2012-10-03 42 views
8

Ho un elenco di prezzi in cui sto cercando di calcolare la variazione in percentuale di ciascun numero. Ho calcolato le differenze conCalcolo della variazione percentuale tra due numeri (Python)

prices = [30.4, 32.5, 31.7, 31.2, 32.7, 34.1, 35.8, 37.8, 36.3, 36.3, 35.6] 

    def f(): 
     for i in range(len(prices)): 
      print(prices[i]-prices[i-1]) 

che restituisce le differenze come

2.1 
    -0.8 
    -0.5 
    ... 

so la variazione percentuale sarebbe ((i- (i-1))/(i-1) * 100 , ma non so come incorporare che nella sceneggiatura Qualsiasi aiuto sarebbe molto apprezzato

+0

Probabilmente si desidera 'range (1, len (prezzi))' - altrimenti la prima cosa che la stampa sarà la differenza tra l'ultimo e primi elementi della elenco. –

+0

Hai l'equazione percentuale di modifica errata ... Potresti pensare a un'equazione di errore% che va come abs (xy)/x, dove x è il valore corretto in teoria, ma la differenza è abs (xy)/average x, y – jeremy

+0

Hai ragione, David. Ho modificato l'intervallo come suggerito e modificato l'ultima riga per 'print ((prezzi [i] -prices [i-1])/prezzi [i-1] * 100)' –

risposta

8

Prova questo:..

prices = [30.4, 32.5, 31.7, 31.2, 32.7, 34.1, 35.8, 37.8, 36.3, 36.3, 35.6] 

for a, b in zip(prices[::1], prices[1::1]): 
    print 100 * (b - a)/a 

Edit: Se si desidera che questo come un elenco, si potrebbe fare questo:

print [100 * (b - a)/a for a, b in zip(prices[::1], prices[1::1])] 
+0

Edit: Dopo la prima coppia di valori, i numeri si spengono: 6,90789473684, -1,57728706625, 4,28134556575 , 5,58659217877 , 0.0 , 0.0 , 0.0 , 0.0 , -5,5900621118 , ,327868852459 , 0.0 –

+0

quello che fai significare? – arshajii

+0

Quale output ti aspettavi? – arshajii

10

Se non si è stati esposti alla biblioteca panda in Python (http://pandas.pydata.org/), Dovresti assolutamente dargli un occhiata.

Fare questo è facile come:

import pandas as pd 
prices = [30.4, 32.5, 31.7, 31.2, 32.7, 34.1, 35.8, 37.8, 36.3, 36.3, 35.6] 

price_series = pd.Series(prices) 
price_series.pct_change()