Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.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 计算一个ID在随后180天内出现的次数_Python_Python 3.x_Pandas_Datetime_Time Series - Fatal编程技术网

Python 计算一个ID在随后180天内出现的次数

Python 计算一个ID在随后180天内出现的次数,python,python-3.x,pandas,datetime,time-series,Python,Python 3.x,Pandas,Datetime,Time Series,我有一个包含以下列的数据框: REF_ID REPORT_DATE_RAW 12345 2019-02-21 20:53:00 我想查看每个特定的REF\u ID,以及它是否在REPORT\u DATE\u RAW之后的180天内被多次报告如果在随后的180天内没有出现,则视为假阳性。如果是,我想返回1,如果否,则返回0 我将需要对每个参考ID执行此操作。我尝试使用groupby和滚动求和来执行此操作,并参考了此处的另一个类似问题。以下是我目前的情况: df['REP

我有一个包含以下列的数据框:

REF_ID       REPORT_DATE_RAW
12345      2019-02-21 20:53:00  
我想查看每个特定的
REF\u ID
,以及它是否在
REPORT\u DATE\u RAW
之后的180天内被多次报告如果在随后的180天内没有出现,则视为假阳性。如果是,我想返回1,如果否,则返回0

我将需要对每个参考ID执行此操作。我尝试使用groupby和滚动求和来执行此操作,并参考了此处的另一个类似问题。以下是我目前的情况:

df['REPORT_DATE_RAW'] = pd.to_datetime(df['REPORT_DATE_RAW'])

delta=180
df = df.set_index('REPORT_DATE_RAW').assign(count=1).groupby('REF_ID').rolling(f'{delta}D').sum() - 1
这将返回:

REF_ID   REPORT_DATE_RAW      count
8637    2019-10-25 16:39:00    0.0
8637    2019-10-31 10:38:00    1.0
我不确定我能不能用这些结果做一个分析。。。。我不知道为什么第一个事件的计数为0,而另一个事件的计数为1。这两个REF_ID在180天内,所以我只想将这个REF_ID计算为1,这样我就可以计算出有多少REF_ID被认为是误报的

提前谢谢。此项目对时间非常敏感,因此我感谢您的帮助

使用:

(df.set\u index('REPORT\u DATE\u RAW')。groupby('REF\u ID'))
.apply(lambda x:(x[::-1]。滚动('180d')。计数()>1)[::-1]。astype(int))
)
其中
[::-1]
表示法采用向前
滚动的方法



注意:Pandas作为转发函数的一种,但它似乎不适用于datetime窗口。

谢谢。这会将每个列的值更改为0或1,但我可以解决这个问题。。。只是出于好奇,你知道一种更快的方法吗?我的数据集有超过40万行,因此.apply()需要很长时间。这只是一个粗略的想法,不需要全部编码如果数据集中有其他列,并且要避免它们成为
count
方法的输出,只需在
groupby
之后指定一列即可。这应该可以解决你的问题。不过,关于你的第二个问题,我不知道如何绕过
应用
,因为你想要向前计数,不是吗?只有当你知道你所有的日子都是连续的(也就是说,没有间隔),我才能在工作中思考(在这种情况下,我们可以安全地使用
shift
)。但无论如何,请注意,
apply
这里是对每个唯一的REF\u ID应用滚动方法,而不是对每行应用滚动方法!