#python #pandas #dataframe #statsmodels #cryptocurrency
#python #pandas #фрейм данных #statsmodels #криптовалюта
Вопрос:
Я использую sanpy для сбора данных о рынке криптовалют, вычисления alpha, beta и rsquared с помощью statsmodels, а затем создаю функцию crypto = input («Cryptocurrency: «) с циклом while, который позволяет мне запрашивать у пользователя конкретную криптографию и выводить соответствующую статистику, а затем снова показывать ввод.
С помощью следующего кода я получаю ошибку: ValueError: при использовании всех скалярных значений необходимо передать индекс
import san
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import datetime
import statsmodels.api as sm
from statsmodels import regression
cryptos = ["bitcoin", "ethereum", "ripple", "bitcoin-cash", "tether",
"bitcoin-sv", "litecoin", "binance-coin", "eos", "chainlink",
"monero", "bitcoin-gold"]
def get_and_process_data(c):
raw_data = san.get("daily_closing_price_usd/" c, from_date="2014-12-31", to_date="2019-12-31", interval="1d") # "query/slug"
return raw_data.pct_change()[1:]
df = pd.DataFrame({c: get_and_process_data(c) for c in cryptos})
df['MKT Return'] = df.mean(axis=1) # avg market return
#print(df) # show dataframe with all data
def model(x, y):
# Calculate r-squared
X = sm.add_constant(x) # artificially add intercept to x, as advised in the docs
model = sm.OLS(y,X).fit()
rsquared = model.rsquared
# Fit linear regression and calculate alpha and beta
X = sm.add_constant(x)
model = regression.linear_model.OLS(y,X).fit()
alpha = model.params[0]
beta = model.params[1]
return rsquared, alpha, beta
results = pd.DataFrame({c: model(df[df[c].notnull()]['MKT Return'], df[df[c].notnull()][c]) for c in cryptos}).transpose()
results.columns = ['rsquared', 'alpha', 'beta']
print(results)
Ошибка находится в следующей строке:
df = pd.DataFrame({c: get_and_process_data(c) for c in cryptos})
Я попытался решить проблему, изменив ее на:
df = {c: get_and_process_data(c) for c in cryptos}
df['MKT Return'] = df.mean(axis=1) # avg market return
print(df) # show dataframe with all data
Но при этом он выдал мне другую ошибку: AttributeError: объект ‘dict’ не имеет атрибута ‘mean’.
Цель состоит в том, чтобы создать единый фрейм данных со столбцом datatime, столбцами для криптосистем и их данными pct.change, дополнительным столбцом для возврата MKT со средним значением за день из pct.change всех криптосистем. Затем используйте все эти данные для вычисления статистики каждой криптовалюты и, наконец, создайте функцию ввода, упомянутую в начале.
Я надеюсь, что я ясно выразился и что кто-то может мне помочь в этом вопросе.
Ответ №1:
Это отличное начало, но я думаю, что вы путаетесь с возвратом из san. Если вы посмотрите на
import san
import pandas as pd
# List of data we are interested in
cryptos = ["bitcoin", "ethereum", "ripple", "bitcoin-cash", "tether",
"bitcoin-sv", "litecoin", "binance-coin", "eos", "chainlink",
"monero", "bitcoin-gold"]
# function to get the data from san into a dataframe and turn in into
# a daily percentage change
def get_and_process_data(c):
raw_data = san.get("daily_closing_price_usd/" c, from_date="2014-12-31", to_date="2019-12-31", interval="1d") # "query/slug"
return raw_data.pct_change()[1:]
# now set up an empty dataframe to get all the data put into
df = pd.DataFrame()
# cycle through your list
for c in cryptos:
# get the data as percentage changes
dftemp = get_and_process_data(c)
# then add it to the output dataframe df
df[c] = dftemp['value']
# have a look at what you have
print(df)
И с этого момента вы знаете, что у вас есть хорошие данные, и вы можете играть с ними по мере продвижения вперед.
Если бы я мог предложить вам просто получить одну валюту и заставить регрессии работать с ней, а затем перейти к циклическому просмотру всех из них.
Ответ №2:
Вы передаете скалярные значения, вам нужно передавать списки, поэтому попробуйте следующее:
data = {c: [get_and_process_data(c)] for c in cryptos}
df = pd.DataFrame(data)
Может быть, сначала попробуйте это
Комментарии:
1. При этом, когда я печатаю (df) , я получаю следующий результат: «биткойн … биткойн-золото 0 значение даты и времени … … значение даты и времени… [1 строка x 12 столбцов] `