massive 2.3.2__tar.gz → 2.5.0__tar.gz

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.
Files changed (50) hide show
  1. {massive-2.3.2 → massive-2.5.0}/PKG-INFO +1 -1
  2. {massive-2.3.2 → massive-2.5.0}/massive/rest/economy.py +102 -0
  3. massive-2.5.0/massive/rest/models/economy.py +229 -0
  4. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/financials.py +75 -0
  5. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/snapshot.py +134 -28
  6. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/trades.py +17 -16
  7. {massive-2.3.2 → massive-2.5.0}/massive/rest/reference.py +146 -8
  8. {massive-2.3.2 → massive-2.5.0}/massive/websocket/models/models.py +4 -0
  9. {massive-2.3.2 → massive-2.5.0}/pyproject.toml +1 -1
  10. massive-2.3.2/massive/rest/models/economy.py +0 -106
  11. {massive-2.3.2 → massive-2.5.0}/LICENSE +0 -0
  12. {massive-2.3.2 → massive-2.5.0}/massive/__init__.py +0 -0
  13. {massive-2.3.2 → massive-2.5.0}/massive/exceptions.py +0 -0
  14. {massive-2.3.2 → massive-2.5.0}/massive/logging.py +0 -0
  15. {massive-2.3.2 → massive-2.5.0}/massive/modelclass.py +0 -0
  16. {massive-2.3.2 → massive-2.5.0}/massive/rest/__init__.py +0 -0
  17. {massive-2.3.2 → massive-2.5.0}/massive/rest/aggs.py +0 -0
  18. {massive-2.3.2 → massive-2.5.0}/massive/rest/base.py +0 -0
  19. {massive-2.3.2 → massive-2.5.0}/massive/rest/benzinga.py +0 -0
  20. {massive-2.3.2 → massive-2.5.0}/massive/rest/etf_global.py +0 -0
  21. {massive-2.3.2 → massive-2.5.0}/massive/rest/financials.py +0 -0
  22. {massive-2.3.2 → massive-2.5.0}/massive/rest/futures.py +0 -0
  23. {massive-2.3.2 → massive-2.5.0}/massive/rest/indicators.py +0 -0
  24. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/__init__.py +0 -0
  25. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/aggs.py +0 -0
  26. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/benzinga.py +0 -0
  27. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/common.py +0 -0
  28. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/conditions.py +0 -0
  29. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/contracts.py +0 -0
  30. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/dividends.py +0 -0
  31. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/etf_global.py +0 -0
  32. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/exchanges.py +0 -0
  33. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/futures.py +0 -0
  34. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/indicators.py +0 -0
  35. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/markets.py +0 -0
  36. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/quotes.py +0 -0
  37. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/request.py +0 -0
  38. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/splits.py +0 -0
  39. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/summaries.py +0 -0
  40. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/tickers.py +0 -0
  41. {massive-2.3.2 → massive-2.5.0}/massive/rest/models/tmx.py +0 -0
  42. {massive-2.3.2 → massive-2.5.0}/massive/rest/quotes.py +0 -0
  43. {massive-2.3.2 → massive-2.5.0}/massive/rest/snapshot.py +0 -0
  44. {massive-2.3.2 → massive-2.5.0}/massive/rest/summaries.py +0 -0
  45. {massive-2.3.2 → massive-2.5.0}/massive/rest/tmx.py +0 -0
  46. {massive-2.3.2 → massive-2.5.0}/massive/rest/trades.py +0 -0
  47. {massive-2.3.2 → massive-2.5.0}/massive/rest/vX.py +0 -0
  48. {massive-2.3.2 → massive-2.5.0}/massive/websocket/__init__.py +0 -0
  49. {massive-2.3.2 → massive-2.5.0}/massive/websocket/models/__init__.py +0 -0
  50. {massive-2.3.2 → massive-2.5.0}/massive/websocket/models/common.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: massive
3
- Version: 2.3.2
3
+ Version: 2.5.0
4
4
  Summary: Official Massive (formerly Polygon.io) REST and Websocket client.
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -8,6 +8,8 @@ from .models.economy import (
8
8
  TreasuryYield,
9
9
  FedInflationExpectations,
10
10
  FedLaborMarket,
11
+ EUMerchantAggregate,
12
+ EUMerchantHierarchy,
11
13
  )
12
14
  from .models.common import Sort, Order
13
15
  from .models.request import RequestOptionBuilder
@@ -168,3 +170,103 @@ class EconomyClient(BaseClient):
168
170
  raw=raw,
169
171
  options=options,
170
172
  )
