如何生成嘈杂的模拟时间序列或信号(Python)
How to generate noisy mock time series or signal (in Python)
我经常需要处理一堆嘈杂的、有些相关的时间序列。有时我需要一些模拟数据来测试我的代码,或者为 Stack Overflow 上的一个问题提供一些示例数据。我通常最终要么从不同的项目加载一些类似的数据集,要么只是添加一些正弦函数和噪声并花一些时间来调整它。
你的方法是什么?您如何生成具有特定规格的噪声信号?我是不是忽略了一些非常明显的标准包,它们正是这样做的?
我通常希望在我的模拟数据中获得的特征:
- 随时间变化的噪音水平
- 信号中的一些历史记录(比如随机游走?)
- 信号的周期性
- 能够生成另一个具有相似(但不完全相同)特征的时间序列
- 可能是一堆怪怪的dips/peaks/plateaus
- 能够重现它(一些种子和一些参数?)
我想得到一个类似于下面两个的时间序列[A]:
我通常会使用如下代码创建一个时间序列:
import numpy as np
n = 1000
limit_low = 0
limit_high = 0.48
my_data = np.random.normal(0, 0.5, n) \
+ np.abs(np.random.normal(0, 2, n) \
* np.sin(np.linspace(0, 3*np.pi, n)) ) \
+ np.sin(np.linspace(0, 5*np.pi, n))**2 \
+ np.sin(np.linspace(1, 6*np.pi, n))**2
scaling = (limit_high - limit_low) / (max(my_data) - min(my_data))
my_data = my_data * scaling
my_data = my_data + (limit_low - min(my_data))
这会导致这样的时间序列:
这是我可以使用的东西,但仍然不是我想要的。这里的问题主要是:
- 它没有 history/random 步行方面
- 这是相当多的代码和调整(如果我想分享样本时间序列,这尤其是个问题)
- 我需要重新调整值(正弦频率等)以生成另一个相似但不完全相同的时间序列。
[A]:对于那些想知道的人,前两张图片中描绘的时间序列是三天(从午夜到早上 6 点被剪掉)在一条道路上的两个点的交通强度(以汽车/秒为单位)(移动汉宁window 平均超过 2 分钟)。重采样到 1000 点。
您是否研究过 TSimulus? By using Generators
,您应该能够生成具有特定模式、周期和周期的数据。
The TSimulus project provides tools for specifying the shape of a time series (general patterns, cycles, importance of the added noise, etc.) and for converting this specification into time series values.
否则,您可以自己尝试 "drawing" 数据并使用 Time Series Maker.
导出这些数据点
我经常需要处理一堆嘈杂的、有些相关的时间序列。有时我需要一些模拟数据来测试我的代码,或者为 Stack Overflow 上的一个问题提供一些示例数据。我通常最终要么从不同的项目加载一些类似的数据集,要么只是添加一些正弦函数和噪声并花一些时间来调整它。
你的方法是什么?您如何生成具有特定规格的噪声信号?我是不是忽略了一些非常明显的标准包,它们正是这样做的?
我通常希望在我的模拟数据中获得的特征:
- 随时间变化的噪音水平
- 信号中的一些历史记录(比如随机游走?)
- 信号的周期性
- 能够生成另一个具有相似(但不完全相同)特征的时间序列
- 可能是一堆怪怪的dips/peaks/plateaus
- 能够重现它(一些种子和一些参数?)
我想得到一个类似于下面两个的时间序列[A]:
我通常会使用如下代码创建一个时间序列:
import numpy as np
n = 1000
limit_low = 0
limit_high = 0.48
my_data = np.random.normal(0, 0.5, n) \
+ np.abs(np.random.normal(0, 2, n) \
* np.sin(np.linspace(0, 3*np.pi, n)) ) \
+ np.sin(np.linspace(0, 5*np.pi, n))**2 \
+ np.sin(np.linspace(1, 6*np.pi, n))**2
scaling = (limit_high - limit_low) / (max(my_data) - min(my_data))
my_data = my_data * scaling
my_data = my_data + (limit_low - min(my_data))
这会导致这样的时间序列:
这是我可以使用的东西,但仍然不是我想要的。这里的问题主要是:
- 它没有 history/random 步行方面
- 这是相当多的代码和调整(如果我想分享样本时间序列,这尤其是个问题)
- 我需要重新调整值(正弦频率等)以生成另一个相似但不完全相同的时间序列。
[A]:对于那些想知道的人,前两张图片中描绘的时间序列是三天(从午夜到早上 6 点被剪掉)在一条道路上的两个点的交通强度(以汽车/秒为单位)(移动汉宁window 平均超过 2 分钟)。重采样到 1000 点。
您是否研究过 TSimulus? By using Generators
,您应该能够生成具有特定模式、周期和周期的数据。
The TSimulus project provides tools for specifying the shape of a time series (general patterns, cycles, importance of the added noise, etc.) and for converting this specification into time series values.
否则,您可以自己尝试 "drawing" 数据并使用 Time Series Maker.