<p>比较<a href="http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.shift.html" rel="nofollow noreferrer">^{<cd1>}</a>ed值与原始值,并通过<a href="https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html" rel="nofollow noreferrer">^{<cd2>}</a>设置新值:</p>
<pre><code>df['Action'] = np.where(df['Adj Close'].shift() > df['Adj Close'], -1, 1)
print (df)
Adj Close Action
0 1144.973755 1
1 1133.032471 -1
2 1130.913696 -1
3 1133.176880 1
4 1135.295532 1
5 1127.495117 -1
</code></pre>
<p><strong>细节</strong>:</p>
<pre><code>print (df['Adj Close'].shift())
0 NaN
1 1144.973755
2 1133.032471
3 1130.913696
4 1133.176880
5 1135.295532
Name: Adj Close, dtype: float64
print (df['Adj Close'].shift() > df['Adj Close'])
0 False
1 True
2 True
3 False
4 False
5 True
Name: Adj Close, dtype: bool
</code></pre>
<p>自定义函数:</p>
<pre><code>def action(df):
df['Action'] = np.where(df['Adj Close'].shift() > df['Adj Close'], -1, 1)
return df
print (action(df))
Adj Close Action
0 1144.973755 1
1 1133.032471 -1
2 1130.913696 -1
3 1133.176880 1
4 1135.295532 1
5 1127.495117 -1
</code></pre>
<p>第一个值与nothing比较,所以如果使用<code>diff</code>函数,则输出缺少值。如果需要自定义值,这里有另一个带有<a href="http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.diff.html" rel="nofollow noreferrer">^{<cd4>}</a>的解决方案:</p>
<pre><code>diff = df['Adj Close'].diff()
df['Action'] = np.select([diff.isna(), diff > 0], [0, 1], -1)
</code></pre>
<p>或:</p>
<pre><code>shifted = df['Adj Close'].shift()
df['Action'] = np.select([shifted > df['Adj Close'], shifted < df['Adj Close']], [-1, 1], 0)
print (df)
Adj Close Action
0 1144.973755 0
1 1133.032471 -1
2 1130.913696 -1
3 1133.176880 1
4 1135.295532 1
5 1127.495117 -1
</code></pre>
<p>上面的解决方案来自预期的输出,似乎需要通过公式来解决:</p>
<pre><code>df['Action'] = np.where(df['Adj Close'].shift(-1) > df['Adj Close'], 1, -1)
print (df)
Adj Close Action
0 1144.973755 -1
1 1133.032471 -1
2 1130.913696 1
3 1133.176880 1
4 1135.295532 -1
5 1127.495117 -1
</code></pre>