173
+
174
+ def list_eu_merchant_aggregates(
175
+ self,
176
+ transaction_date: Optional[Union[str, date]] = None,
177
+ transaction_date_gt: Optional[Union[str, date]] = None,
178
+ transaction_date_gte: Optional[Union[str, date]] = None,
179
+ transaction_date_lt: Optional[Union[str, date]] = None,
180
+ transaction_date_lte: Optional[Union[str, date]] = None,
181
+ name: Optional[str] = None,
182
+ name_any_of: Optional[str] = None,
183
+ name_gt: Optional[str] = None,
184
+ name_gte: Optional[str] = None,
185
+ name_lt: Optional[str] = None,
186
+ name_lte: Optional[str] = None,
187
+ user_country: Optional[str] = None,
188
+ user_country_any_of: Optional[str] = None,
189
+ channel: Optional[str] = None,
190
+ channel_any_of: Optional[str] = None,
191
+ consumer_type: Optional[str] = None,
192
+ consumer_type_any_of: Optional[str] = None,
193
+ parent_name: Optional[str] = None,
194
+ parent_name_any_of: Optional[str] = None,
195
+ parent_name_gt: Optional[str] = None,
196
+ parent_name_gte: Optional[str] = None,
197
+ parent_name_lt: Optional[str] = None,
198
+ parent_name_lte: Optional[str] = None,
199
+ limit: Optional[int] = None,
200
+ sort: Optional[Union[str, Sort]] = None,
201
+ params: Optional[Dict[str, Any]] = None,
202
+ raw: bool = False,
203
+ options: Optional[RequestOptionBuilder] = None,
204
+ ) -> Union[Iterator[EUMerchantAggregate], HTTPResponse]:
205
+ """
206
+ Aggregated consumer transactions from European credit card panels (UK, DE, FR, IT, ES, AT).
207
+ Each row represents daily credit card, debit card, or open banking transactions
208
+ (7-day lag from transaction date) at a tagged merchant or payment processor.
209
+
210
+ Includes ticker (Bloomberg) and industry mapping for ~250 US public companies.
211
+ User counts provided across 8- and 28-day windows for normalization.
212
+ """
213
+ url = "/consumer-spending/eu/v1/merchant-aggregates"
214
+
215
+ return self._paginate(
216
+ path=url,
217
+ params=self._get_params(self.list_eu_merchant_aggregates, locals()),
218
+ deserializer=EUMerchantAggregate.from_dict,
219
+ raw=raw,
220
+ result_key="results",
221
+ options=options,
222
+ )
223
+
224
+ def list_eu_merchant_hierarchy(
225
+ self,
226
+ lookup_name: Optional[str] = None,
227
+ lookup_name_any_of: Optional[str] = None,
228
+ lookup_name_gt: Optional[str] = None,
229
+ lookup_name_gte: Optional[str] = None,
230
+ lookup_name_lt: Optional[str] = None,
231
+ lookup_name_lte: Optional[str] = None,
232
+ ticker: Optional[str] = None,
233
+ ticker_any_of: Optional[str] = None,
234
+ ticker_gt: Optional[str] = None,
235
+ ticker_gte: Optional[str] = None,
236
+ ticker_lt: Optional[str] = None,
237
+ ticker_lte: Optional[str] = None,
238
+ listing_status: Optional[str] = None,
239
+ listing_status_any_of: Optional[str] = None,
240
+ active_from: Optional[Union[str, date]] = None,
241
+ active_from_gt: Optional[Union[str, date]] = None,
242
+ active_from_gte: Optional[Union[str, date]] = None,
243
+ active_from_lt: Optional[Union[str, date]] = None,
244
+ active_from_lte: Optional[Union[str, date]] = None,
245
+ active_to: Optional[Union[str, date]] = None,
246
+ active_to_gt: Optional[Union[str, date]] = None,
247
+ active_to_gte: Optional[Union[str, date]] = None,
248
+ active_to_lt: Optional[Union[str, date]] = None,
249
+ active_to_lte: Optional[Union[str, date]] = None,
250
+ limit: Optional[int] = None,
251
+ sort: Optional[Union[str, Sort]] = None,
252
+ params: Optional[Dict[str, Any]] = None,
253
+ raw: bool = False,
254
+ options: Optional[RequestOptionBuilder] = None,
255
+ ) -> Union[Iterator[EUMerchantHierarchy], HTTPResponse]:
256
+ """
257
+ Reference data mapping merchants to parent companies, tickers, sectors,
258
+ and industries across Fable's European consumer transaction panel.
259
+
260
+ Use lookup_name + active_from/active_to to join with merchant-aggregates
261
+ for point-in-time queries.
262
+ """
263
+ url = "/consumer-spending/eu/v1/merchant-hierarchy"
264
+
265
+ return self._paginate(
266
+ path=url,
267
+ params=self._get_params(self.list_eu_merchant_hierarchy, locals()),
268
+ deserializer=EUMerchantHierarchy.from_dict,
269
+ raw=raw,
270
+ result_key="results",
271
+ options=options,
272
+ )
@@ -0,0 +1,229 @@
1
+ from typing import Optional
2
+ from ...modelclass import modelclass
3
+
4
+
5
+ @modelclass
6
+ class TreasuryYield:
7
+ """
8
+ Treasury yield data for a specific date.
9
+ """
10
+
11
+ date: Optional[str] = None
12
+ yield_1_month: Optional[float] = None
13
+ yield_3_month: Optional[float] = None
14
+ yield_6_month: Optional[float] = None
15
+ yield_1_year: Optional[float] = None
16
+ yield_2_year: Optional[float] = None
17
+ yield_3_year: Optional[float] = None
18
+ yield_5_year: Optional[float] = None
19
+ yield_7_year: Optional[float] = None
20
+ yield_10_year: Optional[float] = None
21
+ yield_20_year: Optional[float] = None
22
+ yield_30_year: Optional[float] = None
23
+
24
+ @staticmethod
25
+ def from_dict(d):
26
+ return TreasuryYield(
27
+ date=d.get("date"),
28
+ yield_1_month=d.get("yield_1_month"),
29
+ yield_3_month=d.get("yield_3_month"),
30
+ yield_6_month=d.get("yield_6_month"),
31
+ yield_1_year=d.get("yield_1_year"),
32
+ yield_2_year=d.get("yield_2_year"),
33
+ yield_3_year=d.get("yield_3_year"),
34
+ yield_5_year=d.get("yield_5_year"),
35
+ yield_7_year=d.get("yield_7_year"),
36
+ yield_10_year=d.get("yield_10_year"),
37
+ yield_20_year=d.get("yield_20_year"),
38
+ yield_30_year=d.get("yield_30_year"),
39
+ )
40
+
41
+
42
+ @modelclass
43
+ class FedInflation:
44
+ cpi: Optional[float] = None
45
+ cpi_core: Optional[float] = None
46
+ cpi_year_over_year: Optional[float] = None
47
+ date: Optional[str] = None
48
+ pce: Optional[float] = None
49
+ pce_core: Optional[float] = None
50
+ pce_spending: Optional[float] = None
51
+
52
+ @staticmethod
53
+ def from_dict(d):
54
+ return FedInflation(
55
+ cpi=d.get("cpi"),
56
+ cpi_core=d.get("cpi_core"),
57
+ cpi_year_over_year=d.get("cpi_year_over_year"),
58
+ date=d.get("date"),
59
+ pce=d.get("pce"),
60
+ pce_core=d.get("pce_core"),
61
+ pce_spending=d.get("pce_spending"),
62
+ )
63
+
64
+
65
+ @modelclass
66
+ class FedInflationExpectations:
67
+ date: Optional[str] = None
68
+ forward_years_5_to_10: Optional[float] = None
69
+ market_10_year: Optional[float] = None
70
+ market_5_year: Optional[float] = None
71
+ model_10_year: Optional[float] = None
72
+ model_1_year: Optional[float] = None
73
+ model_30_year: Optional[float] = None
74
+ model_5_year: Optional[float] = None
75
+
76
+ @staticmethod
77
+ def from_dict(d):
78
+ return FedInflationExpectations(
79
+ date=d.get("date"),
80
+ forward_years_5_to_10=d.get("forward_years_5_to_10"),
81
+ market_10_year=d.get("market_10_year"),
82
+ market_5_year=d.get("market_5_year"),
83
+ model_10_year=d.get("model_10_year"),
84
+ model_1_year=d.get("model_1_year"),
85
+ model_30_year=d.get("model_30_year"),
86
+ model_5_year=d.get("model_5_year"),
87
+ )
88
+
89
+
90
+ @modelclass
91
+ class FedLaborMarket:
92
+ avg_hourly_earnings: Optional[float] = None
93
+ date: Optional[str] = None
94
+ job_openings: Optional[float] = None
95
+ labor_force_participation_rate: Optional[float] = None
96
+ unemployment_rate: Optional[float] = None
97
+
98
+ @staticmethod
99
+ def from_dict(d):
100
+ return FedLaborMarket(
101
+ avg_hourly_earnings=d.get("avg_hourly_earnings"),
102
+ date=d.get("date"),
103
+ job_openings=d.get("job_openings"),
104
+ labor_force_participation_rate=d.get("labor_force_participation_rate"),
105
+ unemployment_rate=d.get("unemployment_rate"),
106
+ )
107
+
108
+
109
+ @modelclass
110
+ class EUMerchantAggregate:
111
+ """
112
+ Aggregated consumer transactions from European credit card panels.
113
+ Each row represents daily credit card, debit card, or open banking transactions
114
+ (7-day lag) at a tagged merchant or payment processor.
115
+ """
116
+
117
+ channel: Optional[str] = None
118
+ consumer_type: Optional[str] = None
119
+ eight_day_rolling_category_accounts: Optional[int] = None
120
+ eight_day_rolling_total_accounts: Optional[int] = None
121
+ mcc_group: Optional[str] = None
122
+ merchant_industry: Optional[str] = None
123
+ merchant_ticker: Optional[str] = None
124
+ name: Optional[str] = None
125
+ parent_name: Optional[str] = None
126
+ published_date: Optional[str] = None
127
+ spend_in_distinct_account_key_count: Optional[int] = None
128
+ spend_in_spend: Optional[float] = None
129
+ spend_in_transaction_count: Optional[int] = None
130
+ spend_out_distinct_account_key_count: Optional[int] = None
131
+ spend_out_spend: Optional[float] = None
132
+ spend_out_transaction_count: Optional[int] = None
133
+ total_accounts: Optional[int] = None
134
+ total_spend: Optional[float] = None
135
+ total_transactions: Optional[int] = None
136
+ transaction_currency: Optional[str] = None
137
+ transaction_date: Optional[str] = None
138
+ twenty_eight_day_rolling_category_accounts: Optional[int] = None
139
+ twenty_eight_day_rolling_total_accounts: Optional[int] = None
140
+ type: Optional[str] = None
141
+ user_country: Optional[str] = None
142
+
143
+ @staticmethod
144
+ def from_dict(d):
145
+ return EUMerchantAggregate(
146
+ channel=d.get("channel"),
147
+ consumer_type=d.get("consumer_type"),
148
+ eight_day_rolling_category_accounts=d.get(
149
+ "eight_day_rolling_category_accounts"
150
+ ),
151
+ eight_day_rolling_total_accounts=d.get("eight_day_rolling_total_accounts"),
152
+ mcc_group=d.get("mcc_group"),
153
+ merchant_industry=d.get("merchant_industry"),
154
+ merchant_ticker=d.get("merchant_ticker"),
155
+ name=d.get("name"),
156
+ parent_name=d.get("parent_name"),
157
+ published_date=d.get("published_date"),
158
+ spend_in_distinct_account_key_count=d.get(
159
+ "spend_in_distinct_account_key_count"
160
+ ),
161
+ spend_in_spend=d.get("spend_in_spend"),
162
+ spend_in_transaction_count=d.get("spend_in_transaction_count"),
163
+ spend_out_distinct_account_key_count=d.get(
164
+ "spend_out_distinct_account_key_count"
165
+ ),
166
+ spend_out_spend=d.get("spend_out_spend"),
167
+ spend_out_transaction_count=d.get("spend_out_transaction_count"),
168
+ total_accounts=d.get("total_accounts"),
169
+ total_spend=d.get("total_spend"),
170
+ total_transactions=d.get("total_transactions"),
171
+ transaction_currency=d.get("transaction_currency"),
172
+ transaction_date=d.get("transaction_date"),
173
+ twenty_eight_day_rolling_category_accounts=d.get(
174
+ "twenty_eight_day_rolling_category_accounts"
175
+ ),
176
+ twenty_eight_day_rolling_total_accounts=d.get(
177
+ "twenty_eight_day_rolling_total_accounts"
178
+ ),
179
+ type=d.get("type"),
180
+ user_country=d.get("user_country"),
181
+ )
182
+
183
+
184
+ @modelclass
185
+ class EUMerchantHierarchy:
186
+ """
187
+ Reference data mapping merchants to parent companies, tickers, sectors,
188
+ and industries across Fable's European consumer transaction panel.
189
+ """
190
+
191
+ active_from: Optional[str] = None
192
+ active_to: Optional[str] = None
193
+ category: Optional[str] = None
194
+ grandparent_name: Optional[str] = None
195
+ grandparent_ticker: Optional[str] = None
196
+ great_grandparent_name: Optional[str] = None
197
+ great_grandparent_ticker: Optional[str] = None
198
+ industry: Optional[str] = None
199
+ industry_group: Optional[str] = None
200
+ listing_status: Optional[str] = None
201
+ lookup_name: Optional[str] = None
202
+ normalized_name: Optional[str] = None
203
+ parent_name: Optional[str] = None
204
+ parent_ticker: Optional[str] = None
205
+ sector: Optional[str] = None
206
+ sub_industry: Optional[str] = None
207
+ ticker: Optional[str] = None
208
+
209
+ @staticmethod
210
+ def from_dict(d):
211
+ return EUMerchantHierarchy(
212
+ active_from=d.get("active_from"),
213
+ active_to=d.get("active_to"),
214
+ category=d.get("category"),
215
+ grandparent_name=d.get("grandparent_name"),
216
+ grandparent_ticker=d.get("grandparent_ticker"),
217
+ great_grandparent_name=d.get("great_grandparent_name"),
218
+ great_grandparent_ticker=d.get("great_grandparent_ticker"),
219
+ industry=d.get("industry"),
220
+ industry_group=d.get("industry_group"),
221
+ listing_status=d.get("listing_status"),
222
+ lookup_name=d.get("lookup_name"),
223
+ normalized_name=d.get("normalized_name"),
224
+ parent_name=d.get("parent_name"),
225
+ parent_ticker=d.get("parent_ticker"),
226
+ sector=d.get("sector"),
227
+ sub_industry=d.get("sub_industry"),
228
+ ticker=d.get("ticker"),
229
+ )
@@ -920,3 +920,78 @@ class RiskFactorTaxonomy:
920
920
  taxonomy=d.get("taxonomy"),
