Pandas прокат данных, пользовательское вычисление, df.ilo c ValueError - PullRequest
0 голосов
/ 01 марта 2020

Как использовать RangeIndex, предоставляемый pandas .DataFrame.rolling в custom_function?

Текущая реализация выдает ValueError.

Сначала x.index = RangeIndex (start = 0 , stop = 2, step = 1), а tmp_df правильно выбирает первую и вторую строки в df (индексы 0 и 1). Для последнего x.index = RangeIndex (start = 6, stop = 8, step = 1) кажется, что ilo c пытается выбрать индекс 8 в df, который находится вне диапазона (df имеет индекс от 0 до 7).

По сути, я хочу иметь пользовательскую функцию для подсчета последовательных чисел в окне. Учитывая положительные значения 1,0,1,1,1,0 в окне, пользовательская функция должна возвращать 3, поскольку существует максимум 3 последовательных 1 с.

import numpy as np
import pandas as pd

df = pd.DataFrame({'open': [7, 5, 10, 11,6,13,17,12],
                   'close': [6, 6, 11, 10,7,15,18,10],
                   'positive': [0, 1, 1, 0,1,1,1,0]},
                 )

def custom_function(x,df):
    print("index:",x.index)
    tmp_df = df.iloc[x.index] # raises "ValueError: cannot set using a slice indexer with a different length than the value" when x.index = RangeIndex(start=6, stop=8, step=1) as df index goes from 0 to 7 only

    # do calulations on any column in tmp_df, get result
    result = 1 #dummyresult

    return result

intervals = range(2, 10)
for i in intervals:
    df['result_' + str(i)] = np.nan
    res = df.rolling(i).apply(custom_function, args=(df,), raw=False)
    df['result_' + str(i)][1:] = res

print(df)
...