wbfdm 2.2.1__py2.py3-none-any.whl
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/__init__.py +2 -0
- wbfdm/admin/__init__.py +42 -0
- wbfdm/admin/classifications.py +39 -0
- wbfdm/admin/esg.py +23 -0
- wbfdm/admin/exchanges.py +53 -0
- wbfdm/admin/instrument_lists.py +23 -0
- wbfdm/admin/instrument_prices.py +62 -0
- wbfdm/admin/instrument_requests.py +33 -0
- wbfdm/admin/instruments.py +117 -0
- wbfdm/admin/instruments_relationships.py +25 -0
- wbfdm/admin/options.py +101 -0
- wbfdm/analysis/__init__.py +2 -0
- wbfdm/analysis/esg/__init__.py +0 -0
- wbfdm/analysis/esg/enums.py +82 -0
- wbfdm/analysis/esg/esg_analysis.py +217 -0
- wbfdm/analysis/esg/utils.py +13 -0
- wbfdm/analysis/financial_analysis/__init__.py +1 -0
- wbfdm/analysis/financial_analysis/financial_metric_analysis.py +88 -0
- wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +125 -0
- wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +271 -0
- wbfdm/analysis/financial_analysis/statement_with_estimates.py +558 -0
- wbfdm/analysis/financial_analysis/utils.py +316 -0
- wbfdm/analysis/technical_analysis/__init__.py +1 -0
- wbfdm/analysis/technical_analysis/technical_analysis.py +138 -0
- wbfdm/analysis/technical_analysis/traces.py +165 -0
- wbfdm/analysis/utils.py +32 -0
- wbfdm/apps.py +14 -0
- wbfdm/contrib/__init__.py +0 -0
- wbfdm/contrib/dsws/__init__.py +0 -0
- wbfdm/contrib/dsws/client.py +285 -0
- wbfdm/contrib/internal/__init__.py +0 -0
- wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
- wbfdm/contrib/internal/dataloaders/market_data.py +87 -0
- wbfdm/contrib/metric/__init__.py +0 -0
- wbfdm/contrib/metric/admin/__init__.py +2 -0
- wbfdm/contrib/metric/admin/instruments.py +12 -0
- wbfdm/contrib/metric/admin/metrics.py +43 -0
- wbfdm/contrib/metric/apps.py +10 -0
- wbfdm/contrib/metric/backends/__init__.py +2 -0
- wbfdm/contrib/metric/backends/base.py +159 -0
- wbfdm/contrib/metric/backends/performances.py +265 -0
- wbfdm/contrib/metric/backends/statistics.py +182 -0
- wbfdm/contrib/metric/decorators.py +14 -0
- wbfdm/contrib/metric/dispatch.py +23 -0
- wbfdm/contrib/metric/dto.py +88 -0
- wbfdm/contrib/metric/exceptions.py +6 -0
- wbfdm/contrib/metric/factories.py +33 -0
- wbfdm/contrib/metric/filters.py +28 -0
- wbfdm/contrib/metric/migrations/0001_initial.py +88 -0
- wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +26 -0
- wbfdm/contrib/metric/migrations/__init__.py +0 -0
- wbfdm/contrib/metric/models.py +180 -0
- wbfdm/contrib/metric/orchestrators.py +94 -0
- wbfdm/contrib/metric/registry.py +80 -0
- wbfdm/contrib/metric/serializers.py +44 -0
- wbfdm/contrib/metric/tasks.py +27 -0
- wbfdm/contrib/metric/tests/__init__.py +0 -0
- wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
- wbfdm/contrib/metric/tests/backends/test_performances.py +152 -0
- wbfdm/contrib/metric/tests/backends/test_statistics.py +48 -0
- wbfdm/contrib/metric/tests/conftest.py +92 -0
- wbfdm/contrib/metric/tests/test_dto.py +73 -0
- wbfdm/contrib/metric/tests/test_models.py +72 -0
- wbfdm/contrib/metric/tests/test_tasks.py +24 -0
- wbfdm/contrib/metric/tests/test_viewsets.py +79 -0
- wbfdm/contrib/metric/urls.py +19 -0
- wbfdm/contrib/metric/viewsets/__init__.py +1 -0
- wbfdm/contrib/metric/viewsets/configs/__init__.py +1 -0
- wbfdm/contrib/metric/viewsets/configs/display.py +92 -0
- wbfdm/contrib/metric/viewsets/configs/menus.py +11 -0
- wbfdm/contrib/metric/viewsets/configs/utils.py +137 -0
- wbfdm/contrib/metric/viewsets/mixins.py +245 -0
- wbfdm/contrib/metric/viewsets/viewsets.py +40 -0
- wbfdm/contrib/msci/__init__.py +0 -0
- wbfdm/contrib/msci/client.py +92 -0
- wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
- wbfdm/contrib/msci/dataloaders/esg.py +87 -0
- wbfdm/contrib/msci/dataloaders/esg_controversies.py +81 -0
- wbfdm/contrib/msci/sync.py +58 -0
- wbfdm/contrib/msci/tests/__init__.py +0 -0
- wbfdm/contrib/msci/tests/conftest.py +1 -0
- wbfdm/contrib/msci/tests/test_client.py +70 -0
- wbfdm/contrib/qa/__init__.py +0 -0
- wbfdm/contrib/qa/apps.py +22 -0
- wbfdm/contrib/qa/database_routers.py +25 -0
- wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
- wbfdm/contrib/qa/dataloaders/adjustments.py +56 -0
- wbfdm/contrib/qa/dataloaders/corporate_actions.py +59 -0
- wbfdm/contrib/qa/dataloaders/financials.py +83 -0
- wbfdm/contrib/qa/dataloaders/market_data.py +117 -0
- wbfdm/contrib/qa/dataloaders/officers.py +59 -0
- wbfdm/contrib/qa/dataloaders/reporting_dates.py +67 -0
- wbfdm/contrib/qa/dataloaders/statements.py +267 -0
- wbfdm/contrib/qa/tasks.py +0 -0
- wbfdm/dataloaders/__init__.py +0 -0
- wbfdm/dataloaders/cache.py +129 -0
- wbfdm/dataloaders/protocols.py +112 -0
- wbfdm/dataloaders/proxies.py +201 -0
- wbfdm/dataloaders/types.py +209 -0
- wbfdm/dynamic_preferences_registry.py +45 -0
- wbfdm/enums.py +657 -0
- wbfdm/factories/__init__.py +13 -0
- wbfdm/factories/classifications.py +56 -0
- wbfdm/factories/controversies.py +27 -0
- wbfdm/factories/exchanges.py +21 -0
- wbfdm/factories/instrument_list.py +22 -0
- wbfdm/factories/instrument_prices.py +79 -0
- wbfdm/factories/instruments.py +63 -0
- wbfdm/factories/instruments_relationships.py +31 -0
- wbfdm/factories/options.py +66 -0
- wbfdm/figures/__init__.py +1 -0
- wbfdm/figures/financials/__init__.py +1 -0
- wbfdm/figures/financials/financial_analysis_charts.py +469 -0
- wbfdm/figures/financials/financials_charts.py +711 -0
- wbfdm/filters/__init__.py +31 -0
- wbfdm/filters/classifications.py +100 -0
- wbfdm/filters/exchanges.py +22 -0
- wbfdm/filters/financials.py +95 -0
- wbfdm/filters/financials_analysis.py +119 -0
- wbfdm/filters/instrument_prices.py +112 -0
- wbfdm/filters/instruments.py +198 -0
- wbfdm/filters/utils.py +44 -0
- wbfdm/import_export/__init__.py +0 -0
- wbfdm/import_export/backends/__init__.py +0 -0
- wbfdm/import_export/backends/cbinsights/__init__.py +2 -0
- wbfdm/import_export/backends/cbinsights/deals.py +44 -0
- wbfdm/import_export/backends/cbinsights/equities.py +41 -0
- wbfdm/import_export/backends/cbinsights/mixin.py +15 -0
- wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
- wbfdm/import_export/backends/cbinsights/utils/classifications.py +4150 -0
- wbfdm/import_export/backends/cbinsights/utils/client.py +217 -0
- wbfdm/import_export/backends/refinitiv/__init__.py +5 -0
- wbfdm/import_export/backends/refinitiv/daily_fundamental.py +36 -0
- wbfdm/import_export/backends/refinitiv/fiscal_period.py +63 -0
- wbfdm/import_export/backends/refinitiv/forecast.py +178 -0
- wbfdm/import_export/backends/refinitiv/fundamental.py +103 -0
- wbfdm/import_export/backends/refinitiv/geographic_segment.py +32 -0
- wbfdm/import_export/backends/refinitiv/instrument.py +55 -0
- wbfdm/import_export/backends/refinitiv/instrument_price.py +77 -0
- wbfdm/import_export/backends/refinitiv/mixin.py +29 -0
- wbfdm/import_export/backends/refinitiv/utils/__init__.py +1 -0
- wbfdm/import_export/backends/refinitiv/utils/controller.py +182 -0
- wbfdm/import_export/handlers/__init__.py +0 -0
- wbfdm/import_export/handlers/instrument.py +253 -0
- wbfdm/import_export/handlers/instrument_list.py +101 -0
- wbfdm/import_export/handlers/instrument_price.py +71 -0
- wbfdm/import_export/handlers/option.py +54 -0
- wbfdm/import_export/handlers/private_equities.py +49 -0
- wbfdm/import_export/parsers/__init__.py +0 -0
- wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
- wbfdm/import_export/parsers/cbinsights/deals.py +39 -0
- wbfdm/import_export/parsers/cbinsights/equities.py +56 -0
- wbfdm/import_export/parsers/cbinsights/fundamentals.py +45 -0
- wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
- wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +7 -0
- wbfdm/import_export/parsers/refinitiv/forecast.py +7 -0
- wbfdm/import_export/parsers/refinitiv/fundamental.py +9 -0
- wbfdm/import_export/parsers/refinitiv/geographic_segment.py +7 -0
- wbfdm/import_export/parsers/refinitiv/instrument.py +75 -0
- wbfdm/import_export/parsers/refinitiv/instrument_price.py +26 -0
- wbfdm/import_export/parsers/refinitiv/utils.py +96 -0
- wbfdm/import_export/resources/__init__.py +0 -0
- wbfdm/import_export/resources/classification.py +23 -0
- wbfdm/import_export/resources/instrument_prices.py +33 -0
- wbfdm/import_export/resources/instruments.py +176 -0
- wbfdm/jinja2.py +7 -0
- wbfdm/management/__init__.py +30 -0
- wbfdm/menu.py +11 -0
- wbfdm/migrations/0001_initial.py +71 -0
- wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +144 -0
- wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +34 -0
- wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +86 -0
- wbfdm/migrations/0005_instrument_corporate_action_backend.py +29 -0
- wbfdm/migrations/0006_instrument_officer_backend.py +29 -0
- wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +117 -0
- wbfdm/migrations/0008_controversy.py +75 -0
- wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +85 -0
- wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +1299 -0
- wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +169 -0
- wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +564 -0
- wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +199 -0
- wbfdm/migrations/0014_alter_controversy_instrument.py +22 -0
- wbfdm/migrations/0015_instrument_instrument_investible_index.py +16 -0
- wbfdm/migrations/0016_instrumenttype_name_repr.py +18 -0
- wbfdm/migrations/0017_instrument_instrument_security_index.py +16 -0
- wbfdm/migrations/0018_instrument_instrument_level_index.py +20 -0
- wbfdm/migrations/0019_alter_controversy_source.py +17 -0
- wbfdm/migrations/0020_optionaggregate_option_and_more.py +249 -0
- wbfdm/migrations/0021_delete_instrumentdailystatistics.py +15 -0
- wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +91 -0
- wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +53 -0
- wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +36 -0
- wbfdm/migrations/0025_instrument_is_primary_and_more.py +29 -0
- wbfdm/migrations/0026_instrument_is_cash_equivalent.py +30 -0
- wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +100 -0
- wbfdm/migrations/__init__.py +0 -0
- wbfdm/models/__init__.py +4 -0
- wbfdm/models/esg/__init__.py +1 -0
- wbfdm/models/esg/controversies.py +81 -0
- wbfdm/models/exchanges/__init__.py +1 -0
- wbfdm/models/exchanges/exchanges.py +223 -0
- wbfdm/models/fields.py +117 -0
- wbfdm/models/fk_fields.py +403 -0
- wbfdm/models/indicators.py +0 -0
- wbfdm/models/instruments/__init__.py +19 -0
- wbfdm/models/instruments/classifications.py +265 -0
- wbfdm/models/instruments/instrument_lists.py +120 -0
- wbfdm/models/instruments/instrument_prices.py +540 -0
- wbfdm/models/instruments/instrument_relationships.py +251 -0
- wbfdm/models/instruments/instrument_requests.py +196 -0
- wbfdm/models/instruments/instruments.py +991 -0
- wbfdm/models/instruments/llm/__init__.py +1 -0
- wbfdm/models/instruments/llm/create_instrument_news_relationships.py +78 -0
- wbfdm/models/instruments/mixin/__init__.py +0 -0
- wbfdm/models/instruments/mixin/financials_computed.py +804 -0
- wbfdm/models/instruments/mixin/financials_serializer_fields.py +1407 -0
- wbfdm/models/instruments/mixin/instruments.py +294 -0
- wbfdm/models/instruments/options.py +225 -0
- wbfdm/models/instruments/private_equities.py +59 -0
- wbfdm/models/instruments/querysets.py +73 -0
- wbfdm/models/instruments/utils.py +41 -0
- wbfdm/preferences.py +21 -0
- wbfdm/serializers/__init__.py +4 -0
- wbfdm/serializers/esg.py +36 -0
- wbfdm/serializers/exchanges.py +39 -0
- wbfdm/serializers/instruments/__init__.py +37 -0
- wbfdm/serializers/instruments/classifications.py +139 -0
- wbfdm/serializers/instruments/instrument_lists.py +61 -0
- wbfdm/serializers/instruments/instrument_prices.py +73 -0
- wbfdm/serializers/instruments/instrument_relationships.py +170 -0
- wbfdm/serializers/instruments/instrument_requests.py +61 -0
- wbfdm/serializers/instruments/instruments.py +274 -0
- wbfdm/serializers/instruments/mixins.py +104 -0
- wbfdm/serializers/officers.py +20 -0
- wbfdm/signals.py +7 -0
- wbfdm/sync/__init__.py +0 -0
- wbfdm/sync/abstract.py +31 -0
- wbfdm/sync/runner.py +22 -0
- wbfdm/tasks.py +69 -0
- wbfdm/tests/__init__.py +0 -0
- wbfdm/tests/analysis/__init__.py +0 -0
- wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
- wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +392 -0
- wbfdm/tests/analysis/financial_analysis/test_utils.py +322 -0
- wbfdm/tests/analysis/test_esg.py +159 -0
- wbfdm/tests/conftest.py +92 -0
- wbfdm/tests/dataloaders/__init__.py +0 -0
- wbfdm/tests/dataloaders/test_cache.py +73 -0
- wbfdm/tests/models/__init__.py +0 -0
- wbfdm/tests/models/test_classifications.py +99 -0
- wbfdm/tests/models/test_exchanges.py +7 -0
- wbfdm/tests/models/test_instrument_list.py +117 -0
- wbfdm/tests/models/test_instrument_prices.py +306 -0
- wbfdm/tests/models/test_instruments.py +202 -0
- wbfdm/tests/models/test_merge.py +99 -0
- wbfdm/tests/models/test_options.py +69 -0
- wbfdm/tests/test_tasks.py +6 -0
- wbfdm/tests/tests.py +10 -0
- wbfdm/urls.py +222 -0
- wbfdm/utils.py +54 -0
- wbfdm/viewsets/__init__.py +10 -0
- wbfdm/viewsets/configs/__init__.py +5 -0
- wbfdm/viewsets/configs/buttons/__init__.py +8 -0
- wbfdm/viewsets/configs/buttons/classifications.py +23 -0
- wbfdm/viewsets/configs/buttons/exchanges.py +9 -0
- wbfdm/viewsets/configs/buttons/instrument_prices.py +49 -0
- wbfdm/viewsets/configs/buttons/instruments.py +283 -0
- wbfdm/viewsets/configs/display/__init__.py +22 -0
- wbfdm/viewsets/configs/display/classifications.py +138 -0
- wbfdm/viewsets/configs/display/esg.py +75 -0
- wbfdm/viewsets/configs/display/exchanges.py +42 -0
- wbfdm/viewsets/configs/display/instrument_lists.py +137 -0
- wbfdm/viewsets/configs/display/instrument_prices.py +199 -0
- wbfdm/viewsets/configs/display/instrument_requests.py +116 -0
- wbfdm/viewsets/configs/display/instruments.py +618 -0
- wbfdm/viewsets/configs/display/instruments_relationships.py +65 -0
- wbfdm/viewsets/configs/display/monthly_performances.py +72 -0
- wbfdm/viewsets/configs/display/officers.py +16 -0
- wbfdm/viewsets/configs/display/prices.py +21 -0
- wbfdm/viewsets/configs/display/statement_with_estimates.py +101 -0
- wbfdm/viewsets/configs/display/statements.py +48 -0
- wbfdm/viewsets/configs/endpoints/__init__.py +41 -0
- wbfdm/viewsets/configs/endpoints/classifications.py +87 -0
- wbfdm/viewsets/configs/endpoints/esg.py +20 -0
- wbfdm/viewsets/configs/endpoints/exchanges.py +6 -0
- wbfdm/viewsets/configs/endpoints/financials_analysis.py +65 -0
- wbfdm/viewsets/configs/endpoints/instrument_lists.py +38 -0
- wbfdm/viewsets/configs/endpoints/instrument_prices.py +51 -0
- wbfdm/viewsets/configs/endpoints/instrument_requests.py +20 -0
- wbfdm/viewsets/configs/endpoints/instruments.py +13 -0
- wbfdm/viewsets/configs/endpoints/instruments_relationships.py +31 -0
- wbfdm/viewsets/configs/endpoints/statements.py +6 -0
- wbfdm/viewsets/configs/menus/__init__.py +9 -0
- wbfdm/viewsets/configs/menus/classifications.py +19 -0
- wbfdm/viewsets/configs/menus/exchanges.py +10 -0
- wbfdm/viewsets/configs/menus/instrument_lists.py +10 -0
- wbfdm/viewsets/configs/menus/instruments.py +20 -0
- wbfdm/viewsets/configs/menus/instruments_relationships.py +33 -0
- wbfdm/viewsets/configs/titles/__init__.py +42 -0
- wbfdm/viewsets/configs/titles/classifications.py +79 -0
- wbfdm/viewsets/configs/titles/esg.py +11 -0
- wbfdm/viewsets/configs/titles/exchanges.py +12 -0
- wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +6 -0
- wbfdm/viewsets/configs/titles/financials_analysis.py +50 -0
- wbfdm/viewsets/configs/titles/instrument_prices.py +50 -0
- wbfdm/viewsets/configs/titles/instrument_requests.py +16 -0
- wbfdm/viewsets/configs/titles/instruments.py +31 -0
- wbfdm/viewsets/configs/titles/instruments_relationships.py +21 -0
- wbfdm/viewsets/configs/titles/market_data.py +13 -0
- wbfdm/viewsets/configs/titles/prices.py +15 -0
- wbfdm/viewsets/configs/titles/statement_with_estimates.py +10 -0
- wbfdm/viewsets/esg.py +72 -0
- wbfdm/viewsets/exchanges.py +63 -0
- wbfdm/viewsets/financial_analysis/__init__.py +3 -0
- wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +85 -0
- wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +85 -0
- wbfdm/viewsets/financial_analysis/statement_with_estimates.py +145 -0
- wbfdm/viewsets/instruments/__init__.py +80 -0
- wbfdm/viewsets/instruments/classifications.py +279 -0
- wbfdm/viewsets/instruments/financials_analysis.py +614 -0
- wbfdm/viewsets/instruments/instrument_lists.py +77 -0
- wbfdm/viewsets/instruments/instrument_prices.py +542 -0
- wbfdm/viewsets/instruments/instrument_requests.py +51 -0
- wbfdm/viewsets/instruments/instruments.py +106 -0
- wbfdm/viewsets/instruments/instruments_relationships.py +235 -0
- wbfdm/viewsets/instruments/utils.py +27 -0
- wbfdm/viewsets/market_data.py +172 -0
- wbfdm/viewsets/mixins.py +9 -0
- wbfdm/viewsets/officers.py +27 -0
- wbfdm/viewsets/prices.py +62 -0
- wbfdm/viewsets/statements/__init__.py +1 -0
- wbfdm/viewsets/statements/statements.py +100 -0
- wbfdm/viewsets/technical_analysis/__init__.py +1 -0
- wbfdm/viewsets/technical_analysis/monthly_performances.py +93 -0
- wbfdm-2.2.1.dist-info/METADATA +15 -0
- wbfdm-2.2.1.dist-info/RECORD +337 -0
- wbfdm-2.2.1.dist-info/WHEEL +5 -0
wbfdm/__init__.py
ADDED
wbfdm/admin/__init__.py
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from django.contrib import admin
|
|
2
|
+
|
|
3
|
+
from .instruments import InstrumentModelAdmin, InstrumentTypeModelAdmin
|
|
4
|
+
from .classifications import ClassificationAdmin, ClassificationGroupAdmin
|
|
5
|
+
from .exchanges import ExchangeModelAdmin
|
|
6
|
+
from .instrument_lists import InstrumentListAdmin
|
|
7
|
+
from .instruments_relationships import InstrumentFavoriteGroupModelAdmin
|
|
8
|
+
from .esg import ControversyModelAdmin
|
|
9
|
+
from .exchanges import ExchangeModelAdmin
|
|
10
|
+
from .instrument_prices import InstrumentPriceAdmin
|
|
11
|
+
from .instrument_requests import InstrumentRequestModelAdmin
|
|
12
|
+
from .options import OptionModelAdmin, OptionAggregateModelAdmin
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ReadOnlyAdmin(admin.ModelAdmin):
|
|
16
|
+
readonly_fields = []
|
|
17
|
+
|
|
18
|
+
def get_readonly_fields(self, request, obj=None):
|
|
19
|
+
return (
|
|
20
|
+
list(self.readonly_fields)
|
|
21
|
+
+ [field.name for field in obj._meta.fields] # type: ignore
|
|
22
|
+
+ [field.name for field in obj._meta.many_to_many] # type: ignore
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def has_add_permission(self, request):
|
|
26
|
+
return False
|
|
27
|
+
|
|
28
|
+
def has_delete_permission(self, request, obj=None):
|
|
29
|
+
return False
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class ReadOnlyTabularInline(admin.TabularInline):
|
|
33
|
+
show_change_link = True
|
|
34
|
+
|
|
35
|
+
def has_change_permission(self, request, obj=None):
|
|
36
|
+
return False
|
|
37
|
+
|
|
38
|
+
def has_add_permission(self, request, obj=None):
|
|
39
|
+
return False
|
|
40
|
+
|
|
41
|
+
def has_delete_permission(self, request, obj=None):
|
|
42
|
+
return False
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from django.contrib import admin
|
|
2
|
+
from reversion_compare.admin import CompareVersionAdmin
|
|
3
|
+
from wbfdm.models import Classification, ClassificationGroup
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ClassificationInLine(admin.TabularInline):
|
|
7
|
+
model = Classification
|
|
8
|
+
fields = ["code_aggregated", "name"]
|
|
9
|
+
extra = 0
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@admin.register(ClassificationGroup)
|
|
13
|
+
class ClassificationGroupAdmin(CompareVersionAdmin):
|
|
14
|
+
list_display = ["name", "max_depth", "is_primary"]
|
|
15
|
+
|
|
16
|
+
search_fields = ["name"]
|
|
17
|
+
ordering = ["name"]
|
|
18
|
+
|
|
19
|
+
def reversion_register(self, model, **options):
|
|
20
|
+
options = {
|
|
21
|
+
"ignore_duplicates": True,
|
|
22
|
+
}
|
|
23
|
+
super().reversion_register(model, **options)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@admin.register(Classification)
|
|
27
|
+
class ClassificationAdmin(CompareVersionAdmin):
|
|
28
|
+
list_display = ["code_aggregated", "name", "level"]
|
|
29
|
+
|
|
30
|
+
search_fields = ["code_aggregated", "name"]
|
|
31
|
+
inlines = [ClassificationInLine]
|
|
32
|
+
ordering = ["code_aggregated"]
|
|
33
|
+
list_filter = ("height", "level", "group")
|
|
34
|
+
|
|
35
|
+
def reversion_register(self, model, **options):
|
|
36
|
+
options = {
|
|
37
|
+
"ignore_duplicates": True,
|
|
38
|
+
}
|
|
39
|
+
super().reversion_register(model, **options)
|
wbfdm/admin/esg.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from django.contrib import admin
|
|
2
|
+
from wbfdm.models import Controversy
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
@admin.register(Controversy)
|
|
6
|
+
class ControversyModelAdmin(admin.ModelAdmin):
|
|
7
|
+
search_fields = (
|
|
8
|
+
"headline",
|
|
9
|
+
"description",
|
|
10
|
+
"source",
|
|
11
|
+
)
|
|
12
|
+
raw_id_fields = ["instrument"]
|
|
13
|
+
list_display = (
|
|
14
|
+
"initiated",
|
|
15
|
+
"review",
|
|
16
|
+
"headline",
|
|
17
|
+
"description",
|
|
18
|
+
"source",
|
|
19
|
+
"status",
|
|
20
|
+
"type",
|
|
21
|
+
"severity",
|
|
22
|
+
"company_response",
|
|
23
|
+
)
|
wbfdm/admin/exchanges.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
from django import forms
|
|
2
|
+
from django.contrib import admin
|
|
3
|
+
from wbfdm.models import Exchange
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class CsvImportForm(forms.Form):
|
|
7
|
+
csv_file = forms.FileField()
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@admin.register(Exchange)
|
|
11
|
+
class ExchangeModelAdmin(admin.ModelAdmin):
|
|
12
|
+
list_display = (
|
|
13
|
+
"source_id",
|
|
14
|
+
"name",
|
|
15
|
+
"mic_code",
|
|
16
|
+
"operating_mic_code",
|
|
17
|
+
"bbg_exchange_codes",
|
|
18
|
+
"bbg_composite",
|
|
19
|
+
"country",
|
|
20
|
+
)
|
|
21
|
+
search_fields = (
|
|
22
|
+
"name",
|
|
23
|
+
"operating_mic_code",
|
|
24
|
+
"mic_code",
|
|
25
|
+
"bbg_exchange_codes",
|
|
26
|
+
"bbg_composite",
|
|
27
|
+
"refinitiv_identifier_code",
|
|
28
|
+
"comments",
|
|
29
|
+
)
|
|
30
|
+
list_filter = ["country"]
|
|
31
|
+
fieldsets = (
|
|
32
|
+
(
|
|
33
|
+
"Main Data",
|
|
34
|
+
{
|
|
35
|
+
"fields": (
|
|
36
|
+
(
|
|
37
|
+
"name",
|
|
38
|
+
"opening_time",
|
|
39
|
+
"closing_time",
|
|
40
|
+
),
|
|
41
|
+
("mic_code", "mic_name"),
|
|
42
|
+
("operating_mic_code", "operating_mic_name"),
|
|
43
|
+
("bbg_exchange_codes", "bbg_composite_primary", "bbg_composite"),
|
|
44
|
+
("refinitiv_identifier_code", "refinitiv_mnemonic"),
|
|
45
|
+
("country", "website"),
|
|
46
|
+
("comments",),
|
|
47
|
+
)
|
|
48
|
+
},
|
|
49
|
+
),
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
def get_queryset(self, request):
|
|
53
|
+
return super().get_queryset(request).select_related("country")
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from django.contrib import admin
|
|
2
|
+
from wbfdm.models import InstrumentList, InstrumentListThroughModel
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class InstrumentInstrumentList(admin.TabularInline):
|
|
6
|
+
model = InstrumentListThroughModel
|
|
7
|
+
fk_name = "instrument_list"
|
|
8
|
+
fields = ["instrument_str", "instrument", "validated", "from_date", "to_date"]
|
|
9
|
+
|
|
10
|
+
raw_id_fields = ["instrument", "instrument_list"]
|
|
11
|
+
|
|
12
|
+
def get_queryset(self, request):
|
|
13
|
+
return super().get_queryset(request).select_related("instrument")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@admin.register(InstrumentList)
|
|
17
|
+
class InstrumentListAdmin(admin.ModelAdmin):
|
|
18
|
+
search_fields = ("name", "instrument_list_type")
|
|
19
|
+
list_display = ("name", "instrument_list_type")
|
|
20
|
+
|
|
21
|
+
inlines = [
|
|
22
|
+
InstrumentInstrumentList,
|
|
23
|
+
]
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
from django.contrib import admin
|
|
3
|
+
from wbcore.admin import ExportCsvMixin, ImportCsvMixin
|
|
4
|
+
from wbfdm.models import Instrument, InstrumentPrice
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@admin.register(InstrumentPrice)
|
|
8
|
+
class InstrumentPriceAdmin(ExportCsvMixin, ImportCsvMixin, admin.ModelAdmin):
|
|
9
|
+
change_list_template = "wbcore/admin/change_list.html"
|
|
10
|
+
# fsm_field = ["status"]
|
|
11
|
+
list_display = ("date", "instrument", "net_value", "gross_value", "calculated")
|
|
12
|
+
|
|
13
|
+
ordering = ("-date",)
|
|
14
|
+
|
|
15
|
+
autocomplete_fields = ["instrument"]
|
|
16
|
+
fieldsets = (
|
|
17
|
+
(
|
|
18
|
+
"Main Data",
|
|
19
|
+
{
|
|
20
|
+
"fields": (
|
|
21
|
+
(
|
|
22
|
+
"instrument",
|
|
23
|
+
"date",
|
|
24
|
+
"import_source",
|
|
25
|
+
"calculated",
|
|
26
|
+
),
|
|
27
|
+
("net_value", "gross_value"),
|
|
28
|
+
)
|
|
29
|
+
},
|
|
30
|
+
),
|
|
31
|
+
(
|
|
32
|
+
"Extra Data",
|
|
33
|
+
{
|
|
34
|
+
"fields": (
|
|
35
|
+
("volume", "volume_50d", "volume_200d"),
|
|
36
|
+
("outstanding_shares", "market_capitalization", "market_capitalization_consolidated"),
|
|
37
|
+
)
|
|
38
|
+
},
|
|
39
|
+
),
|
|
40
|
+
(
|
|
41
|
+
"Computed fields",
|
|
42
|
+
{
|
|
43
|
+
"fields": (
|
|
44
|
+
"lock_statistics",
|
|
45
|
+
("sharpe_ratio", "correlation", "beta"),
|
|
46
|
+
)
|
|
47
|
+
},
|
|
48
|
+
),
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
raw_id_fields = ["import_source", "instrument"]
|
|
52
|
+
|
|
53
|
+
actions = ["export_as_csv"]
|
|
54
|
+
|
|
55
|
+
def manipulate_df(self, df):
|
|
56
|
+
df["instrument"] = df["instrument"].apply(lambda x: Instrument.objects.get(id=x))
|
|
57
|
+
df["date"] = pd.to_datetime(df["date"])
|
|
58
|
+
return df
|
|
59
|
+
|
|
60
|
+
def process_model(self, model):
|
|
61
|
+
query_params = {"instrument": model["instrument"], "date": model["date"]}
|
|
62
|
+
self.model.objects.update_or_create(**query_params, defaults=model)
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from django.contrib import admin
|
|
2
|
+
from wbfdm.models import InstrumentRequest
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
@admin.register(InstrumentRequest)
|
|
6
|
+
class InstrumentRequestModelAdmin(admin.ModelAdmin):
|
|
7
|
+
search_fields = (
|
|
8
|
+
"created_instrument__computed_str",
|
|
9
|
+
"requester__comptuted_str",
|
|
10
|
+
)
|
|
11
|
+
raw_id_fields = ["created_instrument", "requester"]
|
|
12
|
+
list_display = (
|
|
13
|
+
"status",
|
|
14
|
+
"requester",
|
|
15
|
+
"handler",
|
|
16
|
+
"notes",
|
|
17
|
+
"created",
|
|
18
|
+
"created_instrument",
|
|
19
|
+
)
|
|
20
|
+
readonly_fields = ["created"]
|
|
21
|
+
fieldsets = (
|
|
22
|
+
(
|
|
23
|
+
"Main Data",
|
|
24
|
+
{
|
|
25
|
+
"fields": (
|
|
26
|
+
("status", "created", "created_instrument"),
|
|
27
|
+
("requester", "handler"),
|
|
28
|
+
("notes",),
|
|
29
|
+
("instrument_data",),
|
|
30
|
+
)
|
|
31
|
+
},
|
|
32
|
+
),
|
|
33
|
+
)
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
from django.contrib import admin
|
|
2
|
+
from wbfdm.models import Instrument, InstrumentType
|
|
3
|
+
from wbfdm.models.instruments.instruments import import_prices_as_task
|
|
4
|
+
|
|
5
|
+
from .instruments_relationships import (
|
|
6
|
+
InstrumentClassificationThroughModelAdmin,
|
|
7
|
+
RelatedInstrumentThroughModelInlineAdmin,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class InstrumentInline(admin.TabularInline):
|
|
12
|
+
verbose_name = "Child"
|
|
13
|
+
verbose_names = "Children"
|
|
14
|
+
model = Instrument
|
|
15
|
+
fields = ("name", "exchange", "is_investable_universe", "is_security", "is_primary")
|
|
16
|
+
autocomplete_fields = ("exchange",)
|
|
17
|
+
show_change_link = True
|
|
18
|
+
extra = 0
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@admin.register(InstrumentType)
|
|
22
|
+
class InstrumentTypeModelAdmin(admin.ModelAdmin):
|
|
23
|
+
list_display = ("name", "key", "is_security", "is_classifiable")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@admin.register(Instrument)
|
|
27
|
+
class InstrumentModelAdmin(admin.ModelAdmin):
|
|
28
|
+
list_display = (
|
|
29
|
+
"_is_investable",
|
|
30
|
+
"is_investable_universe",
|
|
31
|
+
"is_security",
|
|
32
|
+
"is_primary",
|
|
33
|
+
"instrument_type",
|
|
34
|
+
"name",
|
|
35
|
+
"source",
|
|
36
|
+
"source_id",
|
|
37
|
+
"exchange",
|
|
38
|
+
"ticker",
|
|
39
|
+
"refinitiv_identifier_code",
|
|
40
|
+
"refinitiv_mnemonic_code",
|
|
41
|
+
"isin",
|
|
42
|
+
"currency",
|
|
43
|
+
"country",
|
|
44
|
+
)
|
|
45
|
+
list_filter = ["instrument_type", "is_investable_universe", "is_security", "is_managed", "is_primary"]
|
|
46
|
+
fieldsets = (
|
|
47
|
+
(
|
|
48
|
+
"Instrument Information",
|
|
49
|
+
{
|
|
50
|
+
"fields": (
|
|
51
|
+
("name", "name_repr", "computed_str"),
|
|
52
|
+
("parent", "instrument_type"),
|
|
53
|
+
("is_cash", "is_security", "is_managed", "is_investable_universe", "is_primary"),
|
|
54
|
+
("inception_date", "delisted_date"),
|
|
55
|
+
("primary_url", "additional_urls"),
|
|
56
|
+
(
|
|
57
|
+
"ticker",
|
|
58
|
+
"identifier",
|
|
59
|
+
"refinitiv_identifier_code",
|
|
60
|
+
"refinitiv_mnemonic_code",
|
|
61
|
+
),
|
|
62
|
+
(
|
|
63
|
+
"cusip",
|
|
64
|
+
"sedol",
|
|
65
|
+
"valoren",
|
|
66
|
+
),
|
|
67
|
+
("isin", "old_isins", "tags"),
|
|
68
|
+
("currency", "country", "headquarter_city", "headquarter_address"),
|
|
69
|
+
(
|
|
70
|
+
"exchange",
|
|
71
|
+
"import_source",
|
|
72
|
+
"base_color",
|
|
73
|
+
),
|
|
74
|
+
("description",),
|
|
75
|
+
("dl_parameters", "source", "source_id"),
|
|
76
|
+
)
|
|
77
|
+
},
|
|
78
|
+
),
|
|
79
|
+
)
|
|
80
|
+
search_fields = (
|
|
81
|
+
"name",
|
|
82
|
+
"name_repr",
|
|
83
|
+
"isin",
|
|
84
|
+
"ticker",
|
|
85
|
+
"computed_str",
|
|
86
|
+
"refinitiv_identifier_code",
|
|
87
|
+
"refinitiv_mnemonic_code",
|
|
88
|
+
"cusip",
|
|
89
|
+
"sedol",
|
|
90
|
+
"valoren",
|
|
91
|
+
"source_id",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
autocomplete_fields = ["parent", "currency", "country", "headquarter_city", "related_instruments", "tags"]
|
|
95
|
+
readonly_fields = ["computed_str", "last_update", "last_valuation_date"]
|
|
96
|
+
inlines = [InstrumentInline, RelatedInstrumentThroughModelInlineAdmin, InstrumentClassificationThroughModelAdmin]
|
|
97
|
+
raw_id_fields = [
|
|
98
|
+
"import_source",
|
|
99
|
+
]
|
|
100
|
+
|
|
101
|
+
actions = ["reimport_prices_since_inception"]
|
|
102
|
+
|
|
103
|
+
def reimport_prices_since_inception(self, request, queryset):
|
|
104
|
+
for instrument in queryset:
|
|
105
|
+
for investable_children in instrument.get_descendants(include_self=True).filter(
|
|
106
|
+
is_investable_universe=True
|
|
107
|
+
): # trigger the recomputation for all children within the investable universe
|
|
108
|
+
import_prices_as_task.delay(investable_children.id, clear=True)
|
|
109
|
+
|
|
110
|
+
def isin(self, obj):
|
|
111
|
+
return obj.isin
|
|
112
|
+
|
|
113
|
+
def ric(self, obj):
|
|
114
|
+
return obj.ric
|
|
115
|
+
|
|
116
|
+
def get_queryset(self, request):
|
|
117
|
+
return super().get_queryset(request).select_related("currency", "country", "instrument_type")
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
from django.contrib import admin
|
|
2
|
+
from wbfdm.models import (
|
|
3
|
+
InstrumentClassificationThroughModel,
|
|
4
|
+
InstrumentFavoriteGroup,
|
|
5
|
+
RelatedInstrumentThroughModel,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@admin.register(InstrumentFavoriteGroup)
|
|
10
|
+
class InstrumentFavoriteGroupModelAdmin(admin.ModelAdmin):
|
|
11
|
+
list_display = ("name", "owner", "public", "primary")
|
|
12
|
+
autocomplete_fields = ["instruments", "owner"]
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class InstrumentClassificationThroughModelAdmin(admin.TabularInline):
|
|
16
|
+
list_display = ("classification", "is_favorite")
|
|
17
|
+
model = InstrumentClassificationThroughModel
|
|
18
|
+
fk_name = "instrument"
|
|
19
|
+
autocomplete_fields = ["classification"]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class RelatedInstrumentThroughModelInlineAdmin(admin.TabularInline):
|
|
23
|
+
model = RelatedInstrumentThroughModel
|
|
24
|
+
fk_name = "instrument"
|
|
25
|
+
autocomplete_fields = ["related_instrument"]
|
wbfdm/admin/options.py
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
from django.contrib import admin
|
|
2
|
+
from wbfdm.models import Option, OptionAggregate
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
@admin.register(OptionAggregate)
|
|
6
|
+
class OptionAggregateModelAdmin(admin.ModelAdmin):
|
|
7
|
+
list_display = ("type", "instrument", "date")
|
|
8
|
+
|
|
9
|
+
ordering = ("-date",)
|
|
10
|
+
|
|
11
|
+
autocomplete_fields = ["instrument"]
|
|
12
|
+
fieldsets = (
|
|
13
|
+
(
|
|
14
|
+
"Main Data",
|
|
15
|
+
{"fields": (("type", "instrument", "date", "import_source"),)},
|
|
16
|
+
),
|
|
17
|
+
(
|
|
18
|
+
"Base Metrics",
|
|
19
|
+
{
|
|
20
|
+
"fields": (
|
|
21
|
+
(
|
|
22
|
+
"volume",
|
|
23
|
+
"volume_5d",
|
|
24
|
+
"volume_10d",
|
|
25
|
+
"volume_20d",
|
|
26
|
+
"volume_50d",
|
|
27
|
+
),
|
|
28
|
+
(
|
|
29
|
+
"open_interest",
|
|
30
|
+
"open_interest_5d",
|
|
31
|
+
"open_interest_10d",
|
|
32
|
+
"open_interest_20d",
|
|
33
|
+
"open_interest_50d",
|
|
34
|
+
),
|
|
35
|
+
("volatility", "volatility_30d", "volatility_60d", "volatility_90d"),
|
|
36
|
+
)
|
|
37
|
+
},
|
|
38
|
+
),
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
raw_id_fields = ["import_source", "instrument"]
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@admin.register(Option)
|
|
45
|
+
class OptionModelAdmin(admin.ModelAdmin):
|
|
46
|
+
list_display = ("type", "contract_identifier", "instrument", "date", "expiration_date", "strike")
|
|
47
|
+
|
|
48
|
+
ordering = ("-date",)
|
|
49
|
+
|
|
50
|
+
autocomplete_fields = ["instrument"]
|
|
51
|
+
fieldsets = (
|
|
52
|
+
(
|
|
53
|
+
"Main Data",
|
|
54
|
+
{
|
|
55
|
+
"fields": (
|
|
56
|
+
(
|
|
57
|
+
"type",
|
|
58
|
+
"instrument",
|
|
59
|
+
"contract_identifier",
|
|
60
|
+
"strike",
|
|
61
|
+
),
|
|
62
|
+
("date", "expiration_date", "import_source"),
|
|
63
|
+
)
|
|
64
|
+
},
|
|
65
|
+
),
|
|
66
|
+
(
|
|
67
|
+
"EOD",
|
|
68
|
+
{
|
|
69
|
+
"fields": (
|
|
70
|
+
(
|
|
71
|
+
"open",
|
|
72
|
+
"high",
|
|
73
|
+
"low",
|
|
74
|
+
),
|
|
75
|
+
("close", "bid", "ask"),
|
|
76
|
+
)
|
|
77
|
+
},
|
|
78
|
+
),
|
|
79
|
+
(
|
|
80
|
+
"Base Metrics",
|
|
81
|
+
{
|
|
82
|
+
"fields": (
|
|
83
|
+
("volume", "open_interest"),
|
|
84
|
+
("volatility_30d", "volatility_60d", "volatility_90d"),
|
|
85
|
+
)
|
|
86
|
+
},
|
|
87
|
+
),
|
|
88
|
+
(
|
|
89
|
+
"Risk Metrics",
|
|
90
|
+
{
|
|
91
|
+
"fields": (
|
|
92
|
+
("risk_delta", "risk_theta", "risk_gamma"),
|
|
93
|
+
("risk_vega", "risk_rho", "risk_lambda"),
|
|
94
|
+
("risk_epsilon", "risk_vomma", "risk_vera"),
|
|
95
|
+
("risk_speed", "risk_zomma", "risk_color", "risk_ultima"),
|
|
96
|
+
)
|
|
97
|
+
},
|
|
98
|
+
),
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
raw_id_fields = ["import_source", "instrument"]
|
|
File without changes
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
from wbcore.utils.enum import ChoiceEnum
|
|
2
|
+
from wbfdm.enums import ESG
|
|
3
|
+
|
|
4
|
+
from .utils import get_esg_df
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class AggregationMethod(ChoiceEnum):
|
|
8
|
+
PERCENTAGE_SUM = "Percentage Sum"
|
|
9
|
+
WEIGHTED_AVG_NORMALIZED = "Weighted Avg Normalized"
|
|
10
|
+
WEIGHTED_AVG_CATEGORY_NORMALIZED = "Weighted Avg Weighted (Per Category)"
|
|
11
|
+
INVESTOR_ALLOCATION = "Investor Allocation"
|
|
12
|
+
INVESTOR_ALLOCATION_PER_MILLION = "Investor Allocation Per Million"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ESGAggregation(ChoiceEnum):
|
|
16
|
+
GHG_EMISSIONS_SCOPE_1 = "GHG Emissions Scope 1"
|
|
17
|
+
GHG_EMISSIONS_SCOPE_2 = "GHG Emissions Scope 2"
|
|
18
|
+
GHG_EMISSIONS_SCOPE_3 = "GHG Emissions Scope 3"
|
|
19
|
+
GHG_EMISSIONS_SCOPE_123 = "GHG Emissions Scope 123"
|
|
20
|
+
CARBON_FOOTPRINT = "Carbon Footprint"
|
|
21
|
+
GHG_INTENSITY_OF_COMPAGNIES = "GHG intensity of investee companies"
|
|
22
|
+
FOSSIL_FUEL_EXPOSURE = "Exposure to companies active in the fossil fuel sector"
|
|
23
|
+
SHARE_OF_NONRENEWABLE_ENERGY = "Share of nonrenewable energy consumption and production"
|
|
24
|
+
ENERGY_CONSUMPTION_INTENSITY = "Energy consumption intensity"
|
|
25
|
+
ENERGY_CONSUMPTION_INTENSITY_PER_SECTOR = "Energy consumption intensity per high-impact climate sector"
|
|
26
|
+
ACTIVITY_NEGATIVELY_IMPACTING_BIODIVERSITY = "Activities negatively affecting biodiversity sensitive areas"
|
|
27
|
+
EMISSIONS_TO_WATER = "Emissions to water"
|
|
28
|
+
HAZARDOUS_WASTE_RATIO = "Hazardous Waste Ratio"
|
|
29
|
+
VIOLATION_OF_UN_PRINCIPLES = "Violations of UN Global Compact principles and Organisation for Economic Cooperation and Development (OECD) Guidelines for Multinational Enterprises"
|
|
30
|
+
LACK_OF_PROCESS_AND_COMPLIANCE_OF_UN_PRINCIPLES = "Lack of processes and compliance mechanisms to monitor compliance with UN Global Compact principles and OECD Guidelines for Multinational Enterprises"
|
|
31
|
+
UNADJUSTED_GENDER_PAY_GAP = "Unadjusted gender pay gap"
|
|
32
|
+
BOARD_GENDER_DIVERSITY = "Board Gender Diversity"
|
|
33
|
+
CONTROVERSIAL_WEAPONS_EXPOSURE = "Exposure to controversial weapons (antipersonnel mines, cluster munitions, chemical weapons and biological weapons)"
|
|
34
|
+
|
|
35
|
+
def get_aggregation(self) -> AggregationMethod:
|
|
36
|
+
return {
|
|
37
|
+
"GHG_EMISSIONS_SCOPE_1": AggregationMethod.INVESTOR_ALLOCATION,
|
|
38
|
+
"GHG_EMISSIONS_SCOPE_2": AggregationMethod.INVESTOR_ALLOCATION,
|
|
39
|
+
"GHG_EMISSIONS_SCOPE_3": AggregationMethod.INVESTOR_ALLOCATION,
|
|
40
|
+
"GHG_EMISSIONS_SCOPE_123": AggregationMethod.INVESTOR_ALLOCATION,
|
|
41
|
+
"CARBON_FOOTPRINT": AggregationMethod.INVESTOR_ALLOCATION_PER_MILLION,
|
|
42
|
+
"GHG_INTENSITY_OF_COMPAGNIES": AggregationMethod.WEIGHTED_AVG_NORMALIZED,
|
|
43
|
+
"FOSSIL_FUEL_EXPOSURE": AggregationMethod.PERCENTAGE_SUM,
|
|
44
|
+
"SHARE_OF_NONRENEWABLE_ENERGY": AggregationMethod.WEIGHTED_AVG_NORMALIZED,
|
|
45
|
+
"ENERGY_CONSUMPTION_INTENSITY": AggregationMethod.WEIGHTED_AVG_NORMALIZED,
|
|
46
|
+
"ENERGY_CONSUMPTION_INTENSITY_PER_SECTOR": AggregationMethod.WEIGHTED_AVG_CATEGORY_NORMALIZED,
|
|
47
|
+
"ACTIVITY_NEGATIVELY_IMPACTING_BIODIVERSITY": AggregationMethod.PERCENTAGE_SUM,
|
|
48
|
+
"EMISSIONS_TO_WATER": AggregationMethod.INVESTOR_ALLOCATION_PER_MILLION,
|
|
49
|
+
"HAZARDOUS_WASTE_RATIO": AggregationMethod.INVESTOR_ALLOCATION_PER_MILLION,
|
|
50
|
+
"VIOLATION_OF_UN_PRINCIPLES": AggregationMethod.PERCENTAGE_SUM,
|
|
51
|
+
"LACK_OF_PROCESS_AND_COMPLIANCE_OF_UN_PRINCIPLES": AggregationMethod.PERCENTAGE_SUM,
|
|
52
|
+
"UNADJUSTED_GENDER_PAY_GAP": AggregationMethod.WEIGHTED_AVG_NORMALIZED,
|
|
53
|
+
"BOARD_GENDER_DIVERSITY": AggregationMethod.WEIGHTED_AVG_NORMALIZED,
|
|
54
|
+
"CONTROVERSIAL_WEAPONS_EXPOSURE": AggregationMethod.PERCENTAGE_SUM,
|
|
55
|
+
}.get(
|
|
56
|
+
self.name, AggregationMethod.WEIGHTED_AVG_NORMALIZED
|
|
57
|
+
) # default to weighted avg normalized
|
|
58
|
+
|
|
59
|
+
def get_esg_code(self) -> ESG:
|
|
60
|
+
return {
|
|
61
|
+
"GHG_EMISSIONS_SCOPE_1": ESG.CARBON_EMISSIONS_SCOPE_1,
|
|
62
|
+
"GHG_EMISSIONS_SCOPE_2": ESG.CARBON_EMISSIONS_SCOPE_2,
|
|
63
|
+
"GHG_EMISSIONS_SCOPE_3": ESG.CARBON_EMISSIONS_SCOPE_3_TOTAL,
|
|
64
|
+
"GHG_EMISSIONS_SCOPE_123": ESG.CARBON_EMISSIONS_SCOPE123,
|
|
65
|
+
"CARBON_FOOTPRINT": ESG.CARBON_EMISSIONS_SCOPE123,
|
|
66
|
+
"GHG_INTENSITY_OF_COMPAGNIES": ESG.CARBON_EMISSIONS_SALES_EUR_SCOPE_ALL,
|
|
67
|
+
"FOSSIL_FUEL_EXPOSURE": ESG.ACTIVE_FF_SECTOR_EXPOSURE,
|
|
68
|
+
"SHARE_OF_NONRENEWABLE_ENERGY": ESG.PCT_NON_RENEW_CONSUMPTION_PRODUCTION,
|
|
69
|
+
"ENERGY_CONSUMPTION_INTENSITY": ESG.ENERGY_CONSUMPTION_INTENSITY_EUR,
|
|
70
|
+
"ENERGY_CONSUMPTION_INTENSITY_PER_SECTOR": ESG.ENERGY_CONSUMPTION_INTENSITY_EUR,
|
|
71
|
+
"ACTIVITY_NEGATIVELY_IMPACTING_BIODIVERSITY": ESG.OPS_BIODIV_CONTROVERSITIES,
|
|
72
|
+
"EMISSIONS_TO_WATER": ESG.WATER_EMISSIONS,
|
|
73
|
+
"HAZARDOUS_WASTE_RATIO": ESG.HAZARD_WASTE,
|
|
74
|
+
"VIOLATION_OF_UN_PRINCIPLES": ESG.OECD_ALIGNMENT,
|
|
75
|
+
"LACK_OF_PROCESS_AND_COMPLIANCE_OF_UN_PRINCIPLES": ESG.COMPLIANCE_GLOBAL_IMPACT,
|
|
76
|
+
"UNADJUSTED_GENDER_PAY_GAP": ESG.GENDER_PAY_GAP_RATIO,
|
|
77
|
+
"BOARD_GENDER_DIVERSITY": ESG.PCT_FEMALE_DIRECTORS,
|
|
78
|
+
"CONTROVERSIAL_WEAPONS_EXPOSURE": ESG.CONTROVERSIAL_WEAPONS,
|
|
79
|
+
}[self.name]
|
|
80
|
+
|
|
81
|
+
def get_esg_data(self, instruments):
|
|
82
|
+
return get_esg_df(instruments, self.get_esg_code())
|