首页 > 解决方案 > 如何检测和过滤时间序列数据的峰值?

问题描述

我有一个用户登录的熊猫数据框,如下所示:

    id     datetime_login 
    646  2017-03-15 15:30:25
    611  2017-04-14 11:38:30
    611  2017-05-15 08:49:01
    651  2017-03-15 15:30:25
    611  2017-03-15 15:30:25
    652  2017-03-08 14:03:56
    652  2017-03-08 14:03:56
    652  2017-03-15 15:30:25
    654  2017-03-15 15:30:25
    649  2017-03-15 15:30:25
    902  2017-09-09 15:00:00
    902  2017-02-13 16:39:53
    902  2017-11-15 12:00:00
    902  2017-11-15 12:00:00
    902  2017-09-09 15:00:00
    902  2017-05-15 08:48:47
    902  2017-11-15 12:00:00

绘制登录后:

df.datetime_login = df.datetime_login.apply(lambda x: str(x)[:10])
df.datetime_login = df.datetime_login.apply(lambda x: date(int(x[:4]), int(x[5:7]), int(x[8:10])))


fig, ax = subplots()
df.datetime_login.value_counts().sort_index().plot(figsize=(25,10), colormap='jet',fontsize=20)
  1. 如何在我的图中检测时间序列数据中的峰值?

  2. 如何将时间序列数据中的峰值过滤到数组中?

我试过了:

import peakutils
indices = peakutils.indexes(df, thres=0.4, min_dist=1000)
print(indices) 

但是,我得到了:

TypeError: unsupported operand type(s) for -: 'datetime.date' and 'int'

但是,我得到了:

标签: pythonpython-3.xpandastime-series

解决方案


在哪里 df.datetime_login.value_counts().sort_index().plot(figsize=(25,10), colormap='jet',fontsize=20)绘制:

在此处输入图像描述

让我们尝试以下操作,您需要使用返回的系列value_counts而不是原始 df, peakutils.indexes

df_counts = df.datetime_login.value_counts().sort_index()
df_counts[peakutils.indexes(df_counts, thres=0.4, min_dist=1000)]

输出:

2017-03-15 15:30:25    6
Name: datetime_login, dtype: int64

推荐阅读