Некорректный вывод динамики изменений pct_change() при отрицательном предыдущем показателе

Имеется фрейм данных с финансовыми показателями по периодам, где я хочу подсчитать изменения в % к предыдущему периоду:

id  year  profit   assets
qwe  2018  -1373   19577
qwe  2019  1328    23361
dfe  2018  22836   16789
dfe  2019  22290   15335
dfg  2018  -1212    1732
dfg  2019  3089     2323 

Для расчета динамики использую следующий код:

res = (df[["id","year"]]
                .join(df
                      .groupby(["id"], as_index=False)
                      [["profit","assets"]]
                      .pct_change().fillna(0)*100))

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

Выввод с некорректными знаками, если предыдущее значение отрицательное:

 id  year  profit   assets
    qwe  2018  0          0
    qwe  2019  -197      19
    dfe  2018  0         0
    dfe  2019  -2       -9
    dfg  2018  0        0
    dfg  2019  -355     34 

А вот как должно выглядеть на самом деле:

 id  year  profit   assets
    qwe  2018  0          0
    qwe  2019  197      19
    dfe  2018  0         0
    dfe  2019  -2       -9
    dfg  2018  0        0
    dfg  2019  355     34 

Ответы (2 шт):

Автор решения: MaxU

Решение:

res["profit"] *= np.sign(df["profit"]).shift().fillna(1).to_numpy()

Результат:

In [30]: res
Out[30]:
    id  year      profit     assets
0  qwe  2018    0.000000   0.000000
1  qwe  2019  196.722505  19.328804
2  dfe  2018    0.000000   0.000000
3  dfe  2019   -2.390962  -8.660432
4  dfg  2018    0.000000   0.000000
5  dfg  2019  354.867987  34.122402
→ Ссылка
Автор решения: Pavel

На самом деле есть вот такое решение, вроде рабочее:

res = (df[["id","year"]]
                .join(df
                      .groupby(["id"], as_index=False)
                      [["profit","assets"]]
                .apply(lambda x: x.diff()/x.shift().abs()*100)))
→ Ссылка