gpt4 book ai didi

python - 根据 Pandas 中的日期窗口计算值的累积出现次数

转载 作者:行者123 更新时间:2023-11-28 22:21:44 24 4
gpt4 key购买 nike

我有一个如下所示的 DataFrame (df):

+----------+----+
| dd_mm_yy | id |
+----------+----+
| 01-03-17 | A |
| 01-03-17 | B |
| 01-03-17 | C |
| 01-05-17 | B |
| 01-05-17 | D |
| 01-07-17 | A |
| 01-07-17 | D |
| 01-08-17 | C |
| 01-09-17 | B |
| 01-09-17 | B |
+----------+----+

这是我想计算的最终结果:

+----------+----+-----------+
| dd_mm_yy | id | cum_count |
+----------+----+-----------+
| 01-03-17 | A | 1 |
| 01-03-17 | B | 1 |
| 01-03-17 | C | 1 |
| 01-05-17 | B | 2 |
| 01-05-17 | D | 1 |
| 01-07-17 | A | 2 |
| 01-07-17 | D | 2 |
| 01-08-17 | C | 1 |
| 01-09-17 | B | 2 |
| 01-09-17 | B | 3 |
+----------+----+-----------+

逻辑

计算 id 中值在指定时间窗口内的累计出现次数,例如 4 个月。即每 5 个月计数器重置为 1。

要获得累积出现次数,我们可以使用此 df.groupby('id').cumcount() + 1

关注 id = B,我们看到 B 的第二次出现是在 2 个月之后,所以 cum_count = 2B 的下一次出现在 01-09-17,回头看 4 个月我们只发现了一次,所以 cum_count = 2,等等.

最佳答案

我的方法是从 df.groupby('id').transform 调用辅助函数。我觉得这比它可能的更复杂和更慢,但它似乎有效。

# test data

date id cum_count_desired
2017-03-01 A 1
2017-03-01 B 1
2017-03-01 C 1
2017-05-01 B 2
2017-05-01 D 1
2017-07-01 A 2
2017-07-01 D 2
2017-08-01 C 1
2017-09-01 B 2
2017-09-01 B 3

# preprocessing

df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
# Encode the ID strings to numbers to have a column
# to work with after grouping by ID
df['id_code'] = pd.factorize(df['id'])[0]

# solution

def cumcounter(x):
y = [x.loc[d - pd.DateOffset(months=4):d].count() for d in x.index]
gr = x.groupby('date')
adjust = gr.rank(method='first') - gr.size()
y += adjust
return y

df['cum_count'] = df.groupby('id')['id_code'].transform(cumcounter)

# output

df[['id', 'id_num', 'cum_count_desired', 'cum_count']]

id id_num cum_count_desired cum_count
date
2017-03-01 A 0 1 1
2017-03-01 B 1 1 1
2017-03-01 C 2 1 1
2017-05-01 B 1 2 2
2017-05-01 D 3 1 1
2017-07-01 A 0 2 2
2017-07-01 D 3 2 2
2017-08-01 C 2 1 1
2017-09-01 B 1 2 2
2017-09-01 B 1 3 3

需要调整

如果相同的 ID 在同一天多次出现,我使用的切片方法将多计算每个同一天的 ID,因为基于日期的切片在列表理解时立即获取所有同一天的值遇到多个ID出现的日期。修复:

  1. 按日期对当前 DataFrame 进行分组。
  2. 对每个日期组中的每一行进行排序。
  3. 从这些排名中减去每个日期组中的总行数。这会产生一个以日期为索引的递增负整数系列,以 0 结尾。
  4. 将这些非正整数调整添加到 y

这只会影响给定测试数据中的一行——倒数第二行,因为 B 在同一天出现两次。

包括或排除时间间隔的左端点

要对 4 个日历月前一样旧或更新的行进行计数,即包括 4 个月时间间隔的左端点,保持此行不变:

y = [x.loc[d - pd.DateOffset(months=4):d].count() for d in x.index]

要对 4 个日历月前严格更新的行进行计数,即排除 4 个月时间间隔的左端点,请改为使用:

y = [d.loc[d - pd.DateOffset(months=4, days=-1):d].count() for d in x.index]

关于python - 根据 Pandas 中的日期窗口计算值的累积出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48098128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com