python - 有没有办法检测时间序列数据中的阶梯状形状?
问题描述
我想检测时间序列中的任何阶梯形状,如示例图中所示。我想到的唯一方法是取系列前半部分和后半部分的平均值的差异,并将其与差异的平均值进行比较。如果后半部分的平均值比前半部分的平均值大某个阈值(例如平均值 + 3*sd),那么我可以说数据中有一个阶梯状的形状(希望如此)。但是使用序列的中点是不明智的,因为步长可以在数据中的任何位置。
apply(ds[1:6], 2, function(x){
diffs = diff(x)
l = floor(length(x) / 2)
m1 = mean(x[1:l])
m2 = mean(x[(l+1):length(x)])
(m2-m1) > (mean(diffs) + 3*sd(diffs))
})
该方法也将 b 确定为阶梯形状。任何使用 R 或 Python 的可行解决方案都是可以接受的。
样本数据:
> a = c(115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 115.9364, 132.6718, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154, 137.6154)
> plot.ts(a) # ds[ ,4]
另一方面,该方法不应将下面的系列数据检测为阶梯状,尽管有增加的趋势
b = c(4.0395, 4.0715, 3.9155, 4.065, 3.8804, 4.1018, 4.0128, 4.0536, 3.8843, 4.3133, 4.5442, 4.4616, 4.199, 4.1072, 4.9806, 5.0805, 5.285, 5.0236, 5.1037, 5.0898, 4.5565, 4.99, 5.0152, 5.2478, 5.2843, 5.2827, 5.3203, 5.3841, 5.8214, 5.7281)
> plot.ts(b) # ds[ ,6]
解决方案
您可以对该信号进行导数。step 的导数应该是一个大尖峰,第二个图的导数应该有多个小尖峰。
推荐阅读
- c# - 将 Audit.WebApi 日志保存到数据库
- amazon-web-services - 将 VPN 客户端与 VPC 对等互连
- android - 我的项目中的 Firebase 身份验证问题
- java - 片段中的对话框:
- dart - 如何在 StatefulWidget 上使用构建器函数
- sql-server - 防止注入 - 转义原始 SQL
- javascript - 如何在 asp.net 中使用 JavaScript 从 Grand Child 弹出窗口刷新页面
- powershell - 通过将密码与 Commnad 一起传递来使用 powerShell 脚本 ssh
- c++ - 错误:'std::__cxx11::list
::iterator' {aka 'struct std::_List_iterator '} 没有名为 XXX 的成员 - xquery - 如何一次将一系列十进制值按 8 个值分组?