Skip to content

Commit 94f2e9d

Browse files
Sync client-python with OpenAPI spec (#1011)
1 parent e781983 commit 94f2e9d

File tree

2 files changed

+225
-0
lines changed

2 files changed

+225
-0
lines changed

massive/rest/economy.py

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
TreasuryYield,
99
FedInflationExpectations,
1010
FedLaborMarket,
11+
EUMerchantAggregate,
12+
EUMerchantHierarchy,
1113
)
1214
from .models.common import Sort, Order
1315
from .models.request import RequestOptionBuilder
@@ -168,3 +170,103 @@ def list_labor_market_indicators(
168170
raw=raw,
169171
options=options,
170172
)
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+
)

massive/rest/models/economy.py

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,126 @@ def from_dict(d):
104104
labor_force_participation_rate=d.get("labor_force_participation_rate"),
105105
unemployment_rate=d.get("unemployment_rate"),
106106
)
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+
)

0 commit comments

Comments
 (0)