Проблема с 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)

0 ответов

Другие вопросы по тегам