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