मेरे पास टाइमसीज़ डेटा है। डेटा जनरेट करना
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']
मैं स्थानीय मैक्सिमा और स्थानीय मिनीमा के बीच जुड़ने वाली एक ज़िग-ज़ैग लाइन बनाना चाहता हूँ, जो इस शर्त को संतुष्ट करती है कि y- अक्ष पर, |highest - lowest value|
प्रत्येक zig-zag लाइन की दूरी पिछले की दूरी के प्रतिशत (मान 20%) से अधिक होनी चाहिए zig-zag लाइन, और एक पूर्व-घोषित मूल्य k (1.2 का कहना है)
मैं इस कोड का उपयोग करके स्थानीय एक्स्ट्रेमा पा सकता हूं:
# 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'])
लेकिन मुझे नहीं पता कि इसे कैसे लागू किया जाए। कृपया मुझे सलाह दें कि ऐसी स्थिति को कैसे लागू किया जाए।
चूंकि डेटा में मिलियन टाइमस्टैम्प हो सकते हैं, एक कुशल गणना अत्यधिक अनुशंसित है
उदाहरण आउटपुट, मेरे डेटा से:
# 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')
मेरा वांछित आउटपुट (कुछ इसी तरह, ज़िगज़ैग केवल महत्वपूर्ण खंडों को जोड़ता है)