与熊猫一起查找时间序列中的重复事件



我有一个事件的时间序列,我想统计时间序列中每种类型的事件以前的非连续发生次数。我想和熊猫一起做这件事。我可以在项目中进行迭代,但我想知道是否有一种巧妙的方法可以在没有循环的情况下进行。

为了更清楚。考虑以下时间序列:

dates = pd.date_range('1/1/2011', periods=4, freq='H')
data = ['a', 'a', 'b', 'a']
df = pd.DataFrame(data,index=dates,columns=["event"])
                    event
2011-01-01 00:00:00   a
2011-01-01 01:00:00   a
2011-01-01 02:00:00   b
2011-01-01 03:00:00   a

我想添加一个新的列,告诉对于"事件"列中的每个元素,该元素以前出现过多少次不连续。也就是说,类似这样的东西:

                    event #prev-occurr
2011-01-01 00:00:00   a        0
2011-01-01 01:00:00   a        0
2011-01-01 02:00:00   b        0
2011-01-01 03:00:00   a        1

我们还没有很好的groupby对连续组的支持,但我们可以使用移位-比较累积模式,然后使用密集秩来获得您需要的,IIUC:

>>> egroup = (df["event"] != df["event"].shift()).cumsum()
>>> df["prev_occur"] = egroup.groupby(df["event"]).rank(method="dense") - 1
>>> df
                    event  prev_occur
2011-01-01 00:00:00     a           0
2011-01-01 01:00:00     a           0
2011-01-01 02:00:00     b           0
2011-01-01 03:00:00     a           1
2011-01-01 04:00:00     a           1
2011-01-01 05:00:00     b           1
2011-01-01 06:00:00     a           2

这是因为我们得到了一个连续的事件组计数:

>>> egroup
2011-01-01 00:00:00    1
2011-01-01 01:00:00    1
2011-01-01 02:00:00    2
2011-01-01 03:00:00    3
2011-01-01 04:00:00    3
2011-01-01 05:00:00    4
2011-01-01 06:00:00    5
Freq: H, Name: event, dtype: int64

然后我们可以根据事件类型对其进行分组,从而得到非排名版本:

>>> for k,g in egroup.groupby(df["event"]):
...     print(g)
...     
2011-01-01 00:00:00    1
2011-01-01 01:00:00    1
2011-01-01 03:00:00    3
2011-01-01 04:00:00    3
2011-01-01 06:00:00    5
Name: event, dtype: int64
2011-01-01 02:00:00    2
2011-01-01 05:00:00    4
Name: event, dtype: int64

我们最终可以对其进行密集排序。

最新更新