1
votes

Compter les jours où les nombres passent du positif au négatif

J'ai le DataFrame suivant:

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]

Comment puis-je compter le nombre de jours où le nombre est passé de positif à négatif pour chaque colonne de ticker. Donc, si le nombre était positif hier et qu'il devenait négatif aujourd'hui, ce serait 1 mais il ne devrait pas compter jusqu'à ce qu'il redevienne négatif et redevienne positif, puis redevienne négatif, ce serait un autre compte.

Voici ce que j'essaie de compter:

entrez la description de l'image ici


0 commentaires

3 Réponses :


1
votes

Si je comprends bien, vous pouvez essayer ce qui suit:

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

Décomposons-le. Il fera ce qui suit:

  • (macd_hist> = 0) : pour vérifier si votre nombre est positif ou non
  • .astype (int) : pour convertir en entiers
  • .diff () : pour détecter les changements (-1 pour pos à nég, sinon 1)
  • : pour ne conserver que les changements de pos à nég
  • .sum () : pour compter le nombre de ces changements


0 commentaires

1
votes

Vous pouvez utiliser enumerate():

3

Output:

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)

 entrez la description de l'image ici


1 commentaires

Bien que cela fonctionne, ce n'est pas si approprié lors de l'utilisation de pandas. Une règle principale est d'éviter l'écriture manuelle des boucles for



1
votes

Je marquerais le passage à zéro. Tentative dans ma solution ci-dessous mais il n'y en a pas assez pour que je compte. Il n'y a qu'un seul passage par zéro dans chaque ticker. Ma logique était, obtenir le zerocrossing de chaque ticker et lui attribuer 1 sinon zéro. cumsum et cumcount

Part1

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

Si tout ce que vous voulez, c'est le zerocrossing pour les tickers. Cette ligne de code pourrait faire l'affaire. Découpez essentiellement les lignes avec des tickers, sélectionnez booléen et convertissez le booléen en entier

 #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 


0 commentaires