921
921
  tertiary_category=d.get("tertiary_category"),
922
922
  )
923
+
924
+
925
+ @modelclass
926
+ class FilingSection:
927
+ """SEC document text section from a 10-K/10-Q (raw text content)."""
928
+
929
+ cik: Optional[str] = None
930
+ filing_date: Optional[str] = None
931
+ filing_url: Optional[str] = None
932
+ period_end: Optional[str] = None
933
+ section: Optional[str] = None
934
+ text: Optional[str] = None
935
+ ticker: Optional[str] = None
936
+
937
+ @staticmethod
938
+ def from_dict(d):
939
+ return FilingSection(
940
+ cik=d.get("cik"),
941
+ filing_date=d.get("filing_date"),
942
+ filing_url=d.get("filing_url"),
943
+ period_end=d.get("period_end"),
944
+ section=d.get("section"),
945
+ text=d.get("text"),
946
+ ticker=d.get("ticker"),
947
+ )
948
+
949
+
950
+ @modelclass
951
+ class Filing8K:
952
+ """Parsed 8-K filing with item-level text content."""
953
+
954
+ accession_number: Optional[str] = None
955
+ cik: Optional[str] = None
956
+ filing_date: Optional[str] = None
957
+ filing_url: Optional[str] = None
958
+ form_type: Optional[str] = None
959
+ items_text: Optional[str] = None
960
+ ticker: Optional[str] = None
961
+
962
+ @staticmethod
963
+ def from_dict(d):
964
+ return Filing8K(
965
+ accession_number=d.get("accession_number"),
966
+ cik=d.get("cik"),
967
+ filing_date=d.get("filing_date"),
968
+ filing_url=d.get("filing_url"),
969
+ form_type=d.get("form_type"),
970
+ items_text=d.get("items_text"),
971
+ ticker=d.get("ticker"),
972
+ )
973
+
974
+
975
+ @modelclass
976
+ class FilingIndex:
977
+ """Master index entry for any SEC filing (10-K, 8-K, 10-Q, etc.)."""
978
+
979
+ accession_number: Optional[str] = None
980
+ cik: Optional[str] = None
981
+ filing_date: Optional[str] = None
982
+ filing_url: Optional[str] = None
983
+ form_type: Optional[str] = None
984
+ issuer_name: Optional[str] = None
985
+ ticker: Optional[str] = None
986
+
987
+ @staticmethod
988
+ def from_dict(d):
989
+ return FilingIndex(
990
+ accession_number=d.get("accession_number"),
991
+ cik=d.get("cik"),
992
+ filing_date=d.get("filing_date"),
993
+ filing_url=d.get("filing_url"),
994
+ form_type=d.get("form_type"),
995
+ issuer_name=d.get("issuer_name"),
996
+ ticker=d.get("ticker"),
997
+ )
@@ -7,7 +7,8 @@ from ...modelclass import modelclass
7
7
 
