wbfdm 1.44.0__tar.gz → 1.44.2__tar.gz

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 (355) hide show
  1. {wbfdm-1.44.0 → wbfdm-1.44.2}/PKG-INFO +1 -1
  2. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/dataloaders/adjustments.py +1 -1
  3. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/dataloaders/market_data.py +10 -10
  4. wbfdm-1.44.2/wbfdm/viewsets/financial_analysis/financial_summary.py +266 -0
  5. wbfdm-1.44.0/wbfdm/viewsets/financial_analysis/financial_summary.py +0 -256
  6. {wbfdm-1.44.0 → wbfdm-1.44.2}/.gitignore +0 -0
  7. {wbfdm-1.44.0 → wbfdm-1.44.2}/pyproject.toml +0 -0
  8. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/__init__.py +0 -0
  9. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/admin/__init__.py +0 -0
  10. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/admin/classifications.py +0 -0
  11. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/admin/esg.py +0 -0
  12. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/admin/exchanges.py +0 -0
  13. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/admin/instrument_lists.py +0 -0
  14. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/admin/instrument_prices.py +0 -0
  15. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/admin/instrument_requests.py +0 -0
  16. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/admin/instruments.py +0 -0
  17. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/admin/instruments_relationships.py +0 -0
  18. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/admin/options.py +0 -0
  19. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/__init__.py +0 -0
  20. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/esg/__init__.py +0 -0
  21. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/esg/enums.py +0 -0
  22. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/esg/esg_analysis.py +0 -0
  23. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/esg/utils.py +0 -0
  24. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/financial_analysis/__init__.py +0 -0
  25. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/financial_analysis/financial_metric_analysis.py +0 -0
  26. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +0 -0
  27. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +0 -0
  28. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/financial_analysis/statement_with_estimates.py +0 -0
  29. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/financial_analysis/utils.py +0 -0
  30. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/technical_analysis/__init__.py +0 -0
  31. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/technical_analysis/technical_analysis.py +0 -0
  32. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/technical_analysis/traces.py +0 -0
  33. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/analysis/utils.py +0 -0
  34. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/apps.py +0 -0
  35. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/backends/dto.py +0 -0
  36. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/__init__.py +0 -0
  37. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/dsws/__init__.py +0 -0
  38. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/dsws/client.py +0 -0
  39. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/dsws/dataloaders/market_data.py +0 -0
  40. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/internal/__init__.py +0 -0
  41. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
  42. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/internal/dataloaders/market_data.py +0 -0
  43. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/__init__.py +0 -0
  44. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/admin/__init__.py +0 -0
  45. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/admin/instruments.py +0 -0
  46. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/admin/metrics.py +0 -0
  47. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/apps.py +0 -0
  48. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/backends/__init__.py +0 -0
  49. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/backends/base.py +0 -0
  50. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/backends/performances.py +0 -0
  51. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/backends/statistics.py +0 -0
  52. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/decorators.py +0 -0
  53. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/dispatch.py +0 -0
  54. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/dto.py +0 -0
  55. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/exceptions.py +0 -0
  56. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/factories.py +0 -0
  57. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/filters.py +0 -0
  58. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/migrations/0001_initial.py +0 -0
  59. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +0 -0
  60. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/migrations/__init__.py +0 -0
  61. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/models.py +0 -0
  62. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/orchestrators.py +0 -0
  63. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/registry.py +0 -0
  64. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/serializers.py +0 -0
  65. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/tasks.py +0 -0
  66. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/tests/__init__.py +0 -0
  67. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
  68. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/tests/backends/test_performances.py +0 -0
  69. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/tests/backends/test_statistics.py +0 -0
  70. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/tests/conftest.py +0 -0
  71. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/tests/test_dto.py +0 -0
  72. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/tests/test_models.py +0 -0
  73. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/tests/test_tasks.py +0 -0
  74. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/tests/test_viewsets.py +0 -0
  75. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/urls.py +0 -0
  76. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/viewsets/__init__.py +0 -0
  77. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/viewsets/configs/__init__.py +0 -0
  78. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/viewsets/configs/display.py +0 -0
  79. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/viewsets/configs/menus.py +0 -0
  80. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/viewsets/configs/utils.py +0 -0
  81. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/viewsets/mixins.py +0 -0
  82. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/metric/viewsets/viewsets.py +0 -0
  83. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/msci/__init__.py +0 -0
  84. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/msci/client.py +0 -0
  85. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
  86. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/msci/dataloaders/esg.py +0 -0
  87. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/msci/dataloaders/esg_controversies.py +0 -0
  88. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/msci/sync.py +0 -0
  89. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/msci/tests/__init__.py +0 -0
  90. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/msci/tests/conftest.py +0 -0
  91. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/msci/tests/test_client.py +0 -0
  92. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/__init__.py +0 -0
  93. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/apps.py +0 -0
  94. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/database_routers.py +0 -0
  95. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
  96. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/dataloaders/corporate_actions.py +0 -0
  97. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/dataloaders/financials.py +0 -0
  98. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/dataloaders/officers.py +0 -0
  99. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/dataloaders/reporting_dates.py +0 -0
  100. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/dataloaders/statements.py +0 -0
  101. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/dataloaders/utils.py +0 -0
  102. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/jinja2/qa/sql/companies.sql +0 -0
  103. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/base_estimates.sql +0 -0
  104. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/calendarized.sql +0 -0
  105. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/complete.sql +0 -0
  106. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/estimates.sql +0 -0
  107. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/financials.sql +0 -0
  108. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/jinja2/qa/sql/instruments.sql +0 -0
  109. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/jinja2/qa/sql/quotes.sql +0 -0
  110. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/sync/exchanges.py +0 -0
  111. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/sync/instruments.py +0 -0
  112. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/sync/utils.py +0 -0
  113. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/contrib/qa/tasks.py +0 -0
  114. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/dataloaders/__init__.py +0 -0
  115. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/dataloaders/cache.py +0 -0
  116. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/dataloaders/protocols.py +0 -0
  117. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/dataloaders/proxies.py +0 -0
  118. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/dataloaders/types.py +0 -0
  119. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/dynamic_preferences_registry.py +0 -0
  120. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/enums.py +0 -0
  121. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/factories/__init__.py +0 -0
  122. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/factories/classifications.py +0 -0
  123. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/factories/controversies.py +0 -0
  124. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/factories/exchanges.py +0 -0
  125. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/factories/instrument_list.py +0 -0
  126. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/factories/instrument_prices.py +0 -0
  127. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/factories/instruments.py +0 -0
  128. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/factories/instruments_relationships.py +0 -0
  129. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/factories/options.py +0 -0
  130. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/figures/__init__.py +0 -0
  131. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/figures/financials/__init__.py +0 -0
  132. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/figures/financials/financial_analysis_charts.py +0 -0
  133. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/figures/financials/financials_charts.py +0 -0
  134. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/filters/__init__.py +0 -0
  135. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/filters/classifications.py +0 -0
  136. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/filters/exchanges.py +0 -0
  137. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/filters/financials.py +0 -0
  138. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/filters/financials_analysis.py +0 -0
  139. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/filters/instrument_prices.py +0 -0
  140. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/filters/instruments.py +0 -0
  141. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/filters/utils.py +0 -0
  142. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/__init__.py +0 -0
  143. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/__init__.py +0 -0
  144. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/cbinsights/__init__.py +0 -0
  145. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/cbinsights/deals.py +0 -0
  146. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/cbinsights/equities.py +0 -0
  147. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/cbinsights/mixin.py +0 -0
  148. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
  149. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/cbinsights/utils/classifications.py +0 -0
  150. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/cbinsights/utils/client.py +0 -0
  151. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/refinitiv/__init__.py +0 -0
  152. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/refinitiv/daily_fundamental.py +0 -0
  153. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/refinitiv/fiscal_period.py +0 -0
  154. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/refinitiv/forecast.py +0 -0
  155. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/refinitiv/fundamental.py +0 -0
  156. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/refinitiv/geographic_segment.py +0 -0
  157. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/refinitiv/instrument.py +0 -0
  158. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/refinitiv/instrument_price.py +0 -0
  159. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/refinitiv/mixin.py +0 -0
  160. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/refinitiv/utils/__init__.py +0 -0
  161. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/backends/refinitiv/utils/controller.py +0 -0
  162. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/handlers/__init__.py +0 -0
  163. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/handlers/instrument.py +0 -0
  164. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/handlers/instrument_list.py +0 -0
  165. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/handlers/instrument_price.py +0 -0
  166. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/handlers/option.py +0 -0
  167. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/handlers/private_equities.py +0 -0
  168. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/parsers/__init__.py +0 -0
  169. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
  170. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/parsers/cbinsights/deals.py +0 -0
  171. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/parsers/cbinsights/equities.py +0 -0
  172. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/parsers/cbinsights/fundamentals.py +0 -0
  173. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
  174. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +0 -0
  175. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/parsers/refinitiv/forecast.py +0 -0
  176. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/parsers/refinitiv/fundamental.py +0 -0
  177. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/parsers/refinitiv/geographic_segment.py +0 -0
  178. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/parsers/refinitiv/instrument.py +0 -0
  179. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/parsers/refinitiv/instrument_price.py +0 -0
  180. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/parsers/refinitiv/utils.py +0 -0
  181. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/resources/__init__.py +0 -0
  182. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/resources/classification.py +0 -0
  183. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/resources/instrument_prices.py +0 -0
  184. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/import_export/resources/instruments.py +0 -0
  185. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/jinja2.py +0 -0
  186. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/management/__init__.py +0 -0
  187. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/menu.py +0 -0
  188. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0001_initial.py +0 -0
  189. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +0 -0
  190. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +0 -0
  191. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +0 -0
  192. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0005_instrument_corporate_action_backend.py +0 -0
  193. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0006_instrument_officer_backend.py +0 -0
  194. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +0 -0
  195. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0008_controversy.py +0 -0
  196. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +0 -0
  197. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +0 -0
  198. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +0 -0
  199. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +0 -0
  200. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +0 -0
  201. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0014_alter_controversy_instrument.py +0 -0
  202. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0015_instrument_instrument_investible_index.py +0 -0
  203. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0016_instrumenttype_name_repr.py +0 -0
  204. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0017_instrument_instrument_security_index.py +0 -0
  205. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0018_instrument_instrument_level_index.py +0 -0
  206. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0019_alter_controversy_source.py +0 -0
  207. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0020_optionaggregate_option_and_more.py +0 -0
  208. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0021_delete_instrumentdailystatistics.py +0 -0
  209. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +0 -0
  210. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +0 -0
  211. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +0 -0
  212. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0025_instrument_is_primary_and_more.py +0 -0
  213. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0026_instrument_is_cash_equivalent.py +0 -0
  214. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +0 -0
  215. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/0028_instrumentprice_annualized_daily_volatility.py +0 -0
  216. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/migrations/__init__.py +0 -0
  217. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/__init__.py +0 -0
  218. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/esg/__init__.py +0 -0
  219. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/esg/controversies.py +0 -0
  220. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/exchanges/__init__.py +0 -0
  221. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/exchanges/exchanges.py +0 -0
  222. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/fields.py +0 -0
  223. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/fk_fields.py +0 -0
  224. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/indicators.py +0 -0
  225. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/__init__.py +0 -0
  226. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/classifications.py +0 -0
  227. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/instrument_lists.py +0 -0
  228. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/instrument_prices.py +0 -0
  229. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/instrument_relationships.py +0 -0
  230. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/instrument_requests.py +0 -0
  231. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/instruments.py +0 -0
  232. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/llm/__init__.py +0 -0
  233. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/llm/create_instrument_news_relationships.py +0 -0
  234. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/mixin/__init__.py +0 -0
  235. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/mixin/financials_computed.py +0 -0
  236. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/mixin/financials_serializer_fields.py +0 -0
  237. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/mixin/instruments.py +0 -0
  238. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/options.py +0 -0
  239. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/private_equities.py +0 -0
  240. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/querysets.py +0 -0
  241. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/models/instruments/utils.py +0 -0
  242. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/preferences.py +0 -0
  243. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/serializers/__init__.py +0 -0
  244. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/serializers/esg.py +0 -0
  245. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/serializers/exchanges.py +0 -0
  246. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/serializers/instruments/__init__.py +0 -0
  247. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/serializers/instruments/classifications.py +0 -0
  248. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/serializers/instruments/instrument_lists.py +0 -0
  249. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/serializers/instruments/instrument_prices.py +0 -0
  250. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/serializers/instruments/instrument_relationships.py +0 -0
  251. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/serializers/instruments/instrument_requests.py +0 -0
  252. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/serializers/instruments/instruments.py +0 -0
  253. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/serializers/instruments/mixins.py +0 -0
  254. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/serializers/officers.py +0 -0
  255. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/signals.py +0 -0
  256. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/sync/__init__.py +0 -0
  257. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/sync/abstract.py +0 -0
  258. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/sync/runner.py +0 -0
  259. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tasks.py +0 -0
  260. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/__init__.py +0 -0
  261. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/analysis/__init__.py +0 -0
  262. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
  263. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +0 -0
  264. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/analysis/financial_analysis/test_utils.py +0 -0
  265. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/analysis/test_esg.py +0 -0
  266. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/conftest.py +0 -0
  267. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/dataloaders/__init__.py +0 -0
  268. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/dataloaders/test_cache.py +0 -0
  269. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/models/__init__.py +0 -0
  270. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/models/test_classifications.py +0 -0
  271. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/models/test_exchanges.py +0 -0
  272. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/models/test_instrument_list.py +0 -0
  273. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/models/test_instrument_prices.py +0 -0
  274. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/models/test_instruments.py +0 -0
  275. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/models/test_merge.py +0 -0
  276. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/models/test_options.py +0 -0
  277. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/test_tasks.py +0 -0
  278. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/tests/tests.py +0 -0
  279. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/urls.py +0 -0
  280. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/utils.py +0 -0
  281. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/__init__.py +0 -0
  282. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/__init__.py +0 -0
  283. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/buttons/__init__.py +0 -0
  284. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/buttons/classifications.py +0 -0
  285. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/buttons/exchanges.py +0 -0
  286. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/buttons/instrument_prices.py +0 -0
  287. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/buttons/instruments.py +0 -0
  288. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/__init__.py +0 -0
  289. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/classifications.py +0 -0
  290. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/esg.py +0 -0
  291. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/exchanges.py +0 -0
  292. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/financial_summary.py +0 -0
  293. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/instrument_lists.py +0 -0
  294. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/instrument_prices.py +0 -0
  295. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/instrument_requests.py +0 -0
  296. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/instruments.py +0 -0
  297. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/instruments_relationships.py +0 -0
  298. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/monthly_performances.py +0 -0
  299. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/officers.py +0 -0
  300. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/prices.py +0 -0
  301. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/statement_with_estimates.py +0 -0
  302. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/display/statements.py +0 -0
  303. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/endpoints/__init__.py +0 -0
  304. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/endpoints/classifications.py +0 -0
  305. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/endpoints/esg.py +0 -0
  306. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/endpoints/exchanges.py +0 -0
  307. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/endpoints/financials_analysis.py +0 -0
  308. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/endpoints/instrument_lists.py +0 -0
  309. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/endpoints/instrument_prices.py +0 -0
  310. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/endpoints/instrument_requests.py +0 -0
  311. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/endpoints/instruments.py +0 -0
  312. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/endpoints/instruments_relationships.py +0 -0
  313. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/endpoints/statements.py +0 -0
  314. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/menus/__init__.py +0 -0
  315. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/menus/classifications.py +0 -0
  316. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/menus/exchanges.py +0 -0
  317. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/menus/instrument_lists.py +0 -0
  318. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/menus/instruments.py +0 -0
  319. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/menus/instruments_relationships.py +0 -0
  320. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/titles/__init__.py +0 -0
  321. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/titles/classifications.py +0 -0
  322. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/titles/esg.py +0 -0
  323. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/titles/exchanges.py +0 -0
  324. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +0 -0
  325. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/titles/financials_analysis.py +0 -0
  326. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/titles/instrument_prices.py +0 -0
  327. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/titles/instrument_requests.py +0 -0
  328. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/titles/instruments.py +0 -0
  329. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/titles/instruments_relationships.py +0 -0
  330. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/titles/market_data.py +0 -0
  331. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/titles/prices.py +0 -0
  332. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/configs/titles/statement_with_estimates.py +0 -0
  333. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/esg.py +0 -0
  334. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/exchanges.py +0 -0
  335. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/financial_analysis/__init__.py +0 -0
  336. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +0 -0
  337. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +0 -0
  338. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/financial_analysis/statement_with_estimates.py +0 -0
  339. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/instruments/__init__.py +0 -0
  340. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/instruments/classifications.py +0 -0
  341. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/instruments/financials_analysis.py +0 -0
  342. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/instruments/instrument_lists.py +0 -0
  343. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/instruments/instrument_prices.py +0 -0
  344. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/instruments/instrument_requests.py +0 -0
  345. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/instruments/instruments.py +0 -0
  346. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/instruments/instruments_relationships.py +0 -0
  347. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/instruments/utils.py +0 -0
  348. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/market_data.py +0 -0
  349. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/mixins.py +0 -0
  350. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/officers.py +0 -0
  351. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/prices.py +0 -0
  352. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/statements/__init__.py +0 -0
  353. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/statements/statements.py +0 -0
  354. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/technical_analysis/__init__.py +0 -0
  355. {wbfdm-1.44.0 → wbfdm-1.44.2}/wbfdm/viewsets/technical_analysis/monthly_performances.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbfdm
