擅长:python、mysql、java
<p>假设感兴趣的列被标记为<code>data</code>,一个解决方案是</p>
<pre><code>df['min'] = df.data[(df.data.shift(1) > df.data) & (df.data.shift(-1) > df.data)]
df['max'] = df.data[(df.data.shift(1) < df.data) & (df.data.shift(-1) < df.data)]
</code></pre>
<p>例如:</p>
<pre><code>import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# Generate a noisy AR(1) sample
np.random.seed(0)
rs = np.random.randn(200)
xs = [0]
for r in rs:
xs.append(xs[-1]*0.9 + r)
df = pd.DataFrame(xs, columns=['data'])
# Find local peaks
df['min'] = df.data[(df.data.shift(1) > df.data) & (df.data.shift(-1) > df.data)]
df['max'] = df.data[(df.data.shift(1) < df.data) & (df.data.shift(-1) < df.data)]
# Plot results
plt.scatter(df.index, df['min'], c='r')
plt.scatter(df.index, df['max'], c='g')
df.data.plot()
</code></pre>
<p><a href="https://i.stack.imgur.com/gWOKq.png" rel="noreferrer"><img src="https://i.stack.imgur.com/gWOKq.png" alt="enter image description here"/></a></p>