8
8
  @modelclass
9
9
  class MinuteSnapshot:
10
- "Most recent minute bar."
10
+ """Most recent minute bar."""
11
+
11
12
  accumulated_volume: Optional[float] = None
12
13
  open: Optional[float] = None
13
14
  high: Optional[float] = None
@@ -18,20 +19,24 @@ class MinuteSnapshot:
18
19
  otc: Optional[bool] = None
19
20
  timestamp: Optional[int] = None
20
21
  transactions: Optional[int] = None
22
+ fractional_volume: Optional[str] = None
23
+ fractional_accumulated_volume: Optional[str] = None
21
24
 
22
25
  @staticmethod
23
26
  def from_dict(d):
24
27
  return MinuteSnapshot(
25
- d.get("av", None),
26
- d.get("o", None),
27
- d.get("h", None),
28
- d.get("l", None),
29
- d.get("c", None),
30
- d.get("v", None),
31
- d.get("vw", None),
32
- d.get("otc", None),
33
- d.get("t", None),
34
- d.get("n", None),
28
+ accumulated_volume=d.get("av"),
29
+ open=d.get("o"),
30
+ high=d.get("h"),
31
+ low=d.get("l"),
32
+ close=d.get("c"),
33
+ volume=d.get("v"),
34
+ vwap=d.get("vw"),
35
+ otc=d.get("otc"),
36
+ timestamp=d.get("t"),
37
+ transactions=d.get("n"),
38
+ fractional_volume=d.get("dv"),
39
+ fractional_accumulated_volume=d.get("dav"),
35
40
  )
36
41
 
37
42
 
@@ -318,10 +323,32 @@ class UniversalSnapshotSession:
318
323
  low: Optional[float] = None
319
324
  previous_close: Optional[float] = None
320
325
  volume: Optional[float] = None
326
+ vwap: Optional[float] = None
327
+ last_updated: Optional[int] = None
328
+ fractional_volume: Optional[str] = None
321
329
 
322
330
  @staticmethod
323
331
  def from_dict(d):
