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
@@ -0,0 +1,31 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+
4
+
5
+ class RelatedInstrumentThroughInstrumentEndpointConfig(EndpointViewConfig):
6
+ def get_endpoint(self, **kwargs):
7
+ return reverse(
8
+ "wbfdm:instrument-relatedinstrument-list",
9
+ args=[self.view.kwargs["instrument_id"]],
10
+ request=self.request,
11
+ )
12
+
13
+
14
+ class ClassifiedInstrumentEndpointConfig(EndpointViewConfig):
15
+ PK_FIELD = "instrument"
16
+
17
+ def get_endpoint(self, **kwargs):
18
+ return reverse("wbfdm:classifiedinstrument-list", args=[], request=self.request)
19
+
20
+ def get_instance_endpoint(self, **kwargs):
21
+ return reverse(
22
+ "wbfdm:instrument-list",
23
+ args=[],
24
+ request=self.request,
25
+ )
26
+
27
+ def get_create_endpoint(self, **kwargs):
28
+ return None
29
+
30
+ def get_delete_endpoint(self, **kwargs):
31
+ return None
@@ -0,0 +1,6 @@
1
+ from wbcore.metadata.configs import endpoints
2
+
3
+
4
+ class StatementsEndpointViewConfig(endpoints.EndpointViewConfig):
5
+ def get_endpoint(self, **kwargs):
6
+ return None
@@ -0,0 +1,9 @@
1
+ from .exchanges import ExchangeMenuItem
2
+ from .classifications import ClassificationMenuItem, ClassificationGroupMenuItem
3
+ from .instrument_lists import INSTRUMENT_LIST_MENUITEM
4
+ from .instruments import INSTRUMENT_MENUITEM, INVESTABLE_UNIVERSE_MENUITEM
5
+ from .instruments_relationships import (
6
+ INSTRUMENTFAVORITEGROUP_MENUITEM,
7
+ INSTRUMENT_REQUEST_MENUITEM,
8
+ CLASSIFIEDINSTRUMENTS_MENUITEM,
9
+ )
@@ -0,0 +1,19 @@
1
+ from wbcore.menus import ItemPermission, MenuItem
2
+ from wbcore.permissions.shortcuts import is_internal_user
3
+
4
+ ClassificationMenuItem = MenuItem(
5
+ label="Classification",
6
+ endpoint="wbfdm:classification-list",
7
+ permission=ItemPermission(
8
+ permissions=["wbfdm.view_classification"],
9
+ method=lambda request: is_internal_user(request.user),
10
+ ),
11
+ )
12
+ ClassificationGroupMenuItem = MenuItem(
13
+ label="Classification Group",
14
+ endpoint="wbfdm:classificationgroup-list",
15
+ permission=ItemPermission(
16
+ permissions=["wbfdm.view_classificationgroup"],
17
+ method=lambda request: is_internal_user(request.user),
18
+ ),
19
+ )
@@ -0,0 +1,10 @@
1
+ from wbcore.menus import ItemPermission, MenuItem
2
+ from wbcore.permissions.shortcuts import is_internal_user
3
+
4
+ ExchangeMenuItem = MenuItem(
5
+ label="Exchange",
6
+ endpoint="wbfdm:exchange-list",
7
+ permission=ItemPermission(
8
+ permissions=["wbfdm.view_exchange"], method=lambda request: is_internal_user(request.user)
9
+ ),
10
+ )
@@ -0,0 +1,10 @@
1
+ from wbcore.menus import ItemPermission, MenuItem
2
+ from wbcore.permissions.shortcuts import is_internal_user
3
+
4
+ INSTRUMENT_LIST_MENUITEM = MenuItem(
5
+ label="Instrument Lists",
6
+ endpoint="wbfdm:instrumentlist-list",
7
+ permission=ItemPermission(
8
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.view_instrumentlist"]
9
+ ),
10
+ )
@@ -0,0 +1,20 @@
1
+ from wbcore.menus import ItemPermission, MenuItem
2
+ from wbcore.permissions.shortcuts import is_internal_user
3
+
4
+ INSTRUMENT_MENUITEM = MenuItem(
5
+ label="Instrument",
6
+ endpoint="wbfdm:instrument-list",
7
+ endpoint_get_parameters={"parent__isnull": True},
8
+ permission=ItemPermission(
9
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.view_instrument"]
10
+ ),
11
+ )
12
+
13
+ INVESTABLE_UNIVERSE_MENUITEM = MenuItem(
14
+ label="Investable Universe",
15
+ endpoint="wbfdm:instrument-list",
16
+ endpoint_get_parameters={"is_investable_universe": True},
17
+ permission=ItemPermission(
18
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.view_instrument"]
19
+ ),
20
+ )
@@ -0,0 +1,33 @@
1
+ from wbcore.menus import ItemPermission, MenuItem
2
+ from wbcore.permissions.shortcuts import is_internal_user
3
+
4
+ INSTRUMENTFAVORITEGROUP_MENUITEM = MenuItem(
5
+ label="Favorite Group",
6
+ endpoint="wbfdm:favoritegroup-list",
7
+ permission=ItemPermission(
8
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.view_instrumentfavoritegroup"]
9
+ ),
10
+ )
11
+
12
+ CLASSIFIEDINSTRUMENTS_MENUITEM = MenuItem(
13
+ label="Classified Instruments",
14
+ endpoint="wbfdm:classifiedinstrument-list",
15
+ permission=ItemPermission(
16
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.view_instrument"]
17
+ ),
18
+ )
19
+
20
+ INSTRUMENT_REQUEST_MENUITEM = MenuItem(
21
+ label="Instrument Requests",
22
+ endpoint="wbfdm:instrumentrequest-list",
23
+ permission=ItemPermission(
24
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.view_instrumentrequest"]
25
+ ),
26
+ add=MenuItem(
27
+ label="Create Instrument Request",
28
+ endpoint="wbfdm:instrumentrequest-list",
29
+ permission=ItemPermission(
30
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.add_instrumentrequest"]
31
+ ),
32
+ ),
33
+ )
@@ -0,0 +1,42 @@
1
+ from .classifications import (
2
+ ChildClassificationParentClassificationTitleConfig,
3
+ ClassificationClassificationGroupTitleConfig,
4
+ ClassificationGroupTitleConfig,
5
+ ClassificationIcicleChartTitleConfig,
6
+ ClassificationTitleConfig,
7
+ ClassificationTreeChartTitleConfig,
8
+ InstrumentClassificationThroughTitleConfig,
9
+ )
10
+ from .financials_analysis import (
11
+ CashFlowAnalysisInstrumentBarChartTitle,
12
+ CashFlowAnalysisInstrumentTableChartTitle,
13
+ EarningsInstrumentChartTitle,
14
+ FinancialsGraphInstrumentChartTitle,
15
+ NetDebtAndEbitdaInstrumentChartTitle,
16
+ ProfitabilityRatiosInstrumentChartTitle,
17
+ SummaryTableInstrumentChartTitle,
18
+ FinancialAnalysisGeneratorTitleConfig,
19
+ )
20
+ from .instrument_requests import InstrumentRequestTitleConfig
21
+ from .instruments import InstrumentTitleConfig
22
+ from .instruments_relationships import (
23
+ ClassifiedInstrumentTitleConfig,
24
+ InstrumentFavoriteGroupTitleConfig,
25
+ )
26
+ from .exchanges import ExchangeTitleConfig
27
+ from .instrument_prices import (
28
+ InstrumentPriceTitleConfig,
29
+ InstrumentPriceInstrumentTitleConfig,
30
+ InstrumentPriceStatisticsInstrumentTitleConfig,
31
+ MonthlyPerformancesInstrumentTitleConfig,
32
+ InstrumentTitleConfigMixin,
33
+ FinancialStatisticsInstrumentTitleConfig,
34
+ InstrumentPriceInstrumentDistributionReturnsChartTitleConfig,
35
+ BestAndWorstReturnsInstrumentTitleConfig,
36
+ )
37
+ from .market_data import (
38
+ PerformanceSummaryChartTitleConfig,
39
+ MarketDataChartTitleConfig,
40
+ )
41
+ from .financial_ratio_analysis import ValuationRatioChartTitleConfig
42
+ from .esg import InstrumentESGPAITitleViewConfig, InstrumentESGControversiesTitleViewConfig
@@ -0,0 +1,79 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+ from wbfdm.models import Classification, ClassificationGroup, Instrument
3
+
4
+
5
+ class ClassificationTitleConfig(TitleViewConfig):
6
+ def get_list_title(self):
7
+ return "Classifications"
8
+
9
+ def get_instance_title(self):
10
+ try:
11
+ obj = self.view.get_object()
12
+ return f"Classification: {str(obj)}"
13
+ except AssertionError:
14
+ return "Classification: {{name}}"
15
+
16
+ def get_create_title(self):
17
+ return "New Classification"
18
+
19
+
20
+ class ClassificationGroupTitleConfig(TitleViewConfig):
21
+ def get_list_title(self):
22
+ return "Classification Groups"
23
+
24
+ def get_instance_title(self):
25
+ return "Classification Group"
26
+
27
+ def get_create_title(self):
28
+ return "New Classification Group"
29
+
30
+
31
+ class ChildClassificationParentClassificationTitleConfig(ClassificationTitleConfig):
32
+ def get_list_title(self):
33
+ classification = Classification.objects.get(id=self.view.kwargs["parent_id"])
34
+ return f"Child Classifications of {classification.name}"
35
+
36
+ def get_create_title(self):
37
+ classification = Classification.objects.get(id=self.view.kwargs["parent_id"])
38
+ return f"New Child Classification {classification.name}"
39
+
40
+
41
+ class ClassificationClassificationGroupTitleConfig(ClassificationTitleConfig):
42
+ def get_list_title(self):
43
+ group = ClassificationGroup.objects.get(id=self.view.kwargs["group_id"])
44
+ return f"Entry Level Classifications for group {group.name}"
45
+
46
+ def get_create_title(self):
47
+ group = ClassificationGroup.objects.get(id=self.view.kwargs["group_id"])
48
+ return f"New Classification for group {group.name}"
49
+
50
+
51
+ class ClassificationTreeChartTitleConfig(TitleViewConfig):
52
+ def get_list_title(self):
53
+ group = ClassificationGroup.objects.get(id=self.view.kwargs["group_id"])
54
+ return f"Classification Tree for group {group.name}"
55
+
56
+
57
+ class ClassificationIcicleChartTitleConfig(TitleViewConfig):
58
+ def get_list_title(self):
59
+ group = ClassificationGroup.objects.get(id=self.view.kwargs["group_id"])
60
+ return f"Classification Icicle Chart for group {group.name}"
61
+
62
+
63
+ class InstrumentClassificationThroughTitleConfig(TitleViewConfig):
64
+ def get_create_title(self) -> str:
65
+ if instrument_id := self.view.kwargs.get("instrument_id", None):
66
+ return f"Classification for {Instrument.objects.get(id=instrument_id)}"
67
+ elif classification_id := self.view.kwargs.get("classification_id", None):
68
+ return f"Instrument for {Classification.objects.get(id=classification_id)}"
69
+ else:
70
+ return super().get_create_title()
71
+
72
+ def get_instance_title(self):
73
+ try:
74
+ obj = self.view.get_object()
75
+ if obj.classification and obj.instrument:
76
+ return f"Relationship: {str(obj.classification.name)} <-> {str(obj.instrument.name)}"
77
+ return str(obj)
78
+ except AssertionError:
79
+ return super().get_instance_title()
@@ -0,0 +1,11 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+
3
+
4
+ class InstrumentESGPAITitleViewConfig(TitleViewConfig):
5
+ def get_list_title(self):
6
+ return f"{self.view.instrument} - PAI"
7
+
8
+
9
+ class InstrumentESGControversiesTitleViewConfig(TitleViewConfig):
10
+ def get_list_title(self):
11
+ return f"{self.view.instrument} - Controversies"
@@ -0,0 +1,12 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+
3
+
4
+ class ExchangeTitleConfig(TitleViewConfig):
5
+ def get_list_title(self):
6
+ return "Exchanges"
7
+
8
+ def get_instance_title(self):
9
+ return "Exchange"
10
+
11
+ def get_create_title(self):
12
+ return "New Exchange"
@@ -0,0 +1,6 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+
3
+
4
+ class ValuationRatioChartTitleConfig(TitleViewConfig):
5
+ def get_list_title(self):
6
+ return f"{str(self.view.instrument)} - Financial Statistics Chart"
@@ -0,0 +1,50 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+ from wbfdm.models import Instrument
3
+
4
+
5
+ class SummaryTableInstrumentChartTitle(TitleViewConfig):
6
+ def get_list_title(self) -> str:
7
+ instrument = Instrument.objects.get(id=self.view.kwargs["instrument_id"])
8
+ return f"{instrument.name_repr} - Financial Summary Table"
9
+
10
+
11
+ class FinancialsGraphInstrumentChartTitle(TitleViewConfig):
12
+ def get_list_title(self) -> str:
13
+ instrument = Instrument.objects.get(id=self.view.kwargs["instrument_id"])
14
+ return f"{instrument.name_repr} - Financials Graph Chart"
15
+
16
+
17
+ class ProfitabilityRatiosInstrumentChartTitle(TitleViewConfig):
18
+ def get_list_title(self) -> str:
19
+ instrument = Instrument.objects.get(id=self.view.kwargs["instrument_id"])
20
+ return f"{instrument.name_repr} - Profitability Ratios Chart"
21
+
22
+
23
+ class CashFlowAnalysisInstrumentTableChartTitle(TitleViewConfig):
24
+ def get_list_title(self) -> str:
25
+ instrument = Instrument.objects.get(id=self.view.kwargs["instrument_id"])
26
+ return f"{instrument.name_repr} - Cash Flow Analysis Table"
27
+
28
+
29
+ class CashFlowAnalysisInstrumentBarChartTitle(TitleViewConfig):
30
+ def get_list_title(self) -> str:
31
+ instrument = Instrument.objects.get(id=self.view.kwargs["instrument_id"])
32
+ return f"{instrument.name_repr} - Cash Flow Analysis Bar Chart"
33
+
34
+
35
+ class NetDebtAndEbitdaInstrumentChartTitle(TitleViewConfig):
36
+ def get_list_title(self) -> str:
37
+ instrument = Instrument.objects.get(id=self.view.kwargs["instrument_id"])
38
+ return f"{instrument.name_repr} - Net debt and EBITDA Chart"
39
+
40
+
41
+ class EarningsInstrumentChartTitle(TitleViewConfig):
42
+ def get_list_title(self) -> str:
43
+ instrument = Instrument.objects.get(id=self.view.kwargs["instrument_id"])
44
+ return f"{instrument.name_repr} - Earnings Analysis Chart"
45
+
46
+
47
+ class FinancialAnalysisGeneratorTitleConfig(TitleViewConfig):
48
+ def get_list_title(self):
49
+ instrument = Instrument.objects.get(id=self.view.kwargs["instrument_id"])
50
+ return f"Ratios for {str(instrument)}"
@@ -0,0 +1,50 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+ from wbfdm.models import Instrument
3
+
4
+
5
+ class InstrumentPriceTitleConfig(TitleViewConfig):
6
+ def get_list_title(self):
7
+ return "Instrument Prices"
8
+
9
+ def get_instance_title(self):
10
+ return "Price: {{_instrument.name}} {{date}}"
11
+
12
+ def get_create_title(self):
13
+ return "New Price"
14
+
15
+
16
+ class InstrumentPriceInstrumentTitleConfig(InstrumentPriceTitleConfig):
17
+ def get_list_title(self):
18
+ return f"{str(self.view.instrument)} - Prices"
19
+
20
+
21
+ class InstrumentPriceStatisticsInstrumentTitleConfig(TitleViewConfig):
22
+ def get_list_title(self):
23
+ return f"{str(self.view.instrument)} - Statistics Chart"
24
+
25
+
26
+ class MonthlyPerformancesInstrumentTitleConfig(TitleViewConfig):
27
+ def get_list_title(self):
28
+ return f"{str(self.view.instrument)} - Monthly Returns Table"
29
+
30
+
31
+ class InstrumentTitleConfigMixin(TitleViewConfig):
32
+ def get_list_title(self):
33
+ assert self.message, "No message has been set"
34
+ instrument = Instrument.objects.get(id=self.view.kwargs["instrument_id"])
35
+ return f"{self.message} {str(instrument)}"
36
+
37
+
38
+ class FinancialStatisticsInstrumentTitleConfig(InstrumentTitleConfigMixin):
39
+ def get_list_title(self):
40
+ return f"{str(self.view.instrument)} - Financial Statistics Chart"
41
+
42
+
43
+ class InstrumentPriceInstrumentDistributionReturnsChartTitleConfig(InstrumentTitleConfigMixin):
44
+ def get_list_title(self):
45
+ return f"{str(self.view.instrument)} - Distribution Returns Chart"
46
+
47
+
48
+ class BestAndWorstReturnsInstrumentTitleConfig(InstrumentTitleConfigMixin):
49
+ def get_list_title(self):
50
+ return f"{str(self.view.instrument)} - Best and Worst returns Table "
@@ -0,0 +1,16 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+
3
+
4
+ class InstrumentRequestTitleConfig(TitleViewConfig):
5
+ def get_list_title(self):
6
+ return "Instrument Requests"
7
+
8
+ def get_instance_title(self):
9
+ try:
10
+ obj = self.view.get_object()
11
+ return f"Instrument Request: {str(obj)}"
12
+ except AssertionError:
13
+ return "Instrument Request: {{status}}"
14
+
15
+ def get_create_title(self):
16
+ return "New Instrument Request"
@@ -0,0 +1,31 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+
3
+
4
+ class InstrumentTitleConfig(TitleViewConfig):
5
+ def get_list_title(self):
6
+ return "Instruments"
7
+
8
+ def get_instance_title(self):
9
+ try:
10
+ obj = self.view.get_object()
11
+ instrument_type = obj.instrument_type.name if obj.instrument_type else "Instrument"
12
+ return f"{instrument_type}: {str(obj)}"
13
+ except AssertionError:
14
+ return "Instrument: {{name}}"
15
+
16
+ def get_create_title(self):
17
+ return "New Instrument"
18
+
19
+
20
+ class SubviewInstrumentTitleViewConfig(TitleViewConfig):
21
+ def get_list_title(self):
22
+ return f"{str(self.view.instrument)} - {self.view.SUBVIEW_NAME} "
23
+
24
+ def get_delete_title(self) -> str:
25
+ return None
26
+
27
+ def get_instance_title(self) -> str:
28
+ return None
29
+
30
+ def get_create_title(self) -> str:
31
+ return None
@@ -0,0 +1,21 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+
3
+
4
+ class InstrumentFavoriteGroupTitleConfig(TitleViewConfig):
5
+ def get_list_title(self):
6
+ return "Instrument Favorite Groups"
7
+
8
+ def get_instance_title(self):
9
+ try:
10
+ obj = self.view.get_object()
11
+ return f"Favorite Group: {str(obj)}"
12
+ except AssertionError:
13
+ return "Instrument: {{name}}"
14
+
15
+ def get_create_title(self):
16
+ return "New Favorite Group"
17
+
18
+
19
+ class ClassifiedInstrumentTitleConfig(TitleViewConfig):
20
+ def get_list_title(self) -> str:
21
+ return "Classified Instruments"
@@ -0,0 +1,13 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+ from wbfdm.enums import MarketDataChartType
3
+
4
+
5
+ class PerformanceSummaryChartTitleConfig(TitleViewConfig):
6
+ def get_list_title(self):
7
+ return f"{self.view.instrument} - Performance Summary"
8
+
9
+
10
+ class MarketDataChartTitleConfig(TitleViewConfig):
11
+ def get_list_title(self):
12
+ market_data_chart_type = MarketDataChartType(self.request.GET.get("chart_type", "close"))
13
+ return f"{self.view.instrument} - {market_data_chart_type.label} Chart"
@@ -0,0 +1,15 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+
3
+
4
+ class InstrumentPriceTitleViewConfig(TitleViewConfig):
5
+ def get_list_title(self):
6
+ return f"{self.view.instrument} - Prices"
7
+
8
+ def get_delete_title(self) -> str:
9
+ return None
10
+
11
+ # def get_instance_title(self) -> str:
12
+ # return None
13
+
14
+ def get_create_title(self) -> str:
15
+ return None
@@ -0,0 +1,10 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+
3
+
4
+ class StatementTitleViewConfig(TitleViewConfig):
5
+ def get_list_title(self):
6
+ try:
7
+ statement_label = self.view.financial_analysis_mapping[self.view.kwargs["statement"]][1]
8
+ return f"{self.view.instrument} - {statement_label} Table"
9
+ except KeyError:
10
+ return f"{self.view.instrument} - Statement"
wbfdm/viewsets/esg.py ADDED
@@ -0,0 +1,72 @@
1
+ import pandas as pd
2
+ from rest_framework.response import Response
3
+ from wbcore import viewsets
4
+ from wbcore.contrib.io.viewsets import ExportPandasAPIViewSet
5
+ from wbcore.pandas import fields as pf
6
+ from wbfdm.enums import ESG
7
+ from wbfdm.models.instruments import Instrument
8
+ from wbfdm.serializers import InstrumentControversySerializer
9
+ from wbfdm.viewsets.configs import (
10
+ InstrumentESGControversiesEndpointViewConfig,
11
+ InstrumentESGControversiesTitleViewConfig,
12
+ InstrumentESGControversyDisplayViewConfig,
13
+ InstrumentESGPAIDisplayViewConfig,
14
+ InstrumentESGPAIEndpointViewConfig,
15
+ InstrumentESGPAITitleViewConfig,
16
+ )
17
+
18
+ from .mixins import InstrumentMixin
19
+
20
+
21
+ class InstrumentESGControversiesViewSet(InstrumentMixin, viewsets.ViewSet):
22
+ IDENTIFIER = "wbfdm:instrument-controversy"
23
+ display_config_class = InstrumentESGControversyDisplayViewConfig
24
+ title_config_class = InstrumentESGControversiesTitleViewConfig
25
+ endpoint_config_class = InstrumentESGControversiesEndpointViewConfig
26
+ serializer_class = InstrumentControversySerializer
27
+ queryset = Instrument.objects.none()
28
+ permission_classes = []
29
+
30
+ def list(self, request, instrument_id):
31
+ queryset = self.get_queryset()
32
+ serializer = self.get_serializer_class()
33
+ serializer = serializer(queryset, many=True)
34
+ return Response({"results": serializer.data})
35
+
36
+ def get_queryset(self):
37
+ return sorted(
38
+ Instrument.objects.filter(id=self.instrument.id).dl.esg_controversies(),
39
+ key=lambda x: (x["review"] is None, x["review"]),
40
+ reverse=True,
41
+ )
42
+
43
+
44
+ class InstrumentESGPAIViewSet(InstrumentMixin, ExportPandasAPIViewSet):
45
+ queryset = Instrument.objects.none()
46
+ display_config_class = InstrumentESGPAIDisplayViewConfig
47
+ endpoint_config_class = InstrumentESGPAIEndpointViewConfig
48
+ title_config_class = InstrumentESGPAITitleViewConfig
49
+
50
+ def get_queryset(self):
51
+ return Instrument.objects.filter(id=self.instrument.id)
52
+
53
+ def get_pandas_fields(self, request):
54
+ return pf.PandasFields(
55
+ fields=[
56
+ pf.PKField(key="index", label="ID"),
57
+ pf.IntegerField(key="section", label="Section"),
58
+ pf.TextField(key="asi", label="Adverse sustainability indicator"),
59
+ pf.TextField(key="metric", label="Metric"),
60
+ pf.TextField(key="factor", label="Factor"),
61
+ pf.FloatField(key="value", label="Value"),
62
+ ]
63
+ )
64
+
65
+ def get_dataframe(self, request, queryset, **kwargs):
66
+ df = pd.DataFrame(queryset.dl.esg(values=list(ESG))).reset_index()
67
+ if not df.empty:
68
+ ESG_mapping = ESG.mapping()
69
+ df[["section", "asi", "metric", "factor"]] = pd.DataFrame(
70
+ df.factor_code.map(ESG_mapping).tolist(), index=df.index
71
+ )
72
+ return df
@@ -0,0 +1,63 @@
1
+ from wbcore import viewsets
2
+ from wbcore.permissions.permissions import InternalUserPermissionMixin
3
+ from wbfdm.filters import ExchangeFilterSet
4
+ from wbfdm.models import Exchange
5
+ from wbfdm.serializers import ExchangeModelSerializer, ExchangeRepresentationSerializer
6
+
7
+ from .configs import (
8
+ ExchangeButtonConfig,
9
+ ExchangeDisplayConfig,
10
+ ExchangeEndpointConfig,
11
+ ExchangeTitleConfig,
12
+ )
13
+
14
+
15
+ class ExchangeRepresentationViewSet(InternalUserPermissionMixin, viewsets.RepresentationViewSet):
16
+ queryset = Exchange.objects.all()
17
+ serializer_class = ExchangeRepresentationSerializer
18
+
19
+ search_fields = (
20
+ "name",
21
+ "mic_code",
22
+ "operating_mic_code",
23
+ "bbg_exchange_codes",
24
+ "bbg_composite_primary",
25
+ "bbg_composite",
26
+ "refinitiv_mnemonic",
27
+ "refinitiv_identifier_code",
28
+ "city__name",
29
+ "website",
30
+ "comments",
31
+ )
32
+ ordering_fields = search_fields
33
+ ordering = ["name"]
34
+
35
+
36
+ class ExchangeModelViewSet(InternalUserPermissionMixin, viewsets.ModelViewSet):
37
+ filterset_class = ExchangeFilterSet
38
+ serializer_class = ExchangeModelSerializer
39
+ queryset = Exchange.objects.select_related(
40
+ "country",
41
+ "city",
42
+ )
43
+
44
+ search_fields = (
45
+ "name",
46
+ "mic_code",
47
+ "operating_mic_code",
48
+ "bbg_exchange_codes",
49
+ "bbg_composite_primary",
50
+ "refinitiv_mnemonic",
51
+ "bbg_composite",
52
+ "refinitiv_identifier_code",
53
+ "city__name",
54
+ "website",
55
+ "comments",
56
+ )
57
+ ordering_fields = search_fields
58
+ ordering = ["name"]
59
+
60
+ display_config_class = ExchangeDisplayConfig
61
+ button_config_class = ExchangeButtonConfig
62
+ title_config_class = ExchangeTitleConfig
63
+ endpoint_config_class = ExchangeEndpointConfig
@@ -0,0 +1,3 @@
1
+ from .statement_with_estimates import StatementWithEstimatesPandasViewSet
2
+ from .financial_metric_analysis import FinancialMetricAnalysisPandasViewSet
3
+ from .financial_ratio_analysis import ValuationRatioChartViewSet