Python 计算数字从正变为负的天数
我有以下数据帧:Python 计算数字从正变为负的天数,python,pandas,multi-index,zerocrossing,Python,Pandas,Multi Index,Zerocrossing,我有以下数据帧: macd_hist Out[10]: ADANIPORTS.NS ASIANPAINT.NS ... WIPRO.NS ZEEL.NS Date ... 2015-06-22 NaN NaN ... NaN NaN 2015-06-23 N
macd_hist
Out[10]:
ADANIPORTS.NS ASIANPAINT.NS ... WIPRO.NS ZEEL.NS
Date ...
2015-06-22 NaN NaN ... NaN NaN
2015-06-23 NaN NaN ... NaN NaN
2015-06-24 NaN NaN ... NaN NaN
2015-06-25 NaN NaN ... NaN NaN
2015-06-26 NaN NaN ... NaN NaN
... ... ... ... ...
2020-06-12 -0.064481 1.635353 ... 0.213215 -1.800832
2020-06-15 -0.702969 0.135702 ... -0.096160 -3.020285
2020-06-16 -1.125824 -0.567845 ... -0.438076 -3.804984
2020-06-17 -1.423891 -2.635996 ... -0.347506 -4.095071
2020-06-18 -1.497237 -3.613468 ... -0.312098 -3.520918
[1227 rows x 50 columns]
我如何计算每个股票代码栏的天数从正值变为负值。所以,如果昨天的数字是正的,今天变成负的,那就是1,但它不应该计算,直到它再次变成负的,然后变成正的,然后再次变成负的,那将是另一个计数
我想数的是:
如果我没有弄错,您可以尝试以下方法: macd_hist>0.astypeint.diff>0.sum 让我们把它分解一下。它将执行以下操作: macd_hist>=0:检查您的号码是否为正数 .astypeint:转换为整数 .diff:检测变化-1表示从pos到neg,否则为1 <0:仅保留从pos到neg的更改 .sum:计算此类变更的数量
如果我没有弄错,您可以尝试以下方法: macd_hist>0.astypeint.diff>0.sum 让我们把它分解一下。它将执行以下操作: macd_hist>=0:检查您的号码是否为正数 .astypeint:转换为整数 .diff:检测变化-1表示从pos到neg,否则为1 <0:仅保留从pos到neg的更改 .sum:计算此类变更的数量 您可以使用枚举: 您可以使用枚举:
我会记录过零,。我在下面的解决方案中尝试了,但没有足够的数据进行统计。每个股票代码中只有一个过零。我的逻辑是,从每个股票代码器中获取零交叉,然后将其分配给1或0。积数和积数 第一部分 如果你想要的只是股票的过零。这一行代码就可以了。基本上,使用标记器对行进行切片,布尔选择并将布尔值转换为整数
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
我会记录过零,。我在下面的解决方案中尝试了,但没有足够的数据进行统计。每个股票代码中只有一个过零。我的逻辑是,从每个股票代码器中获取零交叉,然后将其分配给1或0。积数和积数 第一部分 如果你想要的只是股票的过零。这一行代码就可以了。基本上,使用标记器对行进行切片,布尔选择并将布尔值转换为整数
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
虽然这种方法有效,但在使用熊猫时并不太合适。一个主要的规则是避免为循环手动写入。虽然这样做有效,但在使用pandas时并不太合适。一个主要规则是避免为循环手动写入
#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
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