324
- return UniversalSnapshotSession(**d)
332
+ return UniversalSnapshotSession(
333
+ price=d.get("price"),
334
+ change=d.get("change"),
335
+ change_percent=d.get("change_percent"),
336
+ early_trading_change=d.get("early_trading_change"),
337
+ early_trading_change_percent=d.get("early_trading_change_percent"),
338
+ regular_trading_change=d.get("regular_trading_change"),
339
+ regular_trading_change_percent=d.get("regular_trading_change_percent"),
340
+ late_trading_change=d.get("late_trading_change"),
341
+ late_trading_change_percent=d.get("late_trading_change_percent"),
342
+ open=d.get("open"),
343
+ close=d.get("close"),
344
+ high=d.get("high"),
345
+ low=d.get("low"),
346
+ previous_close=d.get("previous_close"),
347
+ volume=d.get("volume"),
348
+ vwap=d.get("vwap"),
349
+ last_updated=d.get("last_updated"),
350
+ fractional_volume=d.get("decimal_volume"),
351
+ )
325
352
 
326
353
 
327
354
  @modelclass
@@ -330,8 +357,10 @@ class UniversalSnapshotLastQuote:
330
357
 
331
358
  ask: Optional[float] = None
332
359
  ask_size: Optional[float] = None
360
+ ask_exchange: Optional[int] = None
333
361
  bid: Optional[float] = None
334
362
  bid_size: Optional[float] = None
363
+ bid_exchange: Optional[int] = None
335
364
  midpoint: Optional[float] = None
336
365
  exchange: Optional[int] = None
337
366
  timeframe: Optional[str] = None
@@ -339,7 +368,18 @@ class UniversalSnapshotLastQuote:
339
368
 
340
369
  @staticmethod
341
370
  def from_dict(d):
342
- return UniversalSnapshotLastQuote(**d)
371
+ return UniversalSnapshotLastQuote(
372
+ ask=d.get("ask"),
373
+ ask_size=d.get("ask_size"),
374
+ ask_exchange=d.get("ask_exchange"),
375
+ bid=d.get("bid"),
376
+ bid_size=d.get("bid_size"),
377
+ bid_exchange=d.get("bid_exchange"),
378
+ midpoint=d.get("midpoint"),
379
+ exchange=d.get("exchange"),
380
+ timeframe=d.get("timeframe"),
381
+ last_updated=d.get("last_updated"),
382
+ )
343
383
 
344
384
 
345
385
  @modelclass
@@ -355,10 +395,51 @@ class UniversalSnapshotLastTrade:
355
395
  last_updated: Optional[int] = None
356
396
  participant_timestamp: Optional[int] = None
357
397
  sip_timestamp: Optional[int] = None
398
+ fractional_size: Optional[str] = None
399
+
400
+ @staticmethod
401
+ def from_dict(d):
402
+ return UniversalSnapshotLastTrade(
403
+ id=d.get("id"),
404
+ price=d.get("price"),
405
+ size=d.get("size"),
406
+ exchange=d.get("exchange"),
407
+ conditions=d.get("conditions"),
408
+ timeframe=d.get("timeframe"),
409
+ last_updated=d.get("last_updated"),
410
+ participant_timestamp=d.get("participant_timestamp"),
411
+ sip_timestamp=d.get("sip_timestamp"),
412
+ fractional_size=d.get("decimal_size"),
413
+ )
414
+
415
+
416
+ @modelclass
417
+ class UniversalSnapshotLastMinute:
418
+ """Contains the most recent minute-level aggregate for the asset."""
419
+
420
+ open: Optional[float] = None
421
+ close: Optional[float] = None
422
+ high: Optional[float] = None
423
+ low: Optional[float] = None
424
+ volume: Optional[float] = None
425
+ vwap: Optional[float] = None
426
+ transactions: Optional[int] = None
427
+ last_updated: Optional[int] = None
428
+ fractional_volume: Optional[str] = None
358
429
 
359
430
  @staticmethod
360
431
  def from_dict(d):
361
- return UniversalSnapshotLastTrade(**d)
432
+ return UniversalSnapshotLastMinute(
433
+ open=d.get("open"),
434
+ close=d.get("close"),
435
+ high=d.get("high"),
436
+ low=d.get("low"),
437
+ volume=d.get("volume"),
438
+ vwap=d.get("vwap"),
439
+ transactions=d.get("transactions"),
440
+ last_updated=d.get("last_updated"),
441
+ fractional_volume=d.get("decimal_volume"),
442
+ )
362
443
 
363
444
 
364
445
  @modelclass
@@ -374,7 +455,14 @@ class UniversalSnapshotUnderlyingAsset:
374
455
 
375
456
  @staticmethod
376
457
  def from_dict(d):
377
- return UniversalSnapshotUnderlyingAsset(**d)
458
+ return UniversalSnapshotUnderlyingAsset(
459
+ ticker=d.get("ticker"),
460
+ price=d.get("price"),
461
+ value=d.get("value"),
462
+ change_to_break_even=d.get("change_to_break_even"),
463
+ timeframe=d.get("timeframe"),
464
+ last_updated=d.get("last_updated"),
465
+ )
378
466
 
379
467
 
380
468
  @modelclass
@@ -389,18 +477,25 @@ class UniversalSnapshotDetails:
389
477
 
390
478
  @staticmethod
391
479
  def from_dict(d):
392
- return UniversalSnapshotDetails(**d)
480
+ return UniversalSnapshotDetails(
481
+ contract_type=d.get("contract_type"),
482
+ exercise_style=d.get("exercise_style"),
483
+ expiration_date=d.get("expiration_date"),
484
+ shares_per_contract=d.get("shares_per_contract"),
485
+ strike_price=d.get("strike_price"),
486
+ )
393
487
 
394
488
 
395
489
  @modelclass
396
490
  class UniversalSnapshot:
397
- """Contains snapshot data for an asset."""
491
+ """Contains snapshot data for an asset (stocks, options, indices, fx, crypto)."""
398
492
 
399
493
  ticker: Optional[str] = None
400
494
  type: Optional[str] = None
401
495
  session: Optional[UniversalSnapshotSession] = None
402
496
  last_quote: Optional[UniversalSnapshotLastQuote] = None
403
497
  last_trade: Optional[UniversalSnapshotLastTrade] = None
498
+ last_minute: Optional[UniversalSnapshotLastMinute] = None
404
499
  greeks: Optional[Greeks] = None
405
500
  underlying_asset: Optional[UniversalSnapshotUnderlyingAsset] = None
406
501
  details: Optional[UniversalSnapshotDetails] = None
@@ -412,12 +507,15 @@ class UniversalSnapshot:
412
507
  fair_market_value: Optional[float] = None
413
508
  error: Optional[str] = None
