wbfdm 2.2.1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of wbfdm might be problematic. Click here for more details.

Files changed (337) hide show
  1. wbfdm/__init__.py +2 -0
  2. wbfdm/admin/__init__.py +42 -0
  3. wbfdm/admin/classifications.py +39 -0
  4. wbfdm/admin/esg.py +23 -0
  5. wbfdm/admin/exchanges.py +53 -0
  6. wbfdm/admin/instrument_lists.py +23 -0
  7. wbfdm/admin/instrument_prices.py +62 -0
  8. wbfdm/admin/instrument_requests.py +33 -0
  9. wbfdm/admin/instruments.py +117 -0
  10. wbfdm/admin/instruments_relationships.py +25 -0
  11. wbfdm/admin/options.py +101 -0
  12. wbfdm/analysis/__init__.py +2 -0
  13. wbfdm/analysis/esg/__init__.py +0 -0
  14. wbfdm/analysis/esg/enums.py +82 -0
  15. wbfdm/analysis/esg/esg_analysis.py +217 -0
  16. wbfdm/analysis/esg/utils.py +13 -0
  17. wbfdm/analysis/financial_analysis/__init__.py +1 -0
  18. wbfdm/analysis/financial_analysis/financial_metric_analysis.py +88 -0
  19. wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +125 -0
  20. wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +271 -0
  21. wbfdm/analysis/financial_analysis/statement_with_estimates.py +558 -0
  22. wbfdm/analysis/financial_analysis/utils.py +316 -0
  23. wbfdm/analysis/technical_analysis/__init__.py +1 -0
  24. wbfdm/analysis/technical_analysis/technical_analysis.py +138 -0
  25. wbfdm/analysis/technical_analysis/traces.py +165 -0
  26. wbfdm/analysis/utils.py +32 -0
  27. wbfdm/apps.py +14 -0
  28. wbfdm/contrib/__init__.py +0 -0
  29. wbfdm/contrib/dsws/__init__.py +0 -0
  30. wbfdm/contrib/dsws/client.py +285 -0
  31. wbfdm/contrib/internal/__init__.py +0 -0
  32. wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
  33. wbfdm/contrib/internal/dataloaders/market_data.py +87 -0
  34. wbfdm/contrib/metric/__init__.py +0 -0
  35. wbfdm/contrib/metric/admin/__init__.py +2 -0
  36. wbfdm/contrib/metric/admin/instruments.py +12 -0
  37. wbfdm/contrib/metric/admin/metrics.py +43 -0
  38. wbfdm/contrib/metric/apps.py +10 -0
  39. wbfdm/contrib/metric/backends/__init__.py +2 -0
  40. wbfdm/contrib/metric/backends/base.py +159 -0
  41. wbfdm/contrib/metric/backends/performances.py +265 -0
  42. wbfdm/contrib/metric/backends/statistics.py +182 -0
  43. wbfdm/contrib/metric/decorators.py +14 -0
  44. wbfdm/contrib/metric/dispatch.py +23 -0
  45. wbfdm/contrib/metric/dto.py +88 -0
  46. wbfdm/contrib/metric/exceptions.py +6 -0
  47. wbfdm/contrib/metric/factories.py +33 -0
  48. wbfdm/contrib/metric/filters.py +28 -0
  49. wbfdm/contrib/metric/migrations/0001_initial.py +88 -0
  50. wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +26 -0
  51. wbfdm/contrib/metric/migrations/__init__.py +0 -0
  52. wbfdm/contrib/metric/models.py +180 -0
  53. wbfdm/contrib/metric/orchestrators.py +94 -0
  54. wbfdm/contrib/metric/registry.py +80 -0
  55. wbfdm/contrib/metric/serializers.py +44 -0
  56. wbfdm/contrib/metric/tasks.py +27 -0
  57. wbfdm/contrib/metric/tests/__init__.py +0 -0
  58. wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
  59. wbfdm/contrib/metric/tests/backends/test_performances.py +152 -0
  60. wbfdm/contrib/metric/tests/backends/test_statistics.py +48 -0
  61. wbfdm/contrib/metric/tests/conftest.py +92 -0
  62. wbfdm/contrib/metric/tests/test_dto.py +73 -0
  63. wbfdm/contrib/metric/tests/test_models.py +72 -0
  64. wbfdm/contrib/metric/tests/test_tasks.py +24 -0
  65. wbfdm/contrib/metric/tests/test_viewsets.py +79 -0
  66. wbfdm/contrib/metric/urls.py +19 -0
  67. wbfdm/contrib/metric/viewsets/__init__.py +1 -0
  68. wbfdm/contrib/metric/viewsets/configs/__init__.py +1 -0
  69. wbfdm/contrib/metric/viewsets/configs/display.py +92 -0
  70. wbfdm/contrib/metric/viewsets/configs/menus.py +11 -0
  71. wbfdm/contrib/metric/viewsets/configs/utils.py +137 -0
  72. wbfdm/contrib/metric/viewsets/mixins.py +245 -0
  73. wbfdm/contrib/metric/viewsets/viewsets.py +40 -0
  74. wbfdm/contrib/msci/__init__.py +0 -0
  75. wbfdm/contrib/msci/client.py +92 -0
  76. wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
  77. wbfdm/contrib/msci/dataloaders/esg.py +87 -0
  78. wbfdm/contrib/msci/dataloaders/esg_controversies.py +81 -0
  79. wbfdm/contrib/msci/sync.py +58 -0
  80. wbfdm/contrib/msci/tests/__init__.py +0 -0
  81. wbfdm/contrib/msci/tests/conftest.py +1 -0
  82. wbfdm/contrib/msci/tests/test_client.py +70 -0
  83. wbfdm/contrib/qa/__init__.py +0 -0
  84. wbfdm/contrib/qa/apps.py +22 -0
  85. wbfdm/contrib/qa/database_routers.py +25 -0
  86. wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
  87. wbfdm/contrib/qa/dataloaders/adjustments.py +56 -0
  88. wbfdm/contrib/qa/dataloaders/corporate_actions.py +59 -0
  89. wbfdm/contrib/qa/dataloaders/financials.py +83 -0
  90. wbfdm/contrib/qa/dataloaders/market_data.py +117 -0
  91. wbfdm/contrib/qa/dataloaders/officers.py +59 -0
  92. wbfdm/contrib/qa/dataloaders/reporting_dates.py +67 -0
  93. wbfdm/contrib/qa/dataloaders/statements.py +267 -0
  94. wbfdm/contrib/qa/tasks.py +0 -0
  95. wbfdm/dataloaders/__init__.py +0 -0
  96. wbfdm/dataloaders/cache.py +129 -0
  97. wbfdm/dataloaders/protocols.py +112 -0
  98. wbfdm/dataloaders/proxies.py +201 -0
  99. wbfdm/dataloaders/types.py +209 -0
  100. wbfdm/dynamic_preferences_registry.py +45 -0
  101. wbfdm/enums.py +657 -0
  102. wbfdm/factories/__init__.py +13 -0
  103. wbfdm/factories/classifications.py +56 -0
  104. wbfdm/factories/controversies.py +27 -0
  105. wbfdm/factories/exchanges.py +21 -0
  106. wbfdm/factories/instrument_list.py +22 -0
  107. wbfdm/factories/instrument_prices.py +79 -0
  108. wbfdm/factories/instruments.py +63 -0
  109. wbfdm/factories/instruments_relationships.py +31 -0
  110. wbfdm/factories/options.py +66 -0
  111. wbfdm/figures/__init__.py +1 -0
  112. wbfdm/figures/financials/__init__.py +1 -0
  113. wbfdm/figures/financials/financial_analysis_charts.py +469 -0
  114. wbfdm/figures/financials/financials_charts.py +711 -0
  115. wbfdm/filters/__init__.py +31 -0
  116. wbfdm/filters/classifications.py +100 -0
  117. wbfdm/filters/exchanges.py +22 -0
  118. wbfdm/filters/financials.py +95 -0
  119. wbfdm/filters/financials_analysis.py +119 -0
  120. wbfdm/filters/instrument_prices.py +112 -0
  121. wbfdm/filters/instruments.py +198 -0
  122. wbfdm/filters/utils.py +44 -0
  123. wbfdm/import_export/__init__.py +0 -0
  124. wbfdm/import_export/backends/__init__.py +0 -0
  125. wbfdm/import_export/backends/cbinsights/__init__.py +2 -0
  126. wbfdm/import_export/backends/cbinsights/deals.py +44 -0
  127. wbfdm/import_export/backends/cbinsights/equities.py +41 -0
  128. wbfdm/import_export/backends/cbinsights/mixin.py +15 -0
  129. wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
  130. wbfdm/import_export/backends/cbinsights/utils/classifications.py +4150 -0
  131. wbfdm/import_export/backends/cbinsights/utils/client.py +217 -0
  132. wbfdm/import_export/backends/refinitiv/__init__.py +5 -0
  133. wbfdm/import_export/backends/refinitiv/daily_fundamental.py +36 -0
  134. wbfdm/import_export/backends/refinitiv/fiscal_period.py +63 -0
  135. wbfdm/import_export/backends/refinitiv/forecast.py +178 -0
  136. wbfdm/import_export/backends/refinitiv/fundamental.py +103 -0
  137. wbfdm/import_export/backends/refinitiv/geographic_segment.py +32 -0
  138. wbfdm/import_export/backends/refinitiv/instrument.py +55 -0
  139. wbfdm/import_export/backends/refinitiv/instrument_price.py +77 -0
  140. wbfdm/import_export/backends/refinitiv/mixin.py +29 -0
  141. wbfdm/import_export/backends/refinitiv/utils/__init__.py +1 -0
  142. wbfdm/import_export/backends/refinitiv/utils/controller.py +182 -0
  143. wbfdm/import_export/handlers/__init__.py +0 -0
  144. wbfdm/import_export/handlers/instrument.py +253 -0
  145. wbfdm/import_export/handlers/instrument_list.py +101 -0
  146. wbfdm/import_export/handlers/instrument_price.py +71 -0
  147. wbfdm/import_export/handlers/option.py +54 -0
  148. wbfdm/import_export/handlers/private_equities.py +49 -0
  149. wbfdm/import_export/parsers/__init__.py +0 -0
  150. wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
  151. wbfdm/import_export/parsers/cbinsights/deals.py +39 -0
  152. wbfdm/import_export/parsers/cbinsights/equities.py +56 -0
  153. wbfdm/import_export/parsers/cbinsights/fundamentals.py +45 -0
  154. wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
  155. wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +7 -0
  156. wbfdm/import_export/parsers/refinitiv/forecast.py +7 -0
  157. wbfdm/import_export/parsers/refinitiv/fundamental.py +9 -0
  158. wbfdm/import_export/parsers/refinitiv/geographic_segment.py +7 -0
  159. wbfdm/import_export/parsers/refinitiv/instrument.py +75 -0
  160. wbfdm/import_export/parsers/refinitiv/instrument_price.py +26 -0
  161. wbfdm/import_export/parsers/refinitiv/utils.py +96 -0
  162. wbfdm/import_export/resources/__init__.py +0 -0
  163. wbfdm/import_export/resources/classification.py +23 -0
  164. wbfdm/import_export/resources/instrument_prices.py +33 -0
  165. wbfdm/import_export/resources/instruments.py +176 -0
  166. wbfdm/jinja2.py +7 -0
  167. wbfdm/management/__init__.py +30 -0
  168. wbfdm/menu.py +11 -0
  169. wbfdm/migrations/0001_initial.py +71 -0
  170. wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +144 -0
  171. wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +34 -0
  172. wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +86 -0
  173. wbfdm/migrations/0005_instrument_corporate_action_backend.py +29 -0
  174. wbfdm/migrations/0006_instrument_officer_backend.py +29 -0
  175. wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +117 -0
  176. wbfdm/migrations/0008_controversy.py +75 -0
  177. wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +85 -0
  178. wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +1299 -0
  179. wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +169 -0
  180. wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +564 -0
  181. wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +199 -0
  182. wbfdm/migrations/0014_alter_controversy_instrument.py +22 -0
  183. wbfdm/migrations/0015_instrument_instrument_investible_index.py +16 -0
  184. wbfdm/migrations/0016_instrumenttype_name_repr.py +18 -0
  185. wbfdm/migrations/0017_instrument_instrument_security_index.py +16 -0
  186. wbfdm/migrations/0018_instrument_instrument_level_index.py +20 -0
  187. wbfdm/migrations/0019_alter_controversy_source.py +17 -0
  188. wbfdm/migrations/0020_optionaggregate_option_and_more.py +249 -0
  189. wbfdm/migrations/0021_delete_instrumentdailystatistics.py +15 -0
  190. wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +91 -0
  191. wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +53 -0
  192. wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +36 -0
  193. wbfdm/migrations/0025_instrument_is_primary_and_more.py +29 -0
  194. wbfdm/migrations/0026_instrument_is_cash_equivalent.py +30 -0
  195. wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +100 -0
  196. wbfdm/migrations/__init__.py +0 -0
  197. wbfdm/models/__init__.py +4 -0
  198. wbfdm/models/esg/__init__.py +1 -0
  199. wbfdm/models/esg/controversies.py +81 -0
  200. wbfdm/models/exchanges/__init__.py +1 -0
  201. wbfdm/models/exchanges/exchanges.py +223 -0
  202. wbfdm/models/fields.py +117 -0
  203. wbfdm/models/fk_fields.py +403 -0
  204. wbfdm/models/indicators.py +0 -0
  205. wbfdm/models/instruments/__init__.py +19 -0
  206. wbfdm/models/instruments/classifications.py +265 -0
  207. wbfdm/models/instruments/instrument_lists.py +120 -0
  208. wbfdm/models/instruments/instrument_prices.py +540 -0
  209. wbfdm/models/instruments/instrument_relationships.py +251 -0
  210. wbfdm/models/instruments/instrument_requests.py +196 -0
  211. wbfdm/models/instruments/instruments.py +991 -0
  212. wbfdm/models/instruments/llm/__init__.py +1 -0
  213. wbfdm/models/instruments/llm/create_instrument_news_relationships.py +78 -0
  214. wbfdm/models/instruments/mixin/__init__.py +0 -0
  215. wbfdm/models/instruments/mixin/financials_computed.py +804 -0
  216. wbfdm/models/instruments/mixin/financials_serializer_fields.py +1407 -0
  217. wbfdm/models/instruments/mixin/instruments.py +294 -0
  218. wbfdm/models/instruments/options.py +225 -0
  219. wbfdm/models/instruments/private_equities.py +59 -0
  220. wbfdm/models/instruments/querysets.py +73 -0
  221. wbfdm/models/instruments/utils.py +41 -0
  222. wbfdm/preferences.py +21 -0
  223. wbfdm/serializers/__init__.py +4 -0
  224. wbfdm/serializers/esg.py +36 -0
  225. wbfdm/serializers/exchanges.py +39 -0
  226. wbfdm/serializers/instruments/__init__.py +37 -0
  227. wbfdm/serializers/instruments/classifications.py +139 -0
  228. wbfdm/serializers/instruments/instrument_lists.py +61 -0
  229. wbfdm/serializers/instruments/instrument_prices.py +73 -0
  230. wbfdm/serializers/instruments/instrument_relationships.py +170 -0
  231. wbfdm/serializers/instruments/instrument_requests.py +61 -0
  232. wbfdm/serializers/instruments/instruments.py +274 -0
  233. wbfdm/serializers/instruments/mixins.py +104 -0
  234. wbfdm/serializers/officers.py +20 -0
  235. wbfdm/signals.py +7 -0
  236. wbfdm/sync/__init__.py +0 -0
  237. wbfdm/sync/abstract.py +31 -0
  238. wbfdm/sync/runner.py +22 -0
  239. wbfdm/tasks.py +69 -0
  240. wbfdm/tests/__init__.py +0 -0
  241. wbfdm/tests/analysis/__init__.py +0 -0
  242. wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
  243. wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +392 -0
  244. wbfdm/tests/analysis/financial_analysis/test_utils.py +322 -0
  245. wbfdm/tests/analysis/test_esg.py +159 -0
  246. wbfdm/tests/conftest.py +92 -0
  247. wbfdm/tests/dataloaders/__init__.py +0 -0
  248. wbfdm/tests/dataloaders/test_cache.py +73 -0
  249. wbfdm/tests/models/__init__.py +0 -0
  250. wbfdm/tests/models/test_classifications.py +99 -0
  251. wbfdm/tests/models/test_exchanges.py +7 -0
  252. wbfdm/tests/models/test_instrument_list.py +117 -0
  253. wbfdm/tests/models/test_instrument_prices.py +306 -0
  254. wbfdm/tests/models/test_instruments.py +202 -0
  255. wbfdm/tests/models/test_merge.py +99 -0
  256. wbfdm/tests/models/test_options.py +69 -0
  257. wbfdm/tests/test_tasks.py +6 -0
  258. wbfdm/tests/tests.py +10 -0
  259. wbfdm/urls.py +222 -0
  260. wbfdm/utils.py +54 -0
  261. wbfdm/viewsets/__init__.py +10 -0
  262. wbfdm/viewsets/configs/__init__.py +5 -0
  263. wbfdm/viewsets/configs/buttons/__init__.py +8 -0
  264. wbfdm/viewsets/configs/buttons/classifications.py +23 -0
  265. wbfdm/viewsets/configs/buttons/exchanges.py +9 -0
  266. wbfdm/viewsets/configs/buttons/instrument_prices.py +49 -0
  267. wbfdm/viewsets/configs/buttons/instruments.py +283 -0
  268. wbfdm/viewsets/configs/display/__init__.py +22 -0
  269. wbfdm/viewsets/configs/display/classifications.py +138 -0
  270. wbfdm/viewsets/configs/display/esg.py +75 -0
  271. wbfdm/viewsets/configs/display/exchanges.py +42 -0
  272. wbfdm/viewsets/configs/display/instrument_lists.py +137 -0
  273. wbfdm/viewsets/configs/display/instrument_prices.py +199 -0
  274. wbfdm/viewsets/configs/display/instrument_requests.py +116 -0
  275. wbfdm/viewsets/configs/display/instruments.py +618 -0
  276. wbfdm/viewsets/configs/display/instruments_relationships.py +65 -0
  277. wbfdm/viewsets/configs/display/monthly_performances.py +72 -0
  278. wbfdm/viewsets/configs/display/officers.py +16 -0
  279. wbfdm/viewsets/configs/display/prices.py +21 -0
  280. wbfdm/viewsets/configs/display/statement_with_estimates.py +101 -0
  281. wbfdm/viewsets/configs/display/statements.py +48 -0
  282. wbfdm/viewsets/configs/endpoints/__init__.py +41 -0
  283. wbfdm/viewsets/configs/endpoints/classifications.py +87 -0
  284. wbfdm/viewsets/configs/endpoints/esg.py +20 -0
  285. wbfdm/viewsets/configs/endpoints/exchanges.py +6 -0
  286. wbfdm/viewsets/configs/endpoints/financials_analysis.py +65 -0
  287. wbfdm/viewsets/configs/endpoints/instrument_lists.py +38 -0
  288. wbfdm/viewsets/configs/endpoints/instrument_prices.py +51 -0
  289. wbfdm/viewsets/configs/endpoints/instrument_requests.py +20 -0
  290. wbfdm/viewsets/configs/endpoints/instruments.py +13 -0
  291. wbfdm/viewsets/configs/endpoints/instruments_relationships.py +31 -0
  292. wbfdm/viewsets/configs/endpoints/statements.py +6 -0
  293. wbfdm/viewsets/configs/menus/__init__.py +9 -0
  294. wbfdm/viewsets/configs/menus/classifications.py +19 -0
  295. wbfdm/viewsets/configs/menus/exchanges.py +10 -0
  296. wbfdm/viewsets/configs/menus/instrument_lists.py +10 -0
  297. wbfdm/viewsets/configs/menus/instruments.py +20 -0
  298. wbfdm/viewsets/configs/menus/instruments_relationships.py +33 -0
  299. wbfdm/viewsets/configs/titles/__init__.py +42 -0
  300. wbfdm/viewsets/configs/titles/classifications.py +79 -0
  301. wbfdm/viewsets/configs/titles/esg.py +11 -0
  302. wbfdm/viewsets/configs/titles/exchanges.py +12 -0
  303. wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +6 -0
  304. wbfdm/viewsets/configs/titles/financials_analysis.py +50 -0
  305. wbfdm/viewsets/configs/titles/instrument_prices.py +50 -0
  306. wbfdm/viewsets/configs/titles/instrument_requests.py +16 -0
  307. wbfdm/viewsets/configs/titles/instruments.py +31 -0
  308. wbfdm/viewsets/configs/titles/instruments_relationships.py +21 -0
  309. wbfdm/viewsets/configs/titles/market_data.py +13 -0
  310. wbfdm/viewsets/configs/titles/prices.py +15 -0
  311. wbfdm/viewsets/configs/titles/statement_with_estimates.py +10 -0
  312. wbfdm/viewsets/esg.py +72 -0
  313. wbfdm/viewsets/exchanges.py +63 -0
  314. wbfdm/viewsets/financial_analysis/__init__.py +3 -0
  315. wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +85 -0
  316. wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +85 -0
  317. wbfdm/viewsets/financial_analysis/statement_with_estimates.py +145 -0
  318. wbfdm/viewsets/instruments/__init__.py +80 -0
  319. wbfdm/viewsets/instruments/classifications.py +279 -0
  320. wbfdm/viewsets/instruments/financials_analysis.py +614 -0
  321. wbfdm/viewsets/instruments/instrument_lists.py +77 -0
  322. wbfdm/viewsets/instruments/instrument_prices.py +542 -0
  323. wbfdm/viewsets/instruments/instrument_requests.py +51 -0
  324. wbfdm/viewsets/instruments/instruments.py +106 -0
  325. wbfdm/viewsets/instruments/instruments_relationships.py +235 -0
  326. wbfdm/viewsets/instruments/utils.py +27 -0
  327. wbfdm/viewsets/market_data.py +172 -0
  328. wbfdm/viewsets/mixins.py +9 -0
  329. wbfdm/viewsets/officers.py +27 -0
  330. wbfdm/viewsets/prices.py +62 -0
  331. wbfdm/viewsets/statements/__init__.py +1 -0
  332. wbfdm/viewsets/statements/statements.py +100 -0
  333. wbfdm/viewsets/technical_analysis/__init__.py +1 -0
  334. wbfdm/viewsets/technical_analysis/monthly_performances.py +93 -0
  335. wbfdm-2.2.1.dist-info/METADATA +15 -0
  336. wbfdm-2.2.1.dist-info/RECORD +337 -0
  337. wbfdm-2.2.1.dist-info/WHEEL +5 -0
