wbfdm 1.46.5__tar.gz → 1.46.7__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 (357) hide show
  1. {wbfdm-1.46.5 → wbfdm-1.46.7}/PKG-INFO +1 -1
  2. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/dataloaders/market_data.py +47 -44
  3. wbfdm-1.46.7/wbfdm/contrib/qa/dataloaders/utils.py +68 -0
  4. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/dataloaders/protocols.py +1 -1
  5. wbfdm-1.46.7/wbfdm/migrations/0030_alter_relatedinstrumentthroughmodel_related_type.py +18 -0
  6. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/instrument_relationships.py +1 -0
  7. wbfdm-1.46.5/wbfdm/contrib/qa/dataloaders/utils.py +0 -22
  8. {wbfdm-1.46.5 → wbfdm-1.46.7}/.gitignore +0 -0
  9. {wbfdm-1.46.5 → wbfdm-1.46.7}/pyproject.toml +0 -0
  10. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/__init__.py +0 -0
  11. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/admin/__init__.py +0 -0
  12. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/admin/classifications.py +0 -0
  13. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/admin/esg.py +0 -0
  14. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/admin/exchanges.py +0 -0
  15. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/admin/instrument_lists.py +0 -0
  16. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/admin/instrument_prices.py +0 -0
  17. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/admin/instrument_requests.py +0 -0
  18. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/admin/instruments.py +0 -0
  19. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/admin/instruments_relationships.py +0 -0
  20. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/admin/options.py +0 -0
  21. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/__init__.py +0 -0
  22. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/esg/__init__.py +0 -0
  23. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/esg/enums.py +0 -0
  24. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/esg/esg_analysis.py +0 -0
  25. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/esg/utils.py +0 -0
  26. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/financial_analysis/__init__.py +0 -0
  27. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/financial_analysis/financial_metric_analysis.py +0 -0
  28. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +0 -0
  29. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +0 -0
  30. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/financial_analysis/statement_with_estimates.py +0 -0
  31. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/financial_analysis/utils.py +0 -0
  32. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/technical_analysis/__init__.py +0 -0
  33. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/technical_analysis/technical_analysis.py +0 -0
  34. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/technical_analysis/traces.py +0 -0
  35. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/analysis/utils.py +0 -0
  36. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/apps.py +0 -0
  37. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/backends/dto.py +0 -0
  38. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/__init__.py +0 -0
  39. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/dsws/__init__.py +0 -0
  40. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/dsws/client.py +0 -0
  41. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/dsws/dataloaders/market_data.py +0 -0
  42. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/internal/__init__.py +0 -0
  43. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
  44. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/internal/dataloaders/market_data.py +0 -0
  45. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/__init__.py +0 -0
  46. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/admin/__init__.py +0 -0
  47. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/admin/instruments.py +0 -0
  48. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/admin/metrics.py +0 -0
  49. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/apps.py +0 -0
  50. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/backends/__init__.py +0 -0
  51. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/backends/base.py +0 -0
  52. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/backends/performances.py +0 -0
  53. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/backends/statistics.py +0 -0
  54. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/decorators.py +0 -0
  55. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/dispatch.py +0 -0
  56. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/dto.py +0 -0
  57. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/exceptions.py +0 -0
  58. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/factories.py +0 -0
  59. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/filters.py +0 -0
  60. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/migrations/0001_initial.py +0 -0
  61. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +0 -0
  62. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/migrations/__init__.py +0 -0
  63. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/models.py +0 -0
  64. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/orchestrators.py +0 -0
  65. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/registry.py +0 -0
  66. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/serializers.py +0 -0
  67. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/tasks.py +0 -0
  68. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/tests/__init__.py +0 -0
  69. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
  70. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/tests/backends/test_performances.py +0 -0
  71. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/tests/backends/test_statistics.py +0 -0
  72. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/tests/conftest.py +0 -0
  73. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/tests/test_dto.py +0 -0
  74. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/tests/test_models.py +0 -0
  75. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/tests/test_tasks.py +0 -0
  76. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/tests/test_viewsets.py +0 -0
  77. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/urls.py +0 -0
  78. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/viewsets/__init__.py +0 -0
  79. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/viewsets/configs/__init__.py +0 -0
  80. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/viewsets/configs/display.py +0 -0
  81. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/viewsets/configs/menus.py +0 -0
  82. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/viewsets/configs/utils.py +0 -0
  83. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/viewsets/mixins.py +0 -0
  84. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/metric/viewsets/viewsets.py +0 -0
  85. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/msci/__init__.py +0 -0
  86. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/msci/client.py +0 -0
  87. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
  88. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/msci/dataloaders/esg.py +0 -0
  89. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/msci/dataloaders/esg_controversies.py +0 -0
  90. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/msci/sync.py +0 -0
  91. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/msci/tests/__init__.py +0 -0
  92. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/msci/tests/conftest.py +0 -0
  93. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/msci/tests/test_client.py +0 -0
  94. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/__init__.py +0 -0
  95. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/apps.py +0 -0
  96. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/database_routers.py +0 -0
  97. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
  98. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/dataloaders/adjustments.py +0 -0
  99. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/dataloaders/corporate_actions.py +0 -0
  100. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/dataloaders/financials.py +0 -0
  101. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/dataloaders/officers.py +0 -0
  102. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/dataloaders/reporting_dates.py +0 -0
  103. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/dataloaders/statements.py +0 -0
  104. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/jinja2/qa/sql/companies.sql +0 -0
  105. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/base_estimates.sql +0 -0
  106. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/calendarized.sql +0 -0
  107. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/complete.sql +0 -0
  108. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/estimates.sql +0 -0
  109. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/financials.sql +0 -0
  110. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/jinja2/qa/sql/instruments.sql +0 -0
  111. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/jinja2/qa/sql/quotes.sql +0 -0
  112. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/sync/exchanges.py +0 -0
  113. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/sync/instruments.py +0 -0
  114. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/sync/utils.py +0 -0
  115. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/contrib/qa/tasks.py +0 -0
  116. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/dataloaders/__init__.py +0 -0
  117. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/dataloaders/cache.py +0 -0
  118. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/dataloaders/proxies.py +0 -0
  119. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/dataloaders/types.py +0 -0
  120. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/dynamic_preferences_registry.py +0 -0
  121. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/enums.py +0 -0
  122. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/factories/__init__.py +0 -0
  123. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/factories/classifications.py +0 -0
  124. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/factories/controversies.py +0 -0
  125. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/factories/exchanges.py +0 -0
  126. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/factories/instrument_list.py +0 -0
  127. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/factories/instrument_prices.py +0 -0
  128. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/factories/instruments.py +0 -0
  129. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/factories/instruments_relationships.py +0 -0
  130. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/factories/options.py +0 -0
  131. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/figures/__init__.py +0 -0
  132. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/figures/financials/__init__.py +0 -0
  133. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/figures/financials/financial_analysis_charts.py +0 -0
  134. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/figures/financials/financials_charts.py +0 -0
  135. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/filters/__init__.py +0 -0
  136. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/filters/classifications.py +0 -0
  137. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/filters/exchanges.py +0 -0
  138. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/filters/financials.py +0 -0
  139. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/filters/financials_analysis.py +0 -0
  140. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/filters/instrument_prices.py +0 -0
  141. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/filters/instruments.py +0 -0
  142. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/filters/utils.py +0 -0
  143. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/__init__.py +0 -0
  144. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/__init__.py +0 -0
  145. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/cbinsights/__init__.py +0 -0
  146. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/cbinsights/deals.py +0 -0
  147. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/cbinsights/equities.py +0 -0
  148. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/cbinsights/mixin.py +0 -0
  149. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
  150. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/cbinsights/utils/classifications.py +0 -0
  151. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/cbinsights/utils/client.py +0 -0
  152. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/refinitiv/__init__.py +0 -0
  153. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/refinitiv/daily_fundamental.py +0 -0
  154. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/refinitiv/fiscal_period.py +0 -0
  155. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/refinitiv/forecast.py +0 -0
  156. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/refinitiv/fundamental.py +0 -0
  157. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/refinitiv/geographic_segment.py +0 -0
  158. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/refinitiv/instrument.py +0 -0
  159. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/refinitiv/instrument_price.py +0 -0
  160. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/refinitiv/mixin.py +0 -0
  161. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/refinitiv/utils/__init__.py +0 -0
  162. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/backends/refinitiv/utils/controller.py +0 -0
  163. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/handlers/__init__.py +0 -0
  164. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/handlers/instrument.py +0 -0
  165. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/handlers/instrument_list.py +0 -0
  166. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/handlers/instrument_price.py +0 -0
  167. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/handlers/option.py +0 -0
  168. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/handlers/private_equities.py +0 -0
  169. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/parsers/__init__.py +0 -0
  170. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
  171. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/parsers/cbinsights/deals.py +0 -0
  172. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/parsers/cbinsights/equities.py +0 -0
  173. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/parsers/cbinsights/fundamentals.py +0 -0
  174. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
  175. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +0 -0
  176. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/parsers/refinitiv/forecast.py +0 -0
  177. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/parsers/refinitiv/fundamental.py +0 -0
  178. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/parsers/refinitiv/geographic_segment.py +0 -0
  179. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/parsers/refinitiv/instrument.py +0 -0
  180. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/parsers/refinitiv/instrument_price.py +0 -0
  181. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/parsers/refinitiv/utils.py +0 -0
  182. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/resources/__init__.py +0 -0
  183. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/resources/classification.py +0 -0
  184. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/resources/instrument_prices.py +0 -0
  185. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/import_export/resources/instruments.py +0 -0
  186. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/jinja2.py +0 -0
  187. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/management/__init__.py +0 -0
  188. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/menu.py +0 -0
  189. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0001_initial.py +0 -0
  190. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +0 -0
  191. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +0 -0
  192. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +0 -0
  193. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0005_instrument_corporate_action_backend.py +0 -0
  194. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0006_instrument_officer_backend.py +0 -0
  195. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +0 -0
  196. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0008_controversy.py +0 -0
  197. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +0 -0
  198. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +0 -0
  199. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +0 -0
  200. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +0 -0
  201. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +0 -0
  202. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0014_alter_controversy_instrument.py +0 -0
  203. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0015_instrument_instrument_investible_index.py +0 -0
  204. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0016_instrumenttype_name_repr.py +0 -0
  205. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0017_instrument_instrument_security_index.py +0 -0
  206. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0018_instrument_instrument_level_index.py +0 -0
  207. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0019_alter_controversy_source.py +0 -0
  208. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0020_optionaggregate_option_and_more.py +0 -0
  209. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0021_delete_instrumentdailystatistics.py +0 -0
  210. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +0 -0
  211. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +0 -0
  212. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +0 -0
  213. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0025_instrument_is_primary_and_more.py +0 -0
  214. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0026_instrument_is_cash_equivalent.py +0 -0
  215. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +0 -0
  216. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0028_instrumentprice_annualized_daily_volatility.py +0 -0
  217. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/0029_alter_instrumentprice_volume.py +0 -0
  218. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/migrations/__init__.py +0 -0
  219. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/__init__.py +0 -0
  220. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/esg/__init__.py +0 -0
  221. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/esg/controversies.py +0 -0
  222. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/exchanges/__init__.py +0 -0
  223. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/exchanges/exchanges.py +0 -0
  224. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/fields.py +0 -0
  225. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/fk_fields.py +0 -0
  226. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/indicators.py +0 -0
  227. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/__init__.py +0 -0
  228. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/classifications.py +0 -0
  229. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/instrument_lists.py +0 -0
  230. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/instrument_prices.py +0 -0
  231. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/instrument_requests.py +0 -0
  232. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/instruments.py +0 -0
  233. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/llm/__init__.py +0 -0
  234. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/llm/create_instrument_news_relationships.py +0 -0
  235. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/mixin/__init__.py +0 -0
  236. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/mixin/financials_computed.py +0 -0
  237. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/mixin/financials_serializer_fields.py +0 -0
  238. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/mixin/instruments.py +0 -0
  239. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/options.py +0 -0
  240. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/private_equities.py +0 -0
  241. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/querysets.py +0 -0
  242. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/models/instruments/utils.py +0 -0
  243. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/preferences.py +0 -0
  244. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/serializers/__init__.py +0 -0
  245. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/serializers/esg.py +0 -0
  246. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/serializers/exchanges.py +0 -0
  247. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/serializers/instruments/__init__.py +0 -0
  248. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/serializers/instruments/classifications.py +0 -0
  249. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/serializers/instruments/instrument_lists.py +0 -0
  250. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/serializers/instruments/instrument_prices.py +0 -0
  251. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/serializers/instruments/instrument_relationships.py +0 -0
  252. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/serializers/instruments/instrument_requests.py +0 -0
  253. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/serializers/instruments/instruments.py +0 -0
  254. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/serializers/instruments/mixins.py +0 -0
  255. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/serializers/officers.py +0 -0
  256. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/signals.py +0 -0
  257. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/sync/__init__.py +0 -0
  258. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/sync/abstract.py +0 -0
  259. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/sync/runner.py +0 -0
  260. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tasks.py +0 -0
  261. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/__init__.py +0 -0
  262. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/analysis/__init__.py +0 -0
  263. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
  264. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +0 -0
  265. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/analysis/financial_analysis/test_utils.py +0 -0
  266. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/analysis/test_esg.py +0 -0
  267. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/conftest.py +0 -0
  268. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/dataloaders/__init__.py +0 -0
  269. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/dataloaders/test_cache.py +0 -0
  270. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/models/__init__.py +0 -0
  271. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/models/test_classifications.py +0 -0
  272. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/models/test_exchanges.py +0 -0
  273. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/models/test_instrument_list.py +0 -0
  274. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/models/test_instrument_prices.py +0 -0
  275. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/models/test_instruments.py +0 -0
  276. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/models/test_merge.py +0 -0
  277. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/models/test_options.py +0 -0
  278. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/test_tasks.py +0 -0
  279. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/tests/tests.py +0 -0
  280. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/urls.py +0 -0
  281. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/utils.py +0 -0
  282. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/__init__.py +0 -0
  283. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/__init__.py +0 -0
  284. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/buttons/__init__.py +0 -0
  285. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/buttons/classifications.py +0 -0
  286. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/buttons/exchanges.py +0 -0
  287. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/buttons/instrument_prices.py +0 -0
  288. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/buttons/instruments.py +0 -0
  289. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/__init__.py +0 -0
  290. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/classifications.py +0 -0
  291. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/esg.py +0 -0
  292. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/exchanges.py +0 -0
  293. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/financial_summary.py +0 -0
  294. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/instrument_lists.py +0 -0
  295. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/instrument_prices.py +0 -0
  296. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/instrument_requests.py +0 -0
  297. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/instruments.py +0 -0
  298. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/instruments_relationships.py +0 -0
  299. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/monthly_performances.py +0 -0
  300. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/officers.py +0 -0
  301. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/prices.py +0 -0
  302. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/statement_with_estimates.py +0 -0
  303. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/display/statements.py +0 -0
  304. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/endpoints/__init__.py +0 -0
  305. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/endpoints/classifications.py +0 -0
  306. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/endpoints/esg.py +0 -0
  307. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/endpoints/exchanges.py +0 -0
  308. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/endpoints/financials_analysis.py +0 -0
  309. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/endpoints/instrument_lists.py +0 -0
  310. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/endpoints/instrument_prices.py +0 -0
  311. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/endpoints/instrument_requests.py +0 -0
  312. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/endpoints/instruments.py +0 -0
  313. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/endpoints/instruments_relationships.py +0 -0
  314. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/endpoints/statements.py +0 -0
  315. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/menus/__init__.py +0 -0
  316. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/menus/classifications.py +0 -0
  317. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/menus/exchanges.py +0 -0
  318. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/menus/instrument_lists.py +0 -0
  319. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/menus/instruments.py +0 -0
  320. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/menus/instruments_relationships.py +0 -0
  321. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/titles/__init__.py +0 -0
  322. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/titles/classifications.py +0 -0
  323. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/titles/esg.py +0 -0
  324. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/titles/exchanges.py +0 -0
  325. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +0 -0
  326. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/titles/financials_analysis.py +0 -0
  327. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/titles/instrument_prices.py +0 -0
  328. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/titles/instrument_requests.py +0 -0
  329. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/titles/instruments.py +0 -0
  330. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/titles/instruments_relationships.py +0 -0
  331. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/titles/market_data.py +0 -0
  332. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/titles/prices.py +0 -0
  333. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/configs/titles/statement_with_estimates.py +0 -0
  334. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/esg.py +0 -0
  335. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/exchanges.py +0 -0
  336. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/financial_analysis/__init__.py +0 -0
  337. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +0 -0
  338. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +0 -0
  339. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/financial_analysis/financial_summary.py +0 -0
  340. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/financial_analysis/statement_with_estimates.py +0 -0
  341. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/instruments/__init__.py +0 -0
  342. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/instruments/classifications.py +0 -0
  343. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/instruments/financials_analysis.py +0 -0
  344. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/instruments/instrument_lists.py +0 -0
  345. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/instruments/instrument_prices.py +0 -0
  346. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/instruments/instrument_requests.py +0 -0
  347. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/instruments/instruments.py +0 -0
  348. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/instruments/instruments_relationships.py +0 -0
  349. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/instruments/utils.py +0 -0
  350. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/market_data.py +0 -0
  351. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/mixins.py +0 -0
  352. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/officers.py +0 -0
  353. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/prices.py +0 -0
  354. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/statements/__init__.py +0 -0
  355. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/statements/statements.py +0 -0
  356. {wbfdm-1.46.5 → wbfdm-1.46.7}/wbfdm/viewsets/technical_analysis/__init__.py +0 -0
  357. {wbfdm-1.46.5 → wbfdm-1.46.7}/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.46.5