414
509
  message: Optional[str] = None
510
+ value: Optional[float] = None
511
+ last_updated: Optional[int] = None
512
+ timeframe: Optional[str] = None
415
513
 
416
514
  @staticmethod
417
515
  def from_dict(d):
418
516
  return UniversalSnapshot(
419
- ticker=d.get("ticker", None),
420
- type=d.get("type", None),
517
+ ticker=d.get("ticker"),
518
+ type=d.get("type"),
421
519
  session=(
422
520
  None
423
521
  if "session" not in d
@@ -433,7 +531,12 @@ class UniversalSnapshot:
433
531
  if "last_trade" not in d
434
532
  else UniversalSnapshotLastTrade.from_dict(d["last_trade"])
435
533
  ),
436
- greeks=None if "greeks" not in d else Greeks.from_dict(d["greeks"]),
534
+ last_minute=(
535
+ None
536
+ if "last_minute" not in d
537
+ else UniversalSnapshotLastMinute.from_dict(d["last_minute"])
538
+ ),
539
+ greeks=(None if "greeks" not in d else Greeks.from_dict(d["greeks"])),
437
540
  underlying_asset=(
438
541
  None
439
542
  if "underlying_asset" not in d
@@ -444,12 +547,15 @@ class UniversalSnapshot:
444
547
  if "details" not in d
445
548
  else UniversalSnapshotDetails.from_dict(d["details"])
446
549
  ),
447
- break_even_price=d.get("break_even_price", None),
448
- implied_volatility=d.get("implied_volatility", None),
449
- open_interest=d.get("open_interest", None),
450
- market_status=d.get("market_status", None),
451
- name=d.get("name", None),
452
- fair_market_value=d.get("fmv", None),
453
- error=d.get("error", None),
454
- message=d.get("message", None),
550
+ break_even_price=d.get("break_even_price"),
551
+ implied_volatility=d.get("implied_volatility"),
552
+ open_interest=d.get("open_interest"),
553
+ market_status=d.get("market_status"),
554
+ name=d.get("name"),
555
+ fair_market_value=d.get("fmv"),
556
+ error=d.get("error"),
557
+ message=d.get("message"),
558
+ value=d.get("value"),
559
+ last_updated=d.get("last_updated"),
560
+ timeframe=d.get("timeframe"),
455
561
  )
@@ -26,7 +26,8 @@ class Trade:
26
26
 
27
27
  @modelclass
28
28
  class LastTrade:
29
- "Contains data for the most recent trade for a given ticker symbol."
29
+ """Contains data for the most recent trade for a given ticker symbol."""
30
+
30
31
  ticker: Optional[str] = None
31
32
  trf_timestamp: Optional[int] = None
32
33
  sequence_number: Optional[float] = None
@@ -40,25 +41,25 @@ class LastTrade:
40
41
  size: Optional[float] = None
41
42
  exchange: Optional[int] = None
42
43
  tape: Optional[int] = None
43
- fractional_shares: Optional[str] = None
44
+ fractional_size: Optional[str] = None
44
45
 
45
46
  @staticmethod
46
47
  def from_dict(d):
47
48
  return LastTrade(
48
- d.get("T", None),
49
- d.get("f", None),
50
- d.get("q", None),
51
- d.get("t", None),
52
- d.get("y", None),
53
- d.get("c", None),
54
- d.get("e", None),
55
- d.get("i", None),
56
- d.get("p", None),
57
- d.get("r", None),
58
- d.get("s", None),
59
- d.get("x", None),
60
- d.get("z", None),
61
- d.get("ds", None),
49
+ ticker=d.get("T"),
50
+ trf_timestamp=d.get("f"),
51
+ sequence_number=d.get("q"),
52
+ sip_timestamp=d.get("t"),
53
+ participant_timestamp=d.get("y"),
54
+ conditions=d.get("c"),
55
+ correction=d.get("e"),
56
+ id=d.get("i"),
57
+ price=d.get("p"),
58
+ trf_id=d.get("r"),
59
+ size=d.get("s"),
60
+ exchange=d.get("x"),
61
+ tape=d.get("z"),
62
+ fractional_size=d.get("ds"),
62
63
  )
63
64
 
64
65
 
@@ -28,6 +28,9 @@ from .models import (
28
28
  ShortVolume,
29
29
  RiskFactor,
30
30
  RiskFactorTaxonomy,
31
+ FilingSection,
32
+ Filing8K,
33
+ FilingIndex,
31
34
  )
32
35
  from urllib3 import HTTPResponse
33
36
  from datetime import date
@@ -793,21 +796,22 @@ class ContractsClient(BaseClient):
793
796
  cik_gte: Optional[str] = None,
794
797
  cik_lt: Optional[str] = None,
795
798
  cik_lte: Optional[str] = None,
796
- limit: Optional[int] = None,
797
- sort: Optional[Union[str, Sort]] = None,
799
+ limit: Optional[int] = 100,
800
+ sort: Optional[Union[str, Sort]] = "filing_date.desc",
798
801
  params: Optional[Dict[str, Any]] = None,
799
802
  raw: bool = False,
800
803
  options: Optional[RequestOptionBuilder] = None,
801
804
  ) -> Union[Iterator[RiskFactor], HTTPResponse]:
802
805
  """
803
- Endpoint: GET /stocks/filings/vX/risk-factors
806
+ Get categorized risk factors extracted from 10-K filings (with supporting_text).
804
807
  """
805
808
  url = "/stocks/filings/vX/risk-factors"
806
809
  return self._paginate(
807
810
  path=url,
808
811
  params=self._get_params(self.list_stocks_filings_risk_factors, locals()),
809
- raw=raw,
812
+ result_key="results",
810
813
  deserializer=RiskFactor.from_dict,
814
+ raw=raw,
811
815
  options=options,
812
816
  )
813
817
 
@@ -836,20 +840,154 @@ class ContractsClient(BaseClient):
836
840
  tertiary_category_gte: Optional[str] = None,
837
841
  tertiary_category_lt: Optional[str] = None,
838
842
  tertiary_category_lte: Optional[str] = None,
839
- limit: Optional[int] = None,
840
- sort: Optional[Union[str, Sort]] = None,
843
+ limit: Optional[int] = 200,
844
+ sort: Optional[Union[str, Sort]] = "taxonomy.desc",
841
845
  params: Optional[Dict[str, Any]] = None,