wbfdm/__init__.py ADDED
@@ -0,0 +1,2 @@
1
+ __version__ = "1.0.0"
2
+
@@ -0,0 +1,42 @@
1
+ from django.contrib import admin
2
+
3
+ from .instruments import InstrumentModelAdmin, InstrumentTypeModelAdmin
4
+ from .classifications import ClassificationAdmin, ClassificationGroupAdmin
5
+ from .exchanges import ExchangeModelAdmin
6
+ from .instrument_lists import InstrumentListAdmin
7
+ from .instruments_relationships import InstrumentFavoriteGroupModelAdmin
8
+ from .esg import ControversyModelAdmin
9
+ from .exchanges import ExchangeModelAdmin
10
+ from .instrument_prices import InstrumentPriceAdmin
11
+ from .instrument_requests import InstrumentRequestModelAdmin
12
+ from .options import OptionModelAdmin, OptionAggregateModelAdmin
13
+
14
+
15
+ class ReadOnlyAdmin(admin.ModelAdmin):
16
+ readonly_fields = []
17
+
18
+ def get_readonly_fields(self, request, obj=None):
19
+ return (
20
+ list(self.readonly_fields)
21
+ + [field.name for field in obj._meta.fields] # type: ignore
22
+ + [field.name for field in obj._meta.many_to_many] # type: ignore
23
+ )
24
+
25
+ def has_add_permission(self, request):
26
+ return False
27
+
28
+ def has_delete_permission(self, request, obj=None):
29
+ return False
30
+
31
+
32
+ class ReadOnlyTabularInline(admin.TabularInline):
33
+ show_change_link = True
34
+
35
+ def has_change_permission(self, request, obj=None):
36
+ return False
37
+
38
+ def has_add_permission(self, request, obj=None):
39
+ return False
40
+
41
+ def has_delete_permission(self, request, obj=None):
42
+ return False
@@ -0,0 +1,39 @@
1
+ from django.contrib import admin
2
+ from reversion_compare.admin import CompareVersionAdmin
3
+ from wbfdm.models import Classification, ClassificationGroup
4
+
5
+
6
+ class ClassificationInLine(admin.TabularInline):
7
+ model = Classification
8
+ fields = ["code_aggregated", "name"]
9
+ extra = 0
10
+
11
+
12
+ @admin.register(ClassificationGroup)
13
+ class ClassificationGroupAdmin(CompareVersionAdmin):
14
+ list_display = ["name", "max_depth", "is_primary"]
15
+
16
+ search_fields = ["name"]
17
+ ordering = ["name"]
18
+
19
+ def reversion_register(self, model, **options):
20
+ options = {
21
+ "ignore_duplicates": True,
22
+ }
23
+ super().reversion_register(model, **options)
24
+
25
+
26
+ @admin.register(Classification)
27
+ class ClassificationAdmin(CompareVersionAdmin):
28
+ list_display = ["code_aggregated", "name", "level"]
29
+
30
+ search_fields = ["code_aggregated", "name"]
31
+ inlines = [ClassificationInLine]
32
+ ordering = ["code_aggregated"]
33
+ list_filter = ("height", "level", "group")
34
+
35
+ def reversion_register(self, model, **options):
36
+ options = {
37
+ "ignore_duplicates": True,
38
+ }
39
+ super().reversion_register(model, **options)
wbfdm/admin/esg.py ADDED
@@ -0,0 +1,23 @@
1
+ from django.contrib import admin
2
+ from wbfdm.models import Controversy
3
+
4
+
5
+ @admin.register(Controversy)
6
+ class ControversyModelAdmin(admin.ModelAdmin):
7
+ search_fields = (
8
+ "headline",
9
+ "description",
10
+ "source",
11
+ )
12
+ raw_id_fields = ["instrument"]
13
+ list_display = (
14
+ "initiated",
15
+ "review",
16
+ "headline",
17
+ "description",
18
+ "source",
19
+ "status",
20
+ "type",
21
+ "severity",
22
+ "company_response",
23
+ )
@@ -0,0 +1,53 @@
1
+ from django import forms
2
+ from django.contrib import admin
3
+ from wbfdm.models import Exchange
4
+
5
+
6
+ class CsvImportForm(forms.Form):
7
+ csv_file = forms.FileField()
8
+
9
+
10
+ @admin.register(Exchange)
11
+ class ExchangeModelAdmin(admin.ModelAdmin):
12
+ list_display = (
13
+ "source_id",
14
+ "name",
15
+ "mic_code",
16
+ "operating_mic_code",
17
+ "bbg_exchange_codes",
18
+ "bbg_composite",
19
+ "country",
20
+ )
21
+ search_fields = (
22
+ "name",
23
+ "operating_mic_code",
24
+ "mic_code",
25
+ "bbg_exchange_codes",
26
+ "bbg_composite",
27
+ "refinitiv_identifier_code",
28
+ "comments",
29
+ )
30
+ list_filter = ["country"]
31
+ fieldsets = (
32
+ (
33
+ "Main Data",
34
+ {
35
+ "fields": (
36
+ (
37
+ "name",
38
+ "opening_time",
39
+ "closing_time",
40
+ ),
41
+ ("mic_code", "mic_name"),
42
+ ("operating_mic_code", "operating_mic_name"),
43
+ ("bbg_exchange_codes", "bbg_composite_primary", "bbg_composite"),
44
+ ("refinitiv_identifier_code", "refinitiv_mnemonic"),
45
+ ("country", "website"),
46
+ ("comments",),
47
+ )
48
+ },
49
+ ),
50
+ )
51
+
52
+ def get_queryset(self, request):
53
+ return super().get_queryset(request).select_related("country")
@@ -0,0 +1,23 @@
1
+ from django.contrib import admin
2
+ from wbfdm.models import InstrumentList, InstrumentListThroughModel
3
+
4
+
5
+ class InstrumentInstrumentList(admin.TabularInline):
6
+ model = InstrumentListThroughModel
7
+ fk_name = "instrument_list"
8
+ fields = ["instrument_str", "instrument", "validated", "from_date", "to_date"]
9
+
10
+ raw_id_fields = ["instrument", "instrument_list"]
11
+
12
+ def get_queryset(self, request):
13
+ return super().get_queryset(request).select_related("instrument")
14
+
15
+
16
+ @admin.register(InstrumentList)
17
+ class InstrumentListAdmin(admin.ModelAdmin):
18
+ search_fields = ("name", "instrument_list_type")
19
+ list_display = ("name", "instrument_list_type")
20
+
21
+ inlines = [
22
+ InstrumentInstrumentList,
23
+ ]
@@ -0,0 +1,62 @@
1
+ import pandas as pd
2
+ from django.contrib import admin
3
+ from wbcore.admin import ExportCsvMixin, ImportCsvMixin
4
+ from wbfdm.models import Instrument, InstrumentPrice
5
+
6
+
7
+ @admin.register(InstrumentPrice)
8
+ class InstrumentPriceAdmin(ExportCsvMixin, ImportCsvMixin, admin.ModelAdmin):
9
+ change_list_template = "wbcore/admin/change_list.html"
10
+ # fsm_field = ["status"]
11
+ list_display = ("date", "instrument", "net_value", "gross_value", "calculated")
12
+
13
+ ordering = ("-date",)
14
+
15
+ autocomplete_fields = ["instrument"]
16
+ fieldsets = (
17
+ (
18
+ "Main Data",
19
+ {
20
+ "fields": (
21
+ (
22
+ "instrument",
23
+ "date",
24
+ "import_source",
25
+ "calculated",
26
+ ),
27
+ ("net_value", "gross_value"),
28
+ )
29
+ },
30
+ ),
31
+ (
32
+ "Extra Data",
33
+ {
34
+ "fields": (
35
+ ("volume", "volume_50d", "volume_200d"),
36
+ ("outstanding_shares", "market_capitalization", "market_capitalization_consolidated"),
37
+ )
38
+ },
39
+ ),
40
+ (
41
+ "Computed fields",
42
+ {
43
+ "fields": (
44
+ "lock_statistics",
45
+ ("sharpe_ratio", "correlation", "beta"),
46
+ )
47
+ },
48
+ ),
49
+ )
50
+
51
+ raw_id_fields = ["import_source", "instrument"]
52
+
53
+ actions = ["export_as_csv"]
54
+
55
+ def manipulate_df(self, df):
56
+ df["instrument"] = df["instrument"].apply(lambda x: Instrument.objects.get(id=x))
57
+ df["date"] = pd.to_datetime(df["date"])
58
+ return df
59
+
60
+ def process_model(self, model):
61
+ query_params = {"instrument": model["instrument"], "date": model["date"]}
62
+ self.model.objects.update_or_create(**query_params, defaults=model)
@@ -0,0 +1,33 @@
1
+ from django.contrib import admin
2
+ from wbfdm.models import InstrumentRequest
3
+
4
+
5
+ @admin.register(InstrumentRequest)
6
+ class InstrumentRequestModelAdmin(admin.ModelAdmin):
7
+ search_fields = (
8
+ "created_instrument__computed_str",
9
+ "requester__comptuted_str",
10
+ )
11
+ raw_id_fields = ["created_instrument", "requester"]
12
+ list_display = (
13
+ "status",
14
+ "requester",
15
+ "handler",
16
+ "notes",
17
+ "created",
18
+ "created_instrument",
19
+ )
20
+ readonly_fields = ["created"]
21
+ fieldsets = (
22
+ (
23
+ "Main Data",
24
+ {
25
+ "fields": (
26
+ ("status", "created", "created_instrument"),
27
+ ("requester", "handler"),
28
+ ("notes",),
29
+ ("instrument_data",),
30
+ )
31
+ },
32
+ ),
33
+ )
@@ -0,0 +1,117 @@
1
+ from django.contrib import admin
2
+ from wbfdm.models import Instrument, InstrumentType
3
+ from wbfdm.models.instruments.instruments import import_prices_as_task
4
+
5
+ from .instruments_relationships import (
6
+ InstrumentClassificationThroughModelAdmin,
7
+ RelatedInstrumentThroughModelInlineAdmin,
8
+ )
9
+
10
+
11
+ class InstrumentInline(admin.TabularInline):
12
+ verbose_name = "Child"
13
+ verbose_names = "Children"
14
+ model = Instrument
15
+ fields = ("name", "exchange", "is_investable_universe", "is_security", "is_primary")
16
+ autocomplete_fields = ("exchange",)
17
+ show_change_link = True
18
+ extra = 0
19
+
20
+
21
+ @admin.register(InstrumentType)
22
+ class InstrumentTypeModelAdmin(admin.ModelAdmin):
23
+ list_display = ("name", "key", "is_security", "is_classifiable")
24
+
25
+
26
+ @admin.register(Instrument)
27
+ class InstrumentModelAdmin(admin.ModelAdmin):
28
+ list_display = (
29
+ "_is_investable",
30
+ "is_investable_universe",
31
+ "is_security",
32
+ "is_primary",
33
+ "instrument_type",
34
+ "name",
35
+ "source",
36
+ "source_id",
37
+ "exchange",
38
+ "ticker",
39
+ "refinitiv_identifier_code",
40
+ "refinitiv_mnemonic_code",
41
+ "isin",
42
+ "currency",
43
+ "country",
44
+ )
45
+ list_filter = ["instrument_type", "is_investable_universe", "is_security", "is_managed", "is_primary"]
46
+ fieldsets = (
47
+ (
48
+ "Instrument Information",
49
+ {
50
+ "fields": (
51
+ ("name", "name_repr", "computed_str"),
52
+ ("parent", "instrument_type"),
53
+ ("is_cash", "is_security", "is_managed", "is_investable_universe", "is_primary"),
54
+ ("inception_date", "delisted_date"),
55
+ ("primary_url", "additional_urls"),
56
+ (
57
+ "ticker",
58
+ "identifier",
59
+ "refinitiv_identifier_code",
60
+ "refinitiv_mnemonic_code",
61
+ ),
62
+ (
63
+ "cusip",
64
+ "sedol",
65
+ "valoren",
66
+ ),
67
+ ("isin", "old_isins", "tags"),
68
+ ("currency", "country", "headquarter_city", "headquarter_address"),
69
+ (
70
+ "exchange",
71
+ "import_source",
72
+ "base_color",
73
+ ),
74
+ ("description",),
75
+ ("dl_parameters", "source", "source_id"),
76
+ )
77
+ },
78
+ ),
79
+ )
80
+ search_fields = (
81
+ "name",
82
+ "name_repr",
83
+ "isin",
84
+ "ticker",
85
+ "computed_str",
86
+ "refinitiv_identifier_code",
87
+ "refinitiv_mnemonic_code",
88
+ "cusip",
89
+ "sedol",
90
+ "valoren",
91
+ "source_id",
92
+ )
93
+
94
+ autocomplete_fields = ["parent", "currency", "country", "headquarter_city", "related_instruments", "tags"]
95
+ readonly_fields = ["computed_str", "last_update", "last_valuation_date"]
96
+ inlines = [InstrumentInline, RelatedInstrumentThroughModelInlineAdmin, InstrumentClassificationThroughModelAdmin]
97
+ raw_id_fields = [
98
+ "import_source",
99
+ ]
100
+
101
+ actions = ["reimport_prices_since_inception"]
102
+
103
+ def reimport_prices_since_inception(self, request, queryset):
104
+ for instrument in queryset:
105
+ for investable_children in instrument.get_descendants(include_self=True).filter(
106
+ is_investable_universe=True
107
+ ): # trigger the recomputation for all children within the investable universe
108
+ import_prices_as_task.delay(investable_children.id, clear=True)
109
+
110
+ def isin(self, obj):
111
+ return obj.isin
112
+
113
+ def ric(self, obj):
114
+ return obj.ric
115
+
116
+ def get_queryset(self, request):
117
+ return super().get_queryset(request).select_related("currency", "country", "instrument_type")
@@ -0,0 +1,25 @@
1
+ from django.contrib import admin
2
+ from wbfdm.models import (
3
+ InstrumentClassificationThroughModel,
4
+ InstrumentFavoriteGroup,
5
+ RelatedInstrumentThroughModel,
6
+ )
7
+
8
+
9
+ @admin.register(InstrumentFavoriteGroup)
10
+ class InstrumentFavoriteGroupModelAdmin(admin.ModelAdmin):
11
+ list_display = ("name", "owner", "public", "primary")
12
+ autocomplete_fields = ["instruments", "owner"]
13
+
14
+
15
+ class InstrumentClassificationThroughModelAdmin(admin.TabularInline):
16
+ list_display = ("classification", "is_favorite")
17
+ model = InstrumentClassificationThroughModel
18
+ fk_name = "instrument"
19
+ autocomplete_fields = ["classification"]
20
+
21
+
22
+ class RelatedInstrumentThroughModelInlineAdmin(admin.TabularInline):
23
+ model = RelatedInstrumentThroughModel
24
+ fk_name = "instrument"
25
+ autocomplete_fields = ["related_instrument"]
wbfdm/admin/options.py ADDED
@@ -0,0 +1,101 @@
1
+ from django.contrib import admin
2
+ from wbfdm.models import Option, OptionAggregate
3
+
4
+
5
+ @admin.register(OptionAggregate)
6
+ class OptionAggregateModelAdmin(admin.ModelAdmin):
7
+ list_display = ("type", "instrument", "date")
8
+
9
+ ordering = ("-date",)
10
+
11
+ autocomplete_fields = ["instrument"]
12
+ fieldsets = (
13
+ (
14
+ "Main Data",
15
+ {"fields": (("type", "instrument", "date", "import_source"),)},
16
+ ),
17
+ (
18
+ "Base Metrics",
19
+ {
20
+ "fields": (
21
+ (
22
+ "volume",
23
+ "volume_5d",
24
+ "volume_10d",
25
+ "volume_20d",
26
+ "volume_50d",
27
+ ),
28
+ (
29
+ "open_interest",
30
+ "open_interest_5d",
31
+ "open_interest_10d",
32
+ "open_interest_20d",
33
+ "open_interest_50d",
34
+ ),
35
+ ("volatility", "volatility_30d", "volatility_60d", "volatility_90d"),
36
+ )
37
+ },
38
+ ),
39
+ )
40
+
41
+ raw_id_fields = ["import_source", "instrument"]
42
+
43
+
44
+ @admin.register(Option)
45
+ class OptionModelAdmin(admin.ModelAdmin):
46
+ list_display = ("type", "contract_identifier", "instrument", "date", "expiration_date", "strike")
47
+
48
+ ordering = ("-date",)
49
+
50
+ autocomplete_fields = ["instrument"]
51
+ fieldsets = (
52
+ (
53
+ "Main Data",
54
+ {
55
+ "fields": (
56
+ (
57
+ "type",
58
+ "instrument",
59
+ "contract_identifier",
60
+ "strike",
61
+ ),
62
+ ("date", "expiration_date", "import_source"),
63
+ )
64
+ },
65
+ ),
66
+ (
67
+ "EOD",
68
+ {
69
+ "fields": (
70
+ (
71
+ "open",
72
+ "high",
73
+ "low",
74
+ ),
75
+ ("close", "bid", "ask"),
76
+ )
77
+ },
78
+ ),
79
+ (
80
+ "Base Metrics",
81
+ {
82
+ "fields": (
83
+ ("volume", "open_interest"),
84
+ ("volatility_30d", "volatility_60d", "volatility_90d"),
85
+ )
86
+ },
87
+ ),
88
+ (
89
+ "Risk Metrics",
90
+ {
91
+ "fields": (
92
+ ("risk_delta", "risk_theta", "risk_gamma"),
93
+ ("risk_vega", "risk_rho", "risk_lambda"),
94
+ ("risk_epsilon", "risk_vomma", "risk_vera"),
95
+ ("risk_speed", "risk_zomma", "risk_color", "risk_ultima"),
96
+ )
97
+ },
98
+ ),
99
+ )
100
+
101
+ raw_id_fields = ["import_source", "instrument"]
@@ -0,0 +1,2 @@
1
+ from .technical_analysis import *
2
+ from .financial_analysis import *
File without changes
@@ -0,0 +1,82 @@
1
+ from wbcore.utils.enum import ChoiceEnum
2
+ from wbfdm.enums import ESG
3
+
4
+ from .utils import get_esg_df
5
+
6
+
7
+ class AggregationMethod(ChoiceEnum):
8
+ PERCENTAGE_SUM = "Percentage Sum"
9
+ WEIGHTED_AVG_NORMALIZED = "Weighted Avg Normalized"
10
+ WEIGHTED_AVG_CATEGORY_NORMALIZED = "Weighted Avg Weighted (Per Category)"
11
+ INVESTOR_ALLOCATION = "Investor Allocation"
12
+ INVESTOR_ALLOCATION_PER_MILLION = "Investor Allocation Per Million"
13
+
14
+
15
+ class ESGAggregation(ChoiceEnum):
16
+ GHG_EMISSIONS_SCOPE_1 = "GHG Emissions Scope 1"
17
+ GHG_EMISSIONS_SCOPE_2 = "GHG Emissions Scope 2"
18
+ GHG_EMISSIONS_SCOPE_3 = "GHG Emissions Scope 3"
19
+ GHG_EMISSIONS_SCOPE_123 = "GHG Emissions Scope 123"
20
+ CARBON_FOOTPRINT = "Carbon Footprint"
21
+ GHG_INTENSITY_OF_COMPAGNIES = "GHG intensity of investee companies"
22
+ FOSSIL_FUEL_EXPOSURE = "Exposure to companies active in the fossil fuel sector"
23
+ SHARE_OF_NONRENEWABLE_ENERGY = "Share of nonrenewable energy consumption and production"
24
+ ENERGY_CONSUMPTION_INTENSITY = "Energy consumption intensity"
25
+ ENERGY_CONSUMPTION_INTENSITY_PER_SECTOR = "Energy consumption intensity per high-impact climate sector"
26
+ ACTIVITY_NEGATIVELY_IMPACTING_BIODIVERSITY = "Activities negatively affecting biodiversity sensitive areas"
27
+ EMISSIONS_TO_WATER = "Emissions to water"
28
+ HAZARDOUS_WASTE_RATIO = "Hazardous Waste Ratio"
29
+ VIOLATION_OF_UN_PRINCIPLES = "Violations of UN Global Compact principles and Organisation for Economic Cooperation and Development (OECD) Guidelines for Multinational Enterprises"
30
+ LACK_OF_PROCESS_AND_COMPLIANCE_OF_UN_PRINCIPLES = "Lack of processes and compliance mechanisms to monitor compliance with UN Global Compact principles and OECD Guidelines for Multinational Enterprises"
31
+ UNADJUSTED_GENDER_PAY_GAP = "Unadjusted gender pay gap"
32
+ BOARD_GENDER_DIVERSITY = "Board Gender Diversity"
33
+ CONTROVERSIAL_WEAPONS_EXPOSURE = "Exposure to controversial weapons (antipersonnel mines, cluster munitions, chemical weapons and biological weapons)"
34
+
35
+ def get_aggregation(self) -> AggregationMethod:
36
+ return {
37
+ "GHG_EMISSIONS_SCOPE_1": AggregationMethod.INVESTOR_ALLOCATION,
38
+ "GHG_EMISSIONS_SCOPE_2": AggregationMethod.INVESTOR_ALLOCATION,
39
+ "GHG_EMISSIONS_SCOPE_3": AggregationMethod.INVESTOR_ALLOCATION,
40
+ "GHG_EMISSIONS_SCOPE_123": AggregationMethod.INVESTOR_ALLOCATION,
41
+ "CARBON_FOOTPRINT": AggregationMethod.INVESTOR_ALLOCATION_PER_MILLION,
42
+ "GHG_INTENSITY_OF_COMPAGNIES": AggregationMethod.WEIGHTED_AVG_NORMALIZED,
43
+ "FOSSIL_FUEL_EXPOSURE": AggregationMethod.PERCENTAGE_SUM,
44
+ "SHARE_OF_NONRENEWABLE_ENERGY": AggregationMethod.WEIGHTED_AVG_NORMALIZED,
45
+ "ENERGY_CONSUMPTION_INTENSITY": AggregationMethod.WEIGHTED_AVG_NORMALIZED,
46
+ "ENERGY_CONSUMPTION_INTENSITY_PER_SECTOR": AggregationMethod.WEIGHTED_AVG_CATEGORY_NORMALIZED,
47
+ "ACTIVITY_NEGATIVELY_IMPACTING_BIODIVERSITY": AggregationMethod.PERCENTAGE_SUM,
48
+ "EMISSIONS_TO_WATER": AggregationMethod.INVESTOR_ALLOCATION_PER_MILLION,
49
+ "HAZARDOUS_WASTE_RATIO": AggregationMethod.INVESTOR_ALLOCATION_PER_MILLION,
50
+ "VIOLATION_OF_UN_PRINCIPLES": AggregationMethod.PERCENTAGE_SUM,
51
+ "LACK_OF_PROCESS_AND_COMPLIANCE_OF_UN_PRINCIPLES": AggregationMethod.PERCENTAGE_SUM,
52
+ "UNADJUSTED_GENDER_PAY_GAP": AggregationMethod.WEIGHTED_AVG_NORMALIZED,
53
+ "BOARD_GENDER_DIVERSITY": AggregationMethod.WEIGHTED_AVG_NORMALIZED,
54
+ "CONTROVERSIAL_WEAPONS_EXPOSURE": AggregationMethod.PERCENTAGE_SUM,
55
+ }.get(
56
+ self.name, AggregationMethod.WEIGHTED_AVG_NORMALIZED
57
+ ) # default to weighted avg normalized
58
+
59
+ def get_esg_code(self) -> ESG:
60
+ return {
61
+ "GHG_EMISSIONS_SCOPE_1": ESG.CARBON_EMISSIONS_SCOPE_1,
62
+ "GHG_EMISSIONS_SCOPE_2": ESG.CARBON_EMISSIONS_SCOPE_2,
63
+ "GHG_EMISSIONS_SCOPE_3": ESG.CARBON_EMISSIONS_SCOPE_3_TOTAL,
64
+ "GHG_EMISSIONS_SCOPE_123": ESG.CARBON_EMISSIONS_SCOPE123,
65
+ "CARBON_FOOTPRINT": ESG.CARBON_EMISSIONS_SCOPE123,
66
+ "GHG_INTENSITY_OF_COMPAGNIES": ESG.CARBON_EMISSIONS_SALES_EUR_SCOPE_ALL,
67
+ "FOSSIL_FUEL_EXPOSURE": ESG.ACTIVE_FF_SECTOR_EXPOSURE,
68
+ "SHARE_OF_NONRENEWABLE_ENERGY": ESG.PCT_NON_RENEW_CONSUMPTION_PRODUCTION,
69
+ "ENERGY_CONSUMPTION_INTENSITY": ESG.ENERGY_CONSUMPTION_INTENSITY_EUR,
70
+ "ENERGY_CONSUMPTION_INTENSITY_PER_SECTOR": ESG.ENERGY_CONSUMPTION_INTENSITY_EUR,
71
+ "ACTIVITY_NEGATIVELY_IMPACTING_BIODIVERSITY": ESG.OPS_BIODIV_CONTROVERSITIES,
72
+ "EMISSIONS_TO_WATER": ESG.WATER_EMISSIONS,
73
+ "HAZARDOUS_WASTE_RATIO": ESG.HAZARD_WASTE,
74
+ "VIOLATION_OF_UN_PRINCIPLES": ESG.OECD_ALIGNMENT,
75
+ "LACK_OF_PROCESS_AND_COMPLIANCE_OF_UN_PRINCIPLES": ESG.COMPLIANCE_GLOBAL_IMPACT,
76
+ "UNADJUSTED_GENDER_PAY_GAP": ESG.GENDER_PAY_GAP_RATIO,
77
+ "BOARD_GENDER_DIVERSITY": ESG.PCT_FEMALE_DIRECTORS,
78
+ "CONTROVERSIAL_WEAPONS_EXPOSURE": ESG.CONTROVERSIAL_WEAPONS,
79
+ }[self.name]
80
+
81
+ def get_esg_data(self, instruments):
82
+ return get_esg_df(instruments, self.get_esg_code())