3
- Version: 1.44.0
3
+ Version: 1.44.2
4
4
  Summary: The workbench module ensures rapid access to diverse financial data (market, fundamental, forecasts, ESG), with features for storing instruments, classifying them, and conducting financial analysis.
5
5
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
6
6
  Requires-Dist: roman==4.*
@@ -34,7 +34,7 @@ class DatastreamAdjustmentsDataloader(AdjustmentsProtocol, Dataloader):
34
34
  adj_end_date,
35
35
  SOURCE_DS2,
36
36
  adj.AdjFactor.as_("adjustment_factor"),
37
- adj.CumAdjFactor.as_("cumulative_adjustement_factor"),
37
+ adj.CumAdjFactor.as_("cumulative_adjustment_factor"),
38
38
  )
39
39
  .from_(adj)
40
40
  .where(adj.AdjType == 2)
@@ -19,14 +19,14 @@ from wbfdm.enums import Frequency, MarketData
19
19
 
20
20
 
21
21
  class DS2MarketData(Enum):
22
- OPEN = ("Open_", None)
23
- CLOSE = ("Close_", None)
24
- HIGH = ("High", None)
25
- LOW = ("Low", None)
26
- BID = ("Bid", None)
27
- ASK = ("Ask", None)
28
- VWAP = ("VWAP", None)
29
- VOLUME = ("Volume", None)
22
+ OPEN = ("Open_", 1)
23
+ CLOSE = ("Close_", 1)
24
+ HIGH = ("High", 1)
25
+ LOW = ("Low", 1)
26
+ BID = ("Bid", 1)
27
+ ASK = ("Ask", 1)
28
+ VWAP = ("VWAP", 1)
29
+ VOLUME = ("Volume", 1)
30
30
  MARKET_CAPITALIZATION = ("ConsolMktVal", 1_000_000)
