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:
3 Réponses :
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 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)
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
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