Tôi có một dữ liệu thời gian. Tạo dữ liệu
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']
Tôi muốn tạo một đường zig-zag kết nối giữa cực đại cục bộ và cực tiểu cục bộ, thỏa mãn điều kiện là trên trục y, |highest - lowest value|
của mỗi đường zig-zag phải vượt quá một tỷ lệ phần trăm (khoảng 20%) khoảng cách của trước đó đường zig-zag, VÀ một giá trị được nêu trước k (giả sử 1.2)
Tôi có thể tìm thấy extrema cục bộ bằng cách sử dụng mã này:
# 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'])
nhưng tôi không biết làm thế nào để áp dụng điều kiện ngưỡng cho nó. Xin tư vấn cho tôi về cách áp dụng điều kiện như vậy.
Vì dữ liệu có thể chứa hàng triệu dấu thời gian, nên tính toán hiệu quả rất được khuyến khích
Ví dụ đầu ra, từ dữ liệu của tôi:
# 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')
Đầu ra mong muốn của tôi (một cái gì đó tương tự như thế này, ngoằn ngoèo chỉ kết nối các phân đoạn quan trọng)