31
31
  SHARES_OUTSTANDING = ("ConsolNumShrs", 1_000)
32
32
 
@@ -96,7 +96,7 @@ class DatastreamMarketDataDataloader(MarketDataProtocol, Dataloader):
96
96
  query.select(
97
97
  ValueWrapper(target_currency).as_("currency"),
98
98
  *[
99
- (LiteralValue(value[0][0]) * fn.Coalesce(fx.midrate, 1)).as_(value[1])
99
+ (LiteralValue(value[0][0]) * fn.Coalesce(fx.midrate, 1) * value[0][1]).as_(value[1])
100
100
  for value in value_mapping
101
101
  ],
102
102
  )
@@ -112,7 +112,7 @@ class DatastreamMarketDataDataloader(MarketDataProtocol, Dataloader):
112
112
  else:
113
113
  query = query.select(
114
114
  pricing.Currency.as_("currency"),
115
- *[LiteralValue(value[0][0]).as_(value[1]) for value in value_mapping],
115
+ *[(LiteralValue(value[0][0]) * value[0][1]).as_(value[1]) for value in value_mapping],
116
116
  )
117
117
 
118
118
  # Add conditional where clauses
@@ -0,0 +1,266 @@
1
+ import pandas as pd
2
+ from django.contrib.messages import warning
3
+ from django.utils.functional import cached_property
4
+ from wbcore.contrib.io.viewsets import ExportPandasAPIViewSet
5
+ from wbcore.metadata.configs.endpoints import NoEndpointViewConfig
6
+ from wbcore.pandas import fields as pf
7
+ from wbcore.pandas.utils import sanitize_fields, pct_change_with_negative_values
8
+ from wbcore.pandas.utils import (
9
+ override_number_to_decimal,
10
+ override_number_to_percent,
11
+ override_number_to_x,
12
+ override_number_to_integer_without_decorations,
13
+ )
14
+ from wbfdm.enums import Financial
15
+ from wbfdm.models.instruments import Instrument
16
+
17
+ from wbfdm.viewsets.configs.display import (
18
+ FinancialSummaryDisplayViewConfig,
19
+ )
20
+
21
+
22
+ from ..mixins import InstrumentMixin
23
+
24
+
25
+ class FinancialSummary(InstrumentMixin, ExportPandasAPIViewSet):
26
+ queryset = Instrument.objects.none()
27
+ display_config_class = FinancialSummaryDisplayViewConfig
28
+ ordering_fields = "__all__"
29
+ endpoint_config_class = NoEndpointViewConfig
30
+
31
+ def get_queryset(self):
32
+ return Instrument.objects.filter(id=self.instrument.id)
33
+
34
+ def get_pandas_fields(self, request):
35
+ return pf.PandasFields(
36
+ fields=[
37
+ pf.PKField(key="id", label="ID"),
38
+ pf.CharField(key="label", label="Financial"),
39
+ pf.JsonField(key="_overwrites", label="Overwrites"),
40
+ *[pf.FloatField(key=k, label=k, precision=1) for k in self.fiscal_columns],
41
+ ]
42
+ )
43
+
44
+ def add_messages(self, request, instance=None, **kwargs):
45
+ super().add_messages(request, instance=instance, **kwargs)
46
+ if self.df.empty:
47
+ warning(request, "There is no data available for the Financial Summary table", extra_tags="auto_close=0")
48
+
49
+ def get_dataframe(self, request, queryset, **kwargs):
50
+ # Get all necessary data from the dataloader and load a dataframe
51
+ df = pd.DataFrame(
52
+ queryset.dl.financials(
53
+ values=self.FINANCIAL_VALUES,
54
+ from_index=-5,
55
+ to_index=3,
56
+ )
57
+ )
58
+ if not df.empty:
59
+ # Pivot the data
60
+ df = df.pivot_table(
61
+ columns="financial",
62
+ index=["year", "period_end_date", "estimate"],
63
+ values="value",
64
+ ).rename_axis(columns=None)
65
+
66
+ sanitize_fields(df, map(lambda enum: enum.value, self.FINANCIAL_VALUES))
67
+
68
+ # Compute all necessary fields
69
+ df["revenue_growth"] = df["revenue"].pct_change() * 100
70
+ df["gross_profit_pct"] = df["gross_profit"] / df["revenue"] * 100
71
+ df["ebitda_pct"] = df["ebitda"] / df["revenue"] * 100
72
+ df["ebit_pct"] = df["ebit"] / df["revenue"] * 100
73
+ df["net_income_pct"] = df["net_income"] / df["revenue"] * 100
74
+ df["eps_growth"] = pct_change_with_negative_values(df, "eps") * 100
75
+
76
+ df["net_debt_ebitda"] = df["net_debt"] / df["ebitda"]
77
+ df["debt_assets"] = df["total_debt"] / df["total_assets"] * 100
78
+ df["debt_equity"] = df["total_debt"] / df["total_assets"] * 100
79
+
80
+ df["interest_coverage_ratio"] = df["ebit"] / df["interest_expense"]
81
+ df["free_cash_flow_per_share"] = df["free_cash_flow"] / df["shares_outstanding"]
82
+ df["free_cash_flow_per_share_growth"] = (
83
+ pct_change_with_negative_values(df, "free_cash_flow_per_share") * 100
84
+ )
85
+
86
+ # Normalize data
87
+ df["revenue"] = df["revenue"] / 1_000_000
88
+ df["net_income"] = df["net_income"] / 1_000_000
89
+
90
+ # Sort the columns into the desired order
91
+ # Reset the index to get the period end date as a column
92
+ # Pivot back to have the dates on top
93
+ df = df[self.FIELDS]
94
+
95
+ # Reset the 2 indices and transpose back
96
+ df = df.reset_index(level=[0, 2]).sort_index()
97
+
98
+ # Adjust the columns to be in a different format
99
+ df.index = df.index.map(lambda x: x.strftime("%b/%y"))
100
+ MAX_ROW = 8
101
+ if df.shape[0] > MAX_ROW:
102
+ df = df.iloc[1:] # remove first row
103
+ df = df.iloc[0 : min([df.shape[0], MAX_ROW])] # keep only 8 row maximum
104
+
105
+ self._estimate_columns = df["estimate"].to_dict()
106
+ df = df.drop(columns=["estimate"], errors="ignore")
107
+ return df
108
+
109
+ def manipulate_dataframe(self, df):
110
+ if not df.empty:
111
+ df = df.T
112
+ # Add labels for human readable output
113
+ df["label"] = self.LABELS
114
+
115
+ override_number_to_percent(
116
+ df,
117
+ *list(
118
+ map(
119
+ lambda x: df.index == x,
120
+ [
121
+ "revenue_growth",
122
+ "gross_profit_pct",
123
+ "ebitda_pct",
124
+ "ebit_pct",
125
+ "net_income_pct",
126
+ "eps_growth",
127
+ "roe",
128
+ "roic",
129
+ "roc",
130
+ "roa",
131
+ "debt_equity",
132
+ "debt_assets",
133
+ "free_cash_flow_per_share_growth",
134
+ ],
135
+ )
136
+ ),
137
+ )
138
+
139
+ override_number_to_x(
140
+ df,
141
+ *list(
142
+ map(
143
+ lambda x: df.index == x,
144
+ [
145
+ "net_debt_ebitda",
146
+ "interest_coverage_ratio",
147
+ ],
148
+ )
149
+ ),
150
+ )
151
+
152
+ override_number_to_decimal(
153
+ df,
154
+ *list(
155
+ map(
156
+ lambda x: df.index == x,
157
+ [
158
+ "revenue",
159
+ "net_income",
160
+ ],
161
+ )
162
+ ),
163
+ )
164
+
165
+ override_number_to_integer_without_decorations(
166
+ df,
167
+ *list(
168
+ map(
169
+ lambda x: df.index == x,
170
+ [
171
+ "year",
172
+ ],
173
+ )
174
+ ),
175
+ )
176
+
177
+ df = df.reset_index(names="id")
178
+ return df
179
+
180
+ @cached_property
181
+ def fiscal_columns(self) -> list:
182
+ """Returns the fiscal columns from the dataframe"""
183
+ return self.df.columns.difference(["label", "_overwrites", "id"]).to_list()
184
+
185
+ @cached_property
186
+ def estimate_columns(self) -> dict:
187
+ """Returns a dictionary with the estimate column for each fiscal column
188
+ The _estimate_columns will be set if the dataframe is constructed.
189
+ """
190
+ return getattr(self, "_estimate_columns", {})
191
+
192
+ @cached_property
193
+ def FINANCIAL_VALUES(self) -> list[Financial]:
194
+ return [
195
+ Financial.REVENUE, # SAL
196
+ Financial.GROSS_PROFIT, # GRI
197
+ Financial.EBITDA, # EBT
198
+ Financial.EBIT, # EBI
199
+ Financial.NET_INCOME, # NET
200
+ Financial.EPS, # EPS
201
+ Financial.SHAREHOLDERS_EQUITY, # SHE
202
+ Financial.TOTAL_ASSETS, # TAS
203
+ Financial.TAX_RATE, # TAX
204
+ Financial.RETURN_ON_INVESTED_CAPITAL, # RIC
205
+ Financial.NET_DEBT, # NDT
206
+ Financial.TOTAL_DEBT, # TDT
207
+ Financial.INTEREST_EXPENSE, # INE
208
+ Financial.FREE_CASH_FLOW, # FCF
209
+ Financial.SHARES_OUTSTANDING,
210
+ Financial.CURRENT_LIABILITIES, # CRL
211
+ Financial.CASH_EQUIVALENTS,
212
+ Financial.RETURN_ON_EQUITY,
213
+ Financial.RETURN_ON_ASSETS,
214
+ Financial.RETURN_ON_CAPITAL,
215
+ Financial.RETURN_ON_INVESTED_CAPITAL,
216
+ ]
217
+
218
+ @cached_property
219
+ def FIELDS(self) -> list[str]:
220
+ return [
221
+ "revenue",
222
+ "revenue_growth",
223
+ "gross_profit_pct",
224
+ "ebitda_pct",
225
+ "ebit_pct",
226
+ "net_income_pct",
227
+ "net_income",
228
+ "eps",
229
+ "eps_growth",
230
+ "roe",
231
+ "roa",
232
+ "roc",
233
+ "roic",
234
+ "net_debt_ebitda",
235
+ "debt_assets",
236
+ "debt_equity",
237
+ "interest_coverage_ratio",
238
+ "free_cash_flow_per_share",
239
+ "free_cash_flow_per_share_growth",
240
+ ]
241
+
242
+ @property
243
+ def LABELS(self) -> list[str]:
244
+ currency_key = self.instrument.currency.key if self.instrument.currency else "N.A."
245
+ return [
246
+ f"in {currency_key} MN",
247
+ "Revenue",
248
+ "Y/Y Change",
249
+ "Gross Margin",
250
+ "EBITDA Margin",
251
+ "EBIT Margin",
252
+ "Net Profit Margin",
253
+ "Net Profit",
254
+ "EPS",
255
+ "Y/Y Change",
256
+ "ROE",
257
+ "ROA",
258
+ "ROC",
259
+ "ROIC",
260
+ "Net Debt/EBITDA",
261
+ "D/A",
262
+ "D/E",
263
+ "Int. Cov. Ratio",
264
+ "FCF per share",
265
+ "Y/Y Change",
266
+ ]
@@ -1,256 +0,0 @@
1
- import pandas as pd
2
- from django.utils.functional import cached_property
3
- from wbcore.contrib.io.viewsets import ExportPandasAPIViewSet
4
- from wbcore.metadata.configs.endpoints import NoEndpointViewConfig
5
- from wbcore.pandas import fields as pf
6
- from wbcore.pandas.utils import sanitize_fields, pct_change_with_negative_values
7
- from wbcore.pandas.utils import (
8
- override_number_to_decimal,
9
- override_number_to_percent,
10
- override_number_to_x,
11
- override_number_to_integer_without_decorations,
12
- )
13
- from wbfdm.enums import Financial
14
- from wbfdm.models.instruments import Instrument
15
-
16
- from wbfdm.viewsets.configs.display import (
17
- FinancialSummaryDisplayViewConfig,
18
- )
19
-
20
-
21
- from ..mixins import InstrumentMixin
22
-
23
-
24
- class FinancialSummary(InstrumentMixin, ExportPandasAPIViewSet):
25
- queryset = Instrument.objects.none()
26
- display_config_class = FinancialSummaryDisplayViewConfig
27
- ordering_fields = "__all__"
28
- endpoint_config_class = NoEndpointViewConfig
29
-
30
- def get_queryset(self):
31
- return Instrument.objects.filter(id=self.instrument.id)
32
-
33
- def get_pandas_fields(self, request):
34
- return pf.PandasFields(
35
- fields=[
36
- pf.PKField(key="id", label="ID"),
37
- pf.CharField(key="label", label="Financial"),
38
- pf.JsonField(key="_overwrites", label="Overwrites"),
39
- *[pf.FloatField(key=k, label=k, precision=1) for k in self.fiscal_columns],
40
- ]
41
- )
42
-
43
- def get_dataframe(self, request, queryset, **kwargs):
44
- # Get all necessary data from the dataloader and load a dataframe
45
- df = pd.DataFrame(
46
- queryset.dl.financials(
47
- values=self.FINANCIAL_VALUES,
48
- from_index=-5,
49
- to_index=3,
50
- )
51
- )
52
-
53
- # Pivot the data
54
- df = df.pivot_table(
55
- columns="financial",
56
- index=["year", "period_end_date", "estimate"],
57
- values="value",
58
- ).rename_axis(columns=None)
59
-
60
- sanitize_fields(df, map(lambda enum: enum.value, self.FINANCIAL_VALUES))
61
-
62
- # Compute all necessary fields
63
- df["revenue_growth"] = df["revenue"].pct_change() * 100
64
- df["gross_profit_pct"] = df["gross_profit"] / df["revenue"] * 100
65
- df["ebitda_pct"] = df["ebitda"] / df["revenue"] * 100
66
- df["ebit_pct"] = df["ebit"] / df["revenue"] * 100
67
- df["net_income_pct"] = df["net_income"] / df["revenue"] * 100
68
- df["eps_growth"] = pct_change_with_negative_values(df, "eps") * 100
69
-
70
- df["net_debt_ebitda"] = df["net_debt"] / df["ebitda"]
71
- df["debt_assets"] = df["total_debt"] / df["total_assets"] * 100
72
- df["debt_equity"] = df["total_debt"] / df["total_assets"] * 100
73
-
74
- df["interest_coverage_ratio"] = df["ebit"] / df["interest_expense"]
75
- df["free_cash_flow_per_share"] = df["free_cash_flow"] / df["shares_outstanding"]
76
- df["free_cash_flow_per_share_growth"] = pct_change_with_negative_values(df, "free_cash_flow_per_share") * 100
77
-
78
- # Normalize data
79
- df["revenue"] = df["revenue"] / 1_000_000
80
- df["net_income"] = df["net_income"] / 1_000_000
81
-
82
- # Sort the columns into the desired order
83
- # Reset the index to get the period end date as a column
84
- # Pivot back to have the dates on top
85
- df = df[self.FIELDS]
86
-
87
- # Reset the 2 indices and transpose back
88
- df = df.reset_index(level=[0, 2]).sort_index()
89
-
90
- # Adjust the columns to be in a different format
91
- df.index = df.index.map(lambda x: x.strftime("%b/%y"))
92
- MAX_ROW = 8
93
- if df.shape[0] > MAX_ROW:
94
- df = df.iloc[1:] # remove first row
95
- df = df.iloc[0 : min([df.shape[0], MAX_ROW])] # keep only 8 row maximum
96
-
97
- self._estimate_columns = df["estimate"].to_dict()
98
- df = df.drop(columns=["estimate"], errors="ignore")
99
- return df
100
-
101
- def manipulate_dataframe(self, df):
102
- df = df.T
103
- # Add labels for human readable output
104
- df["label"] = self.LABELS
105
-
106
- override_number_to_percent(
107
- df,
108
- *list(
109
- map(
110
- lambda x: df.index == x,
111
- [
112
- "revenue_growth",
113
- "gross_profit_pct",
114
- "ebitda_pct",
115
- "ebit_pct",
116
- "net_income_pct",
117
- "eps_growth",
118
- "roe",
119
- "roic",
120
- "roc",
121
- "roa",
122
- "debt_equity",
123
- "debt_assets",
124
- "free_cash_flow_per_share_growth",
125
- ],
126
- )
127
- ),
128
- )
129
-
130
- override_number_to_x(
131
- df,
132
- *list(
133
- map(
134
- lambda x: df.index == x,
135
- [
136
- "net_debt_ebitda",
137
- "interest_coverage_ratio",
138
- ],
139
- )
140
- ),
141
- )
142
-
143
- override_number_to_decimal(
144
- df,
145
- *list(
146
- map(
147
- lambda x: df.index == x,
148
- [
149
- "revenue",
150
- "net_income",
151
- ],
152
- )
153
- ),
154
- )
155
-
156
- override_number_to_integer_without_decorations(
157
- df,
158
- *list(
159
- map(
160
- lambda x: df.index == x,
161
- [
162
- "year",
163
- ],
164
- )
165
- ),
166
- )
167
-
168
- return df.reset_index(names="id")
169
-
170
- @cached_property
171
- def fiscal_columns(self) -> list:
172
- """Returns the fiscal columns from the dataframe"""
173
- return self.df.columns.difference(["label", "_overwrites", "id"]).to_list()
174
-
175
- @cached_property
176
- def estimate_columns(self) -> dict:
177
- """Returns a dictionary with the estimate column for each fiscal column
178
- The _estimate_columns will be set if the dataframe is constructed.
179
- """
180
- return getattr(self, "_estimate_columns", {})
181
-
182
- @cached_property
183
- def FINANCIAL_VALUES(self) -> list[Financial]:
184
- return [
185
- Financial.REVENUE, # SAL
186
- Financial.GROSS_PROFIT, # GRI
187
- Financial.EBITDA, # EBT
188
- Financial.EBIT, # EBI
189
- Financial.NET_INCOME, # NET
190
- Financial.EPS, # EPS
191
- Financial.SHAREHOLDERS_EQUITY, # SHE
192
- Financial.TOTAL_ASSETS, # TAS
193
- Financial.TAX_RATE, # TAX
194
- Financial.RETURN_ON_INVESTED_CAPITAL, # RIC
195
- Financial.NET_DEBT, # NDT
196
- Financial.TOTAL_DEBT, # TDT
197
- Financial.INTEREST_EXPENSE, # INE
198
- Financial.FREE_CASH_FLOW, # FCF
199
- Financial.SHARES_OUTSTANDING,
200
- Financial.CURRENT_LIABILITIES, # CRL
201
- Financial.CASH_EQUIVALENTS,
202
- Financial.RETURN_ON_EQUITY,
203
- Financial.RETURN_ON_ASSETS,
204
- Financial.RETURN_ON_CAPITAL,
205
- Financial.RETURN_ON_INVESTED_CAPITAL,
206
- ]
207
-
208
- @cached_property
209
- def FIELDS(self) -> list[str]:
210
- return [
211
- "revenue",
212
- "revenue_growth",
213
- "gross_profit_pct",
214
- "ebitda_pct",
215
- "ebit_pct",
216
- "net_income_pct",
217
- "net_income",
218
- "eps",
219
- "eps_growth",
220
- "roe",
221
- "roa",
222
- "roc",
223
- "roic",
224
- "net_debt_ebitda",
225
- "debt_assets",
226
- "debt_equity",
227
- "interest_coverage_ratio",
228
- "free_cash_flow_per_share",
229
- "free_cash_flow_per_share_growth",
230
- ]
231
-
232
- @property
233
- def LABELS(self) -> list[str]:
234
- currency_key = self.instrument.currency.key if self.instrument.currency else "N.A."
235
- return [
236
- f"in {currency_key} MN",
237
- "Revenue",
238
- "Y/Y Change",
239
- "Gross Margin",
240
- "EBITDA Margin",
241
- "EBIT Margin",
242
- "Net Profit Margin",
243
- "Net Profit",
244
- "EPS",
245
- "Y/Y Change",
246
- "ROE",
247
- "ROA",
248
- "ROC",
249
- "ROIC",
250
- "Net Debt/EBITDA",
251
- "D/A",
252
- "D/E",
253
- "Int. Cov. Ratio",
254
- "FCF per share",
255
- "Y/Y Change",
256
- ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes