J'écris une fonction pour les profits et pertes pendant N jours et je l'implémente sur le dataframe de pandas. Mais je me trompe dans la condition que je donne au code.
AttributeError Traceback (most recent call last)
<ipython-input-21-ca9c4298a3c4> in <module>()
1 #Average price and PNL pct for 1 week
2 average_price(7)
----> 3 profit_loss_pct(7)
4 print("")
5 #Average price and PNL pct for 2 week
<ipython-input-20-6053bcd8e488> in profit_loss_pct(N)
10 total_days = len(df['Profit/Loss'])
11 calc_pnl = df['Profit/Loss'][total_days-N:].sum()
---> 12 if calc_pnl.iloc[N] < 0:
13 print("Loss pct is: {:5.2f}%". format(calc_pnl.iloc[N]*100));
14 else:
AttributeError: 'numpy.float64' object has no attribute 'iloc'
Je dois trouver s'il y a eu profit ou perte pour chaque jour. et plus tard, écrivez une fonction dans laquelle, en fonction d'un paramètre personnalisé N, la fonction retournera un pourcentage de profit ou de perte pendant N jours. C'est ce que j'ai essayé jusqu'à présent {Remarque: le pourcentage de profit / perte entre N jours est le pourcentage de variation entre les cours de clôture des 2 jours}
def profit_loss_pct(N):
total_days = len(df['Profit/Loss'])
calc_pnl = df['Profit/Loss'][total_days-N:].sum()
if calc_pnl.iloc[N] < 0:
print("Loss pct is: {:5.2f}%". format(calc_pnl.iloc[N]*100));
else:
print("Profit pct is : {:5.2f}%". format(calc_pnl.iloc[N]*100));
return
EDIT 1: j'ai essayé le code mon Francesco Zambolin
def profit_loss_pct(N):
df_n_days = df.tail(N)
profit_loss_prcnt = ((df_n_days["Open Price"] - df_n_days["Close Price"])/df_n_days["Close Price"])
for n in range(N):
if profit_loss_prcnt[n] < 0:
print("Loss:", profit_loss_prcnt[n]*100,"%")
else:
print("Profit:", profit_loss_prcnt[n]*100,"%")
EDIT 2:
après avoir essayé ceci:
def profit_loss_pct(N):
df_n_days = df.tail(N)
profit_loss_prcnt = ((df_n_days["Open Price"] - df_n_days["Close Price"])/df_n_days["Close Price"])
if profit_loss_prcnt < 0:
print("Loss: " + profit_loss_prcnt*100,"%")
else:
return print("Profit: " + profit_loss_prcnt*100,"%")
profit_loss_pct(20)
J'obtiens l'erreur
Date Open Price High Price Low Price Last Price Close Price 2017-05-15 885.50 928.00 885.40 911.25 912.20 2017-05-16 908.20 909.00 890.20 894.00 894.70 2017-05-17 894.90 899.15 880.50 889.00 887.05 2017-05-18 888.00 917.90 865.20 866.15 871.35 2017-05-19 877.00 895.10 813.50 850.60 852.40 2017-06-01 802.00 817.95 794.00 803.40 803.70 2017-06-02 807.00 838.85 801.40 837.00 834.35
si c'est une série, il devrait localiser la valeur à droite? mais pourquoi cela ne fonctionne pas?
5 Réponses :
Votre profit_loss_prcnt est une série de N valeurs. Vous pouvez, par exemple, placer votre instruction if dans une boucle for sur les N valeurs. Lorsque vous rencontrez un pct négatif, votre if fera l'affaire.
N.B. Vous avez une faute de frappe dans l'impression: soit vous passez profit_loss_prcnt comme une chaîne de caractères str (profit_loss_prcnt * 100) pour que votre signe + fonctionne, soit vous mettez une virgule comme ceci: print ("Loss:", profit_loss_prcnt * 100, "%")
Votre fonction serait:
def profit_loss_pct(N):
df_n_days = df.tail(N)
profit_loss_prcnt = ((df_n_days["Open Price"] - df_n_days["Close Price"])/df_n_days["Close Price"])
for n in range(N):
if profit_loss_prcnt[n] < 0:
print("Loss:", profit_loss_prcnt[n]*100,"%")
else:
print("Profit:", profit_loss_prcnt[n]*100,"%")
18 profit_loss_pct (50) ---> 12 if profit_loss_prcnt [n] <0: 13 print ("Loss:", profit_loss_prcnt [n] * 100, "%") 14 else: KeyError: 0
est-il possible que je puisse faire cela différemment si oui, comment alors?
def profit_loss_pct(N):
total_days = len(df['Profit/Loss'])
calc_pnl = df['Profit/Loss'][total_days-N:].sum()
if df["Profit/Loss"][N] < 0:
print("Loss pct is: {:5.2f}%". format(df["Profit/Loss"][N]*100));
else:
print("Profit pct is : {:5.2f}%". format(df["Profit/Loss"][N]*100));
return
>>>Profit pct over 365 days is : 3.21%
i understood where i was going wrong, this worked. Thank you :)
obtenir le dataframe
def getPL(N): total_days = len(df['Profit/Loss']) return df['Profit/Loss'][total_days-N:].sum() getPL(30) -0.09336249871304825
Je dois trouver s'il y a eu un profit ou une perte pour chaque jour
df['Profit/Loss'] = (df['Close'] - df['Close'].shift(1)) / df['Close'] df.head(3) Date High Low Open Close Volume Profit/Loss 2019-01-02 115.980003 111.690002 112.010002 115.209999 4239900.0 NaN 2019-01-03 114.879997 112.690002 114.529999 112.910004 4346700.0 -0.020370 2019-01-04 117.489998 114.440002 114.910004 117.320000 4477800.0 0.037589
écrivez plus tard une fonction dans laquelle, en fonction d'un paramètre personnalisé N, la fonction retournera un pourcentage de profit ou de perte pendant N jours
import pandas_datareader as web
df = web.data.get_data_yahoo('ibm', start='2019-01-01', end='2019-06-01')
df.head(3)
Date High Low Open Close Volume
2019-01-02 115.980003 111.690002 112.010002 115.209999 4239900.0
2019-01-03 114.879997 112.690002 114.529999 112.910004 4346700.0
2019-01-04 117.489998 114.440002 114.910004 117.320000 4477800.0
Cette fonction fera votre travail.
def profit_loss(data,n):
change = data['Close Price'].iloc[-n] - data['Close Price'].iloc[-1]
per = (change*100)/data['Close Price'].iloc[-n]
return per
Cela fonctionnera
def plperct(N):
tb3=tb.tail(N)
t=((tb3['Close Price']-tb3['Prev Close'])/tb3['Prev Close'])*100
return t
profit_loss_prcntserait uneSérie. Vous ne pouvez pas le traiter comme un scalaire avecif.alors comment dois-je continuer?