Проблемы с пониманием логики при создании кода с использованием groupby, списков и пользовательских функций - PullRequest
0 голосов
/ 21 января 2019

Я хочу рассчитать скользящее среднее для разных размеров окна для каждого тикера в моем фрейме данных. В идеале я мог бы передать список размеров окна и для каждого тикера я бы получил новые столбцы (по одному для каждого скользящего среднего размера). Поэтому, если бы я хотел получить скользящее среднее 2 и одно из 3, на каждом тикере было бы два столбца.

import datetime as dt
import numpy as np
import pandas as pd
Dt_df = pd.DataFrame({"Date":pd.date_range('2018-07-01', periods=5, freq='D')})
Tick_df = pd.DataFrame({"Ticker":['ABC',"HIJ","XYZ"]})
Mult_df = pd.merge(Tick_df.assign(key='x'), Dt_df.assign(key='x') on='key').drop('key', 1)
df2 = pd.DataFrame(np.random.randint(low=5, high=10, size=(15, 1)),  columns=['Price'])
df3 = Mult_df.join(df2, how='outer')
df3.set_index(['Ticker','Date'],inplace = True)

Вот пример набора данных:

enter image description here

Когда я пытаюсь применить эту функцию:

def my_RollMeans(x):
    w = [1,2,3]
    s = pd.Series(x)
    Bob = pd.DataFrame([s.rolling(w1).mean() for w1 in w]).T
    return Bob

к моему фрейму данных df3 с использованием различных версий применения или преобразования я получаю ошибки.

NewDF = df3.groupby('Ticker').Price.transform(my_RollMeans).fillna(0)

Последняя ошибка:

Данные должны быть одномерными

1 Ответ

0 голосов
/ 22 января 2019

IIUC попробуйте использовать apply, и я изменил вашу пользовательскую функцию:

def my_RollMeans(x):
    w = [1,2,3]
    s = pd.Series(x)
    Bob = pd.DataFrame([s.rolling(w1).mean().rename('Price_'+str(w1)) for w1 in w]).T
    return Bob

df3.groupby('Ticker').apply(lambda x : my_RollMeans(x.Price)).fillna(0)

Выход:

                   Price_1  Price_2   Price_3
Ticker Date                                  
ABC    2018-07-01      9.0      0.0  0.000000
       2018-07-02      8.0      8.5  0.000000
       2018-07-03      7.0      7.5  8.000000
       2018-07-04      8.0      7.5  7.666667
       2018-07-05      8.0      8.0  7.666667
HIJ    2018-07-01      8.0      0.0  0.000000
       2018-07-02      9.0      8.5  0.000000
       2018-07-03      5.0      7.0  7.333333
       2018-07-04      6.0      5.5  6.666667
       2018-07-05      7.0      6.5  6.000000
XYZ    2018-07-01      9.0      0.0  0.000000
       2018-07-02      5.0      7.0  0.000000
       2018-07-03      9.0      7.0  7.666667
       2018-07-04      8.0      8.5  7.333333
       2018-07-05      6.0      7.0  7.666667
...