2012-04-19 14 views
5

की सूची में प्रतिशत परिवर्तनों की गणना करने का सबसे पायथन तरीका क्या है मेरे पास फ्लोटिंग पॉइंट नंबरों की एक सूची है और मैं अपनी पहली सूची से अवधि रिटर्न की एक और सूची उत्पन्न करना चाहता हूं।संख्या

इस चक्की कार्यान्वयन का एक रन (नहीं परीक्षण किया - और स्पष्ट रूप से कोई त्रुटि जाँच/हैंडलिंग) है:

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] 

वहाँ ऐसा करने का एक और अधिक pythonic तरीका है - शायद सूची समझ और नक्शे का उपयोग?

+1

वांछित आउटपुट क्या है कर रहे थे? –

+0

@RomanBodnarchuk: मैंने अपेक्षित आउटपुट –

+0

के साथ प्रश्न को अद्यतन किया है उत्तर में अपडेट देखें। –

उत्तर

10

ये रहा:

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

चूंकि आप एक सूची के पड़ोसी तत्वों की तुलना करना चाहते, तो आप बेहतर आप में रुचि रखते हैं जोड़ों की सूची बनाने के लिए, इस तरह:

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

उसके बाद यह संख्याओं की एक जोड़ी से प्रतिशत परिवर्तन निकालने के लिए सिर्फ एक साधारण गणित है।

+0

क्या आप इस शब्दावली के बारे में जानते थे या आपने उनके कोड से अवगत कराया था? – Abhijit

+0

@ अहिजीत थोड़ा :) बस आउटपुट में इनपुट मैप किया गया :) –

+0

बस एक मुस्कुराहट एफवाईआई, यदि संख्याओं में से कोई भी शून्य है तो यह शून्य से विभाजन में विफल रहता है। – mikkom

15

मुझे नहीं पता कि आपकी संख्याओं की सूची कितनी बड़ी होगी, लेकिन यदि आप बड़ी मात्रा में संसाधित करने जा रहे हैं, तो आपको numpy पर एक नज़र रखना चाहिए। दुष्प्रभाव यह है कि गणना बहुत सरल लगती है।

numpy के साथ

, आप अपने डेटा

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

के लिए एक सरणी बना सकते हैं और सरणियों के साथ काम के रूप में यदि वे सरल संख्या

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

असल में, आप वास्तव में क्या चाहते हैं 'np.diff (ए)/np.abs (a [: - 1]) * 100.'। इसके अलावा, 0 में एक आइटम 0 हो सकता है, इसलिए 0 त्रुटि से विभाजित होने से बचने के लिए आप कुछ ऐसा करना चाहेंगे जैसे 'a [a == 0] = 0.000000001' –