1
votes

Comment écrire une fonction pour le pourcentage de profits et pertes pendant N jours dans pandas dataframe?

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?


2 commentaires

profit_loss_prcnt serait une Série . Vous ne pouvez pas le traiter comme un scalaire avec if.


alors comment dois-je continuer?


5 Réponses :


0
votes

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,"%")


2 commentaires

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?



0
votes
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 :)

0 commentaires

0
votes

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   


0 commentaires

0
votes

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


0 commentaires

0
votes

Cela fonctionnera

def plperct(N):
    tb3=tb.tail(N)
    t=((tb3['Close Price']-tb3['Prev Close'])/tb3['Prev Close'])*100
    return t


0 commentaires