2012-04-19 12 views
5

Mam listę liczb zmiennoprzecinkowych i chcę wygenerować kolejną listę okresowych zwrotów z mojej pierwszej listy.Jaki jest najbardziej pytony sposób obliczania zmian procentowych na liście liczb

jest to przebieg realizacji młyna (nie testowane - i oczywiście nie błąd sprawdzania/obsługa):

a = [100,105,100,95,100] 

def calc_period_returns(values, period): 
    output = [] 
    startpos, endpos = (period, len(values)-1) 

    while True: 
     current = values[startpos] 
     previous = values[startpos-period] 
     ret = 100*((current-previous)/(1.0*previous)) 
     output.append(ret) 
     startpos += period 
     if startpos > endpos: 
      break 
    return output 


calc_period_returns(a,1) 

# Expected output: 
# [5.0, -4.7619047619047619, -5.0, 5.2631578947368416] 

Czy istnieje bardziej pythonic sposobem w ten sposób - być może przy użyciu listowych i mapy?

+1

co jest pożądane wyjście? –

+0

@RomanBodnarchuk: Mam zaktualizowane pytanie z oczekiwanym wyjściem –

+0

zobacz aktualizację odpowiedzi. –

Odpowiedz

10

Proszę bardzo:

>>> [100.0 * a1/a2 - 100 for a1, a2 in zip(a[1:], a)] 
[5.0, -4.7619047619047592, -5.0, 5.2631578947368354] 

Ponieważ chcesz porównać elementy sąsiadem listy, lepiej stworzyć listę par jesteś zainteresowany, to tak:

>>> a = range(5) 
>>> a 
[0, 1, 2, 3, 4] 
>>> zip(a, a[1:]) 
[(0, 1), (1, 2), (2, 3), (3, 4)] 

Po tym to tylko prosta matematyka, aby wyodrębnić zmianę procentową z pary liczb.

+0

Czy znasz tę terminologię lub odszyfrowałeś ją z jego kodu? – Abhijit

+0

@Ahhijit lekko :) Po prostu zmapowane wejście do wyjścia :) –

+0

Po prostu mały FYI, to kończy się niepowodzeniem z dzieleniem przez zero, jeśli dowolna z liczb wynosi zero. – mikkom

15

Nie wiem, jak duża będzie twoja lista numerów, ale jeśli zamierzasz przetwarzać duże ilości liczb, powinieneś rzucić okiem na numpy. Efektem ubocznym jest to, że obliczenia wyglądają o wiele łatwiej.

Z numpy można utworzyć tablicę dla swoich danych

>>> import numpy as np 
>>> a = np.array([100,105,100,95,100], dtype=float) 

i pracy z tablicami, jak gdyby były proste numery

>>> np.diff(a)/a[:-1] * 100. 
[ 5.   -4.76190476 -5.   5.26315789] 
+1

Właściwie to, czego naprawdę chcesz, to 'np.diff (a)/np.abs (a [: - 1]) * 100. Ponadto pozycja w a może wynosić 0, więc aby uniknąć dzielenia przez 0, możesz chcieć zrobić coś w stylu 'a [a == 0] = 0.000000001' –

Powiązane problemy