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.
Files changed (62) hide show
  1. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/PKG-INFO +1 -1
  2. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/pyproject.toml +1 -1
  3. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/coinmetrics_api.py +109 -198
  4. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/datarequest.py +0 -23
  5. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/getdata.py +2 -0
  6. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/convertparams.py +96 -121
  7. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/impute.py +10 -4
  8. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/od.py +30 -30
  9. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/wrangle.py +15 -7
  10. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/LICENSE +0 -0
  11. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/README.md +0 -0
  12. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/__init__.py +0 -0
  13. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/conf/__init__.py +0 -0
  14. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/conf/fields.csv +0 -0
  15. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/conf/tickers.csv +0 -0
  16. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/__init__.py +0 -0
  17. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/br_econ_calendar.csv +0 -0
  18. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/ca_econ_calendar.csv +0 -0
  19. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/cn_econ_calendar.csv +0 -0
  20. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/de_econ_calendar.csv +0 -0
  21. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/ez_econ_calendar.csv +0 -0
  22. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/fr_econ_calendar.csv +0 -0
  23. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/gb_econ_calendar.csv +0 -0
  24. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/get_econ_calendars.py +0 -0
  25. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/id_econ_calendar.csv +0 -0
  26. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/in_econ_calendar.csv +0 -0
  27. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/it_econ_calendar.csv +0 -0
  28. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/jp_econ_calendar.csv +0 -0
  29. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/kr_econ_calendar.csv +0 -0
  30. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/mx_econ_calendar.csv +0 -0
  31. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/ru_econ_calendar.csv +0 -0
  32. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/tr_econ_calendar.csv +0 -0
  33. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/datasets/us_econ_calendar.csv +0 -0
  34. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/__init__.py +0 -0
  35. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/.ipynb_checkpoints/CCXT-checkpoint.ipynb +0 -0
  36. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/.ipynb_checkpoints/DBNomics-checkpoint.ipynb +0 -0
  37. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/.ipynb_checkpoints/InvestPy-checkpoint.ipynb +0 -0
  38. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/.ipynb_checkpoints/NasdaqDataLink-checkpoint.ipynb +0 -0
  39. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/.ipynb_checkpoints/PandasDataReader-checkpoint.ipynb +0 -0
  40. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/__init__.py +0 -0
  41. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/cryptocompare_api.py +0 -0
  42. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/datavendor.py +0 -0
  43. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/glassnode_api.py +0 -0
  44. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/data_vendors/tiingo_api.py +0 -0
  45. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/exchanges/__init__.py +0 -0
  46. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/exchanges/dydx.py +0 -0
  47. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/exchanges/exchange.py +0 -0
  48. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/libraries/__init__.py +0 -0
  49. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/libraries/ccxt_api.py +0 -0
  50. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/libraries/dbnomics_api.py +0 -0
  51. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/libraries/investpy_api.py +0 -0
  52. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/libraries/library.py +0 -0
  53. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/libraries/pandasdr_api.py +0 -0
  54. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/web/__init__.py +0 -0
  55. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/web/aqr.py +0 -0
  56. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/extract/web/web.py +0 -0
  57. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/__init__.py +0 -0
  58. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/clean.py +0 -0
  59. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/transform/filter.py +0 -0
  60. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/util/__init__.py +0 -0
  61. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/util/datacatalog.py +0 -0
  62. {cryptodatapy-0.2.13 → cryptodatapy-0.2.15}/src/cryptodatapy/util/datacredentials.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: cryptodatapy
3
- Version: 0.2.13
3
+ Version: 0.2.15
4
4
  Summary: Cryptoasset data library
5
5
  License: Apache-2.0
6
6
  Author: Systamental
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "cryptodatapy"
3
- version = "0.2.13"
3
+ version = "0.2.15"
4
4
  description = "Cryptoasset data library"
5
5
  authors = ["Systamental"]
6
6
  license = "Apache License 2.0"
@@ -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
- DataVendor.__init__(
75
- self,
76
- categories,
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) + inst_fields
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
- cm_data_req = ConvertParams(data_req).to_coinmetrics()
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 fields:
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 = DataRequest().get_req(url=url, params=params)
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(0.6)
343
+ sleep(data_req.pause)
378
344
 
379
345
  # request next page