3
+ Version: 1.46.7
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.*
@@ -3,11 +3,11 @@ from datetime import date
3
3
  from enum import Enum
4
4
  from functools import reduce
5
5
  from itertools import batched
6
- from typing import Iterator
6
+ from typing import TYPE_CHECKING, Iterator
7
7
 
8
8
  import pypika as pk
9
9
  from django.db import ProgrammingError, connections
10
- from pypika import Column, MSSQLQuery
10
+ from pypika import Case, Column, MSSQLQuery
11
11
  from pypika import functions as fn
12
12
  from pypika.enums import Order, SqlTypes
13
13
  from pypika.terms import LiteralValue, ValueWrapper
@@ -19,24 +19,27 @@ from wbfdm.dataloaders.protocols import MarketDataProtocol
19
19
  from wbfdm.dataloaders.types import MarketDataDict
20
20
  from wbfdm.enums import Frequency, MarketData
21
21
 
22
+ if TYPE_CHECKING:
23
+ pass
24
+
22
25
 
23
26
  class DS2MarketData(Enum):
24
- OPEN = ("Open_", 1)
25
- CLOSE = ("Close_", 1)
26
- HIGH = ("High", 1)
27
- LOW = ("Low", 1)
28
- BID = ("Bid", 1)
29
- ASK = ("Ask", 1)
30
- VWAP = ("VWAP", 1)
31
- VOLUME = ("Volume", 1)
32
- MARKET_CAPITALIZATION = ("ConsolMktVal", 1_000_000)
33
- SHARES_OUTSTANDING = ("ConsolNumShrs", 1_000)
27
+ OPEN = "Open_"
28
+ CLOSE = "Close_"
29
+ HIGH = "High"
30
+ LOW = "Low"
31
+ BID = "Bid"
32
+ ASK = "Ask"
33
+ VWAP = "VWAP"
34
+ VOLUME = "Volume"
35
+ MARKET_CAPITALIZATION = "MktCap"
36
+ SHARES_OUTSTANDING = "NumShrs"
34
37
 
