wbfdm 1.46.9__tar.gz → 1.46.11__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.46.9 → wbfdm-1.46.11}/PKG-INFO +1 -1
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/factories/instrument_prices.py +3 -1
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/instrument_prices.py +8 -4
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/instruments.py +2 -5
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/mixin/instruments.py +2 -91
- wbfdm-1.46.11/wbfdm/models/instruments/querysets.py +156 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tasks.py +12 -8
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/models/test_instruments.py +2 -0
- wbfdm-1.46.9/wbfdm/models/instruments/querysets.py +0 -73
- {wbfdm-1.46.9 → wbfdm-1.46.11}/.gitignore +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/pyproject.toml +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/admin/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/admin/classifications.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/admin/esg.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/admin/exchanges.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/admin/instrument_lists.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/admin/instrument_prices.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/admin/instrument_requests.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/admin/instruments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/admin/instruments_relationships.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/admin/options.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/esg/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/esg/enums.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/esg/esg_analysis.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/esg/utils.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/financial_analysis/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/financial_analysis/financial_metric_analysis.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/financial_analysis/statement_with_estimates.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/financial_analysis/utils.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/technical_analysis/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/technical_analysis/technical_analysis.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/technical_analysis/traces.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/utils.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/apps.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/backends/dto.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/dsws/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/dsws/client.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/dsws/dataloaders/market_data.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/internal/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/internal/dataloaders/market_data.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/admin/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/admin/instruments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/admin/metrics.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/apps.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/backends/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/backends/base.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/backends/performances.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/backends/statistics.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/decorators.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/dispatch.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/dto.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/exceptions.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/factories.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/filters.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/migrations/0001_initial.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/migrations/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/models.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/orchestrators.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/registry.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/serializers.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/tasks.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/tests/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/tests/backends/test_performances.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/tests/backends/test_statistics.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/tests/conftest.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/tests/test_dto.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/tests/test_models.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/tests/test_tasks.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/tests/test_viewsets.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/urls.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/viewsets/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/viewsets/configs/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/viewsets/configs/display.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/viewsets/configs/menus.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/viewsets/configs/utils.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/viewsets/mixins.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/metric/viewsets/viewsets.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/msci/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/msci/client.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/msci/dataloaders/esg.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/msci/dataloaders/esg_controversies.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/msci/sync.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/msci/tests/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/msci/tests/conftest.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/msci/tests/test_client.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/apps.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/database_routers.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/dataloaders/adjustments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/dataloaders/corporate_actions.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/dataloaders/financials.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/dataloaders/market_data.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/dataloaders/officers.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/dataloaders/reporting_dates.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/dataloaders/statements.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/dataloaders/utils.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/jinja2/qa/sql/companies.sql +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/base_estimates.sql +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/calendarized.sql +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/complete.sql +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/estimates.sql +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/jinja2/qa/sql/ibes/financials.sql +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/jinja2/qa/sql/instruments.sql +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/jinja2/qa/sql/quotes.sql +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/sync/exchanges.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/sync/instruments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/sync/utils.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/contrib/qa/tasks.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/dataloaders/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/dataloaders/cache.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/dataloaders/protocols.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/dataloaders/proxies.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/dataloaders/types.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/dynamic_preferences_registry.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/enums.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/factories/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/factories/classifications.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/factories/controversies.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/factories/exchanges.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/factories/instrument_list.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/factories/instruments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/factories/instruments_relationships.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/factories/options.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/figures/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/figures/financials/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/figures/financials/financial_analysis_charts.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/figures/financials/financials_charts.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/filters/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/filters/classifications.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/filters/exchanges.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/filters/financials.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/filters/financials_analysis.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/filters/instrument_prices.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/filters/instruments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/filters/utils.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/cbinsights/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/cbinsights/deals.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/cbinsights/equities.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/cbinsights/mixin.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/cbinsights/utils/classifications.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/cbinsights/utils/client.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/refinitiv/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/refinitiv/daily_fundamental.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/refinitiv/fiscal_period.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/refinitiv/forecast.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/refinitiv/fundamental.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/refinitiv/geographic_segment.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/refinitiv/instrument.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/refinitiv/instrument_price.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/refinitiv/mixin.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/refinitiv/utils/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/backends/refinitiv/utils/controller.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/handlers/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/handlers/instrument.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/handlers/instrument_list.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/handlers/instrument_price.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/handlers/option.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/handlers/private_equities.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/parsers/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/parsers/cbinsights/deals.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/parsers/cbinsights/equities.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/parsers/cbinsights/fundamentals.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/parsers/refinitiv/forecast.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/parsers/refinitiv/fundamental.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/parsers/refinitiv/geographic_segment.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/parsers/refinitiv/instrument.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/parsers/refinitiv/instrument_price.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/parsers/refinitiv/utils.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/resources/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/resources/classification.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/resources/instrument_prices.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/import_export/resources/instruments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/jinja2.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/management/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/menu.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0001_initial.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0005_instrument_corporate_action_backend.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0006_instrument_officer_backend.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0008_controversy.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0014_alter_controversy_instrument.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0015_instrument_instrument_investible_index.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0016_instrumenttype_name_repr.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0017_instrument_instrument_security_index.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0018_instrument_instrument_level_index.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0019_alter_controversy_source.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0020_optionaggregate_option_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0021_delete_instrumentdailystatistics.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0025_instrument_is_primary_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0026_instrument_is_cash_equivalent.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0028_instrumentprice_annualized_daily_volatility.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0029_alter_instrumentprice_volume.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/0030_alter_relatedinstrumentthroughmodel_related_type.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/migrations/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/esg/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/esg/controversies.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/exchanges/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/exchanges/exchanges.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/fields.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/fk_fields.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/indicators.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/classifications.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/instrument_lists.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/instrument_relationships.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/instrument_requests.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/llm/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/llm/create_instrument_news_relationships.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/mixin/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/mixin/financials_computed.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/mixin/financials_serializer_fields.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/options.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/private_equities.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/models/instruments/utils.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/preferences.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/serializers/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/serializers/esg.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/serializers/exchanges.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/serializers/instruments/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/serializers/instruments/classifications.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/serializers/instruments/instrument_lists.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/serializers/instruments/instrument_prices.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/serializers/instruments/instrument_relationships.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/serializers/instruments/instrument_requests.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/serializers/instruments/instruments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/serializers/instruments/mixins.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/serializers/officers.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/signals.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/sync/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/sync/abstract.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/sync/runner.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/analysis/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/analysis/financial_analysis/test_utils.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/analysis/test_esg.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/conftest.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/dataloaders/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/dataloaders/test_cache.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/models/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/models/test_classifications.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/models/test_exchanges.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/models/test_instrument_list.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/models/test_instrument_prices.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/models/test_merge.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/models/test_options.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/test_tasks.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/tests/tests.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/urls.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/utils.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/buttons/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/buttons/classifications.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/buttons/exchanges.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/buttons/instrument_prices.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/buttons/instruments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/classifications.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/esg.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/exchanges.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/financial_summary.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/instrument_lists.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/instrument_prices.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/instrument_requests.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/instruments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/instruments_relationships.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/monthly_performances.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/officers.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/prices.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/statement_with_estimates.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/display/statements.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/endpoints/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/endpoints/classifications.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/endpoints/esg.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/endpoints/exchanges.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/endpoints/financials_analysis.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/endpoints/instrument_lists.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/endpoints/instrument_prices.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/endpoints/instrument_requests.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/endpoints/instruments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/endpoints/instruments_relationships.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/endpoints/statements.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/menus/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/menus/classifications.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/menus/exchanges.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/menus/instrument_lists.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/menus/instruments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/menus/instruments_relationships.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/titles/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/titles/classifications.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/titles/esg.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/titles/exchanges.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/titles/financials_analysis.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/titles/instrument_prices.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/titles/instrument_requests.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/titles/instruments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/titles/instruments_relationships.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/titles/market_data.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/titles/prices.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/configs/titles/statement_with_estimates.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/esg.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/exchanges.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/financial_analysis/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/financial_analysis/financial_summary.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/financial_analysis/statement_with_estimates.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/instruments/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/instruments/classifications.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/instruments/financials_analysis.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/instruments/instrument_lists.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/instruments/instrument_prices.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/instruments/instrument_requests.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/instruments/instruments.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/instruments/instruments_relationships.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/instruments/utils.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/market_data.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/mixins.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/officers.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/prices.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/statements/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/statements/statements.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/viewsets/technical_analysis/__init__.py +0 -0
- {wbfdm-1.46.9 → wbfdm-1.46.11}/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.
|
|
3
|
+
Version: 1.46.11
|
|
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.*
|
|
@@ -42,7 +42,9 @@ class InstrumentPriceFactory(factory.django.DjangoModelFactory):
|
|
|
42
42
|
)[0]
|
|
43
43
|
)
|
|
44
44
|
|
|
45
|
-
net_value = factory.Faker(
|
|
45
|
+
net_value = factory.Faker(
|
|
46
|
+
"pydecimal", min_value=90, max_value=110, right_digits=6
|
|
47
|
+
) # we narrow down the range to simulate more realistic returns
|
|
46
48
|
gross_value = factory.LazyAttribute(lambda o: o.net_value + Decimal(random.random()))
|
|
47
49
|
|
|
48
50
|
calculated = False
|
|
@@ -408,16 +408,17 @@ class InstrumentPrice(
|
|
|
408
408
|
)
|
|
409
409
|
|
|
410
410
|
def compute_and_update_statistics(self, min_period: int = 20):
|
|
411
|
-
|
|
411
|
+
df = (
|
|
412
412
|
pd.DataFrame(
|
|
413
413
|
InstrumentPrice.objects.filter_only_valid_prices()
|
|
414
414
|
.filter(instrument=self.instrument, date__lte=self.date)
|
|
415
|
-
.values_list("date", "net_value"),
|
|
416
|
-
columns=["date", "net_value"],
|
|
415
|
+
.values_list("date", "net_value", "volume"),
|
|
416
|
+
columns=["date", "net_value", "volume"],
|
|
417
417
|
)
|
|
418
418
|
.set_index("date")
|
|
419
|
-
.sort_index()
|
|
419
|
+
.sort_index()
|
|
420
420
|
)
|
|
421
|
+
prices_df = df["net_value"]
|
|
421
422
|
if not prices_df.empty and prices_df.shape[0] >= min_period:
|
|
422
423
|
financial_statistics = FinancialStatistics(prices_df)
|
|
423
424
|
min_date = prices_df.index.min()
|
|
@@ -451,6 +452,9 @@ class InstrumentPrice(
|
|
|
451
452
|
self.correlation = correlation
|
|
452
453
|
|
|
453
454
|
self.annualized_daily_volatility = financial_statistics.get_annualized_daily_volatility()
|
|
455
|
+
if not (volume_df := df["volume"]).empty:
|
|
456
|
+
self.volume_50d = volume_df.tail(50).mean()
|
|
457
|
+
self.volume_200d = volume_df.tail(200).mean()
|
|
454
458
|
|
|
455
459
|
@classmethod
|
|
456
460
|
def subquery_closest_value(
|
|
@@ -844,7 +844,7 @@ class Instrument(ComplexToStringMixin, TagModelMixin, ImportMixin, InstrumentPMS
|
|
|
844
844
|
def technical_benchmark_analysis(self, from_date: date | None = None, to_date: date | None = None):
|
|
845
845
|
return TechnicalAnalysis.init_close_from_instrument(self, from_date, to_date)
|
|
846
846
|
|
|
847
|
-
def
|
|
847
|
+
def import_prices(self, start: date | None = None, end: date | None = None, **kwargs):
|
|
848
848
|
if not self.is_leaf_node():
|
|
849
849
|
raise ValueError("Cannot import price on a non-leaf node")
|
|
850
850
|
if not start:
|
|
@@ -861,11 +861,8 @@ class Instrument(ComplexToStringMixin, TagModelMixin, ImportMixin, InstrumentPMS
|
|
|
861
861
|
# we detect when was the last date price imported before start and switch the start date from there
|
|
862
862
|
with suppress(ObjectDoesNotExist):
|
|
863
863
|
start = self.prices.filter(date__lte=start).latest("date").date
|
|
864
|
-
yield from self._get_price_objects(start, end, clear=clear)
|
|
865
|
-
|
|
866
|
-
def import_prices(self, start: date | None = None, end: date | None = None, clear: bool = False):
|
|
867
864
|
# Import instrument prices
|
|
868
|
-
objs = list(self.
|
|
865
|
+
objs = list(self.__class__.objects.filter(id=self.id).get_instrument_prices_from_market_data(start, end))
|
|
869
866
|
self.bulk_save_instrument_prices(objs)
|
|
870
867
|
# compute daily statistics & performances
|
|
871
868
|
self.update_last_valuation_date()
|
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
import calendar
|
|
2
|
-
import math
|
|
3
2
|
from collections import defaultdict
|
|
4
|
-
from
|
|
5
|
-
from datetime import date, timedelta
|
|
3
|
+
from datetime import date
|
|
6
4
|
from decimal import Decimal
|
|
7
|
-
from typing import Dict,
|
|
5
|
+
from typing import Dict, Optional
|
|
8
6
|
|
|
9
7
|
import numpy as np
|
|
10
8
|
import pandas as pd
|
|
11
9
|
from pandas.tseries.offsets import BDay
|
|
12
|
-
from wbcore.contrib.currency.models import CurrencyFXRates
|
|
13
10
|
|
|
14
11
|
from wbfdm.analysis.financial_analysis.financial_statistics_analysis import (
|
|
15
12
|
FinancialStatistics,
|
|
@@ -199,91 +196,6 @@ class InstrumentPMSMixin:
|
|
|
199
196
|
|
|
200
197
|
return df
|
|
201
198
|
|
|
202
|
-
def _get_price_objects(self, from_date: date, to_date: date, clear: bool = False) -> Iterable[InstrumentPrice]:
|
|
203
|
-
df = pd.DataFrame(
|
|
204
|
-
self.__class__.objects.filter(id=self.id).dl.market_data(
|
|
205
|
-
from_date=from_date
|
|
206
|
-
- timedelta(
|
|
207
|
-
days=90
|
|
208
|
-
), # we make sure to at least import the last 80 days to be sure to be able to compute the volume 50d
|
|
209
|
-
to_date=to_date,
|
|
210
|
-
values=[MarketData.CLOSE, MarketData.VOLUME, MarketData.MARKET_CAPITALIZATION],
|
|
211
|
-
)
|
|
212
|
-
)
|
|
213
|
-
if not df.empty:
|
|
214
|
-
df["calculated"] = False
|
|
215
|
-
df = df.set_index("valuation_date").sort_index()
|
|
216
|
-
|
|
217
|
-
# # if market cap is not found, maybe we have better chance on the primary exhange
|
|
218
|
-
if not df.market_capitalization.notnull().any() and self.parent and (company := self.parent.get_root()):
|
|
219
|
-
with suppress(KeyError):
|
|
220
|
-
df["market_capitalization"] = pd.DataFrame(
|
|
221
|
-
self.__class__.objects.filter(id=company.id).dl.market_data(
|
|
222
|
-
from_date=from_date,
|
|
223
|
-
to_date=to_date,
|
|
224
|
-
values=[MarketData.MARKET_CAPITALIZATION],
|
|
225
|
-
)
|
|
226
|
-
).set_index("valuation_date")["market_capitalization"]
|
|
227
|
-
|
|
228
|
-
ts = pd.date_range(df.index.min(), df.index.max(), freq="B")
|
|
229
|
-
# fill forward missing data
|
|
230
|
-
df = df.reindex(ts)
|
|
231
|
-
df[["close", "market_capitalization"]] = df[["close", "market_capitalization"]].astype(float).ffill()
|
|
232
|
-
df.volume = df.volume.astype(float).fillna(0)
|
|
233
|
-
df.calculated = df.calculated.astype(bool).fillna(
|
|
234
|
-
True
|
|
235
|
-
) # we do not ffill calculated but set the to True to mark them as "estimated"/"not real"
|
|
236
|
-
df["volume_50d"] = df["volume"].rolling(50).mean()
|
|
237
|
-
df = df[df.index.date >= from_date] # we import only from the requested from_date
|
|
238
|
-
df = df.reset_index().dropna(subset=["index", "close"])
|
|
239
|
-
df = df.replace([np.inf, -np.inf, np.nan], None)
|
|
240
|
-
|
|
241
|
-
for row in df.to_dict("records"):
|
|
242
|
-
if (_date := row.get("index")) and (close := row.get("close", None)):
|
|
243
|
-
# we make sure data does not exist 10 digits (for db constraint)
|
|
244
|
-
if int(math.log10(close)) + 1 < 10:
|
|
245
|
-
try:
|
|
246
|
-
try:
|
|
247
|
-
p = InstrumentPrice.objects.get(instrument=self, date=_date, calculated=False)
|
|
248
|
-
except InstrumentPrice.DoesNotExist:
|
|
249
|
-
p = InstrumentPrice.objects.get(instrument=self, date=_date, calculated=True)
|
|
250
|
-
|
|
251
|
-
# update only if net value is different with existing instrument price
|
|
252
|
-
if (
|
|
253
|
-
round(p.net_value, 2) != round(close, 2)
|
|
254
|
-
or (p.market_capitalization != row.get("market_capitalization"))
|
|
255
|
-
or (p.volume != row.get("volume"))
|
|
256
|
-
or (p.calculated != row.get("calculated"))
|
|
257
|
-
or clear
|
|
258
|
-
):
|
|
259
|
-
p.net_value = close
|
|
260
|
-
p.gross_value = close
|
|
261
|
-
p.calculated = row["calculated"]
|
|
262
|
-
p.volume = row.get("volume", p.volume)
|
|
263
|
-
p.volume_50d = row.get("volume_50d", p.volume_50d)
|
|
264
|
-
p.market_capitalization = row.get("market_capitalization", p.market_capitalization)
|
|
265
|
-
p.market_capitalization_consolidated = p.market_capitalization
|
|
266
|
-
p.set_dynamic_field(False)
|
|
267
|
-
p.id = None
|
|
268
|
-
yield p
|
|
269
|
-
except InstrumentPrice.DoesNotExist:
|
|
270
|
-
with suppress(CurrencyFXRates.DoesNotExist):
|
|
271
|
-
p = InstrumentPrice(
|
|
272
|
-
currency_fx_rate_to_usd=CurrencyFXRates.objects.get( # we need to get the currency rate because we bulk create the object, and thus save is not called
|
|
273
|
-
date=_date, currency=self.currency
|
|
274
|
-
),
|
|
275
|
-
instrument=self,
|
|
276
|
-
date=_date,
|
|
277
|
-
calculated=row["calculated"],
|
|
278
|
-
net_value=close,
|
|
279
|
-
gross_value=close,
|
|
280
|
-
volume=row.get("volume", None),
|
|
281
|
-
market_capitalization=row.get("market_capitalization", None),
|
|
282
|
-
volume_50d=row.get("volume_50d", None),
|
|
283
|
-
)
|
|
284
|
-
p.set_dynamic_field(False)
|
|
285
|
-
yield p
|
|
286
|
-
|
|
287
199
|
@classmethod
|
|
288
200
|
def bulk_save_instrument_prices(cls, objs):
|
|
289
201
|
InstrumentPrice.objects.bulk_create(
|
|
@@ -297,7 +209,6 @@ class InstrumentPMSMixin:
|
|
|
297
209
|
"market_capitalization",
|
|
298
210
|
"market_capitalization_consolidated",
|
|
299
211
|
"calculated",
|
|
300
|
-
"volume_50d",
|
|
301
212
|
],
|
|
302
213
|
batch_size=1000,
|
|
303
214
|
)
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import math
|
|
2
|
+
from contextlib import suppress
|
|
3
|
+
from datetime import date
|
|
4
|
+
|
|
5
|
+
import numpy as np
|
|
6
|
+
import pandas as pd
|
|
7
|
+
from django.db.models import (
|
|
8
|
+
AutoField,
|
|
9
|
+
Exists,
|
|
10
|
+
ExpressionWrapper,
|
|
11
|
+
F,
|
|
12
|
+
OuterRef,
|
|
13
|
+
QuerySet,
|
|
14
|
+
Subquery,
|
|
15
|
+
)
|
|
16
|
+
from django.db.models.functions import Coalesce
|
|
17
|
+
from wbcore.contrib.currency.models import CurrencyFXRates
|
|
18
|
+
|
|
19
|
+
from wbfdm.enums import MarketData
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class InstrumentQuerySet(QuerySet):
|
|
23
|
+
def annotate_classification_for_group(
|
|
24
|
+
self, classification_group, classification_height: int = 0, **kwargs
|
|
25
|
+
) -> QuerySet:
|
|
26
|
+
return classification_group.annotate_queryset(
|
|
27
|
+
self, classification_height, "", annotation_label="ancestor_classifications", **kwargs
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
def annotate_base_data(self):
|
|
31
|
+
base_qs = InstrumentQuerySet(self.model, using=self._db)
|
|
32
|
+
return self.annotate(
|
|
33
|
+
is_investable=~Exists(base_qs.filter(parent=OuterRef("pk"))),
|
|
34
|
+
root=Subquery(base_qs.filter(tree_id=OuterRef("tree_id"), level=0).values("id")[:1]),
|
|
35
|
+
primary_security=ExpressionWrapper(
|
|
36
|
+
Coalesce(
|
|
37
|
+
Subquery(
|
|
38
|
+
base_qs.filter(
|
|
39
|
+
parent=OuterRef("pk"),
|
|
40
|
+
is_primary=True,
|
|
41
|
+
is_security=True,
|
|
42
|
+
).values("id")[:1]
|
|
43
|
+
),
|
|
44
|
+
F("id"),
|
|
45
|
+
),
|
|
46
|
+
output_field=AutoField(),
|
|
47
|
+
),
|
|
48
|
+
primary_quote=ExpressionWrapper(
|
|
49
|
+
Coalesce(
|
|
50
|
+
Subquery(
|
|
51
|
+
base_qs.filter(
|
|
52
|
+
parent=OuterRef("primary_security"),
|
|
53
|
+
is_primary=True,
|
|
54
|
+
).values("id")[:1]
|
|
55
|
+
),
|
|
56
|
+
F("primary_security"),
|
|
57
|
+
),
|
|
58
|
+
output_field=AutoField(),
|
|
59
|
+
),
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
def annotate_all(self):
|
|
63
|
+
return self.annotate_base_data()
|
|
64
|
+
|
|
65
|
+
@property
|
|
66
|
+
def dl(self):
|
|
67
|
+
"""Provides access to the dataloader proxy for the entities in the QuerySet.
|
|
68
|
+
|
|
69
|
+
This method allows for easy retrieval of the DataloaderProxy instance
|
|
70
|
+
associated with the QuerySet. It enables the utilization of dataloader
|
|
71
|
+
functionalities directly from the QuerySet, facilitating data fetching and
|
|
72
|
+
processing tasks.
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
DataloaderProxy: An instance of DataloaderProxy associated with the
|
|
76
|
+
entities in the QuerySet.
|
|
77
|
+
"""
|
|
78
|
+
return self.model.dl_proxy(self)
|
|
79
|
+
|
|
80
|
+
def get_instrument_prices_from_market_data(self, from_date: date, to_date: date):
|
|
81
|
+
from wbfdm.models import InstrumentPrice
|
|
82
|
+
|
|
83
|
+
def _dict_to_object(instrument, row):
|
|
84
|
+
if (
|
|
85
|
+
(price_date := row.get("date"))
|
|
86
|
+
and (close := row.get("close", None))
|
|
87
|
+
and int(math.log10(close)) + 1 < 10
|
|
88
|
+
):
|
|
89
|
+
try:
|
|
90
|
+
try:
|
|
91
|
+
p = InstrumentPrice.objects.get(instrument=instrument, date=price_date, calculated=False)
|
|
92
|
+
except InstrumentPrice.DoesNotExist:
|
|
93
|
+
p = InstrumentPrice.objects.get(instrument=instrument, date=price_date, calculated=True)
|
|
94
|
+
p.net_value = close
|
|
95
|
+
p.gross_value = close
|
|
96
|
+
p.calculated = row["calculated"]
|
|
97
|
+
p.volume = row.get("volume", p.volume)
|
|
98
|
+
p.market_capitalization = row.get("market_capitalization", p.market_capitalization)
|
|
99
|
+
p.market_capitalization_consolidated = p.market_capitalization
|
|
100
|
+
p.set_dynamic_field(False)
|
|
101
|
+
p.id = None
|
|
102
|
+
return p
|
|
103
|
+
except InstrumentPrice.DoesNotExist:
|
|
104
|
+
with suppress(CurrencyFXRates.DoesNotExist):
|
|
105
|
+
p = InstrumentPrice(
|
|
106
|
+
currency_fx_rate_to_usd=CurrencyFXRates.objects.get(
|
|
107
|
+
# we need to get the currency rate because we bulk create the object, and thus save is not called
|
|
108
|
+
date=price_date,
|
|
109
|
+
currency=instrument.currency,
|
|
110
|
+
),
|
|
111
|
+
instrument=instrument,
|
|
112
|
+
date=price_date,
|
|
113
|
+
calculated=row["calculated"],
|
|
114
|
+
net_value=close,
|
|
115
|
+
gross_value=close,
|
|
116
|
+
volume=row.get("volume", None),
|
|
117
|
+
market_capitalization=row.get("market_capitalization", None),
|
|
118
|
+
)
|
|
119
|
+
p.set_dynamic_field(False)
|
|
120
|
+
return p
|
|
121
|
+
|
|
122
|
+
df = pd.DataFrame(
|
|
123
|
+
self.dl.market_data(
|
|
124
|
+
from_date=from_date,
|
|
125
|
+
to_date=to_date,
|
|
126
|
+
values=[MarketData.CLOSE, MarketData.VOLUME, MarketData.MARKET_CAPITALIZATION],
|
|
127
|
+
)
|
|
128
|
+
)
|
|
129
|
+
if not df.empty:
|
|
130
|
+
df["valuation_date"] = pd.to_datetime(df["valuation_date"])
|
|
131
|
+
df = df.rename(columns={"valuation_date": "date"}).set_index(["instrument_id", "date"]).sort_index()
|
|
132
|
+
df = df.drop(columns=df.columns.difference(["calculated", "close", "market_capitalization", "volume"]))
|
|
133
|
+
df["calculated"] = False
|
|
134
|
+
idx = pd.MultiIndex.from_product(
|
|
135
|
+
[
|
|
136
|
+
df.index.levels[0],
|
|
137
|
+
pd.date_range(
|
|
138
|
+
df.index.get_level_values("date").min(), df.index.get_level_values("date").max(), freq="B"
|
|
139
|
+
),
|
|
140
|
+
],
|
|
141
|
+
names=["instrument_id", "date"],
|
|
142
|
+
)
|
|
143
|
+
df = df.reindex(idx)
|
|
144
|
+
df[["close", "market_capitalization"]] = df[["close", "market_capitalization"]].astype(float).ffill()
|
|
145
|
+
df.volume = df.volume.astype(float).fillna(0)
|
|
146
|
+
df.calculated = df.calculated.astype(bool).fillna(
|
|
147
|
+
True
|
|
148
|
+
) # we do not ffill calculated but set the to True to mark them as "estimated"/"not real"
|
|
149
|
+
df = df.reset_index("date").dropna(subset=["close"])
|
|
150
|
+
df = df.replace([np.inf, -np.inf, np.nan], None)
|
|
151
|
+
|
|
152
|
+
for instrument_id, dff in df.groupby(level=0):
|
|
153
|
+
instrument = self.get(id=instrument_id)
|
|
154
|
+
yield from filter(
|
|
155
|
+
lambda x: x, map(lambda row: _dict_to_object(instrument, row), dff.to_dict("records"))
|
|
156
|
+
)
|
|
@@ -19,7 +19,10 @@ from .signals import investable_universe_updated
|
|
|
19
19
|
|
|
20
20
|
@shared_task(queue="portfolio")
|
|
21
21
|
def update_of_investable_universe_data(
|
|
22
|
-
start: date | None = None,
|
|
22
|
+
start: date | None = None,
|
|
23
|
+
end: date | None = None,
|
|
24
|
+
with_background_tasks: bool = True,
|
|
25
|
+
instrument_ids: list[int] | None = None,
|
|
23
26
|
):
|
|
24
27
|
"""
|
|
25
28
|
Update the investable universe data on a daily basis.
|
|
@@ -27,6 +30,8 @@ def update_of_investable_universe_data(
|
|
|
27
30
|
Parameters:
|
|
28
31
|
- start (date | None): The start date for updating data. If None, defaults to three business days before 'end'.
|
|
29
32
|
- end (date | None): The end date for updating data. If None, defaults to the current date.
|
|
33
|
+
- with_background_tasks (bool | True): If true, will trigger the post import background tasks automatically.
|
|
34
|
+
- instrument_ids (list[int] | None): if specified, narrow down the instrument queryset with this list ids
|
|
30
35
|
|
|
31
36
|
Notes:
|
|
32
37
|
- The function resets the investable universe by marking all instruments as not in the investable universe.
|
|
@@ -51,12 +56,9 @@ def update_of_investable_universe_data(
|
|
|
51
56
|
Q(is_managed=True)
|
|
52
57
|
| Q(dl_parameters__market_data__path="wbfdm.contrib.internal.dataloaders.market_data.MarketDataDataloader")
|
|
53
58
|
) # we exclude product and index managed to avoid circular import
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
prices.extend(list(instrument.get_price_objects(start=start, end=end, clear=clear)))
|
|
58
|
-
except Exception as e:
|
|
59
|
-
print(f"Connection error while processing instrument {instrument}: {str(e)}") # noqa
|
|
59
|
+
if instrument_ids:
|
|
60
|
+
instruments = instruments.filter(id__in=instrument_ids)
|
|
61
|
+
prices = list(instruments.get_instrument_prices_from_market_data(start, end))
|
|
60
62
|
Instrument.bulk_save_instrument_prices(prices)
|
|
61
63
|
investable_universe_updated.send(sender=Instrument, end_date=end)
|
|
62
64
|
if with_background_tasks:
|
|
@@ -105,5 +107,7 @@ def daily_update_instrument_price_statistics(from_date: date = None, to_date: da
|
|
|
105
107
|
p.compute_and_update_statistics()
|
|
106
108
|
objs.append(p)
|
|
107
109
|
InstrumentPrice.objects.bulk_update(
|
|
108
|
-
objs,
|
|
110
|
+
objs,
|
|
111
|
+
fields=["sharpe_ratio", "correlation", "beta", "annualized_daily_volatility", "volume_50d", "volume_200d"],
|
|
112
|
+
batch_size=1000,
|
|
109
113
|
)
|
|
@@ -157,12 +157,14 @@ class TestInstrumentModel:
|
|
|
157
157
|
"close": 1,
|
|
158
158
|
"volume": 1,
|
|
159
159
|
"market_capitalization": 1,
|
|
160
|
+
"instrument_id": instrument.id,
|
|
160
161
|
},
|
|
161
162
|
{
|
|
162
163
|
"valuation_date": to_date,
|
|
163
164
|
"close": 2,
|
|
164
165
|
"volume": 2,
|
|
165
166
|
"market_capitalization": 2,
|
|
167
|
+
"instrument_id": instrument.id,
|
|
166
168
|
},
|
|
167
169
|
]
|
|
168
170
|
instrument.import_prices(from_date, to_date + timedelta(days=1))
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
from django.db.models import (
|
|
2
|
-
AutoField,
|
|
3
|
-
Exists,
|
|
4
|
-
ExpressionWrapper,
|
|
5
|
-
F,
|
|
6
|
-
OuterRef,
|
|
7
|
-
QuerySet,
|
|
8
|
-
Subquery,
|
|
9
|
-
)
|
|
10
|
-
from django.db.models.functions import Coalesce
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class InstrumentQuerySet(QuerySet):
|
|
14
|
-
def annotate_classification_for_group(
|
|
15
|
-
self, classification_group, classification_height: int = 0, **kwargs
|
|
16
|
-
) -> QuerySet:
|
|
17
|
-
return classification_group.annotate_queryset(
|
|
18
|
-
self, classification_height, "", annotation_label="ancestor_classifications", **kwargs
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
def annotate_base_data(self):
|
|
22
|
-
base_qs = InstrumentQuerySet(self.model, using=self._db)
|
|
23
|
-
return self.annotate(
|
|
24
|
-
is_investable=~Exists(base_qs.filter(parent=OuterRef("pk"))),
|
|
25
|
-
root=Subquery(base_qs.filter(tree_id=OuterRef("tree_id"), level=0).values("id")[:1]),
|
|
26
|
-
primary_security=ExpressionWrapper(
|
|
27
|
-
Coalesce(
|
|
28
|
-
Subquery(
|
|
29
|
-
base_qs.filter(
|
|
30
|
-
parent=OuterRef("pk"),
|
|
31
|
-
is_primary=True,
|
|
32
|
-
is_security=True,
|
|
33
|
-
).values(
|
|
34
|
-
"id"
|
|
35
|
-
)[:1]
|
|
36
|
-
),
|
|
37
|
-
F("id"),
|
|
38
|
-
),
|
|
39
|
-
output_field=AutoField(),
|
|
40
|
-
),
|
|
41
|
-
primary_quote=ExpressionWrapper(
|
|
42
|
-
Coalesce(
|
|
43
|
-
Subquery(
|
|
44
|
-
base_qs.filter(
|
|
45
|
-
parent=OuterRef("primary_security"),
|
|
46
|
-
is_primary=True,
|
|
47
|
-
).values(
|
|
48
|
-
"id"
|
|
49
|
-
)[:1]
|
|
50
|
-
),
|
|
51
|
-
F("primary_security"),
|
|
52
|
-
),
|
|
53
|
-
output_field=AutoField(),
|
|
54
|
-
),
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
def annotate_all(self):
|
|
58
|
-
return self.annotate_base_data()
|
|
59
|
-
|
|
60
|
-
@property
|
|
61
|
-
def dl(self):
|
|
62
|
-
"""Provides access to the dataloader proxy for the entities in the QuerySet.
|
|
63
|
-
|
|
64
|
-
This method allows for easy retrieval of the DataloaderProxy instance
|
|
65
|
-
associated with the QuerySet. It enables the utilization of dataloader
|
|
66
|
-
functionalities directly from the QuerySet, facilitating data fetching and
|
|
67
|
-
processing tasks.
|
|
68
|
-
|
|
69
|
-
Returns:
|
|
70
|
-
DataloaderProxy: An instance of DataloaderProxy associated with the
|
|
71
|
-
entities in the QuerySet.
|
|
72
|
-
"""
|
|
73
|
-
return self.model.dl_proxy(self)
|
|
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
|
{wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/financial_analysis/financial_metric_analysis.py
RENAMED
|
File without changes
|
{wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/financial_analysis/financial_ratio_analysis.py
RENAMED
|
File without changes
|
{wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/financial_analysis/financial_statistics_analysis.py
RENAMED
|
File without changes
|
{wbfdm-1.46.9 → wbfdm-1.46.11}/wbfdm/analysis/financial_analysis/statement_with_estimates.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
|