wbfdm 1.49.1__py2.py3-none-any.whl → 1.49.3__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/contrib/dsws/dataloaders/market_data.py +2 -0
- wbfdm/contrib/qa/dataloaders/market_data.py +1 -1
- wbfdm/models/instruments/instruments.py +16 -12
- wbfdm/models/instruments/querysets.py +7 -0
- wbfdm/viewsets/configs/display/instrument_lists.py +10 -9
- wbfdm/viewsets/configs/display/instruments.py +1 -1
- {wbfdm-1.49.1.dist-info → wbfdm-1.49.3.dist-info}/METADATA +1 -1
- {wbfdm-1.49.1.dist-info → wbfdm-1.49.3.dist-info}/RECORD +9 -9
- {wbfdm-1.49.1.dist-info → wbfdm-1.49.3.dist-info}/WHEEL +0 -0
|
@@ -75,6 +75,8 @@ class DSWSMarketDataDataloader(MarketDataProtocol, Dataloader):
|
|
|
75
75
|
parameters["end"] = to_date.strftime("%Y-%m-%d")
|
|
76
76
|
for chunked_identifiers in client.get_chunked_list(identifiers, len(fields)):
|
|
77
77
|
df = client.get_timeserie_df(chunked_identifiers, fields, **parameters)
|
|
78
|
+
if exact_date:
|
|
79
|
+
df = df[df["Dates"] == exact_date]
|
|
78
80
|
for row in df.to_dict("records"):
|
|
79
81
|
jsondate = row["Dates"].date()
|
|
80
82
|
external_id = row["Instrument"]
|
|
@@ -118,7 +118,7 @@ class DatastreamMarketDataDataloader(MarketDataProtocol, Dataloader):
|
|
|
118
118
|
|
|
119
119
|
# if market cap or shares outstanding are required we need to join with an additional table
|
|
120
120
|
if MarketData.MARKET_CAPITALIZATION in values or MarketData.SHARES_OUTSTANDING in values:
|
|
121
|
-
query = query.
|
|
121
|
+
query = query.left_join(market_val).on(
|
|
122
122
|
(pricing.InfoCode == market_val.InfoCode) & (pricing.MarketDate == market_val.MarketDate)
|
|
123
123
|
)
|
|
124
124
|
|
|
@@ -130,6 +130,9 @@ class InstrumentManager(TreeManager):
|
|
|
130
130
|
def annotate_all(self):
|
|
131
131
|
return self.get_queryset().annotate_all()
|
|
132
132
|
|
|
133
|
+
def filter_active_at_date(self, val_date: date):
|
|
134
|
+
return self.get_queryset().filter_active_at_date(val_date)
|
|
135
|
+
|
|
133
136
|
|
|
134
137
|
class SecurityInstrumentManager(InstrumentManager):
|
|
135
138
|
def get_queryset(self) -> InstrumentQuerySet:
|
|
@@ -142,19 +145,8 @@ class ClassifiableInstrumentManager(InstrumentManager):
|
|
|
142
145
|
|
|
143
146
|
|
|
144
147
|
class ActiveInstrumentManager(InstrumentManager):
|
|
145
|
-
def get_queryset_at_date(self, val_date: date):
|
|
146
|
-
return (
|
|
147
|
-
super()
|
|
148
|
-
.get_queryset()
|
|
149
|
-
.filter(
|
|
150
|
-
(models.Q(delisted_date__isnull=True) | models.Q(delisted_date__gte=val_date))
|
|
151
|
-
& models.Q(inception_date__isnull=False)
|
|
152
|
-
& models.Q(inception_date__lte=val_date)
|
|
153
|
-
)
|
|
154
|
-
)
|
|
155
|
-
|
|
156
148
|
def get_queryset(self):
|
|
157
|
-
return
|
|
149
|
+
return super().get_queryset().filter_active_at_date(date.today())
|
|
158
150
|
|
|
159
151
|
|
|
160
152
|
class InvestableUniverseManager(InstrumentManager):
|
|
@@ -579,6 +571,18 @@ class Instrument(ComplexToStringMixin, TagModelMixin, ImportMixin, InstrumentPMS
|
|
|
579
571
|
if favorite_classification := self.classifications.filter(group=get_default_classification_group()).first():
|
|
580
572
|
return favorite_classification
|
|
581
573
|
|
|
574
|
+
def get_primary_quote(self):
|
|
575
|
+
if self.children.exists():
|
|
576
|
+
# we try the primary children first, then the first children within the investable universe and we fallback to the first children otherwise
|
|
577
|
+
try:
|
|
578
|
+
instrument = self.children.get(is_primary=True)
|
|
579
|
+
except Instrument.DoesNotExist:
|
|
580
|
+
instrument = self.children.filter(is_investable_universe=True).first()
|
|
581
|
+
if not instrument:
|
|
582
|
+
instrument = self.children.first()
|
|
583
|
+
return instrument.get_primary_quote()
|
|
584
|
+
return self
|
|
585
|
+
|
|
582
586
|
@property
|
|
583
587
|
def active(self) -> bool:
|
|
584
588
|
today = date.today()
|
|
@@ -10,6 +10,7 @@ from django.db.models import (
|
|
|
10
10
|
ExpressionWrapper,
|
|
11
11
|
F,
|
|
12
12
|
OuterRef,
|
|
13
|
+
Q,
|
|
13
14
|
QuerySet,
|
|
14
15
|
Subquery,
|
|
15
16
|
)
|
|
@@ -20,6 +21,12 @@ from wbfdm.enums import MarketData
|
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
class InstrumentQuerySet(QuerySet):
|
|
24
|
+
def filter_active_at_date(self, val_date: date):
|
|
25
|
+
return self.filter(
|
|
26
|
+
(Q(delisted_date__isnull=True) | Q(delisted_date__gte=val_date))
|
|
27
|
+
& (Q(inception_date__isnull=True) | Q(inception_date__lte=val_date))
|
|
28
|
+
)
|
|
29
|
+
|
|
23
30
|
def annotate_classification_for_group(
|
|
24
31
|
self, classification_group, classification_height: int = 0, **kwargs
|
|
25
32
|
) -> QuerySet:
|
|
@@ -2,7 +2,7 @@ from typing import Optional
|
|
|
2
2
|
|
|
3
3
|
from django.utils.translation import gettext as _
|
|
4
4
|
from wbcore.contrib.color.enums import WBColor
|
|
5
|
-
from wbcore.enums import Operator
|
|
5
|
+
from wbcore.enums import Operator, Unit
|
|
6
6
|
from wbcore.metadata.configs import display as dp
|
|
7
7
|
from wbcore.metadata.configs.display.instance_display import (
|
|
8
8
|
Display,
|
|
@@ -82,16 +82,17 @@ class InstrumentListThroughModelDisplayConfig(dp.DisplayViewConfig):
|
|
|
82
82
|
def get_list_display(self) -> Optional[dp.ListDisplay]:
|
|
83
83
|
fields = []
|
|
84
84
|
if self.view.kwargs.get("instrument_id", None):
|
|
85
|
-
fields = [dp.Field(key="instrument_list", label="Instrument List")]
|
|
86
|
-
|
|
87
|
-
fields = [
|
|
85
|
+
fields = [dp.Field(key="instrument_list", label="Instrument List", width=Unit.PIXEL(250))]
|
|
86
|
+
elif self.view.kwargs.get("instrument_list_id", None):
|
|
87
|
+
fields = [
|
|
88
|
+
dp.Field(key="instrument", label="Instrument", width=Unit.PIXEL(300)),
|
|
89
|
+
dp.Field(key="instrument_str", label="Instrument Scraped", width=Unit.PIXEL(300)),
|
|
90
|
+
]
|
|
88
91
|
fields.extend(
|
|
89
92
|
[
|
|
90
|
-
dp.Field(key="
|
|
91
|
-
dp.Field(key="
|
|
92
|
-
dp.Field(key="
|
|
93
|
-
dp.Field(key="comment", label="Comment"),
|
|
94
|
-
dp.Field(key="validated", label="Validated"),
|
|
93
|
+
dp.Field(key="from_date", label="From Date", width=Unit.PIXEL(125)),
|
|
94
|
+
dp.Field(key="to_date", label="To Date", width=Unit.PIXEL(125)),
|
|
95
|
+
dp.Field(key="comment", label="Comment", width=Unit.PIXEL(350)),
|
|
95
96
|
]
|
|
96
97
|
)
|
|
97
98
|
return dp.ListDisplay(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: wbfdm
|
|
3
|
-
Version: 1.49.
|
|
3
|
+
Version: 1.49.3
|
|
4
4
|
Summary: The workbench module ensures rapid access to diverse financial data (market, fundamental, forecasts, ESG), with features for storing instruments, classifying them, and conducting financial analysis.
|
|
5
5
|
Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
|
|
6
6
|
Requires-Dist: roman==4.*
|
|
@@ -38,7 +38,7 @@ wbfdm/backends/dto.py,sha256=5IdeGVsrk8trEi9rqtq-zisqiEDE_VLBP8RxlfZZnjk,596
|
|
|
38
38
|
wbfdm/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
39
39
|
wbfdm/contrib/dsws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
40
40
|
wbfdm/contrib/dsws/client.py,sha256=C598w5P85kvX7_gR0Yf-WHRLj77HqztUhofBMl3JWAE,14508
|
|
41
|
-
wbfdm/contrib/dsws/dataloaders/market_data.py,sha256=
|
|
41
|
+
wbfdm/contrib/dsws/dataloaders/market_data.py,sha256=7Vj64nLqJAA3BiNeJPr3uLnnZ5kFOY2XGyAAJRL7vOk,6097
|
|
42
42
|
wbfdm/contrib/internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
43
|
wbfdm/contrib/internal/dataloaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
44
44
|
wbfdm/contrib/internal/dataloaders/market_data.py,sha256=aoWSMamtnMbejYZrHzr37dQCG40nuA3fNBQNOyqhceQ,3260
|
|
@@ -100,7 +100,7 @@ wbfdm/contrib/qa/dataloaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
|
|
|
100
100
|
wbfdm/contrib/qa/dataloaders/adjustments.py,sha256=DQEexOLA7WyBB1dZJHQd-6zbzyEIURgSSgS7bJRvXzQ,2980
|
|
101
101
|
wbfdm/contrib/qa/dataloaders/corporate_actions.py,sha256=lWT6klrTXKqxiko2HGrxHH8E2C00FJS-AOX3IhglRrI,2912
|
|
102
102
|
wbfdm/contrib/qa/dataloaders/financials.py,sha256=xUHpvhUkvmdPL_RyWCrs7XgChgTklX5qemmaXMedgkY,3475
|
|
103
|
-
wbfdm/contrib/qa/dataloaders/market_data.py,sha256=
|
|
103
|
+
wbfdm/contrib/qa/dataloaders/market_data.py,sha256=FSQ50viiaiwlZ6pudXZN4eLJuKBDDW_My3x1XjFrkZs,6513
|
|
104
104
|
wbfdm/contrib/qa/dataloaders/officers.py,sha256=vytlQJJxmn4Y5HfNh5mHJAvuIrrsQSkNO-sONyhxftY,2940
|
|
105
105
|
wbfdm/contrib/qa/dataloaders/reporting_dates.py,sha256=q25ccB0pbGfLJLV1A1_AY1XYWJ_Fa10egY09L1J-C5A,2628
|
|
106
106
|
wbfdm/contrib/qa/dataloaders/statements.py,sha256=hC6YErJcvBTmaAmzscgeC4sBK3lYE2U5eIKRIE9b_cs,10094
|
|
@@ -231,10 +231,10 @@ wbfdm/models/instruments/instrument_lists.py,sha256=GxfFyfYxEcJS36LAarHja49TOM8f
|
|
|
231
231
|
wbfdm/models/instruments/instrument_prices.py,sha256=WCaFMZ9sF7xeGTp9jkq7TA8RfYHrwvTjujzqgCKj9SI,22070
|
|
232
232
|
wbfdm/models/instruments/instrument_relationships.py,sha256=zpCZCnt5CqIg5bd6le_6TyirsSwGV2NaqTVKw3bd5vM,10660
|
|
233
233
|
wbfdm/models/instruments/instrument_requests.py,sha256=XbpofRS8WHadHlTFjvXJyd0o7K9r2pzJtnpjVQZOLdI,7832
|
|
234
|
-
wbfdm/models/instruments/instruments.py,sha256=
|
|
234
|
+
wbfdm/models/instruments/instruments.py,sha256=T0Ey5tMbUnA8DMroY1c959hOL9bI-CwTZnq5XhxCmi4,39934
|
|
235
235
|
wbfdm/models/instruments/options.py,sha256=hFprq7B5t4ctz8nVqzFsBEzftq_KDUSsSXl1zJyh7tE,7094
|
|
236
236
|
wbfdm/models/instruments/private_equities.py,sha256=uzwZi8IkmCKAHVTxnuFya9tehx7kh57sTlTEi1ieDaM,2198
|
|
237
|
-
wbfdm/models/instruments/querysets.py,sha256=
|
|
237
|
+
wbfdm/models/instruments/querysets.py,sha256=gL-uC5MfsX58RInK64Pok49tqeZhZY7xKPvPiwmraSQ,6732
|
|
238
238
|
wbfdm/models/instruments/utils.py,sha256=88jnWINSSC0OwH-mCEOPLZXuhBCtEsxBpSaZ38GteaE,1365
|
|
239
239
|
wbfdm/models/instruments/llm/__init__.py,sha256=dSmxRmEWb0A4O_lUoWuRKt2mBtUuLCTPVVJqGyi_n40,52
|
|
240
240
|
wbfdm/models/instruments/llm/create_instrument_news_relationships.py,sha256=Eza39rlkNJxpURroIsJLImKC6F-KtTmkdjHn1kv4F3Q,3439
|
|
@@ -294,10 +294,10 @@ wbfdm/viewsets/configs/display/classifications.py,sha256=xolaLg6WDG7Dtwd3gQXWElm
|
|
|
294
294
|
wbfdm/viewsets/configs/display/esg.py,sha256=NcBZDxkIsGd-APYt4yJRNJjfmbmkC0O-H1q7fg_bBcU,3640
|
|
295
295
|
wbfdm/viewsets/configs/display/exchanges.py,sha256=uo-rh_20FjreGmqAiPbU0zTZ-I2CoV0bBC4uxX4hQbs,1946
|
|
296
296
|
wbfdm/viewsets/configs/display/financial_summary.py,sha256=K8CPV9uy0wsK-yLQIDTqMAXTb-W1-pUp6OCMwii7jYo,4738
|
|
297
|
-
wbfdm/viewsets/configs/display/instrument_lists.py,sha256=
|
|
297
|
+
wbfdm/viewsets/configs/display/instrument_lists.py,sha256=UF_M41sBDDxGLDlKxLdAHqo8S1iHJfvIwZbLuoeaGuA,5239
|
|
298
298
|
wbfdm/viewsets/configs/display/instrument_prices.py,sha256=QWDIPxWfgJjqHNB0cEShw1jH7zRkIYhJK9jhTE983EA,6940
|
|
299
299
|
wbfdm/viewsets/configs/display/instrument_requests.py,sha256=CarX1MGe64roHZETm2N4HsEMssHVI5mWw2xTUBjgi-k,5129
|
|
300
|
-
wbfdm/viewsets/configs/display/instruments.py,sha256=
|
|
300
|
+
wbfdm/viewsets/configs/display/instruments.py,sha256=6mypy-px8dl5b9-_vabsY-r3SLuGqwDAEW_N8n8aC9A,17418
|
|
301
301
|
wbfdm/viewsets/configs/display/instruments_relationships.py,sha256=BLAl2ZciWR5Waf3qPd1QQwdiupgIf_wGK6rmYe9byuY,2480
|
|
302
302
|
wbfdm/viewsets/configs/display/monthly_performances.py,sha256=ESsGTLhPmmXz3YjEWNjwaOjA1RNzVDKtJt3JILL2MMc,2973
|
|
303
303
|
wbfdm/viewsets/configs/display/officers.py,sha256=qUwN9HPSSlT85aUSFNY-30550P35j3RZCYqRPj_rFAs,654
|
|
@@ -352,6 +352,6 @@ wbfdm/viewsets/statements/__init__.py,sha256=odxtFYUDICPmz8WCE3nx93EvKZLSPBEI4d7
|
|
|
352
352
|
wbfdm/viewsets/statements/statements.py,sha256=kmtM0uZ3f7eJJe5gVmd-iVra9dHwTB9x12p7f5qTEx8,4084
|
|
353
353
|
wbfdm/viewsets/technical_analysis/__init__.py,sha256=qtCIBg0uSiZeJq_1tEQFilnorMBkMe6uCMfqar6-cLE,77
|
|
354
354
|
wbfdm/viewsets/technical_analysis/monthly_performances.py,sha256=O1j8CGfOranL74LqVvcf7jERaDIboEJZiBf_AbbVDQ8,3974
|
|
355
|
-
wbfdm-1.49.
|
|
356
|
-
wbfdm-1.49.
|
|
357
|
-
wbfdm-1.49.
|
|
355
|
+
wbfdm-1.49.3.dist-info/METADATA,sha256=2YCn-n0JG3nzg5cQU8_k_mjDX0IZPLwPOgi4E3cD5h4,737
|
|
356
|
+
wbfdm-1.49.3.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
|
|
357
|
+
wbfdm-1.49.3.dist-info/RECORD,,
|
|
File without changes
|