842
846
  raw: bool = False,
843
847
  options: Optional[RequestOptionBuilder] = None,
844
848
  ) -> Union[Iterator[RiskFactorTaxonomy], HTTPResponse]:
845
849
  """
846
- Endpoint: GET /stocks/taxonomies/vX/risk-factors
850
+ Get the taxonomy/categories used to classify risk factors (kept old name for backward compatibility).
847
851
  """
848
852
  url = "/stocks/taxonomies/vX/risk-factors"
849
853
  return self._paginate(
850
854
  path=url,
851
855
  params=self._get_params(self.list_stocks_taxonomies_risk_factors, locals()),
852
- raw=raw,
856
+ result_key="results",
853
857
  deserializer=RiskFactorTaxonomy.from_dict,
858
+ raw=raw,
859
+ options=options,
860
+ )
861
+
862
+ def list_stocks_filings_10k_sections(
863
+ self,
864
+ cik: Optional[str] = None,
865
+ cik_any_of: Optional[str] = None,
866
+ cik_gt: Optional[str] = None,
867
+ cik_gte: Optional[str] = None,
868
+ cik_lt: Optional[str] = None,
869
+ cik_lte: Optional[str] = None,
870
+ ticker: Optional[str] = None,
871
+ ticker_any_of: Optional[str] = None,
872
+ ticker_gt: Optional[str] = None,
873
+ ticker_gte: Optional[str] = None,
874
+ ticker_lt: Optional[str] = None,
875
+ ticker_lte: Optional[str] = None,
876
+ section: Optional[str] = None,
877
+ section_any_of: Optional[str] = None,
878
+ filing_date: Optional[Union[str, date]] = None,
879
+ filing_date_gt: Optional[Union[str, date]] = None,
880
+ filing_date_gte: Optional[Union[str, date]] = None,
881
+ filing_date_lt: Optional[Union[str, date]] = None,
882
+ filing_date_lte: Optional[Union[str, date]] = None,
883
+ period_end: Optional[Union[str, date]] = None,
884
+ period_end_gt: Optional[Union[str, date]] = None,
885
+ period_end_gte: Optional[Union[str, date]] = None,
886
+ period_end_lt: Optional[Union[str, date]] = None,
887
+ period_end_lte: Optional[Union[str, date]] = None,
888
+ limit: Optional[int] = 100,
889
+ sort: Optional[Union[str, Sort]] = "period_end.desc",
890
+ params: Optional[Dict[str, Any]] = None,
891
+ raw: bool = False,
892
+ options: Optional[RequestOptionBuilder] = None,
893
+ ) -> Union[Iterator[FilingSection], HTTPResponse]:
894
+ """
895
+ Get raw text sections from 10-K/10-Q filings (business, risk_factors, etc.).
896
+ """
897
+ url = "/stocks/filings/10-K/vX/sections"
898
+ return self._paginate(
899
+ path=url,
900
+ params=self._get_params(self.list_stocks_filings_10k_sections, locals()),
901
+ result_key="results",
902
+ deserializer=FilingSection.from_dict,
903
+ raw=raw,
904
+ options=options,
905
+ )
906
+
907
+ def list_stocks_filings_8k_text(
908
+ self,
909
+ cik: Optional[str] = None,
910
+ cik_any_of: Optional[str] = None,
911
+ cik_gt: Optional[str] = None,
912
+ cik_gte: Optional[str] = None,
913
+ cik_lt: Optional[str] = None,
914
+ cik_lte: Optional[str] = None,
915
+ ticker: Optional[str] = None,
916
+ ticker_any_of: Optional[str] = None,
917
+ ticker_gt: Optional[str] = None,
918
+ ticker_gte: Optional[str] = None,
919
+ ticker_lt: Optional[str] = None,
920
+ ticker_lte: Optional[str] = None,
921
+ form_type: Optional[str] = None,
922
+ form_type_any_of: Optional[str] = None,
923
+ form_type_gt: Optional[str] = None,
924
+ form_type_gte: Optional[str] = None,
925
+ form_type_lt: Optional[str] = None,
926
+ form_type_lte: Optional[str] = None,
927
+ filing_date: Optional[Union[str, date]] = None,
928
+ filing_date_gt: Optional[Union[str, date]] = None,
929
+ filing_date_gte: Optional[Union[str, date]] = None,
930
+ filing_date_lt: Optional[Union[str, date]] = None,
931
+ filing_date_lte: Optional[Union[str, date]] = None,
932
+ limit: Optional[int] = 100,
933
+ sort: Optional[Union[str, Sort]] = "filing_date.desc",
934
+ params: Optional[Dict[str, Any]] = None,
935
+ raw: bool = False,
936
+ options: Optional[RequestOptionBuilder] = None,
937
+ ) -> Union[Iterator[Filing8K], HTTPResponse]:
938
+ """
939
+ Get parsed 8-K filings (earnings, acquisitions, executive changes, etc.).
940
+ """
941
+ url = "/stocks/filings/8-K/vX/text"
942
+ return self._paginate(
943
+ path=url,
944
+ params=self._get_params(self.list_stocks_filings_8k_text, locals()),
945
+ result_key="results",
946
+ deserializer=Filing8K.from_dict,
947
+ raw=raw,
948
+ options=options,
949
+ )
950
+
951
+ def list_stocks_filings_index(
952
+ self,
953
+ cik: Optional[str] = None,
954
+ cik_any_of: Optional[str] = None,
955
+ cik_gt: Optional[str] = None,
956
+ cik_gte: Optional[str] = None,
957
+ cik_lt: Optional[str] = None,
958
+ cik_lte: Optional[str] = None,
959
+ ticker: Optional[str] = None,
960
+ ticker_any_of: Optional[str] = None,
961
+ ticker_gt: Optional[str] = None,
962
+ ticker_gte: Optional[str] = None,
963
+ ticker_lt: Optional[str] = None,
964
+ ticker_lte: Optional[str] = None,
965
+ form_type: Optional[str] = None,
966
+ form_type_any_of: Optional[str] = None,
967
+ form_type_gt: Optional[str] = None,
968
+ form_type_gte: Optional[str] = None,
969
+ form_type_lt: Optional[str] = None,
970
+ form_type_lte: Optional[str] = None,
971
+ filing_date: Optional[Union[str, date]] = None,
972
+ filing_date_gt: Optional[Union[str, date]] = None,
973
+ filing_date_gte: Optional[Union[str, date]] = None,
974
+ filing_date_lt: Optional[Union[str, date]] = None,
975
+ filing_date_lte: Optional[Union[str, date]] = None,
976
+ limit: Optional[int] = 1000,
977
+ sort: Optional[Union[str, Sort]] = "filing_date.desc",
978
+ params: Optional[Dict[str, Any]] = None,
979
+ raw: bool = False,
980
+ options: Optional[RequestOptionBuilder] = None,
981
+ ) -> Union[Iterator[FilingIndex], HTTPResponse]:
982
+ """
983
+ Get the master index of all SEC filings (10-K, 8-K, 10-Q, S-1, 4, etc.).
984
+ """
985
+ url = "/stocks/filings/vX/index"
986
+ return self._paginate(
987
+ path=url,
988
+ params=self._get_params(self.list_stocks_filings_index, locals()),
989
+ result_key="results",
990
+ deserializer=FilingIndex.from_dict,
991
+ raw=raw,
854
992
  options=options,
855
993
  )