35
38
 
36
39
  class DatastreamMarketDataDataloader(MarketDataProtocol, Dataloader):
37
40
  def market_data(
38
41
  self,
39
- values: list[MarketData] | None = [MarketData.CLOSE],
42
+ values: list[MarketData] = [MarketData.CLOSE],
40
43
  from_date: date | None = None,
41
44
  to_date: date | None = None,
42
45
  exact_date: date | None = None,
@@ -60,17 +63,10 @@ class DatastreamMarketDataDataloader(MarketDataProtocol, Dataloader):
60
63
  lookup = {
61
64
  f"{k[0]},{k[1]}": v for k, v in self.entities.values_list("dl_parameters__market_data__parameters", "id")
62
65
  }
63
- value_mapping = [(DS2MarketData[x.name].value, x.value) for x in values or []]
64
66
 
65
67
  # Define tables
66
68
  pricing = pk.Table("vw_DS2Pricing")
67
- market_val = pk.Table("DS2MktVal")
68
- fx_code = pk.Table("DS2FxCode")
69
- fx = pk.Table("DS2FxRate")
70
-
71
- quotes = pk.Table("DS2CtryQtInfo")
72
- securities = pk.Table("DS2Security")
73
- securities2 = pk.Table("DS2Security", alias="securities2")
69
+ market_val = pk.Table("vw_DS2MktCap")
74
70
 
75
71
  mapping, create_mapping_table = create_table(
76
72
  "#ds2infoexchcode", Column("InfoCode", SqlTypes.INTEGER), Column("ExchIntCode", SqlTypes.INTEGER)
@@ -87,14 +83,6 @@ class DatastreamMarketDataDataloader(MarketDataProtocol, Dataloader):
87
83
  fn.Cast(pricing.MarketDate, SqlTypes.DATE).as_("valuation_date"),
88
84
  ValueWrapper("qa-ds2").as_("source"),
89
85
  )
90
- .join(quotes)
91
- .on_field("InfoCode")
92
- .join(securities)
93
- .on(quotes.DsSecCode == securities.DsSecCode)
94
- .join(securities2)
95
- .on((securities2.DsCmpyCode == securities.DsCmpyCode) & securities2.IsMajorSec == "Y")
96
- .left_join(market_val)
97
- .on((securities2.PrimQtInfoCode == market_val.InfoCode) & (pricing.MarketDate == market_val.ValDate))
98
86
  # We join on _codes, which removes all instruments not in _codes - implicit where
99
87
  .join(mapping)
100
88
  .on((pricing.InfoCode == mapping.InfoCode) & (pricing.ExchIntCode == mapping.ExchIntCode))
@@ -102,31 +90,46 @@ class DatastreamMarketDataDataloader(MarketDataProtocol, Dataloader):
102
90
  .orderby(pricing.MarketDate, order=Order.desc)
103
91
  )
