mirror of
https://github.com/webclinic017/drift.git
synced 2026-07-28 11:17:47 +00:00
73 lines
2.1 KiB
Python
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)
|