Проблема с Cryptocompare API и Pandas DataFrame.
Я создал скрипт для получения исторических данных для нескольких криптовалют.
Я пытался использовать функцию normalize_data, но постоянно получаю сообщение об ошибке:
операнды не могут передаваться вместе с фигурами (1188,) (6,)
Я читал об этой проблеме, однако я использовал ту же самую функцию с другим dataFrame(этот: рабочий пример), поэтому я действительно не понимаю проблему.
Q1: в чем здесь проблема?
Q2: Видите ли вы более разумный способ обработки API?
Я действительно ценю всю помощь.
Код:
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from datetime import datetime
import json
from bs4 import BeautifulSoup
import requests
from tqdm import tqdm
def timestamp2date(timestamp):
# function converts a Uniloc timestamp into Gregorian date
return datetime.fromtimestamp(int(timestamp)).strftime('%Y-%m-%d')
def date2timestamp(date):
# function coverts Gregorian date in a given format to timestamp
return datetime.strptime(date, '%Y-%m-%d').timestamp()
def fetchCryptoOHLC(fsym, tsym):
# function fetches a crypto price-series for fsym/tsym and stores
# it in pandas DataFrame
cols = ['date', 'timestamp', 'open', 'high', 'low', 'close']
lst = ['time', 'open', 'high', 'low', 'close']
timestamp_today = datetime.today().timestamp()
curr_timestamp = timestamp_today
for j in range(2):
df = pd.DataFrame(columns=cols)
# (limit-1) * 2 = days
# One year is around 184
limit = 100
url = "https://min-api.cryptocompare.com/data/histoday?fsym=" + fsym + "&tsym=" + tsym + "&toTs=" + str(int(curr_timestamp)) + "&limit=" + str(limit)
response = requests.get(url)
soup = BeautifulSoup(response.content, "html.parser")
dic = json.loads(soup.prettify())
for i in range(1, limit):
tmp = []
for e in enumerate(lst):
x = e[0]
y = dic['Data'][i][e[1]]
if(x == 0):
tmp.append(str(timestamp2date(y)))
tmp.append(y)
if(np.sum(tmp[-4::]) > 0):
df.loc[len(df)] = np.array(tmp)
df.index = pd.to_datetime(df.date)
df.drop('date', axis=1, inplace=True)
curr_timestamp = int(df.iloc[0][0])
if(j == 0):
df0 = df.copy()
else:
data = pd.concat([df, df0], axis=0)
return data
def normalize_data(df):
return df / df.loc[df.index[0]]
def get_multiple_cryptos(symbols):
# Intializing an empty DataFrame
data = pd.DataFrame()
# Adding columns with data for all requested cryptocurrencies
for symbol in tqdm(symbols):
fsym = symbol
tsym = "BTC"
data_symbol = fetchCryptoOHLC(fsym, tsym)
data = pd.concat([data, data_symbol['close']], axis = 1)
# Assinging correct names to the columns
data.columns = symbols
return data
if __name__ == '__main__':
symbols = ['ETH', 'LTC', 'ETC', 'DOGE', 'DGB', 'SC']
data = get_multiple_cryptos(symbols)
data = normalize_data(data)