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.
- {wbfdm-1.44.1 → wbfdm-1.44.3}/PKG-INFO +2 -2
- {wbfdm-1.44.1 → wbfdm-1.44.3}/pyproject.toml +1 -1
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/technical_analysis/traces.py +2 -1
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/adjustments.py +1 -1
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/market_data.py +10 -10
- wbfdm-1.44.3/wbfdm/migrations/0029_alter_instrumentprice_volume.py +18 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/instrument_lists.py +2 -1
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/instrument_prices.py +10 -3
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/llm/create_instrument_news_relationships.py +34 -26
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/classifications.py +8 -8
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/instruments.py +0 -3
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/classifications.py +13 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/instrument_prices.py +2 -1
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/instruments_relationships.py +44 -36
- {wbfdm-1.44.1 → wbfdm-1.44.3}/.gitignore +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/classifications.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/esg.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/exchanges.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/instrument_lists.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/instrument_prices.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/instrument_requests.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/instruments_relationships.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/admin/options.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/esg/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/esg/enums.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/esg/esg_analysis.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/esg/utils.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/financial_metric_analysis.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/statement_with_estimates.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/utils.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/technical_analysis/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/technical_analysis/technical_analysis.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/utils.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/apps.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/backends/dto.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/dsws/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/dsws/client.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/dsws/dataloaders/market_data.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/internal/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/internal/dataloaders/market_data.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/admin/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/admin/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/admin/metrics.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/apps.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/backends/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/backends/base.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/backends/performances.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/backends/statistics.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/decorators.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/dispatch.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/dto.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/exceptions.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/factories.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/filters.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/migrations/0001_initial.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/migrations/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/models.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/orchestrators.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/registry.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/serializers.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tasks.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/backends/test_performances.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/backends/test_statistics.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/conftest.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/test_dto.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/test_models.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/test_tasks.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/tests/test_viewsets.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/urls.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/configs/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/configs/display.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/configs/menus.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/configs/utils.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/mixins.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/metric/viewsets/viewsets.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/client.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/dataloaders/esg.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/dataloaders/esg_controversies.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/sync.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/tests/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/tests/conftest.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/msci/tests/test_client.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/apps.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/database_routers.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/corporate_actions.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/financials.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/officers.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/reporting_dates.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/statements.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/dataloaders/utils.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/companies.sql +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/base_estimates.sql +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/calendarized.sql +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/complete.sql +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/estimates.sql +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/financials.sql +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/instruments.sql +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/jinja2/qa/sql/quotes.sql +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/sync/exchanges.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/sync/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/sync/utils.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/contrib/qa/tasks.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/dataloaders/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/dataloaders/cache.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/dataloaders/protocols.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/dataloaders/proxies.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/dataloaders/types.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/dynamic_preferences_registry.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/enums.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/classifications.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/controversies.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/exchanges.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/instrument_list.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/instrument_prices.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/instruments_relationships.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/factories/options.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/figures/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/figures/financials/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/figures/financials/financial_analysis_charts.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/figures/financials/financials_charts.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/classifications.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/exchanges.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/financials.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/financials_analysis.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/instrument_prices.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/filters/utils.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/deals.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/equities.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/mixin.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/utils/classifications.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/cbinsights/utils/client.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/daily_fundamental.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/fiscal_period.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/forecast.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/fundamental.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/geographic_segment.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/instrument.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/instrument_price.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/mixin.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/utils/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/backends/refinitiv/utils/controller.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/handlers/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/handlers/instrument.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/handlers/instrument_list.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/handlers/instrument_price.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/handlers/option.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/handlers/private_equities.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/cbinsights/deals.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/cbinsights/equities.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/cbinsights/fundamentals.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/forecast.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/fundamental.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/geographic_segment.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/instrument.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/instrument_price.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/parsers/refinitiv/utils.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/resources/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/resources/classification.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/resources/instrument_prices.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/import_export/resources/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/jinja2.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/management/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/menu.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0001_initial.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0005_instrument_corporate_action_backend.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0006_instrument_officer_backend.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0008_controversy.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0014_alter_controversy_instrument.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0015_instrument_instrument_investible_index.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0016_instrumenttype_name_repr.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0017_instrument_instrument_security_index.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0018_instrument_instrument_level_index.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0019_alter_controversy_source.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0020_optionaggregate_option_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0021_delete_instrumentdailystatistics.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0025_instrument_is_primary_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0026_instrument_is_cash_equivalent.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/0028_instrumentprice_annualized_daily_volatility.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/migrations/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/esg/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/esg/controversies.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/exchanges/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/exchanges/exchanges.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/fields.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/fk_fields.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/indicators.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/classifications.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/instrument_relationships.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/instrument_requests.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/llm/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/mixin/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/mixin/financials_computed.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/mixin/financials_serializer_fields.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/mixin/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/options.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/private_equities.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/querysets.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/utils.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/preferences.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/esg.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/exchanges.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/instrument_lists.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/instrument_prices.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/instrument_relationships.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/instrument_requests.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/instruments/mixins.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/serializers/officers.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/signals.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/sync/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/sync/abstract.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/sync/runner.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tasks.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/analysis/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/analysis/financial_analysis/test_utils.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/analysis/test_esg.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/conftest.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/dataloaders/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/dataloaders/test_cache.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_classifications.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_exchanges.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_instrument_list.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_instrument_prices.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_merge.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/models/test_options.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/test_tasks.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/tests/tests.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/urls.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/utils.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/buttons/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/buttons/classifications.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/buttons/exchanges.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/buttons/instrument_prices.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/buttons/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/classifications.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/esg.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/exchanges.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/financial_summary.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/instrument_lists.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/instrument_prices.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/instrument_requests.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/instruments_relationships.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/monthly_performances.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/officers.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/prices.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/statement_with_estimates.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/display/statements.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/classifications.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/esg.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/exchanges.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/financials_analysis.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/instrument_lists.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/instrument_prices.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/instrument_requests.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/instruments_relationships.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/endpoints/statements.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/menus/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/menus/classifications.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/menus/exchanges.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/menus/instrument_lists.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/menus/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/menus/instruments_relationships.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/classifications.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/esg.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/exchanges.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/financials_analysis.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/instrument_prices.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/instrument_requests.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/instruments_relationships.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/market_data.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/prices.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/configs/titles/statement_with_estimates.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/esg.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/exchanges.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/financial_analysis/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/financial_analysis/financial_summary.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/financial_analysis/statement_with_estimates.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/financials_analysis.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/instrument_lists.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/instrument_requests.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/instruments.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/instruments/utils.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/market_data.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/mixins.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/officers.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/prices.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/statements/__init__.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/statements/statements.py +0 -0
- {wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/viewsets/technical_analysis/__init__.py +0 -0
- {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.
|
|
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
|
|
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'
|
|
@@ -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_("
|
|
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_",
|
|
23
|
-
CLOSE = ("Close_",
|
|
24
|
-
HIGH = ("High",
|
|
25
|
-
LOW = ("Low",
|
|
26
|
-
BID = ("Bid",
|
|
27
|
-
ASK = ("Ask",
|
|
28
|
-
VWAP = ("VWAP",
|
|
29
|
-
VOLUME = ("Volume",
|
|
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
|
-
|
|
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(
|
{wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/models/instruments/llm/create_instrument_news_relationships.py
RENAMED
|
@@ -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
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
78
|
-
resources[
|
|
79
|
-
"treechart"
|
|
80
|
-
|
|
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
|
|
|
@@ -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
|
-
|
|
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
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/financial_metric_analysis.py
RENAMED
|
File without changes
|
|
File without changes
|
{wbfdm-1.44.1 → wbfdm-1.44.3}/wbfdm/analysis/financial_analysis/financial_statistics_analysis.py
RENAMED
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|