Оптимизация панд применяется, оглядываясь назад на вычисление середины предыдущего ряда - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть фрейм данных - 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()

Это не работает, и я не совсем уверен, куда идти дальше.

Вставьте приведенный выше код, чтобы просто скопировать / вставить в файл и запустить

1 Ответ

0 голосов
/ 06 февраля 2019

Вы не сможете добиться большего успеха, чем это:

df['out'] = df.A / length
for i in range(len(df)):
    if i >= length:
        df.loc[i, 'out'] = (df.loc[i, 'B'] - 
                df.loc[i - 1, 'out']) * weight + df.loc[i - 1, 'out']

Причина в том, что «итеративный характер вычислений, когда входные данные зависят от результатов предыдущих шагов, усложняет векторизацию» (каккомментатор здесь ставит его).Вы не можете выполнить вычисление, в котором каждый результат зависит от предыдущих в матрице - за кулисами всегда будет какой-то цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...