Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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_Time Series_Data Science - Fatal编程技术网

Python 检测时间序列的快速增长

Python 检测时间序列的快速增长,python,time-series,data-science,Python,Time Series,Data Science,我有一个时间序列,我想检测值何时快速增加,并精确指出(可能是颜色)增加的时间范围。例如,在下面的图中,我想精确指出x轴上特定时间窗口的峰值(例如2018-05-22) 我能够找到20%的最大值,但这对我没有帮助。我想把重点放在快速增长上 d = pd.Series(df['TS'].values[1:] - df['TS].values[:-1], index=df['TS'].index[:-1]).abs() threshold = 0.8 m = d.max() print(d >

我有一个时间序列,我想检测值何时快速增加,并精确指出(可能是颜色)增加的时间范围。例如,在下面的图中,我想精确指出x轴上特定时间窗口的峰值(例如2018-05-22)

我能够找到20%的最大值,但这对我没有帮助。我想把重点放在快速增长上

d = pd.Series(df['TS'].values[1:] - df['TS].values[:-1], index=df['TS'].index[:-1]).abs()
threshold = 0.8
m = d.max()
print(d > m * threshold)
例如,“破裂”在视觉上也有类似的表现。下面是一个示例,其中随机数据沿着它生成的图:

import matplotlib.pyplot as plt
import ruptures as rpt

# generate signal
n_samples, dim, sigma = 1000, 3, 4
n_bkps = 4  # number of breakpoints
#signal, bkps = rpt.pw_constant(n_samples, dim, n_bkps, noise_std=sigma)


# detection
algo = rpt.Pelt(model="rbf").fit(signal)
result = algo.predict(pen=10)

# display
rpt.display(signal, bkps, result)
plt.show()

您可以尝试对序列进行差分,以获得序列在每个步骤中的更改量。这是时间序列分析中的标准方法。这是对这个想法背后的理论的一次很好的讨论

实际上,
pandas
为我们提供了一种通过
.diff()
方法区分序列的简单方法

df = pd.DataFrame({'a': [10, 20, 30, 40, 50, 60],
                   'b': [1, 1000, 20000, 3, 50, 80],
                   'c': [1000, 4, 97, 16, 2500, 36]})
df.diff()

      a        b       c
0   NaN      NaN     NaN
1  10.0    999.0  -996.0
2  10.0  19000.0    93.0
3  10.0 -19997.0   -81.0
4  10.0     47.0  2484.0
5  10.0     30.0 -2464.0
此过程从上一项中减去系列中的下一项(这就是为什么第一项观察现在是
NaN
)。可以向数据中添加第一个差分序列的特征:

df['a_first_difference'] = df['a'].diff()
然后,此系列中的值遵循其自身的分布。也许找到差分序列中高于某个阈值的所有值,就可以通过识别与前一个值相比变化最大的时段来测量“快速增长”。还可以获取
.diff()
来告诉您下一个值的更改:


因此,这将有助于确定下一步发生重大变化的时期

您可以根据移动平均值和标准偏差计算置信区间,然后标记超出这些置信区间的数据点。有一篇文章做了类似的事情,让我看看我是否找到了。编辑:谢谢,我会看一看不完全是我要找的不幸的是,这里的方法可能是平滑数据(例如,使用Savitzky-Golay过滤器),然后分析一阶(和二阶)导数以确定基线。如果已识别基线,则可以提取信号。可能还有其他更适合您的特定测量类型的基线确定方法。您的输入数据在什么地方可用吗?我知道了。谢谢你的帮助:)如果你觉得这个问题有用,你也可以投赞成票。再次感谢:)
df.diff(periods=-1)

      a        b       c
0 -10.0   -999.0   996.0
1 -10.0 -19000.0   -93.0
2 -10.0  19997.0    81.0
3 -10.0    -47.0 -2484.0
4 -10.0    -30.0  2464.0
5   NaN      NaN     NaN