Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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:如何在数据中查找事件发生?_Python_Dataframe - Fatal编程技术网

Python:如何在数据中查找事件发生?

Python:如何在数据中查找事件发生?,python,dataframe,Python,Dataframe,是否有一种简单有效的方法来查找数据系列中的特定事件?对于事件,我指的是数据中的特定条件,如尖峰、超过/低于阈值或数据系列超过等 我基本上有两个目标: 1将一个事件周围的数据与下一个/上一个事件周围的数据进行比较,以分析它们的比较方式以及调整对事件的影响。 2.将数据中所有事件的关键数据复制到新的数据框中进行统计分析 在我看来,我希望按顺序循环事件,并获得事件的索引值,以便处理它周围的数据 显然,我可以选择循环浏览所有数据,但我怀疑它们应该是一种更有效的方法。关于如何最好地解决这个问题,有什么建议

是否有一种简单有效的方法来查找数据系列中的特定事件?对于事件,我指的是数据中的特定条件,如尖峰、超过/低于阈值或数据系列超过等

我基本上有两个目标: 1将一个事件周围的数据与下一个/上一个事件周围的数据进行比较,以分析它们的比较方式以及调整对事件的影响。 2.将数据中所有事件的关键数据复制到新的数据框中进行统计分析

在我看来,我希望按顺序循环事件,并获得事件的索引值,以便处理它周围的数据


显然,我可以选择循环浏览所有数据,但我怀疑它们应该是一种更有效的方法。关于如何最好地解决这个问题,有什么建议吗

我会做如下事情:

# Lets use numpy (you can do the same with pandas or any other algebra package
import numpy as np

# Just generate some data for the example
data = np.array([1,2,3,3,2,1]) 

# Lets say we are looking for a period that data is greater than 2.
# First, we indicate all those points
indicators = (data > 2).astype(int) # now we have [0 0 1 1 0 0]

# We differentiate that so we will have non-zero wherever data > 2.
# Note that we concatenate 0 at the beginning.
indicators_diff = np.concatenate([[0],indicators[1:] - indicators[:-1]])

# Now lets seek for those indices
diff_locations = np.where(indicators_diff != 0)[0]

# We are resulting in all places that the derivative is non-zero.
# Those are indices of start and end of events:
# [event1_start, event1_end, event2_start, ....]
# So we choose by filtering odd/even places of the resulted vector
events_starts_list = diff_locations[::2].tolist()
events_ends_list = diff_locations[1::2].tolist()

# And now we can also gather the events data by iterating the events.
event_data_list = []

for event_start, event_end in zip(events_starts_list, events_ends_list):
     event_data_list.append(data[event_start:event_end])
由于此代码使用C编写的numpy后端来运行大多数循环,因此运行速度非常快。我一直在用它来快速解决问题

祝你好运

编辑:为了清晰起见,添加了一些注释。
注意:您可能还希望处理特殊情况,例如如果最终事件位于数据末尾。在diff_locations变量中可能有奇数个元素。如果是奇数,只需确定一个索引,例如最后一个,并将其添加到此列表中,然后再分离到事件\u开始\u列表和事件\u结束\u列表。

如何在不至少一次查看所有数据值的情况下分析数据?有一个下限,其中n是数据的大小。是的,我必须访问每个数据点至少一次,但这可以以不同的效率完成。就像对整个数组的计算不是通过循环来计算每个元素一样,我希望/期望有一种更有效的方法来查找事件。内联注释会很受欢迎。您选择的方法与我想象中的有点不同。我只是在考虑活动的开始点。作为一个初学者,在理解代码之前我花了一点时间,但它为我做了这项工作。谢谢