Подсчет дней, когда числа меняются с положительных на отрицательные - PullRequest
1 голос
/ 19 июня 2020

У меня есть следующий 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, но оно не должно считаться, пока оно снова не станет отрицательным и не станет положительным, а затем снова станет отрицательным, это будет другой счет.

Я пытаюсь подсчитать следующее:

enter image description here

Ответы [ 3 ]

1 голос
/ 19 июня 2020

Вы можете использовать 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

enter image description here

1 голос
/ 19 июня 2020

Я бы посчитал пересечение нуля. Попытка в моем решении ниже, но мне недостаточно для подсчета. В каждом тикере есть только одно пересечение нуля. Мой лог c был таким: получить нулевое пересечение с каждого тикера и присвоить ему еще 1 ноль. 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
1 голос
/ 19 июня 2020

Если я правильно понял, вы можете попробовать следующее:

((macd_hist > 0).astype(int).diff() > 0).sum()

Давайте разберемся. Он будет делать следующее:

  • (macd_hist >= 0): проверять, является ли ваш номер положительным или нет
  • .astype(int): преобразовывать в целые числа
  • .diff(): для обнаружения изменений (-1 для pos в neg, иначе 1)
  • < 0: только для сохранения изменений с pos на neg
  • .sum(): для подсчета количества такие изменения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...