104
92
 
105
- # If we need to convert to a target currency, we need the fx rate table and multiply all values with the fx rate
93
+ # if a target currency is required, we join on the fx tables and set the currency to the desired one
94
+ # otherwise we just set the currency to whatever the currency is from the instrument
95
+ fx_rate = None
106
96
  if target_currency:
97
+ query = query.select(ValueWrapper(target_currency).as_("currency"))
98
+ fx_code = pk.Table("DS2FxCode")
99
+ fx_rate = pk.Table("DS2FxRate")
107
100
  query = (
108
- query.select(
109
- ValueWrapper(target_currency).as_("currency"),
110
- *[
111
- (LiteralValue(value[0][0]) * fn.Coalesce(fx.midrate, 1) * value[0][1]).as_(value[1])
112
- for value in value_mapping
113
- ],
114
- )
101
+ query
102
+ # Join FX code table matching currencies and ensuring SPOT rate type
115
103
  .left_join(fx_code)
116
104
  .on(
117
- (fx_code.FromCurrCode == target_currency)
118
- & (fx_code.ToCurrCode == pricing.Currency)
105
+ (fx_code.FromCurrCode == pricing.Currency)
106
+ & (fx_code.ToCurrCode == target_currency)
119
107
  & (fx_code.RateTypeCode == "SPOT")
120
108
  )
121
- .left_join(fx)
122
- .on((fx_code.ExRateIntCode == fx.ExRateIntCode) & (fx.ExRateDate == pricing.MarketDate))
109
+ # Join FX rate table matching internal code and date
110
+ .left_join(fx_rate)
111
+ .on((fx_rate.ExRateIntCode == fx_code.ExRateIntCode) & (fx_rate.ExRateDate == pricing.MarketDate))
112
+ # We filter out rows which do not have a proper fx rate (we exclude same currency conversions)
113
+ .where((Case().when(pricing.Currency == target_currency, 1).else_(fx_rate.midrate).isnotnull()))
123
114
  )
