cryptodatapy 0.2.13__tar.gz → 0.2.15__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.
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/PKG-INFO +1 -1
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/pyproject.toml +1 -1
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/coinmetrics_api.py +109 -198
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/datarequest.py +0 -23
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/getdata.py +2 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/convertparams.py +96 -121
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/impute.py +10 -4
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/od.py +30 -30
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/wrangle.py +15 -7
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/LICENSE +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/README.md +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/__init__.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/conf/__init__.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/conf/fields.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/conf/tickers.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/__init__.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/br_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/ca_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/cn_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/de_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/ez_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/fr_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/gb_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/get_econ_calendars.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/id_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/in_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/it_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/jp_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/kr_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/mx_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/ru_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/tr_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/us_econ_calendar.csv +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/__init__.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/.ipynb_checkpoints/CCXT-checkpoint.ipynb +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/.ipynb_checkpoints/DBNomics-checkpoint.ipynb +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/.ipynb_checkpoints/InvestPy-checkpoint.ipynb +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/.ipynb_checkpoints/NasdaqDataLink-checkpoint.ipynb +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/.ipynb_checkpoints/PandasDataReader-checkpoint.ipynb +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/__init__.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/cryptocompare_api.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/datavendor.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/glassnode_api.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/tiingo_api.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/exchanges/__init__.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/exchanges/dydx.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/exchanges/exchange.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/libraries/__init__.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/libraries/ccxt_api.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/libraries/dbnomics_api.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/libraries/investpy_api.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/libraries/library.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/libraries/pandasdr_api.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/web/__init__.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/web/aqr.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/web/web.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/__init__.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/clean.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/filter.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/util/__init__.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/util/datacatalog.py +0 -0
- {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/util/datacredentials.py +0 -0
{cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/coinmetrics_api.py
RENAMED
@@ -71,21 +71,12 @@ class CoinMetrics(DataVendor):
|
|
71
71
|
rate_limit: Any, optional, Default None
|
72
72
|
Number of API calls made and left, by time frequency.
|
73
73
|
"""
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
exchanges,
|
78
|
-
indexes,
|
79
|
-
assets,
|
80
|
-
markets,
|
81
|
-
market_types,
|
82
|
-
fields,
|
83
|
-
frequencies,
|
84
|
-
base_url,
|
85
|
-
api_key,
|
86
|
-
max_obs_per_call,
|
87
|
-
rate_limit,
|
74
|
+
super().__init__(
|
75
|
+
categories, exchanges, indexes, assets, markets, market_types,
|
76
|
+
fields, frequencies, base_url, api_key, max_obs_per_call, rate_limit
|
88
77
|
)
|
78
|
+
self.data_req = None
|
79
|
+
self.data = pd.DataFrame()
|
89
80
|
|
90
81
|
@staticmethod
|
91
82
|
def req_meta(data_type: str) -> Dict[str, Any]:
|
@@ -176,27 +167,6 @@ class CoinMetrics(DataVendor):
|
|
176
167
|
|
177
168
|
return self.assets
|
178
169
|
|
179
|
-
def get_inst_info(self, as_dict: bool = False) -> Union[Dict[str, List[str]], pd.DataFrame]:
|
180
|
-
"""
|
181
|
-
Get institutions info.
|
182
|
-
|
183
|
-
Parameters
|
184
|
-
----------
|
185
|
-
as_dict: bool, default False
|
186
|
-
Returns available institutions as dictionary.
|
187
|
-
|
188
|
-
Returns
|
189
|
-
-------
|
190
|
-
inst: dictionary or pd.DataFrame
|
191
|
-
Dictionary or dataframe with info on available institutions.
|
192
|
-
"""
|
193
|
-
# req data
|
194
|
-
inst = self.req_meta(data_type='catalog_institutions')
|
195
|
-
# wrangle data resp
|
196
|
-
inst = WrangleInfo(inst).cm_inst_info(as_dict=as_dict)
|
197
|
-
|
198
|
-
return inst
|
199
|
-
|
200
170
|
def get_markets_info(self, as_list: bool = False) -> Union[List[str], pd.DataFrame]:
|
201
171
|
"""
|
202
172
|
Get markets info.
|
@@ -258,14 +228,11 @@ class CoinMetrics(DataVendor):
|
|
258
228
|
# req data
|
259
229
|
ohlcv_fields = ['price_open', 'price_close', 'price_high', 'price_low', 'vwap', 'volume', 'candle_usd_volume',
|
260
230
|
'candle_trades_count'] # get market fields
|
261
|
-
inst_fields = [v for k, v in self.get_inst_info(as_dict=True).items()][0] # inst fields
|
262
231
|
onchain_fields = self.get_onchain_fields_info() # get onchain fields
|
263
232
|
|
264
233
|
# fields df
|
265
234
|
if data_type == "market":
|
266
235
|
self.fields = onchain_fields[onchain_fields.category == "Market"]
|
267
|
-
elif data_type == "off-chain":
|
268
|
-
self.fields = inst_fields
|
269
236
|
else:
|
270
237
|
self.fields = onchain_fields
|
271
238
|
|
@@ -275,10 +242,8 @@ class CoinMetrics(DataVendor):
|
|
275
242
|
self.fields = ohlcv_fields + list(self.fields.index)
|
276
243
|
elif data_type == "on-chain":
|
277
244
|
self.fields = list(self.fields.index)
|
278
|
-
elif data_type == "off-chain":
|
279
|
-
self.fields = inst_fields
|
280
245
|
else:
|
281
|
-
self.fields = ohlcv_fields + list(self.fields.index)
|
246
|
+
self.fields = ohlcv_fields + list(self.fields.index)
|
282
247
|
|
283
248
|
return self.fields
|
284
249
|
|
@@ -297,15 +262,14 @@ class CoinMetrics(DataVendor):
|
|
297
262
|
List of available assets for selected fields.
|
298
263
|
"""
|
299
264
|
# convert data request parameters to Coin Metrics format
|
300
|
-
|
301
|
-
# fields param
|
302
|
-
fields = cm_data_req["fields"]
|
265
|
+
self.data_req = ConvertParams(data_req).to_coinmetrics()
|
303
266
|
|
304
267
|
# fields info
|
305
268
|
self.get_fields_info()
|
269
|
+
|
306
270
|
# fields dict
|
307
271
|
fields_dict = {}
|
308
|
-
for field in
|
272
|
+
for field in self.data_req.source_fields:
|
309
273
|
if field in self.fields.index:
|
310
274
|
df = self.fields.loc[field] # get fields metadata
|
311
275
|
# add to dict
|
@@ -341,12 +305,14 @@ class CoinMetrics(DataVendor):
|
|
341
305
|
if self.fields is None:
|
342
306
|
self.get_fields_info(as_list=True)
|
343
307
|
|
344
|
-
def req_data(self, data_type: str, params: Dict[str, Union[str, int]]) -> pd.DataFrame:
|
308
|
+
def req_data(self, data_req: DataRequest, data_type: str, params: Dict[str, Union[str, int]]) -> pd.DataFrame:
|
345
309
|
"""
|
346
310
|
Sends data request to Python client.
|
347
311
|
|
348
312
|
Parameters
|
349
313
|
----------
|
314
|
+
data_req: DataRequest
|
315
|
+
Parameters of data request in CryptoDataPy format.
|
350
316
|
data_type: str
|
351
317
|
Data type to retrieve.
|
352
318
|
params: dict
|
@@ -361,7 +327,7 @@ class CoinMetrics(DataVendor):
|
|
361
327
|
url = self.base_url + data_type
|
362
328
|
|
363
329
|
# data request
|
364
|
-
data_resp =
|
330
|
+
data_resp = data_req.get_req(url=url, params=params)
|
365
331
|
|
366
332
|
# raise error if data is None
|
367
333
|
if data_resp is None:
|
@@ -374,10 +340,10 @@ class CoinMetrics(DataVendor):
|
|
374
340
|
# while loop
|
375
341
|
while next_page_url:
|
376
342
|
# wait to avoid exceeding rate limit
|
377
|
-
sleep(
|
343
|
+
sleep(data_req.pause)
|
378
344
|
|
379
345
|
# request next page
|
380
|
-
next_page_data_resp =
|
346
|
+
next_page_data_resp = data_req.get_req(url=next_page_url, params=None)
|
381
347
|
next_page_data, next_page_url = next_page_data_resp.get('data', []), next_page_data_resp.get(
|
382
348
|
'next_page_url')
|
383
349
|
|
@@ -390,7 +356,7 @@ class CoinMetrics(DataVendor):
|
|
390
356
|
return df
|
391
357
|
|
392
358
|
@staticmethod
|
393
|
-
def wrangle_data_resp(data_req: DataRequest, data_resp: pd.DataFrame()):
|
359
|
+
def wrangle_data_resp(data_req: DataRequest, data_resp: pd.DataFrame()) -> pd.DataFrame():
|
394
360
|
"""
|
395
361
|
Wrangle data response.
|
396
362
|
|
@@ -433,13 +399,13 @@ class CoinMetrics(DataVendor):
|
|
433
399
|
Dataframe with DatetimeIndex (level 0), ticker (level 1) and values for fields/col, in tidy data format.
|
434
400
|
"""
|
435
401
|
# get entire data history
|
436
|
-
df = self.req_data(data_type, params)
|
402
|
+
df = self.req_data(data_req, data_type, params)
|
437
403
|
# wrangle df
|
438
404
|
df = self.wrangle_data_resp(data_req, df)
|
439
405
|
|
440
406
|
return df
|
441
407
|
|
442
|
-
def check_tickers(self, data_req: DataRequest, data_type: str) ->
|
408
|
+
def check_tickers(self, data_req: DataRequest, data_type: str) -> DataRequest:
|
443
409
|
"""
|
444
410
|
Checks tickers for data availability.
|
445
411
|
|
@@ -457,40 +423,41 @@ class CoinMetrics(DataVendor):
|
|
457
423
|
List of available tickers.
|
458
424
|
"""
|
459
425
|
# convert params
|
460
|
-
|
461
|
-
# tickers
|
462
|
-
tickers = []
|
426
|
+
self.data_req = ConvertParams(data_req).to_coinmetrics()
|
463
427
|
|
464
428
|
# check indexes
|
465
429
|
if data_type == 'indexes':
|
466
430
|
self.get_indexes_info(as_list=True)
|
467
431
|
# avail tickers
|
468
|
-
|
432
|
+
self.data_req.source_tickers = [ticker for ticker in self.data_req.source_tickers
|
433
|
+
if ticker.upper() in self.indexes]
|
469
434
|
|
470
435
|
# check markets
|
471
436
|
elif data_type == 'market_candles' or data_type == 'open_interest' or \
|
472
437
|
data_type == 'funding_rates' or data_type == 'trades' or data_type == 'quotes':
|
473
438
|
self.get_assets_info(as_list=True)
|
474
439
|
# avail tickers
|
475
|
-
|
476
|
-
|
440
|
+
self.data_req.source_markets = [market for ticker, market in
|
441
|
+
zip(self.data_req.source_tickers, self.data_req.source_markets)
|
442
|
+
if ticker in self.assets]
|
477
443
|
|
478
444
|
# check assets
|
479
445
|
elif data_type == 'asset_metrics':
|
480
446
|
self.get_assets_info(as_list=True)
|
481
447
|
# avail tickers
|
482
|
-
|
448
|
+
self.data_req.source_tickers = [ticker for ticker in self.data_req.source_tickers
|
449
|
+
if ticker in self.assets]
|
483
450
|
|
484
451
|
# raise error if no tickers available
|
485
|
-
if len(
|
452
|
+
if len(self.data_req.source_tickers) == 0:
|
486
453
|
raise ValueError(
|
487
454
|
f"{data_req.tickers} are not valid tickers for the requested data type."
|
488
455
|
f" Use get_metadata to get a list of available indexes and assets."
|
489
456
|
)
|
490
457
|
|
491
|
-
return
|
458
|
+
return self.data_req
|
492
459
|
|
493
|
-
def check_fields(self, data_req: DataRequest, data_type: str) ->
|
460
|
+
def check_fields(self, data_req: DataRequest, data_type: str) -> DataRequest:
|
494
461
|
"""
|
495
462
|
Checks fields for data availability.
|
496
463
|
|
@@ -508,33 +475,25 @@ class CoinMetrics(DataVendor):
|
|
508
475
|
List of avaialble fields.
|
509
476
|
"""
|
510
477
|
# convert params
|
511
|
-
|
512
|
-
# fields
|
513
|
-
fields = []
|
514
|
-
|
515
|
-
# check instution
|
516
|
-
if data_type == 'institutions':
|
517
|
-
# avail inst
|
518
|
-
inst_list = [val for key, val in self.get_inst_info(as_dict=True).items()][0]
|
519
|
-
fields = [field for field in cm_data_req["fields"] if field in inst_list]
|
478
|
+
self.data_req = ConvertParams(data_req).to_coinmetrics()
|
520
479
|
|
521
480
|
# check on-chain metrics
|
522
|
-
|
481
|
+
if data_type == 'asset_metrics':
|
523
482
|
self.get_fields_info(data_type='on-chain', as_list=True)
|
524
483
|
# avail fields
|
525
|
-
|
484
|
+
self.data_req.source_fields = [field for field in self.data_req.source_fields
|
485
|
+
if field in self.fields]
|
526
486
|
|
527
487
|
# raise error if fields is empty
|
528
|
-
if len(
|
488
|
+
if len(self.data_req.source_fields) == 0:
|
529
489
|
raise ValueError(
|
530
490
|
f"{data_req.fields} are not valid fields."
|
531
491
|
f" Use the get_fields_info or get_inst_info methods to get available source fields."
|
532
492
|
)
|
533
493
|
|
534
|
-
return
|
494
|
+
return self.data_req
|
535
495
|
|
536
|
-
|
537
|
-
def check_params(data_req: DataRequest, data_type: str) -> None:
|
496
|
+
def check_params(self, data_req: DataRequest, data_type: str) -> None:
|
538
497
|
"""
|
539
498
|
Checks data request parameters.
|
540
499
|
|
@@ -548,27 +507,19 @@ class CoinMetrics(DataVendor):
|
|
548
507
|
|
549
508
|
"""
|
550
509
|
# convert params
|
551
|
-
|
510
|
+
self.data_req = ConvertParams(data_req).to_coinmetrics()
|
552
511
|
|
553
512
|
# indexes
|
554
513
|
if data_type == 'indexes':
|
555
|
-
if
|
514
|
+
if self.data_req.source_freq not in ["1h", "1d"]:
|
556
515
|
raise ValueError(
|
557
516
|
f"Indexes data is only available for hourly, daily, weekly, monthly and quarterly"
|
558
517
|
f" frequencies. Change data request frequency and try again."
|
559
518
|
)
|
560
519
|
|
561
|
-
# institutions
|
562
|
-
elif data_type == 'institutions':
|
563
|
-
if cm_data_req["freq"] != "1d":
|
564
|
-
raise ValueError(
|
565
|
-
f"Institutions data is only available for daily frequency."
|
566
|
-
f" Change data request frequency and try again."
|
567
|
-
)
|
568
|
-
|
569
520
|
# ohlcv
|
570
521
|
elif data_type == 'market_candles':
|
571
|
-
if
|
522
|
+
if self.data_req.source_freq not in ["1m", "1h", "1d"]:
|
572
523
|
raise ValueError(
|
573
524
|
f"OHLCV data is only available for minute, hourly, daily, weekly, monthly and quarterly"
|
574
525
|
f" frequencies. Change data request frequency and try again."
|
@@ -576,7 +527,7 @@ class CoinMetrics(DataVendor):
|
|
576
527
|
|
577
528
|
# on-chain
|
578
529
|
elif data_type == 'asset_metrics':
|
579
|
-
if
|
530
|
+
if self.data_req.source_freq not in ["1b", "1d"]:
|
580
531
|
raise ValueError(
|
581
532
|
f"On-chain data is only available for 'block' and 'd' frequencies."
|
582
533
|
f" Change data request frequency and try again."
|
@@ -584,14 +535,15 @@ class CoinMetrics(DataVendor):
|
|
584
535
|
|
585
536
|
# funding rate
|
586
537
|
elif data_type == 'funding_rates':
|
587
|
-
if data_req.mkt_type not in ["perpetual_future", "future", "option"]:
|
538
|
+
if self.data_req.mkt_type not in ["perpetual_future", "future", "option"]:
|
588
539
|
raise ValueError(
|
589
540
|
f"Funding rates are only available for 'perpetual_future', 'future' and"
|
590
541
|
f" 'option' market types. Change 'mkt_type' in data request and try again."
|
591
542
|
)
|
592
543
|
|
544
|
+
# oi
|
593
545
|
elif data_type == 'open_interest':
|
594
|
-
if data_req.mkt_type not in ["perpetual_future", "future", "option"]:
|
546
|
+
if self.data_req.mkt_type not in ["perpetual_future", "future", "option"]:
|
595
547
|
raise ValueError(
|
596
548
|
f"Open interest is only available for 'perpetual_future', 'future' and"
|
597
549
|
f" 'option' market types. Change 'mkt_type' in data request and try again."
|
@@ -599,7 +551,7 @@ class CoinMetrics(DataVendor):
|
|
599
551
|
|
600
552
|
# trades
|
601
553
|
elif data_type == 'trades':
|
602
|
-
if
|
554
|
+
if self.data_req.source_freq != "raw":
|
603
555
|
raise ValueError(
|
604
556
|
f"{data_type} data is only available at the 'tick' frequency."
|
605
557
|
f" Change data request frequency and try again."
|
@@ -607,7 +559,7 @@ class CoinMetrics(DataVendor):
|
|
607
559
|
|
608
560
|
# quotes
|
609
561
|
elif data_type == 'quotes':
|
610
|
-
if
|
562
|
+
if self.data_req.source_freq not in ["raw", "1s", "1m", "1h", "1d"]:
|
611
563
|
raise ValueError(
|
612
564
|
f"{data_type} data is only available at the 'tick', '1s', '1m', '1h' and '1d' frequencies."
|
613
565
|
f" Change data request frequency and try again."
|
@@ -630,21 +582,21 @@ class CoinMetrics(DataVendor):
|
|
630
582
|
DataFrame with DatetimeIndex (level 0), tickers (level 1) and index values (cols).
|
631
583
|
"""
|
632
584
|
# convert data request parameters to Coin Metrics format
|
633
|
-
|
585
|
+
self.data_req = ConvertParams(data_req).to_coinmetrics()
|
634
586
|
|
635
587
|
# check params
|
636
588
|
self.check_params(data_req, data_type='indexes')
|
637
589
|
|
638
590
|
# check tickers
|
639
|
-
|
640
|
-
sleep(
|
591
|
+
self.check_tickers(data_req, data_type='indexes')
|
592
|
+
sleep(self.data_req.pause)
|
641
593
|
|
642
594
|
# params
|
643
595
|
params = {
|
644
|
-
'indexes': ','.join(
|
645
|
-
'frequency':
|
646
|
-
'start_time':
|
647
|
-
'end_time':
|
596
|
+
'indexes': ','.join(self.data_req.source_tickers),
|
597
|
+
'frequency': self.data_req.source_freq,
|
598
|
+
'start_time': self.data_req.source_start_date,
|
599
|
+
'end_time': self.data_req.source_end_date,
|
648
600
|
'pretty': True,
|
649
601
|
'page_size': 10000,
|
650
602
|
}
|
@@ -656,48 +608,6 @@ class CoinMetrics(DataVendor):
|
|
656
608
|
|
657
609
|
return df
|
658
610
|
|
659
|
-
def get_institutions(self, data_req: DataRequest) -> pd.DataFrame:
|
660
|
-
"""
|
661
|
-
Get institutions data.
|
662
|
-
|
663
|
-
Parameters
|
664
|
-
----------
|
665
|
-
data_req: DataRequest
|
666
|
-
Parameters of data request in CryptoDataPy format.
|
667
|
-
|
668
|
-
Returns
|
669
|
-
-------
|
670
|
-
df: pd.DataFrame
|
671
|
-
DataFrame with DatetimeIndex (level 0), tickers (level 1) and institution fields values (cols).
|
672
|
-
"""
|
673
|
-
# convert data request parameters to Coin Metrics format
|
674
|
-
cm_data_req = ConvertParams(data_req).to_coinmetrics()
|
675
|
-
|
676
|
-
# check params
|
677
|
-
self.check_params(data_req, data_type='institutions')
|
678
|
-
|
679
|
-
# check fields
|
680
|
-
fields = self.check_fields(data_req, data_type='institutions')
|
681
|
-
sleep(0.6)
|
682
|
-
|
683
|
-
# params
|
684
|
-
params = {
|
685
|
-
'institutions': cm_data_req["inst"],
|
686
|
-
'metrics': ','.join(fields),
|
687
|
-
'frequency': cm_data_req['freq'],
|
688
|
-
'start_time': cm_data_req["start_date"],
|
689
|
-
'end_time': cm_data_req["end_date"],
|
690
|
-
'pretty': True,
|
691
|
-
'page_size': 10000,
|
692
|
-
}
|
693
|
-
|
694
|
-
# get tidy data
|
695
|
-
df = self.get_tidy_data(data_req,
|
696
|
-
data_type='/timeseries/institution-metrics',
|
697
|
-
params=params)
|
698
|
-
|
699
|
-
return df
|
700
|
-
|
701
611
|
def get_ohlcv(self, data_req: DataRequest) -> pd.DataFrame:
|
702
612
|
"""
|
703
613
|
Get OHLCV (candles) data.
|
@@ -713,21 +623,21 @@ class CoinMetrics(DataVendor):
|
|
713
623
|
DataFrame with DatetimeIndex (level 0), ticker (level 1), and OHLCV values (cols).
|
714
624
|
"""
|
715
625
|
# convert data request parameters to Coin Metrics format
|
716
|
-
|
626
|
+
self.data_req = ConvertParams(data_req).to_coinmetrics()
|
717
627
|
|
718
628
|
# check freq
|
719
629
|
self.check_params(data_req, data_type='market_candles')
|
720
630
|
|
721
631
|
# check tickers
|
722
|
-
|
723
|
-
sleep(
|
632
|
+
self.check_tickers(data_req, data_type='market_candles')
|
633
|
+
sleep(self.data_req.pause)
|
724
634
|
|
725
635
|
# params
|
726
636
|
params = {
|
727
|
-
'markets': ','.join(
|
728
|
-
'frequency':
|
729
|
-
'start_time':
|
730
|
-
'end_time':
|
637
|
+
'markets': ','.join(self.data_req.source_markets),
|
638
|
+
'frequency': self.data_req.source_freq,
|
639
|
+
'start_time': self.data_req.source_start_date,
|
640
|
+
'end_time': self.data_req.source_end_date,
|
731
641
|
'pretty': True,
|
732
642
|
'page_size': 10000,
|
733
643
|
}
|
@@ -754,26 +664,26 @@ class CoinMetrics(DataVendor):
|
|
754
664
|
DataFrame with DatetimeIndex (level 0), ticker (level 1), and on-chain values (cols).
|
755
665
|
"""
|
756
666
|
# convert data request parameters to Coin Metrics format
|
757
|
-
|
667
|
+
self.data_req = ConvertParams(data_req).to_coinmetrics()
|
758
668
|
|
759
669
|
# check params
|
760
670
|
self.check_params(data_req, data_type='asset_metrics')
|
761
671
|
|
762
672
|
# check tickers
|
763
|
-
|
764
|
-
sleep(
|
673
|
+
self.check_tickers(data_req, data_type='asset_metrics')
|
674
|
+
sleep(self.data_req.pause)
|
765
675
|
|
766
676
|
# check fields
|
767
|
-
|
768
|
-
sleep(
|
677
|
+
self.check_fields(data_req, data_type='asset_metrics')
|
678
|
+
sleep(self.data_req.pause)
|
769
679
|
|
770
680
|
# params
|
771
681
|
params = {
|
772
|
-
'assets': ','.join(
|
773
|
-
'metrics': ','.join(
|
774
|
-
'frequency':
|
775
|
-
'start_time':
|
776
|
-
'end_time':
|
682
|
+
'assets': ','.join(self.data_req.source_tickers),
|
683
|
+
'metrics': ','.join(self.data_req.source_fields),
|
684
|
+
'frequency': self.data_req.source_freq,
|
685
|
+
'start_time': self.data_req.source_start_date,
|
686
|
+
'end_time': self.data_req.source_end_date,
|
777
687
|
'pretty': True,
|
778
688
|
'page_size': 10000,
|
779
689
|
'ignore_forbidden_errors': True,
|
@@ -804,20 +714,20 @@ class CoinMetrics(DataVendor):
|
|
804
714
|
DataFrame with DatetimeIndex (level 0), ticker (level 1), and open interest values (cols).
|
805
715
|
"""
|
806
716
|
# convert data request parameters to Coin Metrics format
|
807
|
-
|
717
|
+
self.data_req = ConvertParams(data_req).to_coinmetrics()
|
808
718
|
|
809
719
|
# check params
|
810
720
|
self.check_params(data_req, data_type='open_interest')
|
811
721
|
|
812
722
|
# check tickers
|
813
|
-
|
814
|
-
sleep(
|
723
|
+
self.check_tickers(data_req, data_type='open_interest')
|
724
|
+
sleep(self.data_req.pause)
|
815
725
|
|
816
726
|
# params
|
817
727
|
params = {
|
818
|
-
'markets': ','.join(
|
819
|
-
'start_time':
|
820
|
-
'end_time':
|
728
|
+
'markets': ','.join(self.data_req.source_markets),
|
729
|
+
'start_time': self.data_req.source_start_date,
|
730
|
+
'end_time': self.data_req.source_end_date,
|
821
731
|
'pretty': True,
|
822
732
|
'page_size': 10000,
|
823
733
|
}
|
@@ -845,20 +755,20 @@ class CoinMetrics(DataVendor):
|
|
845
755
|
DataFrame with DatetimeIndex (level 0), ticker (level 1), and funding rates values (cols).
|
846
756
|
"""
|
847
757
|
# convert data request parameters to Coin Metrics format
|
848
|
-
|
758
|
+
self.data_req = ConvertParams(data_req).to_coinmetrics()
|
849
759
|
|
850
760
|
# check params
|
851
761
|
self.check_params(data_req, data_type='funding_rates')
|
852
762
|
|
853
763
|
# check tickers
|
854
|
-
|
855
|
-
sleep(
|
764
|
+
self.check_tickers(data_req, data_type='funding_rates')
|
765
|
+
sleep(self.data_req.pause)
|
856
766
|
|
857
767
|
# params
|
858
768
|
params = {
|
859
|
-
'markets': ','.join(
|
860
|
-
'start_time':
|
861
|
-
'end_time':
|
769
|
+
'markets': ','.join(self.data_req.source_markets),
|
770
|
+
'start_time': self.data_req.source_start_date,
|
771
|
+
'end_time': self.data_req.source_end_date,
|
862
772
|
'pretty': True,
|
863
773
|
'page_size': 10000,
|
864
774
|
}
|
@@ -886,20 +796,20 @@ class CoinMetrics(DataVendor):
|
|
886
796
|
DataFrame with DatetimeIndex (level 0), ticker (level 1), and bid/ask price and size values (cols).
|
887
797
|
"""
|
888
798
|
# convert data request parameters to Coin Metrics format
|
889
|
-
|
799
|
+
self.data_req = ConvertParams(data_req).to_coinmetrics()
|
890
800
|
|
891
801
|
# check params
|
892
802
|
self.check_params(data_req, data_type='trades')
|
893
803
|
|
894
804
|
# check tickers
|
895
|
-
|
896
|
-
sleep(
|
805
|
+
self.check_tickers(data_req, data_type='trades')
|
806
|
+
sleep(self.data_req.pause)
|
897
807
|
|
898
808
|
# params
|
899
809
|
params = {
|
900
|
-
'markets': ','.join(
|
901
|
-
'start_time':
|
902
|
-
'end_time':
|
810
|
+
'markets': ','.join(self.data_req.source_markets),
|
811
|
+
'start_time': self.data_req.source_start_date,
|
812
|
+
'end_time': self.data_req.source_end_date,
|
903
813
|
'pretty': True,
|
904
814
|
'page_size': 10000,
|
905
815
|
}
|
@@ -927,21 +837,21 @@ class CoinMetrics(DataVendor):
|
|
927
837
|
DataFrame with DatetimeIndex (level 0), ticker (level 1), and bid/ask price and size values (cols).
|
928
838
|
"""
|
929
839
|
# convert data request parameters to Coin Metrics format
|
930
|
-
|
840
|
+
self.data_req = ConvertParams(data_req).to_coinmetrics()
|
931
841
|
|
932
842
|
# check params
|
933
843
|
self.check_params(data_req, data_type='quotes')
|
934
844
|
|
935
845
|
# check tickers
|
936
|
-
|
937
|
-
sleep(
|
846
|
+
self.check_tickers(data_req, data_type='quotes')
|
847
|
+
sleep(self.data_req.pause)
|
938
848
|
|
939
849
|
# params
|
940
850
|
params = {
|
941
|
-
'markets': ','.join(
|
942
|
-
'granularity':
|
943
|
-
'start_time':
|
944
|
-
'end_time':
|
851
|
+
'markets': ','.join(self.data_req.source_markets),
|
852
|
+
'granularity': self.data_req.source_freq,
|
853
|
+
'start_time': self.data_req.source_start_date,
|
854
|
+
'end_time': self.data_req.source_end_date,
|
945
855
|
'pretty': True,
|
946
856
|
'page_size': 10000,
|
947
857
|
}
|
@@ -970,16 +880,17 @@ class CoinMetrics(DataVendor):
|
|
970
880
|
fields (cols), in tidy format.
|
971
881
|
"""
|
972
882
|
# convert data request parameters to Coin Metrics format
|
973
|
-
|
883
|
+
self.data_req = ConvertParams(data_req).to_coinmetrics()
|
974
884
|
|
975
885
|
# check if fields available
|
976
886
|
self.get_fields_info(as_list=True)
|
977
|
-
sleep(
|
978
|
-
|
979
|
-
|
980
|
-
|
981
|
-
|
982
|
-
|
887
|
+
sleep(self.data_req.pause)
|
888
|
+
|
889
|
+
if not all([field in self.fields for field in self.data_req.source_fields]):
|
890
|
+
raise ValueError(
|
891
|
+
"Some selected fields are not available. Check available fields with"
|
892
|
+
" get_fields_info method and try again."
|
893
|
+
)
|
983
894
|
|
984
895
|
# field lists
|
985
896
|
ohlcv_list = ['price_open', 'price_close', 'price_high', 'price_low', 'vwap', 'volume',
|
@@ -991,9 +902,9 @@ class CoinMetrics(DataVendor):
|
|
991
902
|
|
992
903
|
# get indexes data
|
993
904
|
self.get_indexes_info(as_list=True)
|
994
|
-
sleep(
|
995
|
-
if any([ticker.upper() in self.indexes for ticker in
|
996
|
-
[field in ohlcv_list for field in
|
905
|
+
sleep(self.data_req.pause)
|
906
|
+
if any([ticker.upper() in self.indexes for ticker in self.data_req.source_tickers]) and any(
|
907
|
+
[field in ohlcv_list for field in self.data_req.source_fields]
|
997
908
|
):
|
998
909
|
df0 = self.get_indexes(data_req)
|
999
910
|
df = pd.concat([df, df0])
|
@@ -1001,15 +912,15 @@ class CoinMetrics(DataVendor):
|
|
1001
912
|
# get OHLCV data
|
1002
913
|
self.get_assets_info(as_list=True)
|
1003
914
|
sleep(0.6)
|
1004
|
-
if any([ticker in self.assets for ticker in
|
1005
|
-
[field in ohlcv_list for field in
|
915
|
+
if any([ticker in self.assets for ticker in self.data_req.source_tickers]) and any(
|
916
|
+
[field in ohlcv_list for field in self.data_req.source_fields]
|
1006
917
|
):
|
1007
918
|
df1 = self.get_ohlcv(data_req)
|
1008
919
|
df = pd.concat([df, df1])
|
1009
920
|
|
1010
921
|
# get on-chain data
|
1011
|
-
if any([ticker in self.assets for ticker in
|
1012
|
-
[field in oc_list for field in
|
922
|
+
if any([ticker in self.assets for ticker in self.data_req.source_tickers]) and any(
|
923
|
+
[field in oc_list for field in self.data_req.source_fields]
|
1013
924
|
):
|
1014
925
|
df2 = self.get_onchain(data_req)
|
1015
926
|
df = pd.concat([df, df2], axis=1)
|