панды вальцованные в сочетании с двумя колоннами - PullRequest
1 голос
/ 16 апреля 2019

Я занимаюсь анализом биржевых данных с использованием ежедневных тиковых данных.скажем, один столбец - closed_price для цены закрытия в день и tick_price для цены tick_price в 14:30.Идея заключается в настройке скользящего окна для использования closed_price между предыдущими днями, но для текущего дня используется tick_price.В скользящем окне окно [-n: -1] будет из closed_price, а последнее elementwindow [0] будет из tick_price.Роллинг может отлично справиться с одной колонной.Но я не могу найти способы объединить данные двух столбцов в один скользящий объект.Как я должен сделать это в течение приемлемого срока?

Я пробовал df.rolling (n) .apply (func), но внутри функции я не смог получить информацию о столбцах.Кажется, что перебирается одна серия над другой, а не строка за строкой.Я читаю исходный код о переходах и np.stride, но чувствую себя перегруженным.Последний способ будет использовать циклы for, но я чувствую, что это будет намного медленнее.

the data can be copied in jupyter and it is like:
pd.DataFrame(np.array([[3535.229 , 3547.2157],
       [3564.038 , 3554.8975],
       [3541.727 , 3549.8678],
       [3471.456 , 3453.7913],
       [3480.13  , 3480.0087]]),columns=['closed_price','tick_price'])

Типичный переход (окно) может хорошо работать на отдельных столбцах.но то, что я должен сделать, это:

   my_rolling(3) return:
      3535.229(close)
      3564.038(close)
      3453.7913(tick)

например, я внедряю мой roll_sum (), как показано ниже:

def rolling_sum(df_w,window,output_column='rolling_3_sum'):
    df=df_w.copy()
    w=window
    df[output_column]=0
    index_output_column = df.columns.get_loc(output_column)
    for i in range(w-1,df.shape[0]):
        window=df.iloc[i-w+1:i+1]['closed_price'].values # get closed price window
        window[-1]=df.iloc[i]['tick_price'] # replace the latest value with tick price
        df.iat[i, index_output_column] =np.sum(window) # sum the values in window
    return df[output_column]

, он работает прямо сейчас, но таким образом я имеюпереписать почти все функции, такие как Rolling (). Sum, Rolling (). STD ().и это немного медленно.То, что я хочу реализовать Rolling_Func (), которые возвращают модифицированный объект катания .Если он может удовлетворить мои потребности выше, я могу вызвать его следующим образом:

 rolling_func(n).sum() 
 rolling_func(n).std() 

без переписывания.

Редактировать: после прочтения аналогичного решения.Я попробовал функцию ниже:

def roll(df, w, **kwargs):
# np.dstack([df.values[i:i+w, :] for i in range(len(df.index) - w + 1)]).T
#roll_array=np.dstack([np.array(np.append(df.values[i:i+w-1,0],df.values[i+w-1:i+w,1])) for i in range(len(df.index) - w + 1)]).T
    roll_array=np.array([[np.append(df.values[i:i+w-1,0],df.values[i+w-1:i+w,1])] for i in range(len(df.index) - w + 1)])
    panel = pd.Panel(roll_array, 
                     items=df.index[w-1:],
                     major_axis=[df.columns[0]],
                     minor_axis=pd.Index(range(w), name='roll'))
    df_window=panel.to_frame().unstack().T.groupby(level=0, **kwargs)
    return df_window

На данный момент это работает, как с системной функцией, так и с индивидуальной функцией.Но вот некоторые проблемы: 1. В возвращаемом результате отсутствуют данные о размере окна, что отличается от поведения скручивания панд.Требуется вставить нулевые данные для заполнения отсутствующего индекса.2. кажется, что панель обесценилась.3. Скорость бега не сильно отличается от написанного мной forloops.

Я попытаюсь покопаться в коде src pandas roll и исправить это.

...