Создать таблицу, в которой хранится остаток бонусов на счету каждого клиента на начало каждого месяца
Необходимо Создать таблицу, в которой хранится остаток бонусов на счету каждого клиента на начало каждого месяца . Исходный файл .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