Идеальным вариантом было бы использовать сырые данные от компаний, некоторые компании их предоставляют (https://www.bp.com/content/dam/bp/business-sites/en/global/corporate/xlsx/sustainability/bp-esg-datasheet-2019.xlsx). Однако, так как большинство ограничиваются PDF-отчетами, то вся задача сводится к двум этапам:
- Извлечение данных
- Визуализация и аналитика
Извлечение данных проще всего осуществлять на базе заранее определенной схемы данных для отчета. В схеме должны указываться метрики, метод извлечения метрики, а также метод конверсии величины метрики. В качестве метода извлечения проще всего использовать регулярные выражения (с ними знаком каждый разработчик). Тогда описание парсера отчета сводится к подобной структуре (на примере совокупного значения Greenhouse gas emissions):
{
'name': 'BP',
'reports':{
2019: 'https://www.bp.com/content/dam/bp/business-sites/en/global/corporate/pdfs/sustainability/bp-esg-datasheet-2019.pdf',
},
'metrics': {
'greenhouse gas emissions': {
'regex': 'Operational control.{1,10}Scope 1 \(direct\) greenhouse gas emissions.*?(\d+\.\d+)\n',
'unit': 'MteCO2e',
'convert': as_is
}
}
}
Другой пример:
{
'name': 'Google',
'reports':{
2019: 'https://services.google.com/fh/files/misc/google_2019-environmental-report.pdf',
},
'metrics': {
'greenhouse gas emissions': {
'regex': 'Greenhouse gas emissions.{1,1000}Total.{1,100}\s([\d\,\.]+)\d{2}\n',
'unit': 'MteCO2e',
'convert': tCO2e_to_MteCO2e
}
}
}
На этапе демо извлечение выглядит так:
На разработку схемы под один отчет, учитывающую от 10 метрик у middle-разработчика должно уйти не больше 10 часов работы. При этом большее количество метрик не должно влиять на длительность работы. Смысл в подобной работе будет если будущие отчеты будут похожи на предыдущие и в процессе работы получится унифицировать извлечение метрик для отчетов с разной версткой.
Длительность унификации парсинга отчетов оценить не представляется возможным из-за обилия форматов отчетов.
С получеными сырыми данными можно будет удобно работать в фреймворке для анализа данных pandas.