У меня есть фрейм данных - pastebin для запуска кода минимума
df_dict = {
'A': [1, 2, 3, 4, 5],
'B': [5, 2, 3, 1, 5],
'out': np.nan
}
df = pd.DataFrame(df_dict)
В настоящее время я выполняю некоторые построчные вычисления, выполняя следующие действия:
def transform(row):
length = 2
weight = 5
row_num = int(row.name)
out = row['A'] / length
if (row_num >= length):
previous_out = df.at[ row_num-1, 'out' ]
out = (row['B'] - previous_out) * weight + previous_out
df.at[row_num, 'out'] = out
df.apply( lambda x: transform(x), axis=1)
Это приводит к правильному результату:
A B out
0 1 5 0.5
1 2 2 1.0
2 3 3 11.0
3 4 1 -39.0
4 5 5 181.0
Разбивка для правильного расчета выглядит следующим образом:
A B out
0 1 5 0.5
out = a / b
1 2 2 1.0
out = a / b
row_num >= length:
2 3 3 11.0
out = (b - previous_out) * weight + previous_out
out = (3 - 1) * 5 + 1 = 11
3 4 1 -39.0
out = (1 - 11) * 5 + 11 = 39
4 5 5 181.0
out = (5 - (-39)) * 5 + (-39) = 181
Выполнение этого по многим столбцам и циклы выполняются медленно, поэтому я хотел быоптимизировать, используя преимущества некоторой векторизации, если это возможно.
Моя текущая попытка выглядит следующим образом:
df['out'] = df['A'] / length
df[length:]['out'] = (df[length:]['B'] - df[length:]['out'].shift() ) * weight + df[length:]['out'].shift()
Это не работает, и я не совсем уверен, куда идти дальше.
Вставьте приведенный выше код, чтобы просто скопировать / вставить в файл и запустить