У меня есть следующий DataFrame:
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, но оно не должно считаться, пока оно снова не станет отрицательным и не станет положительным, а затем снова станет отрицательным, это будет другой счет.
Я пытаюсь подсчитать следующее:
Вы можете использовать enumerate():
enumerate()
d = [-1,-2,-1,1,2,4,1,-1,-2,-4,-1,3,4,5,2,-2,-3,-1,3,4,3,1,-1,-3,-2,-1,2,3,4] count = 0 for i,n in enumerate(d): if i < len(d)-1 and d[i] > 0 and d[i+1] < 0: count += 1 print(count)
Вывод:
3
Я бы посчитал пересечение нуля. Попытка в моем решении ниже, но мне недостаточно для подсчета. В каждом тикере есть только одно пересечение нуля. Мой лог c был таким: получить нулевое пересечение с каждого тикера и присвоить ему еще 1 ноль. cumsum и cumcount
cumsum
cumcount
Part1
#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
Если все хотят, это нулевое пересечение для тикеров. Эта одна строка кода могла бы сделать. В основном нарезайте строки тикерами, логическим выбором и преобразуйте логическое значение в целое число g
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
Если я правильно понял, вы можете попробовать следующее:
((macd_hist > 0).astype(int).diff() > 0).sum()
Давайте разберемся. Он будет делать следующее:
(macd_hist >= 0)
.astype(int)
.diff()
< 0
.sum()