Files
drift/utils/glassnode/utils.py
T
2022-01-03 13:57:36 +01:00

73 lines
2.1 KiB
Python

import requests
import calendar
import pandas as pd
from datetime import datetime
def unix_timestamp(date_str):
"""
Returns a unix timestamp to a given date string.
:param date_str: Date in string format (ex. '2021-01-01').
:return: Int Unix-timestamp.
"""
dt_obj = datetime.strptime(date_str, "%Y-%m-%d")
return calendar.timegm(dt_obj.utctimetuple())
def is_supported_by_endpoint(glassnode_client, url):
path = glassnode_client.endpoints.query(url)
if glassnode_client.asset not in path['assets']:
print(f'{url} metric is not available for {glassnode_client.asset}')
return False
if glassnode_client.resolution not in path['resolutions']:
print(f'{url} metric is not available for {glassnode_client.resolution}')
return False
return True
def response_to_dataframe(response):
"""
Returns DataFrame from a response objects (ex. {"t":1604361600,"v":0.002}).
:param response: Response from API.
:return: DataFrame.
"""
try:
df = pd.DataFrame(response)
df.set_index('t', inplace=True)
df.index = pd.to_datetime(df.index, unit='s')
df.index.name = None
df.sort_index(ascending=False, inplace=True)
return df
except Exception as e:
print(e)
def dataframe_with_inner_object(func):
def wrapper(*args, **kwargs):
df = func(*args, **kwargs)
return pd.concat([df.drop(['o'], axis=1), df['o'].apply(pd.Series)], axis=1)
return wrapper
def fetch(endpoint, params=None):
"""
Returns an object of time, value pairs for a metric from the Glassnode API.
:param params:
:param endpoint: Endpoint url corresponding to some metric (ex. '/v1/metrics/market/price_usd')
:return: DataFrame of {'t' : datetime, 'v' : 'metric-value'} pairs
"""
r = requests.get(f'https://api.glassnode.com{endpoint}', params=params, stream=True)
try:
r.raise_for_status()
except requests.exceptions.HTTPError as e:
print(e.response.text)
try:
return r.json()
except Exception as e:
print(e)