Панды отслеживают ежемесячное изменение цены на основе другого столбца - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть DataFrame, который выглядит следующим образом:

part   price      date
1      67.32      2018-12-01 00:00:00.000
3      99.16      2018-12-01 00:00:00.000
1      67.32      2018-11-01 00:00:00.000
3      167.34     2018-11-01 00:00:00.000
1      67.32      2018-10-01 00:00:00.000
3      167.34     2018-10-01 00:00:00.000
1      88.37      2018-09-01 00:00:00.000
3      212.70     2018-09-01 00:00:00.000
1      88.37      2018-08-01 00:00:00.000
3      264.02     2018-08-01 00:00:00.000
1      88.37      2018-07-01 00:00:00.000
3      264.02     2018-07-01 00:00:00.000

Я хочу создать новый столбец, назовите его price_change, который отслеживает, как цена меняется от месяца к месяцу за часть.Таким образом, вышеприведенное выглядит так:

part   price      date                         price_change
1      67.32      2018-12-01 00:00:00.000      0.0
3      99.16      2018-12-01 00:00:00.000      -68.18
1      67.32      2018-11-01 00:00:00.000      0.0
3      167.34     2018-11-01 00:00:00.000      0.0
1      67.32      2018-10-01 00:00:00.000      -21.05
3      167.34     2018-10-01 00:00:00.000      -45.36
1      88.37      2018-09-01 00:00:00.000      0.0
3      212.70     2018-09-01 00:00:00.000      -51.32
1      88.37      2018-08-01 00:00:00.000      0.0
3      264.02     2018-08-01 00:00:00.000      0.0
1      88.37      2018-07-01 00:00:00.000      0.0
3      264.02     2018-07-01 00:00:00.000      0.0

В случае достижения самой старой даты price_change должно быть просто 0.

Я попытался отсортировать и использовать pd.DataFrame.diff выглядит следующим образом:

df.sort_values(by=['part', 'date'])
df['price_change'] = df['price'].diff()

Вместе с филлной это почти работает.Проблема в том, что это не перезапускает вычисления diff каждый раз, когда достигается новая часть.

1 Ответ

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

Просто sort_values и groupby, затем найдите разницу:

df['diff'] = df.sort_values('date').groupby('part')['price'].diff().fillna(0)

    part   price       date   diff
0      1   67.32 2018-12-01   0.00
1      3   99.16 2018-12-01 -68.18
2      1   67.32 2018-11-01   0.00
3      3  167.34 2018-11-01   0.00
4      1   67.32 2018-10-01 -21.05
5      3  167.34 2018-10-01 -45.36
6      1   88.37 2018-09-01   0.00
7      3  212.70 2018-09-01 -51.32
8      1   88.37 2018-08-01   0.00
9      3  264.02 2018-08-01   0.00
10     1   88.37 2018-07-01   0.00
11     3  264.02 2018-07-01   0.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...