Я пытаюсь выполнить некоторые вычисления на фреймах данных.Я хочу вычислить среднюю разницу между двумя наборами скользящего среднего.Чтобы быть более точным, среднее значение разницы между долгосрочным средним (lst
) и меньшим (lst_2
).Я пытаюсь объединить вычисление с двойным циклом for следующим образом:
import pandas as pd
import numpy as pd
def main(df):
df=df.pct_change()
lst=[100,150,200,250,300]
lst_2=[5,10,15,20]
result=pd.DataFrame(np.sum([calc(df,T,t) for T in lst for t in lst_2]))/(len(lst)+len(lst_2))
return result
def calc(df,T,t):
roll=pd.DataFrame(np.sign(df.rolling(t).mean()-df.rolling(T).mean()))
return roll
В целом у меня должно быть 20 различий (5 и 100, 10 и 100, 15 и 100 ... 20 и 300);Я беру знак различия и хочу получить среднее значение этих различий в каждый момент времени.В идеале результатом должен быть фрейм данных result
.
. Я получил ошибку: cannot copy sequence with size 3951 to array axis with dimension 1056
, когда он запускает двойной цикл for.Очевидно, я понимаю, что из-за циклического изменения различных значений T и t размеры кадров данных не равны, когда дело доходит до преобразования массива (с np.sum
), но я подумал, что для выравнивания измерений будет добавлено значение «NaN».Надеюсь, я был достаточно ясен.Спасибо.
Как и просили в комментариях, вот пример.Давайте предположим, что следующий фрейм данных:
df = pd.DataFrame({'A': [100,101.4636,104.9477,106.7089,109.2701,111.522,113.3832,113.8672,115.0718,114.6945,111.7446,108.8154]},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])
df=df.pct_change()
и у меня есть следующие 2 набора средних значений, которые мне нужно вычислить:
lst=[8,10]
lst_1=[3,4]
Затем я выполняю следующие шаги:
1 / Я хочу вычислить скользящее среднее (3) - скользящее среднее (8) и получить его знак:
roll=np.sign(df.rolling(3).mean()-df.rolling(8).mean())
Это должно вернуть следующее:
roll = pd.DataFrame({'A': ['NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN',-1,-1,-1,-1},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])
2 / Я повторяю шаг 1 с комбинацией различий 3-10;4-8;4-10.Таким образом, я получаю в общей сложности 4 кадра данных.
roll_3_8 = pd.DataFrame({'A': ['NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN',-1,-1,-1,-1},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])
roll_3_10 = pd.DataFrame({'A': ['NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN',-1,-1},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])
roll_4_8 = pd.DataFrame({'A': ['NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN',-1,-1,-1,-1},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])
roll_4_10 = pd.DataFrame({'A': ['NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN',-1,-1},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])
3 / Теперь, когда у меня есть все различия, я просто хочу получить их среднее значение, поэтому я суммирую все 4 скользящих кадра данных и делю их на 4(количество различий вычислено).Результаты должны быть (перед сбросом всех значений N / A):
result = pd.DataFrame({'A': ['NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN','NaN',-1,-1},index=[0, 1, 2, 3,4,5,6,7,8,9,10,11])