Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandas-计算下一个/未来x天的数值频率_Python_Pandas_Datetime_Rolling Computation - Fatal编程技术网

Python Pandas-计算下一个/未来x天的数值频率

Python Pandas-计算下一个/未来x天的数值频率,python,pandas,datetime,rolling-computation,Python,Pandas,Datetime,Rolling Computation,这是我在这里提出的问题的后续: 我不想在过去的x天里得到一个计数,我想让计数看看ID,然后计算在接下来的x天里它显示了多少次。例如,从给定的日期时间开始,ID A在接下来的7天内出现了多少次?所以这就像一个反向滚动计数 import pandas as pd df = pd.DataFrame( [['A', '2020-02-02 20:31:00'], ['A', '2020-02-03 00:52:00'], ['A', '2020-

这是我在这里提出的问题的后续:

我不想在过去的x天里得到一个计数,我想让计数看看ID,然后计算在接下来的x天里它显示了多少次。例如,从给定的日期时间开始,ID A在接下来的7天内出现了多少次?所以这就像一个反向滚动计数

import pandas as pd




df = pd.DataFrame(
        [['A', '2020-02-02 20:31:00'],
        ['A', '2020-02-03 00:52:00'],
        ['A', '2020-02-07 23:45:00'],
        ['A', '2020-02-08 13:19:00'],
        ['A', '2020-02-18 13:16:00'],
        ['A', '2020-02-27 12:16:00'],
        ['A', '2020-02-28 12:16:00'],
        ['B', '2020-02-07 18:57:00'],
        ['B', '2020-02-07 21:50:00'],
        ['B', '2020-02-12 19:03:00'],
        ['C', '2020-02-01 13:50:00'],
        ['C', '2020-02-11 15:50:00'],
        ['C', '2020-02-21 10:50:00']],
        columns = ['ID', 'Date'])

df['Date'] = pd.to_datetime(df['Date'])
期望输出:

   ID                Date  count_in_next_7_days
0   A 2020-02-02 20:31:00                     3
1   A 2020-02-03 00:52:00                     2
2   A 2020-02-07 23:45:00                     1
3   A 2020-02-08 13:19:00                     0
4   A 2020-02-18 13:16:00                     0
5   A 2020-02-27 12:16:00                     1
6   A 2020-02-28 12:16:00                     0
7   B 2020-02-07 18:57:00                     2
8   B 2020-02-07 21:50:00                     1
9   B 2020-02-12 19:03:00                     0
10  C 2020-02-01 13:50:00                     0
11  C 2020-02-11 15:50:00                     0
12  C 2020-02-21 10:50:00                     0
以下是如何获取前7天窗口的计数。我也试过同样的代码,但在日期上按降序排序后,我认为只要切换顺序就行了,但事实并非如此。所以我被困在如何让滚动窗口向前看x天,而不是向后看x天

delta = 7
df = df[['ID','Date']]
df = (df.set_index('Date')
   .assign(count_last=1)
   .groupby('ID')
   .rolling(f'{delta}D')
   .sum() - 1).reset_index(drop=False)

下面是一个使用groupby和apply的方法。我有一种感觉,使用groupby和transform可能有更好的方法,但我从未使用过transform,现在仍在努力解决这个问题

def f(thing):
    cutoff = thing.loc['Date'] + seven
    mask = group.loc[thing.name:,'Date'] <= cutoff
    return mask.sum() - 1

df = df.assign(count_in_next_7_days=0)
seven = pd.Timedelta('7 days')
grouped = df.groupby('ID')
for name,group in grouped:
    n = group.apply(f,axis=1)
    df.loc[df['ID'] == name,['count_in_next_7_days']] = n

对于
counts=comparison.sum(1)-1-np.arange(x.shape[0])
来说,减号表示不计算本身,减号
.arange()
表示不计算过去的日期

有点吹毛求疵:问题中的标准是
在接下来的7天内出现
,预期结果列名称是
在过去的7天内计数
啊,好捕获。我会改变的,这很好。比我今天尝试的要好得多。我将尝试得到日期的倒数,然后应用我以前使用过的方法,然后将它们合并到一起,得到原始的日期时间。
df = df.assign(count_in_next_7_days=0)
ids = df.ID.unique()
for idee in ids:
    mask = df['ID'] == idee
    x = df.loc[mask,'Date'].values
    y = x + seven
    comparison = y[:,None] >= x
    counts = comparison.sum(1) - 1 - np.arange(x.shape[0])
    df.loc[mask,'count_in_next_7_days'] = counts