我有一个价值河公里的图,该值在图表上应该是平滑的,因为它代表了维克勒的轨迹,并且公里数不能跳跃。
我找到了一个scipy.signal库和find_peaks function
但是我找不到合适的参数。
我读到最好的是prominence
,但是找不到我需要的峰。
我也尝试使用距离,但结果也令我不满意
x = df.river_km
# find peaks
#peaks, _ = find_peaks(x, distance = 150)
peaks, properties = find_peaks(x, prominence=1)
答案 0 :(得分:0)
您可以尝试使用prominence
值,我尝试这样做,并且通过调整突出值获得不同的结果。我想您的范围太大,因此设置了{{1} }值1会给您带来不好的结果。
峰的突出度衡量一个峰从信号周围的基线中突出多少,并定义为峰与其最低轮廓线之间的垂直距离。
prominence
import matplotlib.pyplot as plt
from scipy.misc import electrocardiogram
from scipy.signal import find_peaks
import numpy as np
x = np.cumsum(np.random.randn(1000,100))
peaks, _ = find_peaks(x, prominence=1)
plt.plot(x)
plt.plot(peaks, x[peaks], "x")
plt.show()
的值为1
OR
您只需传入prominence
的distance参数即可,x-axis
答案 1 :(得分:0)
使用与您相似的模拟数据(峰值高度为100-150个单位),以下操作非常有效:
import matplotlib.pyplot as plt
import numpy as np
from scipy.signal import find_peaks
x = np.array(1400 - 0.002 * np.linspace(0,700_000,700_000))
# add peaks 100 - 150 units high
for i in range(70_000,630_000,70_000):
x[i] += np.random.rand()*50+100
peaks, _ = find_peaks(x, threshold=100)
plt.plot(x)
plt.plot(peaks, x[peaks], "x")
plt.show()
在这种模拟情况下,默认设置(即find_peaks(x)
)产生的结果相同。
threshold
参数指定曲线上峰的最小雾化度(如果给出两个值,则为最小和最大仰角)。
您可能还想先消除任何nan
的可能性:
警告 对于包含NaN的数据,此函数可能返回意外结果。 为避免这种情况,应删除或替换NaN。