wbfdm 1.44.1__tar.gz → 1.44.3__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.1 → wbfdm-1.44.3}/PKG-INFO +2 -2
  2. {wbfdm-1.44.1 → wbfdm-1.44.3}/pyproject.toml +1 -1
  3. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/technical_analysis/traces.py +2 -1
  4. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/adjustments.py +1 -1
  5. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/market_data.py +10 -10
  6. wbfdm-1.44.3/wbfdm/migrations/0029_alter_instrumentprice_volume.py +18 -0
  7. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/instrument_lists.py +2 -1
  8. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/instrument_prices.py +10 -3
  9. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/llm/create_instrument_news_relationships.py +34 -26
  10. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/classifications.py +8 -8
  11. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/instruments.py +0 -3
  12. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/classifications.py +13 -0
  13. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/instrument_prices.py +2 -1
  14. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/instruments_relationships.py +44 -36
  15. {wbfdm-1.44.1 → wbfdm-1.44.3}/.gitignore +0 -0
  16. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/__init__.py +0 -0
  17. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/__init__.py +0 -0
  18. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/classifications.py +0 -0
  19. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/esg.py +0 -0
  20. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/exchanges.py +0 -0
  21. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/instrument_lists.py +0 -0
  22. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/instrument_prices.py +0 -0
  23. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/instrument_requests.py +0 -0
  24. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/instruments.py +0 -0
  25. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/instruments_relationships.py +0 -0
  26. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/options.py +0 -0
  27. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/__init__.py +0 -0
  28. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/esg/__init__.py +0 -0
  29. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/esg/enums.py +0 -0
  30. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/esg/esg_analysis.py +0 -0
  31. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/esg/utils.py +0 -0
  32. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/__init__.py +0 -0
  33. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/financial_metric_analysis.py +0 -0
  34. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +0 -0
  35. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +0 -0
  36. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/statement_with_estimates.py +0 -0
  37. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/utils.py +0 -0
  38. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/technical_analysis/__init__.py +0 -0
  39. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/technical_analysis/technical_analysis.py +0 -0
  40. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/utils.py +0 -0
  41. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/apps.py +0 -0
  42. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/backends/dto.py +0 -0
  43. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/__init__.py +0 -0
  44. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/dsws/__init__.py +0 -0
  45. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/dsws/client.py +0 -0
  46. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/dsws/dataloaders/market_data.py +0 -0
  47. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/internal/__init__.py +0 -0
  48. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
  49. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/internal/dataloaders/market_data.py +0 -0
  50. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/__init__.py +0 -0
  51. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/admin/__init__.py +0 -0
  52. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/admin/instruments.py +0 -0
  53. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/admin/metrics.py +0 -0
  54. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/apps.py +0 -0
  55. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/backends/__init__.py +0 -0
  56. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/backends/base.py +0 -0
  57. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/backends/performances.py +0 -0
  58. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/backends/statistics.py +0 -0
  59. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/decorators.py +0 -0
  60. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/dispatch.py +0 -0
  61. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/dto.py +0 -0
  62. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/exceptions.py +0 -0
  63. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/factories.py +0 -0
  64. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/filters.py +0 -0
  65. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/migrations/0001_initial.py +0 -0
  66. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +0 -0
  67. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/migrations/__init__.py +0 -0
  68. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/models.py +0 -0
  69. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/orchestrators.py +0 -0
  70. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/registry.py +0 -0
  71. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/serializers.py +0 -0
  72. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tasks.py +0 -0
  73. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/__init__.py +0 -0
  74. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
  75. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/backends/test_performances.py +0 -0
  76. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/backends/test_statistics.py +0 -0
  77. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/conftest.py +0 -0
  78. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/test_dto.py +0 -0
  79. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/test_models.py +0 -0
  80. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/test_tasks.py +0 -0
  81. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/test_viewsets.py +0 -0
  82. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/urls.py +0 -0
  83. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/__init__.py +0 -0
  84. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/configs/__init__.py +0 -0
  85. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/configs/display.py +0 -0
  86. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/configs/menus.py +0 -0
  87. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/configs/utils.py +0 -0
  88. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/mixins.py +0 -0
  89. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/viewsets.py +0 -0
  90. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/__init__.py +0 -0
  91. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/client.py +0 -0
  92. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
  93. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/dataloaders/esg.py +0 -0
  94. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/dataloaders/esg_controversies.py +0 -0
  95. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/sync.py +0 -0
  96. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/tests/__init__.py +0 -0
  97. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/tests/conftest.py +0 -0
  98. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/tests/test_client.py +0 -0
  99. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/__init__.py +0 -0
  100. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/apps.py +0 -0
  101. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/database_routers.py +0 -0
  102. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
  103. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/corporate_actions.py +0 -0
  104. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/financials.py +0 -0
  105. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/officers.py +0 -0
  106. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/reporting_dates.py +0 -0
  107. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/statements.py +0 -0
  108. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/utils.py +0 -0
  109. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/companies.sql +0 -0
  110. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/base_estimates.sql +0 -0
  111. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/calendarized.sql +0 -0
  112. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/complete.sql +0 -0
  113. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/estimates.sql +0 -0
  114. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/financials.sql +0 -0
  115. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/instruments.sql +0 -0
  116. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/quotes.sql +0 -0
  117. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/sync/exchanges.py +0 -0
  118. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/sync/instruments.py +0 -0
  119. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/sync/utils.py +0 -0
  120. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/tasks.py +0 -0
  121. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/dataloaders/__init__.py +0 -0
  122. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/dataloaders/cache.py +0 -0
  123. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/dataloaders/protocols.py +0 -0
  124. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/dataloaders/proxies.py +0 -0
  125. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/dataloaders/types.py +0 -0
  126. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/dynamic_preferences_registry.py +0 -0
  127. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/enums.py +0 -0
  128. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/__init__.py +0 -0
  129. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/classifications.py +0 -0
  130. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/controversies.py +0 -0
  131. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/exchanges.py +0 -0
  132. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/instrument_list.py +0 -0
  133. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/instrument_prices.py +0 -0
  134. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/instruments.py +0 -0
  135. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/instruments_relationships.py +0 -0
  136. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/options.py +0 -0
  137. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/figures/__init__.py +0 -0
  138. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/figures/financials/__init__.py +0 -0
  139. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/figures/financials/financial_analysis_charts.py +0 -0
  140. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/figures/financials/financials_charts.py +0 -0
  141. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/__init__.py +0 -0
  142. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/classifications.py +0 -0
  143. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/exchanges.py +0 -0
  144. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/financials.py +0 -0
  145. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/financials_analysis.py +0 -0
  146. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/instrument_prices.py +0 -0
  147. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/instruments.py +0 -0
  148. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/utils.py +0 -0
  149. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/__init__.py +0 -0
  150. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/__init__.py +0 -0
  151. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/__init__.py +0 -0
  152. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/deals.py +0 -0
  153. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/equities.py +0 -0
  154. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/mixin.py +0 -0
  155. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
  156. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/utils/classifications.py +0 -0
  157. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/utils/client.py +0 -0
  158. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/__init__.py +0 -0
  159. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/daily_fundamental.py +0 -0
  160. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/fiscal_period.py +0 -0
  161. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/forecast.py +0 -0
  162. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/fundamental.py +0 -0
  163. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/geographic_segment.py +0 -0
  164. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/instrument.py +0 -0
  165. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/instrument_price.py +0 -0
  166. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/mixin.py +0 -0
  167. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/utils/__init__.py +0 -0
  168. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/utils/controller.py +0 -0
  169. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/handlers/__init__.py +0 -0
  170. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/handlers/instrument.py +0 -0
  171. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/handlers/instrument_list.py +0 -0
  172. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/handlers/instrument_price.py +0 -0
  173. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/handlers/option.py +0 -0
  174. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/handlers/private_equities.py +0 -0
  175. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/__init__.py +0 -0
  176. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
  177. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/cbinsights/deals.py +0 -0
  178. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/cbinsights/equities.py +0 -0
  179. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/cbinsights/fundamentals.py +0 -0
  180. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
  181. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +0 -0
  182. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/forecast.py +0 -0
  183. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/fundamental.py +0 -0
  184. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/geographic_segment.py +0 -0
  185. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/instrument.py +0 -0
  186. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/instrument_price.py +0 -0
  187. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/utils.py +0 -0
  188. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/resources/__init__.py +0 -0
  189. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/resources/classification.py +0 -0
  190. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/resources/instrument_prices.py +0 -0
  191. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/resources/instruments.py +0 -0
  192. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/jinja2.py +0 -0
  193. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/management/__init__.py +0 -0
  194. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/menu.py +0 -0
  195. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0001_initial.py +0 -0
  196. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +0 -0
  197. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +0 -0
  198. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +0 -0
  199. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0005_instrument_corporate_action_backend.py +0 -0
  200. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0006_instrument_officer_backend.py +0 -0
  201. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +0 -0
  202. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0008_controversy.py +0 -0
  203. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +0 -0
  204. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +0 -0
  205. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +0 -0
  206. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +0 -0
  207. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +0 -0
  208. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0014_alter_controversy_instrument.py +0 -0
  209. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0015_instrument_instrument_investible_index.py +0 -0
  210. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0016_instrumenttype_name_repr.py +0 -0
  211. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0017_instrument_instrument_security_index.py +0 -0
  212. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0018_instrument_instrument_level_index.py +0 -0
  213. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0019_alter_controversy_source.py +0 -0
  214. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0020_optionaggregate_option_and_more.py +0 -0
  215. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0021_delete_instrumentdailystatistics.py +0 -0
  216. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +0 -0
  217. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +0 -0
  218. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +0 -0
  219. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0025_instrument_is_primary_and_more.py +0 -0
  220. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0026_instrument_is_cash_equivalent.py +0 -0
  221. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +0 -0
  222. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0028_instrumentprice_annualized_daily_volatility.py +0 -0
  223. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/__init__.py +0 -0
  224. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/__init__.py +0 -0
  225. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/esg/__init__.py +0 -0
  226. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/esg/controversies.py +0 -0
  227. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/exchanges/__init__.py +0 -0
  228. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/exchanges/exchanges.py +0 -0
  229. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/fields.py +0 -0
  230. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/fk_fields.py +0 -0
  231. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/indicators.py +0 -0
  232. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/__init__.py +0 -0
  233. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/classifications.py +0 -0
  234. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/instrument_relationships.py +0 -0
  235. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/instrument_requests.py +0 -0
  236. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/instruments.py +0 -0
  237. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/llm/__init__.py +0 -0
  238. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/mixin/__init__.py +0 -0
  239. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/mixin/financials_computed.py +0 -0
  240. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/mixin/financials_serializer_fields.py +0 -0
  241. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/mixin/instruments.py +0 -0
  242. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/options.py +0 -0
  243. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/private_equities.py +0 -0
  244. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/querysets.py +0 -0
  245. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/utils.py +0 -0
  246. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/preferences.py +0 -0
  247. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/__init__.py +0 -0
  248. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/esg.py +0 -0
  249. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/exchanges.py +0 -0
  250. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/__init__.py +0 -0
  251. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/instrument_lists.py +0 -0
  252. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/instrument_prices.py +0 -0
  253. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/instrument_relationships.py +0 -0
  254. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/instrument_requests.py +0 -0
  255. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/mixins.py +0 -0
  256. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/officers.py +0 -0
  257. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/signals.py +0 -0
  258. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/sync/__init__.py +0 -0
  259. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/sync/abstract.py +0 -0
  260. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/sync/runner.py +0 -0
  261. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tasks.py +0 -0
  262. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/__init__.py +0 -0
  263. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/analysis/__init__.py +0 -0
  264. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
  265. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +0 -0
  266. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/analysis/financial_analysis/test_utils.py +0 -0
  267. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/analysis/test_esg.py +0 -0
  268. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/conftest.py +0 -0
  269. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/dataloaders/__init__.py +0 -0
  270. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/dataloaders/test_cache.py +0 -0
  271. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/__init__.py +0 -0
  272. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_classifications.py +0 -0
  273. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_exchanges.py +0 -0
  274. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_instrument_list.py +0 -0
  275. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_instrument_prices.py +0 -0
  276. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_instruments.py +0 -0
  277. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_merge.py +0 -0
  278. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_options.py +0 -0
  279. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/test_tasks.py +0 -0
  280. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/tests.py +0 -0
  281. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/urls.py +0 -0
  282. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/utils.py +0 -0
  283. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/__init__.py +0 -0
  284. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/__init__.py +0 -0
  285. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/buttons/__init__.py +0 -0
  286. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/buttons/classifications.py +0 -0
  287. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/buttons/exchanges.py +0 -0
  288. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/buttons/instrument_prices.py +0 -0
  289. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/buttons/instruments.py +0 -0
  290. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/__init__.py +0 -0
  291. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/classifications.py +0 -0
  292. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/esg.py +0 -0
  293. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/exchanges.py +0 -0
  294. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/financial_summary.py +0 -0
  295. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/instrument_lists.py +0 -0
  296. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/instrument_prices.py +0 -0
  297. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/instrument_requests.py +0 -0
  298. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/instruments.py +0 -0
  299. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/instruments_relationships.py +0 -0
  300. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/monthly_performances.py +0 -0
  301. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/officers.py +0 -0
  302. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/prices.py +0 -0
  303. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/statement_with_estimates.py +0 -0
  304. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/statements.py +0 -0
  305. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/__init__.py +0 -0
  306. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/classifications.py +0 -0
  307. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/esg.py +0 -0
  308. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/exchanges.py +0 -0
  309. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/financials_analysis.py +0 -0
  310. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/instrument_lists.py +0 -0
  311. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/instrument_prices.py +0 -0
  312. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/instrument_requests.py +0 -0
  313. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/instruments.py +0 -0
  314. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/instruments_relationships.py +0 -0
  315. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/statements.py +0 -0
  316. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/menus/__init__.py +0 -0
  317. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/menus/classifications.py +0 -0
  318. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/menus/exchanges.py +0 -0
  319. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/menus/instrument_lists.py +0 -0
  320. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/menus/instruments.py +0 -0
  321. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/menus/instruments_relationships.py +0 -0
  322. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/__init__.py +0 -0
  323. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/classifications.py +0 -0
  324. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/esg.py +0 -0
  325. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/exchanges.py +0 -0
  326. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +0 -0
  327. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/financials_analysis.py +0 -0
  328. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/instrument_prices.py +0 -0
  329. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/instrument_requests.py +0 -0
  330. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/instruments.py +0 -0
  331. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/instruments_relationships.py +0 -0
  332. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/market_data.py +0 -0
  333. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/prices.py +0 -0
  334. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/statement_with_estimates.py +0 -0
  335. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/esg.py +0 -0
  336. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/exchanges.py +0 -0
  337. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/financial_analysis/__init__.py +0 -0
  338. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +0 -0
  339. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +0 -0
  340. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/financial_analysis/financial_summary.py +0 -0
  341. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/financial_analysis/statement_with_estimates.py +0 -0
  342. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/__init__.py +0 -0
  343. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/financials_analysis.py +0 -0
  344. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/instrument_lists.py +0 -0
  345. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/instrument_requests.py +0 -0
  346. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/instruments.py +0 -0
  347. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/utils.py +0 -0
  348. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/market_data.py +0 -0
  349. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/mixins.py +0 -0
  350. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/officers.py +0 -0
  351. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/prices.py +0 -0
  352. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/statements/__init__.py +0 -0
  353. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/statements/statements.py +0 -0
  354. {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/technical_analysis/__init__.py +0 -0
  355. {wbfdm-1.44.1 → wbfdm-1.44.3}/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.1
3
+ Version: 1.44.3
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.*
@@ -9,7 +9,7 @@ Requires-Dist: stockstats==0.6.*
9
9
  Requires-Dist: wbcore
10
10
  Requires-Dist: wbnews
11
11
  Provides-Extra: dsws
12
- Requires-Dist: datastreampy==2.0.*; extra == 'dsws'
12
+ Requires-Dist: datastreampy==2.0.21; extra == 'dsws'
13
13
  Requires-Dist: requests-cache==1.0.*; extra == 'dsws'
14
14
  Provides-Extra: qa
15
15
  Requires-Dist: jinjasql2==0.1.*; extra == 'qa'
@@ -20,7 +20,7 @@ qa = [
20
20
  ]
21
21
  dsws = [
22
22
  "requests-cache == 1.0.*",
23
- "datastreampy == 2.0.*",
23
+ "datastreampy == 2.0.21", # fix version because newer introduced breaking changes
24
24
  ]
25
25
 
26
26
  [tool.uv.sources]
@@ -43,7 +43,8 @@ class TechnicalAnalysisTraceFactory:
43
43
  name = str(self.ta.instrument)
44
44
  line_options = line_options if line_options else {}
45
45
  text = []
46
-
46
+ if base_series is not None and not base_series.empty:
47
+ prefix = f"Normalized {prefix}"
47
48
  format_template = "{y:.2%}" if percent_format else "{y:.2f}"
48
49
  hovertemplate = "<b>" + prefix + "</b>: %" + format_template
49
50
  # If a base series is present, we add a line into the hover template to show the difference
@@ -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,18 @@
1
+ # Generated by Django 5.0.10 on 2025-02-03 10:25
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('wbfdm', '0028_instrumentprice_annualized_daily_volatility'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='instrumentprice',
15
+ name='volume',
16
+ field=models.FloatField(default=0.0, help_text='The Volume of the Asset on the price date of the Asset.', verbose_name='Volume'),
17
+ ),
18
+ ]
@@ -1,6 +1,7 @@
1
1
  from django.db import models
