met*_*211 2 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 > m * threshold)
Run Code Online (Sandbox Code Playgroud)
例如,破裂在视觉上做了类似的事情。有一个示例,其生成的图中包含随机数据:
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()
Run Code Online (Sandbox Code Playgroud)
您可以尝试对序列进行差分,以获得序列在每个步骤中更改的量。这是时间序列分析的标准方法。这是对该想法背后的理论的很好的讨论。
在实践中,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
Run Code Online (Sandbox Code Playgroud)
此过程从前一项中减去系列中的下一项(这就是为什么第一个观察现在是NaN)。您可以向数据添加一个特征,即一阶差分序列:
df['a_first_difference'] = df['a'].diff()
Run Code Online (Sandbox Code Playgroud)
该系列中的值遵循它们自己的分布。也许找到差异序列中高于某个阈值的所有值可以让您通过识别与前一个值相比变化最大的时期来衡量“快速增长”。还可以告诉您下一个.diff()值的变化:
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
Run Code Online (Sandbox Code Playgroud)
那么,这将有助于识别下一步经历重大变化的时期。