wbfdm 1.54.8__py2.py3-none-any.whl → 1.54.9__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.

@@ -5,6 +5,7 @@ from typing import Iterator
5
5
  from DatastreamPy import DSUserObjectFault
6
6
  from django.conf import settings
7
7
  from pandas.tseries.offsets import BDay
8
+ from wbcore.contrib.currency.models import Currency, CurrencyFXRates
8
9
  from wbcore.contrib.dataloader.dataloaders import Dataloader
9
10
  from wbfdm.dataloaders.protocols import MarketDataProtocol
10
11
  from wbfdm.dataloaders.types import MarketDataDict
@@ -34,6 +35,8 @@ class DSWSMarketDataDataloader(MarketDataProtocol, Dataloader):
34
35
  to_date: date | None = None,
35
36
  exact_date: date | None = None,
36
37
  frequency: Frequency = Frequency.DAILY,
38
+ target_currency: str | None = None,
39
+ apply_fx_rate: bool = True,
37
40
  **kwargs,
38
41
  ) -> Iterator[MarketDataDict]:
39
42
  """Get prices for instruments.
@@ -55,6 +58,12 @@ class DSWSMarketDataDataloader(MarketDataProtocol, Dataloader):
55
58
  "id",
56
59
  )
57
60
  }
61
+ instruments = {entity.id: entity for entity in self.entities}
62
+ try:
63
+ target_currency = Currency.objects.get(key=target_currency)
64
+ except Currency.DoesNotExist:
65
+ target_currency = None
66
+
58
67
  if (dsws_username := getattr(settings, "REFINITIV_DATASTREAM_USERNAME", None)) and (
59
68
  dsws_password := getattr(settings, "REFINITIV_DATASTREAM_PASSWORD", None)
60
69
  ):
@@ -80,13 +89,31 @@ class DSWSMarketDataDataloader(MarketDataProtocol, Dataloader):
80
89
  for row in df.to_dict("records"):
81
90
  jsondate = row["Dates"].date()
82
91
  external_id = row["Instrument"]
83
-
84
- data = {}
92
+ fx_rate = 1.0
93
+ if target_currency:
94
+ instrument = instruments[default_lookup[external_id]["id"]]
95
+ if instrument.currency != target_currency:
96
+ with suppress(CurrencyFXRates.DoesNotExist):
97
+ fx_rate = instrument.currency.convert(jsondate, target_currency)
98
+ data = dict(fx_rate=fx_rate)
85
99
  for market_value in values:
86
100
  data[market_value.value] = row.get(FIELD_MAP[market_value.value], None)
101
+ if (
102
+ apply_fx_rate
103
+ and data[market_value.value]
104
+ and market_value.value
105
+ not in [
106
+ MarketData.MARKET_CAPITALIZATION.value,
107
+ MarketData.VOLUME.value,
108
+ MarketData.VWAP.value,
109
+ ]
110
+ ):
111
+ data[market_value.value] *= fx_rate
112
+
87
113
  with suppress(KeyError):
88
114
  if default_symbol := default_lookup[external_id].get("symbol", None):
89
115
  data["close"] = row[default_symbol]
116
+
90
117
  yield MarketDataDict(
91
118
  id=f"{default_lookup[external_id]['id']}_{jsondate}",
92
119
  valuation_date=jsondate,
@@ -98,7 +98,9 @@ class DatastreamMarketDataDataloader(MarketDataProtocol, Dataloader):
98
98
  fx_code = pk.Table("DS2FxCode")
99
99
  fx_rate = pk.Table("DS2FxRate")
100
100
  query = (
101
- query.select((1 / fx_rate.midrate).as_("fx_rate"))
101
+ query.select(
102
+ (Case().when(pricing.Currency == target_currency, 1).else_(1 / fx_rate.midrate)).as_("fx_rate")
103
+ )
102
104
  # Join FX code table matching currencies and ensuring SPOT rate type
103
105
  .left_join(fx_code)
104
106
  .on(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbfdm
3
- Version: 1.54.8
3
+ Version: 1.54.9
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=7Vj64nLqJAA3BiNeJPr3uLnnZ5kFOY2XGyAAJRL7vOk,6097
41
+ wbfdm/contrib/dsws/dataloaders/market_data.py,sha256=eup82Tpa6JRzIsKcMr6L33wEPVPwxH1KvjfMijd2mO4,7479
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=FA7_f_20Gx1EjWOK9HDcWfX_gbBpOYXaxMR_O5T-K-Q,4542
@@ -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=0LjTN04WM2i9rrJ_M3M04cY0UbxMElsWiaqOC75xpHQ,8221
103
+ wbfdm/contrib/qa/dataloaders/market_data.py,sha256=ei_XNzgMOU-X8dCR06xQGASboCmw05-Hwgn1t17n5ME,8318
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
@@ -359,6 +359,6 @@ wbfdm/viewsets/statements/__init__.py,sha256=odxtFYUDICPmz8WCE3nx93EvKZLSPBEI4d7
359
359
  wbfdm/viewsets/statements/statements.py,sha256=gA6RCI8-B__JwjEb6OZxpn8Y-9aF-YQ3HIQ7e1vfJMw,4304
360
360
  wbfdm/viewsets/technical_analysis/__init__.py,sha256=qtCIBg0uSiZeJq_1tEQFilnorMBkMe6uCMfqar6-cLE,77
361
361
  wbfdm/viewsets/technical_analysis/monthly_performances.py,sha256=O1j8CGfOranL74LqVvcf7jERaDIboEJZiBf_AbbVDQ8,3974
362
- wbfdm-1.54.8.dist-info/METADATA,sha256=76MaKZO9aTh9b4Q6HavxQ-XD7hqH7GeDXmw9Xs65kv0,768
363
- wbfdm-1.54.8.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
364
- wbfdm-1.54.8.dist-info/RECORD,,
362
+ wbfdm-1.54.9.dist-info/METADATA,sha256=HpfktLlCPZBteZWL7Ta3TmLEZArU9BIja0IK2iKPKpo,768
363
+ wbfdm-1.54.9.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
364
+ wbfdm-1.54.9.dist-info/RECORD,,
File without changes