wbfdm 1.49.3__py2.py3-none-any.whl → 1.49.5__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.
@@ -10,7 +10,7 @@ from django.db import ProgrammingError, connections
10
10
  from pypika import Case, Column, MSSQLQuery
11
11
  from pypika import functions as fn
12
12
  from pypika.enums import Order, SqlTypes
13
- from pypika.terms import LiteralValue, ValueWrapper
13
+ from pypika.terms import ValueWrapper
14
14
  from wbcore.contrib.dataloader.dataloaders import Dataloader
15
15
  from wbcore.contrib.dataloader.utils import dictfetchall
16
16
 
@@ -66,7 +66,6 @@ class DatastreamMarketDataDataloader(MarketDataProtocol, Dataloader):
66
66
 
67
67
  # Define tables
68
68
  pricing = pk.Table("vw_DS2Pricing")
69
- market_val = pk.Table("vw_DS2MktCap")
70
69
 
71
70
  mapping, create_mapping_table = create_table(
72
71
  "#ds2infoexchcode", Column("InfoCode", SqlTypes.INTEGER), Column("ExchIntCode", SqlTypes.INTEGER)
@@ -118,13 +117,34 @@ class DatastreamMarketDataDataloader(MarketDataProtocol, Dataloader):
118
117
 
119
118
  # if market cap or shares outstanding are required we need to join with an additional table
120
119
  if MarketData.MARKET_CAPITALIZATION in values or MarketData.SHARES_OUTSTANDING in values:
121
- query = query.left_join(market_val).on(
122
- (pricing.InfoCode == market_val.InfoCode) & (pricing.MarketDate == market_val.MarketDate)
120
+ pricing_2 = pk.Table("vw_DS2Pricing", alias="pricing_2")
121
+ num_shares = pk.Table("DS2NumShares")
122
+ query = query.left_join(pricing_2).on(
123
+ (pricing_2.InfoCode == pricing.InfoCode)
124
+ & (pricing_2.ExchIntcode == pricing.ExchIntCode)
125
+ & (pricing_2.MarketDate == pricing.MarketDate)
126
+ & (pricing_2.AdjType == 0)
123
127
  )
124
128
 
125
- for market_data in values:
129
+ value = pricing_2.Close_
130
+ if fx_rate:
131
+ value /= Case().when(pricing_2.Currency == target_currency, 1).else_(fx_rate.midrate)
132
+
133
+ query = query.select(value.as_("undadjusted_close"))
134
+ query = query.select(
135
+ MSSQLQuery.from_(num_shares)
136
+ .select(num_shares.NumShrs * 1_000)
137
+ .where((pricing_2.InfoCode == num_shares.InfoCode) & (num_shares.EventDate <= pricing_2.MarketDate))
138
+ .orderby(num_shares.EventDate, order=Order.desc)
139
+ .limit(1)
140
+ .as_("unadjusted_outstanding_shares")
141
+ )
142
+
143
+ for market_data in filter(
144
+ lambda x: x not in (MarketData.SHARES_OUTSTANDING, MarketData.MARKET_CAPITALIZATION), values
145
+ ):
126
146
  ds2_value = DS2MarketData[market_data.name].value
127
- value = LiteralValue(ds2_value)
147
+ value = getattr(pricing, ds2_value)
128
148
  if fx_rate and market_data is not MarketData.SHARES_OUTSTANDING:
129
149
  value /= Case().when(pricing.Currency == target_currency, 1).else_(fx_rate.midrate)
130
150
 
@@ -146,12 +166,27 @@ class DatastreamMarketDataDataloader(MarketDataProtocol, Dataloader):
146
166
  for batch in batched(
147
167
  self.entities.values_list("dl_parameters__market_data__parameters", flat=True), 1000
148
168
  ):
149
- cursor.execute(reduce(lambda x, y: x.insert(y), batch, MSSQLQuery.into(mapping)).get_sql())
169
+ sql = reduce(lambda x, y: x.insert(y), batch, MSSQLQuery.into(mapping)).get_sql()
170
+ cursor.execute(sql)
171
+
172
+ # import sqlparse
173
+ # print(sqlparse.format(query.get_sql(), reindent=True))
150
174
 
151
175
  cursor.execute(query.get_sql())
152
176
 
153
177
  for row in dictfetchall(cursor, MarketDataDict):
154
178
  row["instrument_id"] = lookup[row["external_identifier"]]
179
+
180
+ if MarketData.MARKET_CAPITALIZATION in values:
181
+ row["market_capitalization"] = row["unadjusted_outstanding_shares"] * (
182
+ row["undadjusted_close"] or 0
183
+ )
184
+ del row["unadjusted_outstanding_shares"]
185
+ del row["undadjusted_close"]
186
+
187
+ if MarketData.SHARES_OUTSTANDING in values:
188
+ row["outstanding_shares"] = (row["market_capitalization"] / row["close"]) if row["close"] else None
189
+
155
190
  yield row
156
191
 
157
192
  cursor.execute(MSSQLQuery.drop_table(mapping).get_sql())
@@ -66,6 +66,9 @@ class MarketDataDict(BaseDict):
66
66
  market_cap: NotRequired[float]
67
67
  calculated: NotRequired[bool]
68
68
 
69
+ unadjusted_close: NotRequired[float]
70
+ unadjusted_outstanding_shares: NotRequired[float | int]
71
+
69
72
 
70
73
  class CorporateActionDataDict(BaseDict):
71
74
  old_shares: float
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbfdm
3
- Version: 1.49.3
3
+ Version: 1.49.5
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.*
@@ -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=FSQ50viiaiwlZ6pudXZN4eLJuKBDDW_My3x1XjFrkZs,6513
103
+ wbfdm/contrib/qa/dataloaders/market_data.py,sha256=Wp-LcQkytDCXQWywWkilhjgpIiT29U6_AUQRy3-pY6A,8104
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
@@ -120,7 +120,7 @@ wbfdm/dataloaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU
120
120
  wbfdm/dataloaders/cache.py,sha256=K9BeVxT7p-BMvjurINt18bfrUDccp840uIjfDBLJRNk,4841
121
121
  wbfdm/dataloaders/protocols.py,sha256=xFbexmhh38MWmkWsOSsfcNxdtrrWfO02qNihsqwA_BQ,2987
122
122
  wbfdm/dataloaders/proxies.py,sha256=3Wt-_bj98Ykf9uiJSznNqCUbRQYdR8EvqQ73tPuBfD8,7072
123
- wbfdm/dataloaders/types.py,sha256=wtXMGbUV-m32EHBCEbO5p3KPCHI87G_V9o9K0DpVgxM,5463
123
+ wbfdm/dataloaders/types.py,sha256=wrV0PrKLkLog-rCjtcGFkQuzdeY1w-JGfAetq-mKqFs,5565
124
124
  wbfdm/factories/__init__.py,sha256=yYxAKBde_ksIr-3g4RjL6d5Wu-nmsuEDdYNyJpgfpQU,660
125
125
  wbfdm/factories/classifications.py,sha256=GJ0eARFTsj5dnKUsUYbLSIZLzTCy7RWhy7_f8Dn6IMQ,1827
126
126
  wbfdm/factories/controversies.py,sha256=GhuoEms1O7DIMVNAIbFEzD9DRv8j1MXIv0u1JK6Pi-o,929
@@ -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.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,,
355
+ wbfdm-1.49.5.dist-info/METADATA,sha256=J1maIDn_TjS3rDZYXoy1Msb1CxOWeITETm5QYJ9NHUk,737
356
+ wbfdm-1.49.5.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
357
+ wbfdm-1.49.5.dist-info/RECORD,,
File without changes