【发布时间】:2020-01-03 17:37:31
【问题描述】:
我有一个带峰和谷的样带,并想确定两者的峰值。数据集有相当多的噪音,所以目前,峰值不会作为单个值返回。 我尝试使用滚动平均值来平滑数据,即使结果比不平滑时要好,但仍然存在多个“峰值”。 [CSV file here]
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy.signal import argrelextrema
from pandas import read_csv
from numpy import mean
from matplotlib import pyplot
import csv
df = pd.read_csv('transect2.csv', delimiter=',', header=None, names=['x', 'y'])
plt.plot(df['x'], df['y'], label='Original Height')
rolling = df.rolling(window=100)
rolling_mean = rolling.mean()
plt.xlabel('Distance')
plt.ylabel('Height')
plt.plot(rolling_mean['x'], rolling_mean['y'], label='Mean Height 100')
plt.legend(loc='upper left')
plt.show()
n=1000
ilocs_min = argrelextrema(rolling_mean.y.values, np.less_equal, order=n)[0]
ilocs_max = argrelextrema(rolling_mean.y.values, np.greater_equal, order=n)[0]
df.y.plot (color='gray')
df.iloc[ilocs_max].y.plot(style='.', lw=10, color='red', marker="v");
df.iloc[ilocs_min].y.plot(style='.', lw=10, color='green', marker="^");
进一步平滑数据并不能代表现实,因此我可以改进这种平滑或使用不同的平滑函数。
【问题讨论】:
-
在我的特定问题中,将信号与高斯窗口进行卷积效果很好(参见例如this answer)。
标签: python pandas csv smoothing