TL; DR:需要处理水流时间序列,无法找出消除异常峰的方法。
我目前在一个项目中,在该项目中我收到包含两列的.csv
数据集:
datetime
时间戳记此数据集通常是使用自动灌溉系统的管理实体的水流传感器的测量值的一年,其中包含约402 000原始值。有时候,它可能会有一些与浇水周期不对应的峰值,因为它是正常值之间的守时值,例如image。
到目前为止,我已经尝试过计算两个点之间的百分比差异和间距,并计算中值绝对偏差(MAD),但是两者都捕获了误报。
这里的问题是,我需要一种算法,该算法可识别可持续1或2个测量值的自发峰,因为从物理上讲,在2分钟内流量不可能增加300%。
另一个问题是编码。需要有一种动态的方法来检测这些峰,因为根据整体dataset,我们清楚地知道原因:在夏天,流量增加到两倍多,不可能达到0.95%的百分率。
我已经使用上述技术和数据集的1天准备了一个github回购,这是我目前正在使用的回购(大约1000个值)。
不是真正的答案,但评论太久:
也许您可以使用峰的prominence。您可以将find_peaks
与find_peaks
和prominence
参数一起使用,并尝试调整其他参数(例如窗口大小)以进行突出计算(width
)。
以下快速示例仅说明用法。它只是发现峰的最小值最小为中位数的3倍:
wlen
from scipy.signal import find_peaks
df = pd.read_csv('https://raw.githubusercontent.com/MigasTigas/peak_removal/master/dataset_simple_example.csv')
peaks,_ = find_peaks(df.value, prominence=df.value.median()*3, width=(1,2))
ax = df.plot()
df.iloc[peaks.tolist()].plot(style=['x'], ax=ax)