380
- next_page_data_resp = DataRequest(pause=0.6).get_req(url=next_page_url, params=None)
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) -> List[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
- cm_data_req = ConvertParams(data_req).to_coinmetrics()
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
- tickers = [ticker for ticker in cm_data_req["tickers"] if ticker.upper() in self.indexes]
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
- tickers = [ticker for asset, ticker in zip(cm_data_req["tickers"], cm_data_req["mkts"]) if
476
- asset in self.assets]
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
- tickers = [ticker for ticker in cm_data_req["tickers"] if ticker in self.assets]
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(tickers) == 0:
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 tickers
458
+ return self.data_req
492
459
 
493
- def check_fields(self, data_req: DataRequest, data_type: str) -> List[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
- cm_data_req = ConvertParams(data_req).to_coinmetrics()
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
- elif data_type == 'asset_metrics':
481
+ if data_type == 'asset_metrics':
523
482
  self.get_fields_info(data_type='on-chain', as_list=True)
524
483
  # avail fields
525
- fields = [field for field in cm_data_req["fields"] if field in self.fields]
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(fields) == 0:
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 fields
494
+ return self.data_req
535
495
 
536
- @staticmethod
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
- cm_data_req = ConvertParams(data_req).to_coinmetrics()
510
+ self.data_req = ConvertParams(data_req).to_coinmetrics()
552
511
 
553
512
  # indexes
554
513
  if data_type == 'indexes':
555
- if cm_data_req["freq"] not in ["1h", "1d"]:
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 cm_data_req["freq"] not in ["1m", "1h", "1d"]:
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 cm_data_req["freq"] not in ["1b", "1d"]:
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 cm_data_req["freq"] != "raw":
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 cm_data_req["freq"] not in ["raw", "1s", "1m", "1h", "1d"]:
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
- cm_data_req = ConvertParams(data_req).to_coinmetrics()
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
- tickers = self.check_tickers(data_req, data_type='indexes')
640
- sleep(0.6)
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(tickers),
645
- 'frequency': cm_data_req['freq'],
646
- 'start_time': cm_data_req["start_date"],
647
- 'end_time': cm_data_req["end_date"],
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
- cm_data_req = ConvertParams(data_req).to_coinmetrics()
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
- tickers = self.check_tickers(data_req, data_type='market_candles')
723
- sleep(0.6)
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(tickers),
728
- 'frequency': cm_data_req['freq'],
729
- 'start_time': cm_data_req["start_date"],
730
- 'end_time': cm_data_req["end_date"],
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
- cm_data_req = ConvertParams(data_req).to_coinmetrics()
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
- tickers = self.check_tickers(data_req, data_type='asset_metrics')
764
- sleep(0.6)
673
+ self.check_tickers(data_req, data_type='asset_metrics')
674
+ sleep(self.data_req.pause)
765
675
 
766
676
  # check fields
767
- fields = self.check_fields(data_req, data_type='asset_metrics')
768
- sleep(0.6)
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(tickers),
773
- 'metrics': ','.join(fields),
774
- 'frequency': cm_data_req['freq'],
775
- 'start_time': cm_data_req["start_date"],
776
- 'end_time': cm_data_req["end_date"],
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
- cm_data_req = ConvertParams(data_req).to_coinmetrics()
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
- tickers = self.check_tickers(data_req, data_type='open_interest')
814
- sleep(0.6)
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(tickers),
819
- 'start_time': cm_data_req["start_date"],
820
- 'end_time': cm_data_req["end_date"],
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
- cm_data_req = ConvertParams(data_req).to_coinmetrics()
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
- tickers = self.check_tickers(data_req, data_type='funding_rates')
855
- sleep(0.6)
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(tickers),
860
- 'start_time': cm_data_req["start_date"],
861
- 'end_time': cm_data_req["end_date"],
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
- cm_data_req = ConvertParams(data_req).to_coinmetrics()
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
- tickers = self.check_tickers(data_req, data_type='trades')
896
- sleep(0.6)
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(tickers),
901
- 'start_time': cm_data_req["start_date"],
902
- 'end_time': cm_data_req["end_date"],
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
- cm_data_req = ConvertParams(data_req).to_coinmetrics()
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
- tickers = self.check_tickers(data_req, data_type='quotes')
937
- sleep(0.6)
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(tickers),
942
- 'granularity': cm_data_req['freq'],
943
- 'start_time': cm_data_req["start_date"],
944
- 'end_time': cm_data_req["end_date"],
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
- cm_data_req = ConvertParams(data_req).to_coinmetrics()
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(0.6)
978
- # if not all([field in self.fields for field in cm_data_req["fields"]]):
979
- # raise ValueError(
980
- # "Some selected fields are not available. Check available fields with"
981
- # " get_fields_info method and try again."
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(0.6)
995
- if any([ticker.upper() in self.indexes for ticker in cm_data_req["tickers"]]) and any(
996
- [field in ohlcv_list for field in cm_data_req["fields"]]
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 cm_data_req["tickers"]]) and any(
1005
- [field in ohlcv_list for field in cm_data_req["fields"]]
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 cm_data_req["tickers"]]) and any(
1012
- [field in oc_list for field in cm_data_req["fields"]]
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)