<p>我会记录过零,。我在下面的解决方案中尝试了,但没有足够的数据进行统计。每个股票代码中只有一个过零。我的逻辑是,从每个股票代码器中获取零交叉,然后将其分配给1或0<code>cumsum</code>和<code>cumcount</code></p>
<p>第一部分</p>
<pre><code> #Zerocrossing
a=df.ZEEL.lt(0)
c1=a.ne(a.shift(1))
b=df.WIPRO.lt(0)
c2=b.ne(b.shift(1))
c=df.ASIANPAINT.lt(0)
c3=c.ne(c.shift(1))
d=df.ADANIPORTS.lt(0)
c4=d.ne(d.shift(1))
Attribute in columns
df['ADANIPORTSZC']=np.where(c4,1,0)
df['ASIANPAINTZC']=np.where(c3,1,0)
df['WIPROZC']=np.where(c2,1,0)
df['ZEELZC']=np.where(c1,1,0)
Date ADANIPORTS ASIANPAINT WIPRO ZEEL ADANIPORTSZC \
0 2015-06-22 0.000000 0.000000 0.000000 0.000000 1
1 2015-06-23 0.000000 0.000000 0.000000 0.000000 0
2 2015-06-24 0.000000 0.000000 0.000000 0.000000 0
3 2015-06-25 0.000000 0.000000 0.000000 0.000000 0
4 2015-06-26 0.000000 0.000000 0.000000 0.000000 0
5 2020-06-12 -0.064481 1.635353 0.213215 -1.800832 1
6 2020-06-15 -0.702969 0.135702 -0.096160 -3.020285 0
7 2020-06-16 -1.125824 -0.567845 -0.438076 -3.804984 0
8 2020-06-17 -1.423891 -2.635996 -0.347506 -4.095071 0
9 2020-06-18 -1.497237 -3.613468 -0.312098 -3.520918 0
ASIANPAINTZC WIPROZC ZEELZC
0 1 1 1
1 0 0 0
2 0 0 0
3 0 0 0
4 0 0 0
5 0 0 1
6 0 1 0
7 1 0 0
8 0 0 0
9 0 0 0
</code></pre>
<p>如果你想要的只是股票的过零。这一行代码就可以了。基本上,使用标记器对行进行切片,布尔选择并将布尔值转换为整数</p>
<pre><code>df.iloc[:,1::].apply(lambda x:x.le(0).ne(x.le(0).shift(1))).astype(int)
ADANIPORTS ASIANPAINT WIPRO ZEEL
0 1 1 1 1
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0
5 0 1 1 0
6 0 0 1 0
7 0 1 0 0
8 0 0 0 0
9 0 0 0 0
</code></pre>