Создать таблицу, в которой хранится остаток бонусов на счету каждого клиента на начало каждого месяца

Необходимо Создать таблицу, в которой хранится остаток бонусов на счету каждого клиента на начало каждого месяца . Исходный файл .csv(19000 строк) без нулевых остатков


+---------------------+------------+--------------------------------------+----------+
|       period        | recordkind |              customerid              |  points  |
+---------------------+------------+--------------------------------------+----------+
| 2010-03-31 00:00:00 |          0 | 0540fe8a-c06e-42f4-8015-dd874f7ec443 | 8511.757 |
| 2010-04-14 00:00:00 |          0 | 5750e29a-e783-460a-8031-30149f8e302b |  329.994 |
| 2010-05-15 00:00:00 |          1 | 5a24042b-fff7-4a36-8025-03e2d1e14ef2 |   449.96 |
| 2010-06-25 00:00:00 |          0 | 741912b5-583b-4785-8040-82345d8610cb |  115.213 |
| 2010-07-02 11:47:08 |          1 | 0540fe8a-c06e-42f4-8015-dd874f7ec443 |     64.0 |
+---------------------+------------+--------------------------------------+----------+

Period – дата и время операции
Recordkind – тип операции: 0 – приход бонусов на счет, 1 – списание
Customerid – идентификатор клиента
Points – количество бонусов

Буду рад помощи любой.

Пример

+---------------------+------------+--------------------------------------+--------+
|       period        | recordkind |              customerid              | points |
+---------------------+------------+--------------------------------------+--------+
| 2010-04-03 11:06:25 |          0 | ce57503e-c1c0-476d-803e-385464dfd487 |    3.0 |
| 2010-04-03 12:34:30 |          0 | 5750e29a-e783-460a-8031-30149f8e302b |    1.0 |
| 2010-04-06 11:06:15 |          0 | 0540fe8a-c06e-42f4-8015-dd874f7ec443 |   16.0 |
| 2010-04-06 11:34:50 |          0 | 0540fe8a-c06e-42f4-8015-dd874f7ec443 |   32.0 |
| 2010-05-04 14:27:52 |          0 | 0540fe8a-c06e-42f4-8015-dd874f7ec443 |    3.0 |
| 2010-05-04 16:36:58 |          1 | 0540fe8a-c06e-42f4-8015-dd874f7ec443 |   7.02 |
| 2010-05-04 19:30:43 |          0 | 741912b5-583b-4785-8040-82345d8610cb |  1.235 |
| 2010-05-05 09:46:14 |          0 | 5750e29a-e783-460a-8031-30149f8e302b | 29.368 |
+---------------------+------------+--------------------------------------+--------+
+---------------------+--------------------------------------+-----------+
|       period        |              customerid              | sumpoints |
+---------------------+--------------------------------------+-----------+
| 2010-05-01 00:00:00 | ce57503e-c1c0-476d-803e-385464dfd487 |         3 |
| 2010-05-01 00:00:00 | 5750e29a-e783-460a-8031-30149f8e302b |         1 |
| 2010-05-01 00:00:00 | 0540fe8a-c06e-42f4-8015-dd874f7ec443 |        48 |
| 2010-06-01 00:00:00 | 0540fe8a-c06e-42f4-8015-dd874f7ec443 |        44 |
| 2010-06-01 00:00:00 | 741912b5-583b-4785-8040-82345d8610cb |         1 |
| 2010-06-01 00:00:00 | 5750e29a-e783-460a-8031-30149f8e302b |        30 |
+---------------------+--------------------------------------+-----------+

Трудность в реализации сортировки по месяцам и по id клиента.


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

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

Попробуйте так:

import pandas as pd

df = pd.read_csv(filename, parse_dates=["period"])

res = (df
       .assign(x=np.where(df["recordkind"]==1, -1 * df["points"], df["points"]))
       .groupby([pd.Grouper(key="period", freq="MS"), "customerid"])
       ["x"]
       .sum()
       .reset_index(name="points"))

In [50]: res
Out[50]:
      period                            customerid  points
0 2010-04-01  0540fe8a-c06e-42f4-8015-dd874f7ec443  48.000
1 2010-04-01  5750e29a-e783-460a-8031-30149f8e302b   1.000
2 2010-04-01  ce57503e-c1c0-476d-803e-385464dfd487   3.000
3 2010-05-01  0540fe8a-c06e-42f4-8015-dd874f7ec443  -4.020
4 2010-05-01  5750e29a-e783-460a-8031-30149f8e302b  29.368
5 2010-05-01  741912b5-583b-4785-8040-82345d8610cb   1.235
→ Ссылка