在大型数据集中找到测量起点的自动化

数据挖掘 Python 时间序列 数据集 自动化
2022-02-12 14:40:48

我正在寻找一种在 Python 中自动找到信号上升起点的方法。数据以 10k 的频率(每个 0.0001 s)收集,因此每个点之间的差异非常小,在噪声中丢失。我之前使用数据分析软件手动发现了这一点(黑点),但我有多个文件,手动过程无法正常工作。我试图想一些与导数(红点)或滚动方差(绿点)有关的事情,但现在对我来说这是一个死胡同。以下是选择手动点的方式:

在此处输入图像描述

我选择了一个在我看来最接近上升信号但在上升之前仍处于噪声中间的点。手动选择它只是我的粗略估计,但我不介意从“正确”的起始上升点错一两点。我将使用它来抵消我的信号,以便在 X = 0 时或多或少地开始上升。

现在我想用python找到它。完整的信号如下所示:

在此处输入图像描述

导数:

在此处输入图像描述

滚动方差:

在此处输入图像描述

所以它们都靠近兴趣点(黑点),但我不知道接下来该怎么处理它们。如果我更改限制,它看起来像这样:

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

任何想法如何解决我的问题?简单的代码示例如下(不包括绘图)

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy.optimize import curve_fit
import scipy.signal as sig

#reading dataset
signal = pd.read_csv('dataset.txt', delimiter=' ' )
signal.columns = ['time','current']

#calculating derivative, finding max and min indices of derivative
signal_derivative = np.gradient(signal,axis=0)
signal['derivative'] = pd.DataFrame(signal_derivative[:,1])
index_derivative_max = signal['derivative'].index[signal['derivative'] == signal['derivative'].max()]
index_derivative_min = signal['derivative'].index[signal['derivative'] == signal['derivative'].min()]

#calculating rolling variance, range 50 points, finding indices of peaks
signal['rolling_var'] = signal['current'].rolling(window=50,center=False).std()
index_rolling_max = signal['rolling_var'].index[signal['rolling_var'] == signal['rolling_var'].max()]
index_rolling_2nd_max = signal['rolling_var'].index[signal['rolling_var'] == signal['rolling_var'][:100000].max()]
1个回答

嗯......我会做你所做的。原始信号的导数非常嘈杂。我可能会从移动平均平滑信号中提取导数,但是它会给您的检测带来一些延迟。有关更多信息和 python 代码,请参阅此答案

另一种方法是检测时频域中的点。只需绘制信号的STFT,看看这是否有助于检测的准确性超过导数。