wbfdm 1.44.0__tar.gz → 1.44.1__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.1}/PKG-INFO +1 -1
  2. wbfdm-1.44.1/wbfdm/viewsets/financial_analysis/financial_summary.py +266 -0
  3. wbfdm-1.44.0/wbfdm/viewsets/financial_analysis/financial_summary.py +0 -256
  4. {wbfdm-1.44.0 → wbfdm-1.44.1}/.gitignore +0 -0
  5. {wbfdm-1.44.0 → wbfdm-1.44.1}/pyproject.toml +0 -0
  6. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/__init__.py +0 -0
  7. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/admin/__init__.py +0 -0
  8. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/admin/classifications.py +0 -0
  9. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/admin/esg.py +0 -0
  10. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/admin/exchanges.py +0 -0
  11. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/admin/instrument_lists.py +0 -0
  12. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/admin/instrument_prices.py +0 -0
  13. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/admin/instrument_requests.py +0 -0
  14. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/admin/instruments.py +0 -0
  15. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/admin/instruments_relationships.py +0 -0
  16. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/admin/options.py +0 -0
  17. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/__init__.py +0 -0
  18. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/esg/__init__.py +0 -0
  19. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/esg/enums.py +0 -0
  20. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/esg/esg_analysis.py +0 -0
  21. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/esg/utils.py +0 -0
  22. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/financial_analysis/__init__.py +0 -0
  23. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/financial_analysis/financial_metric_analysis.py +0 -0
  24. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +0 -0
  25. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +0 -0
  26. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/financial_analysis/statement_with_estimates.py +0 -0
  27. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/financial_analysis/utils.py +0 -0
  28. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/technical_analysis/__init__.py +0 -0
  29. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/technical_analysis/technical_analysis.py +0 -0
  30. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/technical_analysis/traces.py +0 -0
  31. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/analysis/utils.py +0 -0
  32. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/apps.py +0 -0
  33. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/backends/dto.py +0 -0
  34. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/__init__.py +0 -0
  35. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/dsws/__init__.py +0 -0
  36. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/dsws/client.py +0 -0
  37. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/dsws/dataloaders/market_data.py +0 -0
  38. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/internal/__init__.py +0 -0
  39. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
  40. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/internal/dataloaders/market_data.py +0 -0
  41. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/__init__.py +0 -0
  42. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/admin/__init__.py +0 -0
  43. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/admin/instruments.py +0 -0
  44. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/admin/metrics.py +0 -0
  45. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/apps.py +0 -0
  46. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/backends/__init__.py +0 -0
  47. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/backends/base.py +0 -0
  48. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/backends/performances.py +0 -0
  49. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/backends/statistics.py +0 -0
  50. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/decorators.py +0 -0
  51. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/dispatch.py +0 -0
  52. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/dto.py +0 -0
  53. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/exceptions.py +0 -0
  54. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/factories.py +0 -0
  55. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/filters.py +0 -0
  56. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/migrations/0001_initial.py +0 -0
  57. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +0 -0
  58. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/migrations/__init__.py +0 -0
  59. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/models.py +0 -0
  60. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/orchestrators.py +0 -0
  61. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/registry.py +0 -0
  62. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/serializers.py +0 -0
  63. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/tasks.py +0 -0
  64. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/tests/__init__.py +0 -0
  65. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
  66. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/tests/backends/test_performances.py +0 -0
  67. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/tests/backends/test_statistics.py +0 -0
  68. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/tests/conftest.py +0 -0
  69. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/tests/test_dto.py +0 -0
  70. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/tests/test_models.py +0 -0
  71. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/tests/test_tasks.py +0 -0
  72. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/tests/test_viewsets.py +0 -0
  73. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/urls.py +0 -0
  74. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/viewsets/__init__.py +0 -0
  75. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/viewsets/configs/__init__.py +0 -0
  76. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/viewsets/configs/display.py +0 -0
  77. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/viewsets/configs/menus.py +0 -0
  78. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/viewsets/configs/utils.py +0 -0
  79. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/viewsets/mixins.py +0 -0
  80. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/metric/viewsets/viewsets.py +0 -0
  81. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/msci/__init__.py +0 -0
  82. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/msci/client.py +0 -0
  83. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
  84. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/msci/dataloaders/esg.py +0 -0
  85. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/msci/dataloaders/esg_controversies.py +0 -0
  86. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/msci/sync.py +0 -0
  87. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/msci/tests/__init__.py +0 -0
  88. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/msci/tests/conftest.py +0 -0
  89. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/msci/tests/test_client.py +0 -0
  90. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/__init__.py +0 -0
  91. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/apps.py +0 -0
  92. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/database_routers.py +0 -0
  93. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
  94. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/dataloaders/adjustments.py +0 -0
  95. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/dataloaders/corporate_actions.py +0 -0
  96. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/dataloaders/financials.py +0 -0
  97. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/dataloaders/market_data.py +0 -0
  98. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/dataloaders/officers.py +0 -0
  99. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/dataloaders/reporting_dates.py +0 -0
  100. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/dataloaders/statements.py +0 -0
  101. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/dataloaders/utils.py +0 -0
  102. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/jinja2/qa/sql/companies.sql +0 -0
  103. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/base_estimates.sql +0 -0
  104. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/calendarized.sql +0 -0
  105. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/complete.sql +0 -0
  106. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/estimates.sql +0 -0
  107. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/financials.sql +0 -0
  108. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/jinja2/qa/sql/instruments.sql +0 -0
  109. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/jinja2/qa/sql/quotes.sql +0 -0
  110. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/sync/exchanges.py +0 -0
  111. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/sync/instruments.py +0 -0
  112. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/sync/utils.py +0 -0
  113. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/contrib/qa/tasks.py +0 -0
  114. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/dataloaders/__init__.py +0 -0
  115. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/dataloaders/cache.py +0 -0
  116. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/dataloaders/protocols.py +0 -0
  117. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/dataloaders/proxies.py +0 -0
  118. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/dataloaders/types.py +0 -0
  119. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/dynamic_preferences_registry.py +0 -0
  120. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/enums.py +0 -0
  121. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/factories/__init__.py +0 -0
  122. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/factories/classifications.py +0 -0
  123. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/factories/controversies.py +0 -0
  124. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/factories/exchanges.py +0 -0
  125. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/factories/instrument_list.py +0 -0
  126. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/factories/instrument_prices.py +0 -0
  127. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/factories/instruments.py +0 -0
  128. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/factories/instruments_relationships.py +0 -0
  129. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/factories/options.py +0 -0
  130. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/figures/__init__.py +0 -0
  131. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/figures/financials/__init__.py +0 -0
  132. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/figures/financials/financial_analysis_charts.py +0 -0
  133. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/figures/financials/financials_charts.py +0 -0
  134. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/filters/__init__.py +0 -0
  135. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/filters/classifications.py +0 -0
  136. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/filters/exchanges.py +0 -0
  137. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/filters/financials.py +0 -0
  138. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/filters/financials_analysis.py +0 -0
  139. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/filters/instrument_prices.py +0 -0
  140. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/filters/instruments.py +0 -0
  141. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/filters/utils.py +0 -0
  142. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/__init__.py +0 -0
  143. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/__init__.py +0 -0
  144. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/cbinsights/__init__.py +0 -0
  145. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/cbinsights/deals.py +0 -0
  146. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/cbinsights/equities.py +0 -0
  147. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/cbinsights/mixin.py +0 -0
  148. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
  149. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/cbinsights/utils/classifications.py +0 -0
  150. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/cbinsights/utils/client.py +0 -0
  151. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/refinitiv/__init__.py +0 -0
  152. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/refinitiv/daily_fundamental.py +0 -0
  153. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/refinitiv/fiscal_period.py +0 -0
  154. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/refinitiv/forecast.py +0 -0
  155. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/refinitiv/fundamental.py +0 -0
  156. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/refinitiv/geographic_segment.py +0 -0
  157. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/refinitiv/instrument.py +0 -0
  158. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/refinitiv/instrument_price.py +0 -0
  159. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/refinitiv/mixin.py +0 -0
  160. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/refinitiv/utils/__init__.py +0 -0
  161. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/backends/refinitiv/utils/controller.py +0 -0
  162. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/handlers/__init__.py +0 -0
  163. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/handlers/instrument.py +0 -0
  164. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/handlers/instrument_list.py +0 -0
  165. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/handlers/instrument_price.py +0 -0
  166. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/handlers/option.py +0 -0
  167. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/handlers/private_equities.py +0 -0
  168. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/parsers/__init__.py +0 -0
  169. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
  170. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/parsers/cbinsights/deals.py +0 -0
  171. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/parsers/cbinsights/equities.py +0 -0
  172. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/parsers/cbinsights/fundamentals.py +0 -0
  173. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
  174. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +0 -0
  175. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/parsers/refinitiv/forecast.py +0 -0
  176. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/parsers/refinitiv/fundamental.py +0 -0
  177. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/parsers/refinitiv/geographic_segment.py +0 -0
  178. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/parsers/refinitiv/instrument.py +0 -0
  179. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/parsers/refinitiv/instrument_price.py +0 -0
  180. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/parsers/refinitiv/utils.py +0 -0
  181. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/resources/__init__.py +0 -0
  182. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/resources/classification.py +0 -0
  183. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/resources/instrument_prices.py +0 -0
  184. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/import_export/resources/instruments.py +0 -0
  185. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/jinja2.py +0 -0
  186. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/management/__init__.py +0 -0
  187. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/menu.py +0 -0
  188. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0001_initial.py +0 -0
  189. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +0 -0
  190. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +0 -0
  191. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +0 -0
  192. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0005_instrument_corporate_action_backend.py +0 -0
  193. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0006_instrument_officer_backend.py +0 -0
  194. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +0 -0
  195. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0008_controversy.py +0 -0
  196. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +0 -0
  197. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +0 -0
  198. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +0 -0
  199. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +0 -0
  200. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +0 -0
  201. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0014_alter_controversy_instrument.py +0 -0
  202. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0015_instrument_instrument_investible_index.py +0 -0
  203. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0016_instrumenttype_name_repr.py +0 -0
  204. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0017_instrument_instrument_security_index.py +0 -0
  205. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0018_instrument_instrument_level_index.py +0 -0
  206. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0019_alter_controversy_source.py +0 -0
  207. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0020_optionaggregate_option_and_more.py +0 -0
  208. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0021_delete_instrumentdailystatistics.py +0 -0
  209. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +0 -0
  210. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +0 -0
  211. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +0 -0
  212. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0025_instrument_is_primary_and_more.py +0 -0
  213. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0026_instrument_is_cash_equivalent.py +0 -0
  214. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +0 -0
  215. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/0028_instrumentprice_annualized_daily_volatility.py +0 -0
  216. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/migrations/__init__.py +0 -0
  217. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/__init__.py +0 -0
  218. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/esg/__init__.py +0 -0
  219. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/esg/controversies.py +0 -0
  220. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/exchanges/__init__.py +0 -0
  221. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/exchanges/exchanges.py +0 -0
  222. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/fields.py +0 -0
  223. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/fk_fields.py +0 -0
  224. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/indicators.py +0 -0
  225. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/__init__.py +0 -0
  226. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/classifications.py +0 -0
  227. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/instrument_lists.py +0 -0
  228. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/instrument_prices.py +0 -0
  229. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/instrument_relationships.py +0 -0
  230. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/instrument_requests.py +0 -0
  231. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/instruments.py +0 -0
  232. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/llm/__init__.py +0 -0
  233. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/llm/create_instrument_news_relationships.py +0 -0
  234. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/mixin/__init__.py +0 -0
  235. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/mixin/financials_computed.py +0 -0
  236. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/mixin/financials_serializer_fields.py +0 -0
  237. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/mixin/instruments.py +0 -0
  238. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/options.py +0 -0
  239. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/private_equities.py +0 -0
  240. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/querysets.py +0 -0
  241. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/models/instruments/utils.py +0 -0
  242. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/preferences.py +0 -0
  243. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/serializers/__init__.py +0 -0
  244. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/serializers/esg.py +0 -0
  245. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/serializers/exchanges.py +0 -0
  246. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/serializers/instruments/__init__.py +0 -0
  247. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/serializers/instruments/classifications.py +0 -0
  248. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/serializers/instruments/instrument_lists.py +0 -0
  249. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/serializers/instruments/instrument_prices.py +0 -0
  250. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/serializers/instruments/instrument_relationships.py +0 -0
  251. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/serializers/instruments/instrument_requests.py +0 -0
  252. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/serializers/instruments/instruments.py +0 -0
  253. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/serializers/instruments/mixins.py +0 -0
  254. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/serializers/officers.py +0 -0
  255. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/signals.py +0 -0
  256. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/sync/__init__.py +0 -0
  257. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/sync/abstract.py +0 -0
  258. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/sync/runner.py +0 -0
  259. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tasks.py +0 -0
  260. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/__init__.py +0 -0
  261. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/analysis/__init__.py +0 -0
  262. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
  263. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +0 -0
  264. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/analysis/financial_analysis/test_utils.py +0 -0
  265. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/analysis/test_esg.py +0 -0
  266. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/conftest.py +0 -0
  267. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/dataloaders/__init__.py +0 -0
  268. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/dataloaders/test_cache.py +0 -0
  269. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/models/__init__.py +0 -0
  270. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/models/test_classifications.py +0 -0
  271. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/models/test_exchanges.py +0 -0
  272. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/models/test_instrument_list.py +0 -0
  273. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/models/test_instrument_prices.py +0 -0
  274. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/models/test_instruments.py +0 -0
  275. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/models/test_merge.py +0 -0
  276. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/models/test_options.py +0 -0
  277. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/test_tasks.py +0 -0
  278. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/tests/tests.py +0 -0
  279. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/urls.py +0 -0
  280. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/utils.py +0 -0
  281. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/__init__.py +0 -0
  282. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/__init__.py +0 -0
  283. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/buttons/__init__.py +0 -0
  284. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/buttons/classifications.py +0 -0
  285. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/buttons/exchanges.py +0 -0
  286. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/buttons/instrument_prices.py +0 -0
  287. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/buttons/instruments.py +0 -0
  288. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/__init__.py +0 -0
  289. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/classifications.py +0 -0
  290. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/esg.py +0 -0
  291. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/exchanges.py +0 -0
  292. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/financial_summary.py +0 -0
  293. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/instrument_lists.py +0 -0
  294. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/instrument_prices.py +0 -0
  295. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/instrument_requests.py +0 -0
  296. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/instruments.py +0 -0
  297. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/instruments_relationships.py +0 -0
  298. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/monthly_performances.py +0 -0
  299. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/officers.py +0 -0
  300. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/prices.py +0 -0
  301. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/statement_with_estimates.py +0 -0
  302. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/display/statements.py +0 -0
  303. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/endpoints/__init__.py +0 -0
  304. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/endpoints/classifications.py +0 -0
  305. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/endpoints/esg.py +0 -0
  306. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/endpoints/exchanges.py +0 -0
  307. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/endpoints/financials_analysis.py +0 -0
  308. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/endpoints/instrument_lists.py +0 -0
  309. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/endpoints/instrument_prices.py +0 -0
  310. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/endpoints/instrument_requests.py +0 -0
  311. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/endpoints/instruments.py +0 -0
  312. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/endpoints/instruments_relationships.py +0 -0
  313. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/endpoints/statements.py +0 -0
  314. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/menus/__init__.py +0 -0
  315. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/menus/classifications.py +0 -0
  316. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/menus/exchanges.py +0 -0
  317. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/menus/instrument_lists.py +0 -0
  318. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/menus/instruments.py +0 -0
  319. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/menus/instruments_relationships.py +0 -0
  320. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/titles/__init__.py +0 -0
  321. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/titles/classifications.py +0 -0
  322. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/titles/esg.py +0 -0
  323. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/titles/exchanges.py +0 -0
  324. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +0 -0
  325. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/titles/financials_analysis.py +0 -0
  326. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/titles/instrument_prices.py +0 -0
  327. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/titles/instrument_requests.py +0 -0
  328. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/titles/instruments.py +0 -0
  329. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/titles/instruments_relationships.py +0 -0
  330. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/titles/market_data.py +0 -0
  331. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/titles/prices.py +0 -0
  332. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/configs/titles/statement_with_estimates.py +0 -0
  333. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/esg.py +0 -0
  334. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/exchanges.py +0 -0
  335. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/financial_analysis/__init__.py +0 -0
  336. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +0 -0
  337. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +0 -0
  338. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/financial_analysis/statement_with_estimates.py +0 -0
  339. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/instruments/__init__.py +0 -0
  340. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/instruments/classifications.py +0 -0
  341. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/instruments/financials_analysis.py +0 -0
  342. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/instruments/instrument_lists.py +0 -0
  343. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/instruments/instrument_prices.py +0 -0
  344. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/instruments/instrument_requests.py +0 -0
  345. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/instruments/instruments.py +0 -0
  346. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/instruments/instruments_relationships.py +0 -0
  347. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/instruments/utils.py +0 -0
  348. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/market_data.py +0 -0
  349. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/mixins.py +0 -0
  350. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/officers.py +0 -0
  351. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/prices.py +0 -0
  352. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/statements/__init__.py +0 -0
  353. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/statements/statements.py +0 -0
  354. {wbfdm-1.44.0 → wbfdm-1.44.1}/wbfdm/viewsets/technical_analysis/__init__.py +0 -0
  355. {wbfdm-1.44.0 → wbfdm-1.44.1}/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.1
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.*
@@ -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