Подвижные средства в кадре данных Pandas - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь выполнить некоторые вычисления на фреймах данных.Я хочу вычислить среднюю разницу между двумя наборами скользящего среднего.Чтобы быть более точным, среднее значение разницы между долгосрочным средним (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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...