Python 从时间序列中提取模式
我有以下数据集,一个熊猫数据帧:Python 从时间序列中提取模式,python,python-3.x,pandas,numpy,Python,Python 3.x,Pandas,Numpy,我有以下数据集,一个熊猫数据帧: Score min max Date Loc 0 2.757 0.000 2.757 2020-07-04 11:00:00 3 2.723 2.723 0.000 2020-07-04 14:00:00 8 2.724 2.724 0.000 2020-07-04 19:00:00 11 2.752 0.000 2.752 2020-07-04 22:00:00 13 2
Score min max Date
Loc
0 2.757 0.000 2.757 2020-07-04 11:00:00
3 2.723 2.723 0.000 2020-07-04 14:00:00
8 2.724 2.724 0.000 2020-07-04 19:00:00
11 2.752 0.000 2.752 2020-07-04 22:00:00
13 2.742 2.742 0.000 2020-07-05 00:00:00
15 2.781 0.000 2.781 2020-07-05 02:00:00
18 2.758 2.758 0.000 2020-07-05 05:00:00
20 2.865 0.000 2.865 2020-07-05 07:00:00
24 2.832 0.000 2.832 2020-07-05 11:00:00
25 2.779 2.779 0.000 2020-07-05 12:00:00
29 2.775 2.775 0.000 2020-07-05 16:00:00
34 2.954 0.000 2.954 2020-07-05 21:00:00
37 2.886 2.886 0.000 2020-07-06 00:00:00
48 3.101 0.000 3.101 2020-07-06 11:00:00
53 3.012 3.012 0.000 2020-07-06 16:00:00
55 3.068 0.000 3.068 2020-07-06 18:00:00
61 2.970 2.970 0.000 2020-07-07 00:00:00
64 3.058 0.000 3.058 2020-07-07 03:00:00
其中:
分数是一个非常基本的趋势,最小值和最大值是分数的局部最小值和最大值
Loc是该行x轴上的值,日期是图表上该行的日期
绘制时,该数据如下所示:
我试图从我的代码中检测红色框中的数据,以便在其他数据集中检测它。基本上,我正在寻找的是一种从我的代码中设置该数据段定义的方法,以便可以从其他数据中检测到它
到目前为止,我只在图表上标记了局部最大值和最小值黄点和红点,我还知道如何用自己的话定义该模式,我只需要从代码中执行:
定义最小值/最大值点非常远的时间,使其与上一个最小值/最大值点具有更高的值
然后,找出局部极小值和极大值的点是否非常接近,它们的值是否相差不大。简言之,当一个强劲的增长,如果紧随其后的是一个范围内的分数没有上升或下降很多
我希望问题足够清楚,如果需要,我可以提供更多细节。我不知道它是否适用于Numpy或任何其他库。我认为动态时间扭曲dtw可能适合您。我也用过类似的东西。本质上,它允许您评估时间序列的相似性 以下是我所知道的python实现: fastdtw dtw dtw python 这里有一个很好的解释它是如何工作的 您可以使用它来比较传入的时间序列与红色框中的数据的相似程度 例如:
# Event were looking for
event = np.array([10, 100, 50, 60, 50, 70])
# A matching event occurring
event2 = np.array([0, 7, 12, 4, 11, 100, 51, 62, 53, 72])
# A non matching event
non_event = np.array([0, 5, 10, 5, 10, 20, 30, 20, 11, 9])
distance, path = fastdtw(event, event2)
distance2, path2 = fastdtw(event, non_event)
这将产生一组指数,其中两个时间序列最匹配。此时,您可以通过您喜欢的方法进行评估。我粗略地看了一下这些值之间的相关性
def event_corr(event,event2, path):
d = []
for p in path:
d.append((event2[p[1]] * event[p[0]])/event[p[0]]**2)
return np.mean(d)
print("Our event re-occuring is {:0.2f} correlated with our search event.".format(event_corr(event, event2, path)))
print("Our non-event is {:0.2f} correlated with our search event.".format(event_corr(event, non_event, path2)))
产生:
我们的事件重复发生与我们的搜索事件相关度为0.85
我们的非事件与搜索事件的相关性为0.45。使用相关或互相关函数听起来很简单。numpy和scipy中都有实现。尝试一下,如果您有具体问题,请随时更新。谢谢您的回答!关于这件事你有什么例子吗?我刚刚开始,你应该提供一个最小的工作示例。我给了你一个开始四处看看的提示,这样你就可以开始了。希望您可以在numpy或scipy文档中找到一些示例进行尝试。如果您有具体的实现问题或错误,那么您可以打开另一个问题,或者更新此问题。我发现了互相关等的含义,但我不确定这是否是我在这个阶段需要的。基本上,从我的理解来看,交叉关联意味着在数据集中找到一种模式。在本例中,我有一个我想要搜索的模式,但我不知道如何用代码定义该模式,这是主要问题,只需使用数据集中的数据即可。然后尝试将其与其他数据集相匹配。试试看。如果你遇到了一个特定的问题,那么请多多询问你的答案。这很有趣!我唯一的问题是我需要以某种方式规范化这些数据,原因如下:模式可能与我在问题上附加的模式完全相同,但值不同。因此,在这种情况下,模式中的值范围为2到3;但是,如果图案的形状相同,但值从13到15,例如,会发生什么情况?根据其他数据不是事件时的情况,可以通过将数据集除以在某个时间段内的变化(例如,应用dtw之前的data/max-min)来进行规范化。事实上,通过变量进行规范化可能是一个很好的解决方案,尽管在某些情况下可能仍然有点不准确,所以我想看看是否有更准确的方法。让我对DTM进行一些研究,看看它是否能与我的案例一起工作。顺便问一下,你用过树桩吗?对我来说,这听起来像是一个很酷的工作;我认为这在很大程度上取决于我如何规范我的数据,但这可能是一种可行的方法。我将用DTW测试它,看看我得到了什么,如果我有任何问题,我将提出另一个问题。非常感谢你!还有一件事:假设有一个模式A,例如红色框中的模式。然后我有另一个数据集。我想在数据集B中找到模式A,因为数据集B很大,所以模式A只能在数据集的某些部分找到,所以我只需要从数据集B中提取找到模式A的区域;可能吗?