Векторизация / оптимизация расчета скользящих панд на ряд - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть фрейм данных:

df_dict = {
    'sum': np.nan,
    'src1': [5, 1, 1, 5, 1],
    'src2': [2, 6, 2, 4, 1]
}
df = pd.DataFrame(df_dict)

В настоящее время я обновляю столбец 'sum', выполняя:

def transform(x):
    row_num = int(x.name)

    previous_sum = 0
    if row_num > 0:
        previous_sum = df.at[row_num-1,'sum']

    src1 = df.at[row_num,'src1']
    src2 = df.at[row_num,'src2']

    df.at[row_num,'sum'] = previous_sum - src2 + src1

df.apply( lambda x: transform(x), axis=1)

, что приводит к правильному выводу:

   sum  src1  src2
0  3.0     5     2
1 -2.0     1     6
2 -3.0     1     2
3 -2.0     5     4
4 -2.0     1     1

Проблема в большом кадре данных со многими строками, и повторять его во многих столбцах очень медленно.

Я хотел бы оптимизировать его, чтобы каким-то образом использовать некоторые встроенные панды / numpy векторизацию, если это возможноили любое более оптимизированное решение.

Мой пример лучшего решения

df['sum'] = df['sum'].shift() - df['src1'] + df['src2']

Что приводит к неверному выводу

   sum  src1  src2
0  NaN     5     2
1  NaN     1     6
2  NaN     1     2
3  NaN     5     4
4  NaN     1     1

Ответы [ 2 ]

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

df['sum'] = df['src1'].cumsum() - df['src2'].cumsum().

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

Кажется, вы выполняете накопительную сумму.

Этого можно достичь с помощью функции cumsum ()

df['sum'] = df['src'].cumsum()

, в результате

sum     src
0   1   1
1   3   2
2   6   3
3   10  4
4   15  5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...