Saya punya data deret waktu. Menghasilkan data
date_rng = pd.date_range('2019-01-01', freq='s', periods=400)
df = pd.DataFrame(np.random.lognormal(.005, .5,size=(len(date_rng), 3)),
columns=['data1', 'data2', 'data3'],
index= date_rng)
s = df['data1']
Saya ingin membuat garis zig-zag yang menghubungkan antara maxima lokal dan minimum lokal, yang memenuhi syarat bahwa pada sumbu y, |highest - lowest value|
setiap garis zig-zag harus melebihi persentase (katakanlah 20%) dari jarak sebelumnya garis zig-zag, DAN nilai yang dinyatakan sebelumnya k (katakanlah 1.2)
Saya dapat menemukan ekstrema lokal menggunakan kode ini:
# Find peaks(max).
peak_indexes = signal.argrelextrema(s.values, np.greater)
peak_indexes = peak_indexes[0]
# Find valleys(min).
valley_indexes = signal.argrelextrema(s.values, np.less)
valley_indexes = valley_indexes[0]
# Merge peaks and valleys data points using pandas.
df_peaks = pd.DataFrame({'date': s.index[peak_indexes], 'zigzag_y': s[peak_indexes]})
df_valleys = pd.DataFrame({'date': s.index[valley_indexes], 'zigzag_y': s[valley_indexes]})
df_peaks_valleys = pd.concat([df_peaks, df_valleys], axis=0, ignore_index=True, sort=True)
# Sort peak and valley datapoints by date.
df_peaks_valleys = df_peaks_valleys.sort_values(by=['date'])
tapi saya tidak tahu bagaimana menerapkan kondisi ambang itu. Tolong beri tahu saya bagaimana menerapkan kondisi seperti itu.
Karena data dapat berisi jutaan cap waktu, perhitungan yang efisien sangat disarankan
Untuk deskripsi yang lebih jelas:
Contoh output, dari data saya:
# Instantiate axes.
(fig, ax) = plt.subplots()
# Plot zigzag trendline.
ax.plot(df_peaks_valleys['date'].values, df_peaks_valleys['zigzag_y'].values,
color='red', label="Zigzag")
# Plot original line.
ax.plot(s.index, s, linestyle='dashed', color='black', label="Org. line", linewidth=1)
# Format time.
ax.xaxis_date()
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d"))
plt.gcf().autofmt_xdate() # Beautify the x-labels
plt.autoscale(tight=True)
plt.legend(loc='best')
plt.grid(True, linestyle='dashed')
Output yang saya inginkan (sesuatu yang mirip dengan ini, zigzag hanya menghubungkan segmen signifikan)