wbfdm 1.44.5__py2.py3-none-any.whl → 1.45.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/admin/classifications.py +1 -0
- wbfdm/admin/esg.py +1 -0
- wbfdm/admin/exchanges.py +1 -0
- wbfdm/admin/instrument_lists.py +1 -0
- wbfdm/admin/instrument_prices.py +1 -0
- wbfdm/admin/instrument_requests.py +1 -0
- wbfdm/admin/instruments.py +1 -0
- wbfdm/admin/instruments_relationships.py +1 -0
- wbfdm/admin/options.py +1 -0
- wbfdm/analysis/esg/enums.py +2 -3
- wbfdm/analysis/esg/esg_analysis.py +1 -0
- wbfdm/analysis/esg/utils.py +1 -0
- wbfdm/analysis/financial_analysis/financial_metric_analysis.py +1 -0
- wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +1 -0
- wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +4 -1
- wbfdm/analysis/financial_analysis/statement_with_estimates.py +3 -4
- wbfdm/analysis/financial_analysis/utils.py +1 -0
- wbfdm/analysis/technical_analysis/technical_analysis.py +1 -0
- wbfdm/contrib/dsws/client.py +17 -2
- wbfdm/contrib/internal/dataloaders/market_data.py +1 -0
- wbfdm/contrib/metric/admin/instruments.py +1 -0
- wbfdm/contrib/metric/backends/base.py +5 -4
- wbfdm/contrib/metric/backends/performances.py +4 -3
- wbfdm/contrib/metric/backends/statistics.py +1 -0
- wbfdm/contrib/metric/factories.py +1 -0
- wbfdm/contrib/metric/filters.py +1 -0
- wbfdm/contrib/metric/serializers.py +1 -0
- wbfdm/contrib/metric/tasks.py +2 -1
- wbfdm/contrib/metric/tests/backends/test_performances.py +1 -0
- wbfdm/contrib/metric/tests/backends/test_statistics.py +1 -0
- wbfdm/contrib/metric/tests/test_models.py +1 -0
- wbfdm/contrib/metric/tests/test_viewsets.py +1 -0
- wbfdm/contrib/metric/viewsets/configs/display.py +1 -0
- wbfdm/contrib/metric/viewsets/mixins.py +1 -0
- wbfdm/contrib/metric/viewsets/viewsets.py +1 -0
- wbfdm/contrib/msci/dataloaders/esg.py +1 -0
- wbfdm/contrib/msci/dataloaders/esg_controversies.py +1 -0
- wbfdm/contrib/msci/sync.py +1 -0
- wbfdm/contrib/qa/dataloaders/adjustments.py +5 -5
- wbfdm/contrib/qa/dataloaders/corporate_actions.py +5 -5
- wbfdm/contrib/qa/dataloaders/financials.py +1 -0
- wbfdm/contrib/qa/dataloaders/market_data.py +9 -7
- wbfdm/contrib/qa/dataloaders/officers.py +8 -10
- wbfdm/contrib/qa/dataloaders/reporting_dates.py +1 -0
- wbfdm/contrib/qa/dataloaders/statements.py +1 -0
- wbfdm/contrib/qa/dataloaders/utils.py +2 -2
- wbfdm/dataloaders/proxies.py +1 -0
- wbfdm/factories/classifications.py +1 -0
- wbfdm/factories/controversies.py +1 -0
- wbfdm/factories/exchanges.py +1 -0
- wbfdm/factories/instrument_list.py +1 -0
- wbfdm/factories/instrument_prices.py +1 -0
- wbfdm/factories/instruments.py +1 -0
- wbfdm/factories/instruments_relationships.py +1 -0
- wbfdm/factories/options.py +1 -0
- wbfdm/figures/financials/financial_analysis_charts.py +1 -0
- wbfdm/figures/financials/financials_charts.py +1 -0
- wbfdm/filters/classifications.py +1 -0
- wbfdm/filters/exchanges.py +1 -0
- wbfdm/filters/financials.py +1 -0
- wbfdm/filters/financials_analysis.py +1 -0
- wbfdm/filters/instrument_prices.py +1 -0
- wbfdm/filters/instruments.py +1 -0
- wbfdm/filters/utils.py +1 -0
- wbfdm/import_export/backends/cbinsights/mixin.py +1 -0
- wbfdm/import_export/backends/refinitiv/mixin.py +1 -0
- wbfdm/import_export/backends/refinitiv/utils/controller.py +1 -0
- wbfdm/import_export/handlers/instrument.py +9 -9
- wbfdm/import_export/handlers/instrument_price.py +5 -0
- wbfdm/import_export/parsers/cbinsights/deals.py +1 -0
- wbfdm/import_export/parsers/cbinsights/equities.py +1 -0
- wbfdm/import_export/parsers/cbinsights/fundamentals.py +1 -0
- wbfdm/import_export/parsers/refinitiv/instrument.py +1 -0
- wbfdm/import_export/parsers/refinitiv/instrument_price.py +1 -0
- wbfdm/import_export/resources/classification.py +1 -0
- wbfdm/import_export/resources/instrument_prices.py +1 -0
- wbfdm/import_export/resources/instruments.py +1 -0
- wbfdm/models/esg/controversies.py +1 -0
- wbfdm/models/instruments/instrument_lists.py +1 -0
- wbfdm/models/instruments/instrument_prices.py +1 -0
- wbfdm/models/instruments/instrument_requests.py +1 -0
- wbfdm/models/instruments/instruments.py +12 -7
- wbfdm/models/instruments/llm/create_instrument_news_relationships.py +2 -2
- wbfdm/models/instruments/mixin/instruments.py +24 -19
- wbfdm/models/instruments/options.py +1 -0
- wbfdm/models/instruments/private_equities.py +1 -0
- wbfdm/models/instruments/utils.py +1 -0
- wbfdm/serializers/esg.py +1 -0
- wbfdm/serializers/exchanges.py +1 -0
- wbfdm/serializers/instruments/__init__.py +1 -0
- wbfdm/serializers/instruments/classifications.py +1 -0
- wbfdm/serializers/instruments/instrument_lists.py +1 -0
- wbfdm/serializers/instruments/instrument_prices.py +1 -0
- wbfdm/serializers/instruments/instrument_relationships.py +6 -8
- wbfdm/serializers/instruments/instrument_requests.py +1 -0
- wbfdm/serializers/instruments/instruments.py +1 -1
- wbfdm/signals.py +3 -0
- wbfdm/tasks.py +45 -5
- wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +1 -0
- wbfdm/tests/analysis/financial_analysis/test_utils.py +1 -0
- wbfdm/tests/analysis/test_esg.py +1 -0
- wbfdm/tests/dataloaders/test_cache.py +1 -0
- wbfdm/tests/models/test_classifications.py +1 -0
- wbfdm/tests/models/test_instrument_list.py +1 -0
- wbfdm/tests/models/test_instrument_prices.py +1 -0
- wbfdm/tests/models/test_instruments.py +2 -1
- wbfdm/tests/models/test_merge.py +14 -9
- wbfdm/tests/models/test_options.py +1 -0
- wbfdm/urls.py +1 -0
- wbfdm/viewsets/configs/buttons/instruments.py +1 -0
- wbfdm/viewsets/configs/display/esg.py +1 -0
- wbfdm/viewsets/configs/display/instrument_lists.py +1 -0
- wbfdm/viewsets/configs/display/instrument_prices.py +1 -0
- wbfdm/viewsets/configs/display/instrument_requests.py +1 -0
- wbfdm/viewsets/configs/display/instruments.py +31 -4
- wbfdm/viewsets/configs/endpoints/__init__.py +1 -0
- wbfdm/viewsets/configs/endpoints/instrument_requests.py +1 -0
- wbfdm/viewsets/configs/endpoints/instruments_relationships.py +10 -0
- wbfdm/viewsets/configs/titles/classifications.py +1 -0
- wbfdm/viewsets/configs/titles/financials_analysis.py +1 -0
- wbfdm/viewsets/configs/titles/instrument_prices.py +1 -0
- wbfdm/viewsets/configs/titles/market_data.py +1 -0
- wbfdm/viewsets/esg.py +1 -0
- wbfdm/viewsets/exchanges.py +1 -0
- wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +1 -0
- wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +2 -1
- wbfdm/viewsets/financial_analysis/financial_summary.py +4 -4
- wbfdm/viewsets/financial_analysis/statement_with_estimates.py +1 -0
- wbfdm/viewsets/instruments/classifications.py +1 -0
- wbfdm/viewsets/instruments/financials_analysis.py +1 -0
- wbfdm/viewsets/instruments/instrument_lists.py +1 -0
- wbfdm/viewsets/instruments/instrument_prices.py +1 -0
- wbfdm/viewsets/instruments/instrument_requests.py +1 -0
- wbfdm/viewsets/instruments/instruments.py +1 -0
- wbfdm/viewsets/instruments/instruments_relationships.py +17 -0
- wbfdm/viewsets/market_data.py +3 -2
- wbfdm/viewsets/mixins.py +1 -0
- wbfdm/viewsets/officers.py +1 -0
- wbfdm/viewsets/prices.py +1 -0
- wbfdm/viewsets/statements/statements.py +1 -0
- wbfdm/viewsets/technical_analysis/monthly_performances.py +1 -0
- {wbfdm-1.44.5.dist-info → wbfdm-1.45.1.dist-info}/METADATA +1 -1
- {wbfdm-1.44.5.dist-info → wbfdm-1.45.1.dist-info}/RECORD +144 -144
- {wbfdm-1.44.5.dist-info → wbfdm-1.45.1.dist-info}/WHEEL +0 -0
wbfdm/admin/classifications.py
CHANGED
wbfdm/admin/esg.py
CHANGED
wbfdm/admin/exchanges.py
CHANGED
wbfdm/admin/instrument_lists.py
CHANGED
wbfdm/admin/instrument_prices.py
CHANGED
wbfdm/admin/instruments.py
CHANGED
wbfdm/admin/options.py
CHANGED
wbfdm/analysis/esg/enums.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from wbcore.utils.enum import ChoiceEnum
|
|
2
|
+
|
|
2
3
|
from wbfdm.enums import ESG
|
|
3
4
|
|
|
4
5
|
from .utils import get_esg_df
|
|
@@ -52,9 +53,7 @@ class ESGAggregation(ChoiceEnum):
|
|
|
52
53
|
"UNADJUSTED_GENDER_PAY_GAP": AggregationMethod.WEIGHTED_AVG_NORMALIZED,
|
|
53
54
|
"BOARD_GENDER_DIVERSITY": AggregationMethod.WEIGHTED_AVG_NORMALIZED,
|
|
54
55
|
"CONTROVERSIAL_WEAPONS_EXPOSURE": AggregationMethod.PERCENTAGE_SUM,
|
|
55
|
-
}.get(
|
|
56
|
-
self.name, AggregationMethod.WEIGHTED_AVG_NORMALIZED
|
|
57
|
-
) # default to weighted avg normalized
|
|
56
|
+
}.get(self.name, AggregationMethod.WEIGHTED_AVG_NORMALIZED) # default to weighted avg normalized
|
|
58
57
|
|
|
59
58
|
def get_esg_code(self) -> ESG:
|
|
60
59
|
return {
|
wbfdm/analysis/esg/utils.py
CHANGED
|
@@ -3,6 +3,7 @@ from math import pow
|
|
|
3
3
|
|
|
4
4
|
import numpy as np
|
|
5
5
|
import pandas as pd
|
|
6
|
+
from dateutil.relativedelta import relativedelta
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
class FinancialStatistics:
|
|
@@ -241,7 +242,9 @@ class FinancialStatistics:
|
|
|
241
242
|
def get_annualized_daily_volatility(self) -> float:
|
|
242
243
|
"""Computed the annualized volatility"""
|
|
243
244
|
df = self.compute_performance(freq=1)
|
|
244
|
-
|
|
245
|
+
last_date = df.index[-1]
|
|
246
|
+
last_year = last_date - relativedelta(months=12)
|
|
247
|
+
df = df.loc[df.index >= last_year]
|
|
245
248
|
return df.std()
|
|
246
249
|
|
|
247
250
|
def prepare_daily_returns_instrument_vs_benchmark(self, benchmark_prices_df: pd.Series) -> pd.DataFrame:
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import pandas as pd
|
|
2
|
+
|
|
2
3
|
from wbfdm.enums import CalendarType, Financial, MarketData
|
|
3
4
|
from wbfdm.models import Instrument
|
|
4
5
|
|
|
@@ -334,10 +335,8 @@ class StatementWithEstimates:
|
|
|
334
335
|
* 100,
|
|
335
336
|
quarterly_df.get(Financial.EBIT.value, quarterly_empty_series).rolling(4, min_periods=1).sum()
|
|
336
337
|
/ (
|
|
337
|
-
(
|
|
338
|
-
|
|
339
|
-
- quarterly_df.get(Financial.CURRENT_LIABILITIES.value, quarterly_empty_series)
|
|
340
|
-
)
|
|
338
|
+
quarterly_df.get(Financial.TOTAL_ASSETS.value, quarterly_empty_series)
|
|
339
|
+
- quarterly_df.get(Financial.CURRENT_LIABILITIES.value, quarterly_empty_series)
|
|
341
340
|
)
|
|
342
341
|
* 100,
|
|
343
342
|
],
|
|
@@ -8,6 +8,7 @@ from wbcore.pandas.utils import (
|
|
|
8
8
|
override_number_to_x,
|
|
9
9
|
override_number_with_currency,
|
|
10
10
|
)
|
|
11
|
+
|
|
11
12
|
from wbfdm.enums import CalendarType, Financial, MarketData, PeriodType
|
|
12
13
|
from wbfdm.models import Instrument
|
|
13
14
|
from wbfdm.utils import rename_period_index_level_to_repr
|
|
@@ -4,6 +4,7 @@ from typing import TYPE_CHECKING, Literal
|
|
|
4
4
|
import pandas as pd
|
|
5
5
|
from pandas.tseries.offsets import BDay
|
|
6
6
|
from stockstats import StockDataFrame
|
|
7
|
+
|
|
7
8
|
from wbfdm.analysis.technical_analysis.traces import TechnicalAnalysisTraceFactory
|
|
8
9
|
from wbfdm.enums import MarketData
|
|
9
10
|
|
wbfdm/contrib/dsws/client.py
CHANGED
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
import math
|
|
2
2
|
import re
|
|
3
|
-
from datetime import date
|
|
3
|
+
from datetime import date, datetime
|
|
4
4
|
from typing import Generator, List, Optional
|
|
5
5
|
|
|
6
6
|
import DatastreamPy as dsweb
|
|
7
7
|
import numpy as np
|
|
8
8
|
import pandas as pd
|
|
9
|
+
import pytz
|
|
10
|
+
from django.core.cache import cache
|
|
11
|
+
from django.utils import timezone
|
|
9
12
|
from wbcore.contrib.currency.models import Currency, CurrencyFXRates
|
|
10
13
|
|
|
11
14
|
|
|
15
|
+
class CachedTokenDataClient(dsweb.DataClient):
|
|
16
|
+
def _get_token(self, isProxy=False):
|
|
17
|
+
if (token := cache.get("dsws_token")) and (token_expiry := cache.get("dsws_token_expiry")):
|
|
18
|
+
self.token = token
|
|
19
|
+
self.tokenExpiry = timezone.make_aware(datetime.fromtimestamp(token_expiry), timezone=pytz.UTC)
|
|
20
|
+
else:
|
|
21
|
+
super()._get_token()
|
|
22
|
+
expiry_elapse = (self.tokenExpiry - timezone.now()).seconds
|
|
23
|
+
cache.set("dsws_token", self.token, timeout=expiry_elapse)
|
|
24
|
+
cache.set("dsws_token_expiry", datetime.timestamp(self.tokenExpiry), timeout=expiry_elapse)
|
|
25
|
+
|
|
26
|
+
|
|
12
27
|
class Client:
|
|
13
28
|
MAXIMUM_ITEMS_PER_BUNDLE: int = 500
|
|
14
29
|
MAXIMUM_REQUESTS_PER_BUNDLE: int = 20
|
|
@@ -19,7 +34,7 @@ class Client:
|
|
|
19
34
|
IBUNIT_DEFAULT_UNIT: float = 1e6
|
|
20
35
|
|
|
21
36
|
def __init__(self, username: Optional[str] = None, password: Optional[str] = None):
|
|
22
|
-
self.connection =
|
|
37
|
+
self.connection = CachedTokenDataClient(None, username, password)
|
|
23
38
|
super().__init__()
|
|
24
39
|
|
|
25
40
|
@classmethod
|
|
@@ -3,6 +3,7 @@ from decimal import Decimal
|
|
|
3
3
|
from typing import Iterator
|
|
4
4
|
|
|
5
5
|
from wbcore.contrib.dataloader.dataloaders import Dataloader
|
|
6
|
+
|
|
6
7
|
from wbfdm.dataloaders.protocols import MarketDataProtocol
|
|
7
8
|
from wbfdm.dataloaders.types import MarketDataDict
|
|
8
9
|
from wbfdm.enums import MarketData
|
|
@@ -9,6 +9,7 @@ from django.db.models import F, Model, QuerySet, Value
|
|
|
9
9
|
from rest_framework.serializers import Field
|
|
10
10
|
from wbcore import serializers as wb_serializers
|
|
11
11
|
from wbcore.contrib.currency.models import CurrencyFXRates
|
|
12
|
+
|
|
12
13
|
from wbfdm.models import Instrument, InstrumentPrice
|
|
13
14
|
|
|
14
15
|
from ..dto import Metric, MetricField, MetricKey
|
|
@@ -65,10 +66,10 @@ class AbstractBackend(Generic[T]):
|
|
|
65
66
|
}
|
|
66
67
|
)
|
|
67
68
|
for extra_subfield in metric_key.extra_subfields:
|
|
68
|
-
fields[
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
read_only=True, label=extra_subfield.label, **self.get_serializer_field_attr(extra_subfield)
|
|
69
|
+
fields[f"{metric_key.key}_{extra_subfield.key}"] = (
|
|
70
|
+
wb_serializers.ModelSerializer.serializer_field_mapping[
|
|
71
|
+
extra_subfield.field_type
|
|
72
|
+
](read_only=True, label=extra_subfield.label, **self.get_serializer_field_attr(extra_subfield))
|
|
72
73
|
)
|
|
73
74
|
return fields
|
|
74
75
|
|
|
@@ -6,6 +6,7 @@ import numpy as np
|
|
|
6
6
|
import pandas as pd
|
|
7
7
|
from dateutil.relativedelta import relativedelta
|
|
8
8
|
from django.db.models import Avg, BooleanField, DateField, F, QuerySet
|
|
9
|
+
|
|
9
10
|
from wbfdm.models import Instrument, InstrumentPrice, RelatedInstrumentThroughModel
|
|
10
11
|
|
|
11
12
|
from ..decorators import register
|
|
@@ -252,9 +253,9 @@ class InstrumentPerformanceMetricBackend(InstrumentMetricBaseBackend):
|
|
|
252
253
|
|
|
253
254
|
with suppress(KeyError):
|
|
254
255
|
start_date = Dataloader.get_performance_date_map(pivot_date)[metric_field.key.replace("previous_", "")]
|
|
255
|
-
attrs[
|
|
256
|
-
"
|
|
257
|
-
|
|
256
|
+
attrs["help_text"] = (
|
|
257
|
+
f"The {metric_field.label} performance is computed from {start_date:%Y-%m-%d} to {pivot_date:%Y-%m-%d}"
|
|
258
|
+
)
|
|
258
259
|
return attrs
|
|
259
260
|
|
|
260
261
|
|
|
@@ -5,6 +5,7 @@ from typing import Generator
|
|
|
5
5
|
import pandas as pd
|
|
6
6
|
from django.db.models import Avg, Sum
|
|
7
7
|
from wbcore.serializers.fields.number import DisplayMode
|
|
8
|
+
|
|
8
9
|
from wbfdm.enums import Financial, PeriodType, SeriesType
|
|
9
10
|
from wbfdm.models import Instrument, InstrumentPrice
|
|
10
11
|
|
wbfdm/contrib/metric/filters.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from rest_framework.reverse import reverse
|
|
2
2
|
from wbcore import serializers as wb_serializers
|
|
3
3
|
from wbcore.content_type.serializers import ContentTypeRepresentationSerializer
|
|
4
|
+
|
|
4
5
|
from wbfdm.contrib.metric.models import InstrumentMetric
|
|
5
6
|
from wbfdm.serializers.instruments import InstrumentRepresentationSerializer
|
|
6
7
|
|
wbfdm/contrib/metric/tasks.py
CHANGED
|
@@ -2,6 +2,7 @@ from datetime import date
|
|
|
2
2
|
|
|
3
3
|
from celery import shared_task
|
|
4
4
|
from django.contrib.contenttypes.models import ContentType
|
|
5
|
+
|
|
5
6
|
from wbfdm.contrib.metric.orchestrators import MetricOrchestrator
|
|
6
7
|
|
|
7
8
|
|
|
@@ -11,7 +12,7 @@ def compute_metrics_as_task(
|
|
|
11
12
|
key: str | None = None,
|
|
12
13
|
basket_content_type_id: int | None = None,
|
|
13
14
|
basket_id: int | None = None,
|
|
14
|
-
**kwargs
|
|
15
|
+
**kwargs,
|
|
15
16
|
):
|
|
16
17
|
"""
|
|
17
18
|
Run the orchestrator as a async task periodically for all keys and baskets
|
|
@@ -5,6 +5,7 @@ from faker import Faker
|
|
|
5
5
|
from rest_framework.test import APIRequestFactory
|
|
6
6
|
from wbcore import viewsets
|
|
7
7
|
from wbcore.utils.strings import get_aggregate_symbol
|
|
8
|
+
|
|
8
9
|
from wbfdm.contrib.metric.backends.performances import (
|
|
9
10
|
PERFORMANCE_METRIC,
|
|
10
11
|
InstrumentPerformanceMetricBackend,
|
|
@@ -9,6 +9,7 @@ from wbcore.metadata.configs.display.instance_display.shortcuts import (
|
|
|
9
9
|
)
|
|
10
10
|
from wbcore.metadata.configs.display.instance_display.utils import repeat_field
|
|
11
11
|
from wbcore.metadata.configs.display.view_config import DisplayViewConfig
|
|
12
|
+
|
|
12
13
|
from wbfdm.contrib.metric.dto import MetricField
|
|
13
14
|
|
|
14
15
|
|
|
@@ -6,6 +6,7 @@ from django.utils.functional import cached_property
|
|
|
6
6
|
from wbcore import filters
|
|
7
7
|
from wbcore.metadata.metadata import WBCoreMetadata
|
|
8
8
|
from wbcore.utils.strings import get_aggregate_symbol
|
|
9
|
+
|
|
9
10
|
from wbfdm.contrib.metric.models import InstrumentMetric
|
|
10
11
|
from wbfdm.contrib.metric.registry import backend_registry
|
|
11
12
|
from wbfdm.contrib.metric.viewsets.configs.display import (
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from django.db.models import Case, Exists, F, IntegerField, OuterRef, When
|
|
2
2
|
from wbcore import viewsets
|
|
3
|
+
|
|
3
4
|
from wbfdm.contrib.metric.filters import InstrumentMetricFilterSet
|
|
4
5
|
from wbfdm.contrib.metric.models import InstrumentMetric
|
|
5
6
|
from wbfdm.contrib.metric.serializers import (
|
wbfdm/contrib/msci/sync.py
CHANGED
|
@@ -3,18 +3,18 @@ from datetime import date
|
|
|
3
3
|
from itertools import batched
|
|
4
4
|
from typing import Iterator
|
|
5
5
|
|
|
6
|
+
import pypika as pk
|
|
6
7
|
from django.db import ProgrammingError, connections
|
|
8
|
+
from pypika import functions as fn
|
|
9
|
+
from pypika.enums import Order, SqlTypes
|
|
10
|
+
from pypika.terms import LiteralValue
|
|
7
11
|
from wbcore.contrib.dataloader.dataloaders import Dataloader
|
|
8
12
|
from wbcore.contrib.dataloader.utils import dictfetchall
|
|
13
|
+
|
|
9
14
|
from wbfdm.contrib.qa.dataloaders.utils import SOURCE_DS2
|
|
10
15
|
from wbfdm.dataloaders.protocols import AdjustmentsProtocol
|
|
11
16
|
from wbfdm.dataloaders.types import AdjustmentDataDict
|
|
12
17
|
|
|
13
|
-
import pypika as pk
|
|
14
|
-
from pypika import functions as fn
|
|
15
|
-
from pypika.enums import SqlTypes, Order
|
|
16
|
-
from pypika.terms import LiteralValue
|
|
17
|
-
|
|
18
18
|
|
|
19
19
|
class DatastreamAdjustmentsDataloader(AdjustmentsProtocol, Dataloader):
|
|
20
20
|
def adjustments(self, from_date: date | None = None, to_date: date | None = None) -> Iterator[AdjustmentDataDict]:
|
|
@@ -3,18 +3,18 @@ from datetime import date
|
|
|
3
3
|
from itertools import batched
|
|
4
4
|
from typing import Iterator
|
|
5
5
|
|
|
6
|
+
import pypika as pk
|
|
6
7
|
from django.db import ProgrammingError, connections
|
|
8
|
+
from pypika import functions as fn
|
|
9
|
+
from pypika.enums import SqlTypes
|
|
10
|
+
from pypika.terms import LiteralValue
|
|
7
11
|
from wbcore.contrib.dataloader.dataloaders import Dataloader
|
|
8
12
|
from wbcore.contrib.dataloader.utils import dictfetchall
|
|
13
|
+
|
|
9
14
|
from wbfdm.contrib.qa.dataloaders.utils import SOURCE_DS2
|
|
10
15
|
from wbfdm.dataloaders.protocols import CorporateActionsProtocol
|
|
11
16
|
from wbfdm.dataloaders.types import CorporateActionDataDict
|
|
12
17
|
|
|
13
|
-
import pypika as pk
|
|
14
|
-
from pypika import functions as fn
|
|
15
|
-
from pypika.enums import SqlTypes
|
|
16
|
-
from pypika.terms import LiteralValue
|
|
17
|
-
|
|
18
18
|
|
|
19
19
|
class DatastreamCorporateActionsDataloader(CorporateActionsProtocol, Dataloader):
|
|
20
20
|
def corporate_actions(
|
|
@@ -7,6 +7,7 @@ from django.template.loader import get_template
|
|
|
7
7
|
from jinjasql import JinjaSql # type: ignore
|
|
8
8
|
from wbcore.contrib.dataloader.dataloaders import Dataloader
|
|
9
9
|
from wbcore.contrib.dataloader.utils import dictfetchall
|
|
10
|
+
|
|
10
11
|
from wbfdm.dataloaders.protocols import FinancialsProtocol
|
|
11
12
|
from wbfdm.dataloaders.types import FinancialDataDict
|
|
12
13
|
from wbfdm.enums import (
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
from contextlib import suppress
|
|
2
|
-
from functools import reduce
|
|
3
|
-
from itertools import batched
|
|
4
2
|
from datetime import date
|
|
5
3
|
from enum import Enum
|
|
4
|
+
from functools import reduce
|
|
5
|
+
from itertools import batched
|
|
6
6
|
from typing import Iterator
|
|
7
|
-
import pypika as pk
|
|
8
|
-
from pypika import Column, MSSQLQuery, functions as fn
|
|
9
|
-
from pypika.enums import SqlTypes, Order
|
|
10
|
-
from pypika.terms import ValueWrapper, LiteralValue
|
|
11
7
|
|
|
8
|
+
import pypika as pk
|
|
12
9
|
from django.db import ProgrammingError, connections
|
|
10
|
+
from pypika import Column, MSSQLQuery
|
|
11
|
+
from pypika import functions as fn
|
|
12
|
+
from pypika.enums import Order, SqlTypes
|
|
13
|
+
from pypika.terms import LiteralValue, ValueWrapper
|
|
13
14
|
from wbcore.contrib.dataloader.dataloaders import Dataloader
|
|
14
15
|
from wbcore.contrib.dataloader.utils import dictfetchall
|
|
15
|
-
|
|
16
|
+
|
|
16
17
|
from wbfdm.contrib.qa.dataloaders.utils import create_table
|
|
18
|
+
from wbfdm.dataloaders.protocols import MarketDataProtocol
|
|
17
19
|
from wbfdm.dataloaders.types import MarketDataDict
|
|
18
20
|
from wbfdm.enums import Frequency, MarketData
|
|
19
21
|
|
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
from typing import Iterator
|
|
2
|
-
|
|
3
|
-
from django.db import connections, ProgrammingError
|
|
4
|
-
from wbcore.contrib.dataloader.dataloaders import Dataloader
|
|
5
|
-
from wbcore.contrib.dataloader.utils import dictfetchall
|
|
6
|
-
from wbfdm.dataloaders.protocols import OfficersProtocol
|
|
7
|
-
from wbfdm.dataloaders.types import OfficerDataDict
|
|
8
|
-
from itertools import batched
|
|
9
1
|
from contextlib import suppress
|
|
2
|
+
from itertools import batched
|
|
3
|
+
from typing import Iterator
|
|
10
4
|
|
|
11
5
|
import pypika as pk
|
|
6
|
+
from django.db import ProgrammingError, connections
|
|
12
7
|
from pypika import functions as fn
|
|
8
|
+
from pypika.analytics import RowNumber
|
|
13
9
|
from pypika.enums import SqlTypes
|
|
14
10
|
from pypika.terms import LiteralValue
|
|
11
|
+
from wbcore.contrib.dataloader.dataloaders import Dataloader
|
|
12
|
+
from wbcore.contrib.dataloader.utils import dictfetchall
|
|
15
13
|
|
|
16
|
-
|
|
17
|
-
from
|
|
14
|
+
from wbfdm.dataloaders.protocols import OfficersProtocol
|
|
15
|
+
from wbfdm.dataloaders.types import OfficerDataDict
|
|
18
16
|
|
|
19
17
|
|
|
20
18
|
class RKDOfficersDataloader(OfficersProtocol, Dataloader):
|
|
@@ -4,6 +4,7 @@ from django.db import connections
|
|
|
4
4
|
from jinjasql import JinjaSql
|
|
5
5
|
from wbcore.contrib.dataloader.dataloaders import Dataloader
|
|
6
6
|
from wbcore.contrib.dataloader.utils import dictfetchall
|
|
7
|
+
|
|
7
8
|
from wbfdm.dataloaders.protocols import ReportDateProtocol
|
|
8
9
|
from wbfdm.dataloaders.types import ReportDateDataDict
|
|
9
10
|
|
|
@@ -6,6 +6,7 @@ from django.db import connections
|
|
|
6
6
|
from jinjasql import JinjaSql # type: ignore
|
|
7
7
|
from wbcore.contrib.dataloader.dataloaders import Dataloader
|
|
8
8
|
from wbcore.contrib.dataloader.utils import dictfetchall
|
|
9
|
+
|
|
9
10
|
from wbfdm.dataloaders.protocols import StatementsProtocol
|
|
10
11
|
from wbfdm.dataloaders.types import StatementDataDict
|
|
11
12
|
from wbfdm.enums import DataType, Financial, PeriodType, StatementType
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
from typing import TYPE_CHECKING
|
|
2
2
|
|
|
3
|
-
from pypika.terms import ValueWrapper
|
|
4
3
|
from pypika import Column, MSSQLQuery, Table
|
|
4
|
+
from pypika.terms import ValueWrapper
|
|
5
5
|
|
|
6
6
|
if TYPE_CHECKING:
|
|
7
|
-
from pypika.terms import Term
|
|
8
7
|
from pypika.queries import CreateQueryBuilder
|
|
8
|
+
from pypika.terms import Term
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
def compile_source(source: str) -> "Term":
|
wbfdm/dataloaders/proxies.py
CHANGED
wbfdm/factories/controversies.py
CHANGED
wbfdm/factories/exchanges.py
CHANGED
wbfdm/factories/instruments.py
CHANGED