115
+
124
116
  else:
125
- query = query.select(
126
- pricing.Currency.as_("currency"),
127
- *[(LiteralValue(value[0][0]) * value[0][1]).as_(value[1]) for value in value_mapping],
117
+ query = query.select(pricing.Currency.as_("currency"))
118
+
119
+ # if market cap or shares outstanding are required we need to join with an additional table
120
+ if MarketData.MARKET_CAPITALIZATION in values or MarketData.SHARES_OUTSTANDING in values:
121
+ query = query.join(market_val).on(
122
+ (pricing.InfoCode == market_val.InfoCode) & (pricing.MarketDate == market_val.MarketDate)
128
123
  )
129
124
 
125
+ for market_data in values:
126
+ ds2_value = DS2MarketData[market_data.name].value
127
+ value = LiteralValue(ds2_value)
128
+ if fx_rate and market_data is not MarketData.SHARES_OUTSTANDING:
129
+ value /= Case().when(pricing.Currency == target_currency, 1).else_(fx_rate.midrate)
130
+
131
+ query = query.select(value.as_(market_data.value))
132
+
130
133
  # Add conditional where clauses
131
134
  if from_date:
132
135
  query = query.where(pricing.MarketDate >= from_date)
@@ -0,0 +1,68 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ from pypika import Case, Column, Criterion, Field, MSSQLQuery, Table
4
+ from pypika.terms import ValueWrapper
5
+
6
+ if TYPE_CHECKING:
7
+ from pypika.queries import CreateQueryBuilder, QueryBuilder
8
+ from pypika.terms import Term
9
+
10
+
11
+ def compile_source(source: str) -> "Term":
12
+ return ValueWrapper(source).as_("source")
13
+
14
+
15
+ SOURCE_DS2 = compile_source("qa-ds2")
16
+ SOURCE_RKD = compile_source("qa-rkd")
17
+ SOURCE_IBES = compile_source("qa-ibes")
18
+
19
+
20
+ def create_table(tablename: "str", *columns: "Column") -> tuple[Table, "CreateQueryBuilder"]:
21
+ table = Table(tablename)
22
+ return table, MSSQLQuery.create_table(table).columns(*columns)
23
+
24
+
25
+ def get_currency_fx_rate(
26
+ query: "QueryBuilder", alias_prefix: str, from_ccy: str | Field, to_ccy: str | Field, fx_date: str | Criterion
27
+ ) -> tuple["QueryBuilder", Criterion]:
28
+ """Gets the currency exchange rate with fallback to 1 if rate not found.
29
+
30
+ Extends a query with FX table joins to retrieve currency conversion rates. Uses left joins
31
+ and provides a default rate of 1 when no conversion rate exists, effectively making the
32
+ conversion neutral in such cases.
33
+
34
+ Warning:
35
+ The alias_prefix must be unique across the entire query chain. Reusing the same
36
+ prefix in multiple calls will cause table alias conflicts, leading to incorrect
37
+ results or SQL errors. Each call to this function should use a distinct prefix.
38
+
39
+ Args:
40
+ query (QueryBuilder): Base query to extend with FX-related joins
41
+ alias_prefix (str): Prefix for table aliases to prevent naming conflicts in joins.
42
+ Must be unique across the entire query chain.
43
+ from_ccy (str | pk.Field): Source currency code or Field to convert from
44
+ to_ccy (str | pk.Field): Target currency code or Field to convert to
45
+ fx_date (Any): Date for which to get the exchange rate
46
+
47
+ Returns:
48
+ tuple[QueryBuilder, pk.Criterion]: A tuple containing:
49
+ - Modified query with FX table joins
50
+ - Coalesced midrate (defaults to 1 if no rate found)
51
+ """
52
+ # Create aliased FX tables to avoid naming conflicts in complex queries
53
+ fx_code = Table("DS2FxCode", alias=f"{alias_prefix}DS2FxCode")
54
+ fx_rate = Table("DS2FxRate", alias=f"{alias_prefix}DS2FxRate")
55
+ # Build query with FX table joins
56
+ query = (
57
+ query
58
+ # Join FX code table matching currencies and ensuring SPOT rate type
59
+ .left_join(fx_code)
60
+ .on((fx_code.FromCurrCode == from_ccy) & (fx_code.ToCurrCode == to_ccy) & (fx_code.RateTypeCode == "SPOT"))
61
+ # Join FX rate table matching internal code and date
62
+ .left_join(fx_rate)
63
+ .on((fx_rate.ExRateIntCode == fx_code.ExRateIntCode) & (fx_rate.ExRateDate == fx_date))
64
+ )
65
+
66
+ # Return query and coalesced rate (falls back to 1 if no rate found)
67
+ fx = Case().when(from_ccy == to_ccy, 1).else_(fx_rate.midrate)
68
+ return (query, fx)
@@ -39,7 +39,7 @@ class AdjustmentsProtocol(Protocol):
39
39
  class MarketDataProtocol(Protocol):
40
40
  def market_data(
41
41
  self,
42
- values: list[MarketData] | None = [MarketData.CLOSE],
42
+ values: list[MarketData] = [MarketData.CLOSE],
43
43
  from_date: date | None = None,
44
44
  to_date: date | None = None,
45
45
  exact_date: date | None = None,
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.0.12 on 2025-02-20 14:48
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('wbfdm', '0029_alter_instrumentprice_volume'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='relatedinstrumentthroughmodel',
15
+ name='related_type',
16
+ field=models.CharField(choices=[('BENCHMARK', 'Benchmark'), ('PEER', 'Peer'), ('RISK_INSTRUMENT', 'Risk Instrument'), ('TRACKER', 'Tracker')], default='BENCHMARK', max_length=32),
17
+ ),
18
+ ]
@@ -140,6 +140,7 @@ class RelatedInstrumentThroughModel(models.Model):
140
140
  BENCHMARK = "BENCHMARK", "Benchmark"
141
141
  PEER = "PEER", "Peer"
142
142
  RISK_INSTRUMENT = "RISK_INSTRUMENT", "Risk Instrument"
143
+ TRACKER = "TRACKER", "Tracker"
143
144
 
144
145
  instrument = models.ForeignKey(
145
146
  "wbfdm.Instrument",
@@ -1,22 +0,0 @@
1
- from typing import TYPE_CHECKING
2
-
3
- from pypika import Column, MSSQLQuery, Table
4
- from pypika.terms import ValueWrapper
5
-
6
- if TYPE_CHECKING:
7
- from pypika.queries import CreateQueryBuilder
8
- from pypika.terms import Term
9
-
10
-
11
- def compile_source(source: str) -> "Term":
12
- return ValueWrapper(source).as_("source")
13
-
14
-
15
- SOURCE_DS2 = compile_source("qa-ds2")
16
- SOURCE_RKD = compile_source("qa-rkd")
17
- SOURCE_IBES = compile_source("qa-ibes")
18
-
19
-
20
- def create_table(tablename: "str", *columns: "Column") -> tuple[Table, "CreateQueryBuilder"]:
21
- table = Table(tablename)
22
- return table, MSSQLQuery.create_table(table).columns(*columns)
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
File without changes
File without changes
File without changes
File without changes