2
2
  from slugify import slugify
3
3
  from wbcore.contrib.io.mixins import ImportMixin
4
+ from wbcore.contrib.notifications.utils import create_notification_type
4
5
  from wbcore.models import WBModel
5
6
  from wbcore.utils.models import ComplexToStringMixin
6
7
  from wbfdm.import_export.handlers.instrument_list import InstrumentListImportHandler
@@ -51,7 +52,7 @@ class InstrumentListThroughModel(ImportMixin, ComplexToStringMixin):
51
52
  ]
52
53
 
53
54
  notification_types = [
54
- (
55
+ create_notification_type(
55
56
  "wbfdm.instrument_list_add",
56
57
  "Instrument added to Instrument List",
57
58
  "A notification when an instrument gets added to a list.",
@@ -211,8 +211,7 @@ class InstrumentPrice(
211
211
  ########################################################
212
212
 
213
213
  volume = models.FloatField(
214
- null=True,
215
- blank=True,
214
+ default=0.0,
216
215
  verbose_name="Volume",
217
216
  help_text="The Volume of the Asset on the price date of the Asset.",
218
217
  )
@@ -340,7 +339,6 @@ class InstrumentPrice(
340
339
 
341
340
  if self.market_capitalization_consolidated is None:
342
341
  self.market_capitalization_consolidated = self.market_capitalization
343
-
344
342
  super().save(*args, **kwargs)
345
343
 
346
344
  def __str__(self):
@@ -399,6 +397,15 @@ class InstrumentPrice(
399
397
  """
400
398
  return self.instrument.nominal_value(self.date)
401
399
 
400
+ def fill_market_capitalization(self):
401
+ if self.market_capitalization is None:
402
+ with suppress(InstrumentPrice.DoesNotExist):
403
+ self.market_capitalization = (
404
+ self.instrument.valuations.filter(date__lt=self.date, market_capitalization__isnull=False)
405
+ .latest("date")
406
+ .market_capitalization
407
+ )
408
+
402
409
  def compute_and_update_statistics(self, min_period: int = 20):
403
410
  prices_df = (
404
411
  pd.DataFrame(
@@ -6,6 +6,9 @@ from langchain_core.messages import HumanMessage, SystemMessage
6
6
  from pydantic import BaseModel, Field
7
7
  from wbcore.contrib.ai.exceptions import APIStatusErrors
8
8
  from wbcore.contrib.ai.llm.utils import run_llm
9
+ import logging
10
+
11
+ logger = logging.getLogger("llm")
9
12
 
10
13
 
11
14
  class CompanyModel(BaseModel):
@@ -46,33 +49,38 @@ def run_company_extraction_llm(title: str, description: str, *args) -> list[dict
46
49
  from wbfdm.import_export.handlers.instrument import InstrumentLookup
47
50
  from wbfdm.models import Instrument
48
51
 
49
- res = run_llm(
50
- prompt=[
51
- SystemMessage(
52
- content="You will be parsed a news article, please provide the name of the publicly listed companies mentioned in the article, along with their ISIN, ticker, RIC, sentiment, and analysis."
53
- ),
54
- HumanMessage(content=f"Title: {title}, Description: {description}"),
55
- ],
56
- output_model=CompaniesModel,
57
- )
58
52
  relationships = []
59
- instrument_ct = ContentType.objects.get_for_model(Instrument)
60
- for company in res.get("companies", []):
61
- instrument = InstrumentLookup(Instrument).lookup(
62
- only_security=True,
63
- name=company.name,
64
- isin=company.isin,
65
- ticker=company.ticker,
66
- refinitiv_identifier_code=company.refinitiv_identifier_code,
53
+
54
+ try:
55
+ res = run_llm(
56
+ prompt=[
57
+ SystemMessage(
58
+ content="You will be parsed a news article, please provide the name of the publicly listed companies mentioned in the article, along with their ISIN, ticker, RIC, sentiment, and analysis."
59
+ ),
60
+ HumanMessage(content=f"Title: {title}, Description: {description}"),
61
+ ],
62
+ output_model=CompaniesModel,
67
63
  )
68
- if instrument is not None:
69
- relationships.append(
70
- {
71
- "content_type_id": instrument_ct.id,
72
- "object_id": instrument.get_root().id,
73
- "sentiment": company.sentiment,
74
- "analysis": company.analysis,
75
- }
64
+ instrument_ct = ContentType.objects.get_for_model(Instrument)
65
+ for company in res.get("companies", []):
66
+ instrument = InstrumentLookup(Instrument).lookup(
67
+ only_security=True,
68
+ name=company.name,
69
+ isin=company.isin,
70
+ ticker=company.ticker,
71
+ refinitiv_identifier_code=company.refinitiv_identifier_code,
76
72
  )
77
-
73
+ if instrument is not None:
74
+ relationships.append(
75
+ {
76
+ "content_type_id": instrument_ct.id,
77
+ "object_id": instrument.get_root().id,
78
+ "sentiment": company.sentiment,
79
+ "analysis": company.analysis,
80
+ }
81
+ )
82
+ except tuple(APIStatusErrors) as e: # for APIStatusError, we let celery retry it
83
+ raise e
84
+ except Exception as e: # otherwise we log the error and silently fail
85
+ logger.error(str(e))
78
86
  return relationships
@@ -1,7 +1,7 @@
1
1
  from rest_framework import serializers as rf_serializers
2
2
  from rest_framework.reverse import reverse
3
3
  from wbcore import serializers as wb_serializers
4
- from wbcore.serializers import DefaultAttributeFromRemoteField
4
+ from wbcore.serializers import DefaultAttributeFromRemoteField, DefaultFromView
5
5
  from wbfdm.models.instruments import Classification, ClassificationGroup
6
6
  from wbfdm.preferences import get_default_classification_group
7
7
 
@@ -62,7 +62,7 @@ class ClassificationModelSerializer(wb_serializers.ModelSerializer):
62
62
  default=DefaultAttributeFromRemoteField("parent_id", Classification, source="group"),
63
63
  )
64
64
  _group = ClassificationGroupRepresentationSerializer(source="group")
65
- code_aggregated = wb_serializers.CharField(required=False, default="")
65
+ code_aggregated = wb_serializers.CharField(required=False, default=DefaultFromView("next_valid_code_aggregated"))
66
66
  level_representation = wb_serializers.CharField(required=False, default="")
67
67
  description = wb_serializers.TextAreaField(label="Description", allow_null=True, allow_blank=True, required=False)
68
68
 
@@ -72,12 +72,12 @@ class ClassificationModelSerializer(wb_serializers.ModelSerializer):
72
72
  "childs": reverse("wbfdm:classificationparent-classification-list", args=[instance.id], request=request),
73
73
  }
74
74
  if instance.children.exists():
75
- resources[
76
- "iciclechart"
77
- ] = f'{reverse("wbfdm:classificationgroup-iciclechart-list", args=[instance.group.id], request=request)}?top_classification={instance.id}'
78
- resources[
79
- "treechart"
80
- ] = f'{reverse("wbfdm:classificationgroup-treechart-list", args=[instance.group.id], request=request)}?top_classification={instance.id}'
75
+ resources["iciclechart"] = (
76
+ f'{reverse("wbfdm:classificationgroup-iciclechart-list", args=[instance.group.id], request=request)}?top_classification={instance.id}'
77
+ )
78
+ resources["treechart"] = (
79
+ f'{reverse("wbfdm:classificationgroup-treechart-list", args=[instance.group.id], request=request)}?top_classification={instance.id}'
80
+ )
81
81
 
82
82
  resources["instruments"] = reverse("wbfdm:classification-instrument-list", args=[instance.id], request=request)
83
83
 
@@ -130,9 +130,6 @@ class InstrumentModelListSerializer(
130
130
  "inception_date",
131
131
  "delisted_date",
132
132
  "country",
133
- "isin",
134
- "refinitiv_identifier_code",
135
- "ticker",
136
133
  "is_active",
137
134
  "parent",
138
135
  "is_primary",
@@ -97,6 +97,19 @@ class ClassificationModelViewSet(InternalUserPermissionMixin, RevisionMixin, vie
97
97
  title_config_class = ClassificationTitleConfig
98
98
  button_config_class = ClassificationButtonConfig
99
99
 
100
+ @cached_property
101
+ def next_valid_code_aggregated(self) -> str:
102
+ group = None
103
+ parent = None
104
+ if group_id := self.kwargs.get("group_id", None):
105
+ group = ClassificationGroup.objects.get(id=group_id)
106
+ elif parent_id := self.kwargs.get("parent_id", None):
107
+ parent = Classification.objects.get(id=parent_id)
108
+ group = parent.group
109
+ if group:
110
+ return Classification.get_next_valid_code(group, parent=parent)
111
+ return ""
112
+
100
113
 
101
114
  class ClassificationClassificationGroupModelViewSet(ClassificationModelViewSet):
102
115
  endpoint_config_class = ClassificationClassificationGroupEndpointConfig
@@ -530,7 +530,8 @@ class BestAndWorstReturnsInstrumentPandasView(InstrumentMixin, InternalUserPermi
530
530
 
531
531
  def get_dataframe(self, request, queryset, **kwargs):
532
532
  df_to_display = pd.DataFrame()
533
- if not (prices_df := self.instrument.get_prices_df()).empty:
533
+ from_date, to_date = get_date_interval_from_request(self.request, date_range_fieldname="date")
534
+ if not (prices_df := self.instrument.get_prices_df(from_date=from_date, to_date=to_date)).empty:
534
535
  returns_df = FinancialStatistics(prices_df).get_best_and_worst_returns(freq=request.GET.get("frequency"))
535
536
  if not returns_df.empty and returns_df.shape[0] > 0:
536
537
  df_to_display["date_best_returns"] = returns_df["Date Best Return"].dt.strftime("%Y-%m-%d")
@@ -121,6 +121,43 @@ class RelatedInstrumentThroughInstrumentModelViewSet(
121
121
  return super().get_queryset().filter(instrument=self.instrument)
122
122
 
123
123
 
124
+ def get_classified_instrument_serializer_class(classification_grouo_id: int) -> type:
125
+ """
126
+ Unwrap defined serializer class and inject the metric fields into a new class
127
+ """
128
+
129
+ group = ClassificationGroup.objects.get(id=classification_grouo_id)
130
+
131
+ attrs = dict()
132
+ serializer_fields = [
133
+ "id",
134
+ "instrument",
135
+ "_instrument",
136
+ "classification",
137
+ "_classification",
138
+ "is_favorite",
139
+ "tags",
140
+ "_tags",
141
+ ]
142
+ for field_name in group.get_fields_names(sep="_"):
143
+ base_field_name = f"classification_{field_name}"
144
+ # representation_field_name = f"_classification_{field_name}"
145
+ attrs[base_field_name] = wb_serializers.CharField(read_only=True)
146
+ serializer_fields.append(base_field_name)
147
+
148
+ class BaseClassifiedInstrumentModelSerializer(TagSerializerMixin, wb_serializers.ModelSerializer):
149
+ _instrument = ClassifiableInstrumentRepresentationSerializer(source="instrument")
150
+ _classification = ClassificationRepresentationSerializer(source="classification", label_key="{{name}}")
151
+
152
+ class Meta:
153
+ model = InstrumentClassificationThroughModel
154
+ fields = read_only_fields = serializer_fields
155
+
156
+ serializer_class = type("ClassifiedInstrumentModelSerializer", (BaseClassifiedInstrumentModelSerializer,), attrs)
157
+
158
+ return serializer_class
159
+
160
+
124
161
  class ClassifiedInstrumentModelViewSet(InternalUserPermissionMixin, viewsets.ModelViewSet):
125
162
  queryset = InstrumentClassificationThroughModel.objects.all()
126
163
  display_config_class = ClassifiedInstrumentDisplayConfig
@@ -135,43 +172,14 @@ class ClassifiedInstrumentModelViewSet(InternalUserPermissionMixin, viewsets.Mod
135
172
  ordering_fields.append(f"classification_{field_name}")
136
173
  return ordering_fields
137
174
 
138
- def get_serializer_class(self):
139
- """
140
- Unwrap defined serializer class and inject the metric fields into a new class
141
- """
142
-
143
- group = self.classification_group
144
-
145
- attrs = dict()
146
- serializer_fields = [
147
- "id",
148
- "instrument",
149
- "_instrument",
150
- "classification",
151
- "_classification",
152
- "is_favorite",
153
- "tags",
154
- "_tags",
155
- ]
156
- for field_name in group.get_fields_names(sep="_"):
157
- base_field_name = f"classification_{field_name}"
158
- # representation_field_name = f"_classification_{field_name}"
159
- attrs[base_field_name] = wb_serializers.CharField(read_only=True)
160
- serializer_fields.append(base_field_name)
161
-
162
- class BaseClassifiedInstrumentModelSerializer(TagSerializerMixin, wb_serializers.ModelSerializer):
163
- _instrument = ClassifiableInstrumentRepresentationSerializer(source="instrument")
164
- _classification = ClassificationRepresentationSerializer(source="classification", label_key="{{name}}")
165
-
166
- class Meta:
167
- model = InstrumentClassificationThroughModel
168
- fields = read_only_fields = serializer_fields
169
-
170
- serializer_class = type(
171
- "ClassifiedInstrumentModelSerializer", (BaseClassifiedInstrumentModelSerializer,), attrs
172
- )
175
+ def get_resource_serializer_class(self):
176
+ return {
177
+ "serializer_class_path": "wbfdm.viewsets.instruments.instruments_relationships.get_classified_instrument_serializer_class",
178
+ "serializer_class_method_args": [self.classification_group.id],
179
+ }
173
180
 
174
- return serializer_class
181
+ def get_serializer_class(self):
182
+ return get_classified_instrument_serializer_class(self.classification_group.id)
175
183
 
176
184
  def get_filterset_class(self, request):
177
185
  group = self.classification_group
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