@@ -22,6 +22,8 @@ class EquityAgg:
22
22
  start_timestamp: Optional[int] = None
23
23
  end_timestamp: Optional[int] = None
24
24
  otc: Optional[bool] = None
25
+ fractional_volume: Optional[str] = None
26
+ fractional_accumulated_volume: Optional[str] = None
25
27
 
26
28
  @staticmethod
27
29
  def from_dict(d):
@@ -41,6 +43,8 @@ class EquityAgg:
41
43
  d.get("s", None),
42
44
  d.get("e", None),
43
45
  d.get("otc", None),
46
+ d.get("dv", None),
47
+ d.get("dav", None),
44
48
  )
45
49
 
46
50
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "massive"
3
- version = "2.3.2"
3
+ version = "2.5.0"
4
4
  description = "Official Massive (formerly Polygon.io) REST and Websocket client."
5
5
  authors = ["massive.com"]
6
6
  license = "MIT"
@@ -1,106 +0,0 @@
1
- from typing import Optional
2
- from ...modelclass import modelclass
3
-
4
-
5
- @modelclass
6
- class TreasuryYield:
7
- """
8
- Treasury yield data for a specific date.
9
- """
10
-
11
- date: Optional[str] = None
12
- yield_1_month: Optional[float] = None
13
- yield_3_month: Optional[float] = None
14
- yield_6_month: Optional[float] = None
15
- yield_1_year: Optional[float] = None
16
- yield_2_year: Optional[float] = None
17
- yield_3_year: Optional[float] = None
18
- yield_5_year: Optional[float] = None
19
- yield_7_year: Optional[float] = None
20
- yield_10_year: Optional[float] = None
21
- yield_20_year: Optional[float] = None
22
- yield_30_year: Optional[float] = None
23
-
24
- @staticmethod
25
- def from_dict(d):
26
- return TreasuryYield(
27
- date=d.get("date"),
28
- yield_1_month=d.get("yield_1_month"),
29
- yield_3_month=d.get("yield_3_month"),
30
- yield_6_month=d.get("yield_6_month"),
31
- yield_1_year=d.get("yield_1_year"),
32
- yield_2_year=d.get("yield_2_year"),
33
- yield_3_year=d.get("yield_3_year"),
34
- yield_5_year=d.get("yield_5_year"),
35
- yield_7_year=d.get("yield_7_year"),
36
- yield_10_year=d.get("yield_10_year"),
37
- yield_20_year=d.get("yield_20_year"),
38
- yield_30_year=d.get("yield_30_year"),
39
- )
40
-
41
-
42
- @modelclass
43
- class FedInflation:
44
- cpi: Optional[float] = None
45
- cpi_core: Optional[float] = None
46
- cpi_year_over_year: Optional[float] = None
47
- date: Optional[str] = None
48
- pce: Optional[float] = None
49
- pce_core: Optional[float] = None
50
- pce_spending: Optional[float] = None
51
-
52
- @staticmethod
53
- def from_dict(d):
54
- return FedInflation(
55
- cpi=d.get("cpi"),
56
- cpi_core=d.get("cpi_core"),
57
- cpi_year_over_year=d.get("cpi_year_over_year"),
58
- date=d.get("date"),
59
- pce=d.get("pce"),
60
- pce_core=d.get("pce_core"),
61
- pce_spending=d.get("pce_spending"),
62
- )
63
-
64
-
65
- @modelclass
66
- class FedInflationExpectations:
67
- date: Optional[str] = None
68
- forward_years_5_to_10: Optional[float] = None
69
- market_10_year: Optional[float] = None
70
- market_5_year: Optional[float] = None
71
- model_10_year: Optional[float] = None
72
- model_1_year: Optional[float] = None
73
- model_30_year: Optional[float] = None
74
- model_5_year: Optional[float] = None
75
-
76
- @staticmethod
77
- def from_dict(d):
78
- return FedInflationExpectations(
79
- date=d.get("date"),
80
- forward_years_5_to_10=d.get("forward_years_5_to_10"),
81
- market_10_year=d.get("market_10_year"),
82
- market_5_year=d.get("market_5_year"),
83
- model_10_year=d.get("model_10_year"),
84
- model_1_year=d.get("model_1_year"),
85
- model_30_year=d.get("model_30_year"),
86
- model_5_year=d.get("model_5_year"),
87
- )
88
-
89
-
90
- @modelclass
91
- class FedLaborMarket:
92
- avg_hourly_earnings: Optional[float] = None
93
- date: Optional[str] = None
94
- job_openings: Optional[float] = None
95
- labor_force_participation_rate: Optional[float] = None
96
- unemployment_rate: Optional[float] = None
97
-
98
- @staticmethod
99
- def from_dict(d):
100
- return FedLaborMarket(
101
- avg_hourly_earnings=d.get("avg_hourly_earnings"),
102
- date=d.get("date"),
103
- job_openings=d.get("job_openings"),
104
- labor_force_participation_rate=d.get("labor_force_participation_rate"),
105
- unemployment_rate=d.get("unemployment_rate"),
106
- )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes