<p>假设数据帧已排序。一种方法是基于差异的总和,以确定继3天上涨趋势(即4天上涨趋势)之后的首次上涨价格移动</p>
<pre><code>quant1 = (df['Price'].diff().apply(np.sign) == 1).cumsum()
quant2 = (df['Price'].diff().apply(np.sign) == 1).cumsum().where(~(df['Price'].diff().apply(np.sign) == 1)).ffill().fillna(0).astype(int)
df['is_consecutive'] = (quant1-quant2) >= 3
</code></pre>
<p>请注意,以上仅考虑了严格上涨的价格(不相等)</p>
<p>然后,我们还使用<em>win_view</em>自定义函数覆盖前3个价格的<em>is_Continuous</em>标签,使其也<em>TRUE</em>:</p>
<pre><code>def win_view(x, size):
if isinstance(x, list):
x = np.array(x)
if isinstance(x, pd.core.series.Series):
x = x.values
if isinstance(x, np.ndarray):
pass
else:
raise Exception('wrong type')
return np.lib.stride_tricks.as_strided(
x,
shape=(x.size - size + 1, size),
strides=(x.strides[0], x.strides[0])
)
arr = win_view(df['is_consecutive'], 4)
arr[arr[:,3]] = True
</code></pre>
<p>请注意,我们将替换为True的值</p>
<p><strong>编辑1</strong>
受自定义的<em>win_view</em>函数的启发,我意识到,只需<em>win_view</em>(无需使用累积和)即可获得解决方案,如下所示:</p>
<pre><code>df['is_consecutive'] = False
arr = win_view(df['Price'].diff(), 4)
arr_ind = win_view(list(df['Price'].index), 4)
mask = arr_ind[np.all(arr[:, 1:] > 0, axis=1)].flatten()
df.loc[mask, 'is_consecutive'] = True
</code></pre>
<p>我们维护2个数组,1个用于返回,1个用于索引。我们收集有3个连续正回报<code>np.all(arr[:, 1:] > 0, axis=1</code>(即4个上涨价格)的指数,并替换原始df中的指数</p>