Я хочу добавить 9 столбцов в мой Pandas DataFrame, состоящий из следующей информации:
- Сумма транзакций в этот день / неделю / месяц (AmtDay / AmtWeek / AmtMonth)
- Количество транзакций в этот день / неделя / месяц (CountDay / CountWeek / CountMonth)
- Средняя сумма транзакций в этот день / неделя / месяц (AvgAmtDay / AvgAmtWeek / AvgAmtMonth)
Чтобы сделать это, я написал следующий код:
df["AmtDay"] = df.groupby(["ClientId", "Year","Day"])["Amount"].transform(sum)
df["CountDay"] = df.groupby(["ClientId", "Year", "Day"])["Amount"].transform(len)
df["AvgAmtDay"] = df.groupby(["ClientId", "Year", "Day"])["Amount"].transform(lambda x: sum(x) / len(x))
df["AmtWeek"] = df.groupby(["ClientId", "Year", "Week"])["Amount"].transform(sum)
df["CountWeek"] = df.groupby(["ClientId", "Year", "Week"])["Amount"].transform(len)
df["AvgAmtWeek"] = df.groupby(["ClientId", "Year", "Day"])["Amount"].transform(lambda x: sum(x) / len(x))
df["AmtMonth"] = df.groupby(["ClientId", "Year", "Month"])["Amount"].transform(sum)
df["CountMonth"] = df.groupby(["ClientId", "Year", "Month"])["Amount"].transform(len)
df["AvgAmtMonth"] = df.groupby(["ClientId", "Year", "Day"])["Amount"].transform(lambda x: sum(x) / len(x))
За исключением того, что это требует слишком больших вычислительных затрат, чтобы очень быстро выполнять (в основном) одну и ту же группировку каждый раз. Есть ли способ сделать это более эффективно?
Мои данные структурированы следующим образом, где каждая строка представляет одну транзакцию с clientId, дата (день представляет день год), и сумма:
+----------+------+-------+------+-----+--------+
| ClientId | Year | Month | Week | Day | Amount |
+----------+------+-------+------+-----+--------+
| 1 | 2020 | 1 | 1 | 1 | 10 |
| 1 | 2020 | 1 | 1 | 2 | 20 |
| 1 | 2020 | 1 | 1 | 2 | 10 |
| 2 | 2020 | 1 | 1 | 1 | 5 |
| 2 | 2020 | 1 | 1 | 1 | 10 |
| 2 | 2020 | 1 | 1 | 2 | 30 |
+----------+------+-------+------+-----+--------+
В то время как я хотел бы, чтобы выходные данные были следующими (показаны только 3-дневные столбцы для лучшей читаемости):
+----------+------+-------+------+-----+--------+--------+----------+-----------+-----------------+
| ClientId | Year | Month | Week | Day | Amount | AmtDay | CountDay | AvgAmtDay | AmtWeek... Etc. |
+----------+------+-------+------+-----+--------+--------+----------+-----------+-----------------+
| 1 | 2020 | 1 | 1 | 1 | 10 | 10 | 1 | 10 | |
| 1 | 2020 | 1 | 1 | 2 | 20 | 30 | 2 | 15 | |
| 1 | 2020 | 1 | 1 | 2 | 10 | 30 | 2 | 15 | |
| 2 | 2020 | 1 | 1 | 1 | 5 | 15 | 2 | 7.5 | |
| 2 | 2020 | 1 | 1 | 1 | 10 | 15 | 2 | 7.5 | |
| 2 | 2020 | 1 | 1 | 2 | 30 | 30 | 1 | 30 | |
+----------+------+-------+------+-----+--------+--------+----------+-----------+-----------------+