2012-04-19 31 views
5

Tôi có một danh sách các số dấu phẩy động và tôi muốn tạo một danh sách các khoảng thời gian khác từ danh sách đầu tiên của tôi.Whats cách nhiều nhất để tính toán thay đổi phần trăm trên danh sách các số

Đây là một hoạt động của các nhà máy thực hiện (không kiểm tra - và rõ ràng là không có lỗi kiểm tra/xử lý):

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] 

Có cách nào pythonic hơn để làm điều này - có lẽ sử dụng danh sách hiểu biết và bản đồ?

+1

đầu ra mong muốn là gì? –

+0

@RomanBodnarchuk: Tôi đã cập nhật câu hỏi với kết quả mong đợi –

+0

xem cập nhật câu trả lời. –

Trả lời

10

Ở đây bạn đi:

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

Vì bạn muốn so sánh các yếu tố hàng xóm của một danh sách, bạn nên tạo một danh sách các cặp bạn quan tâm, như thế này:

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

Sau đó nó chỉ là một phép toán đơn giản để trích xuất phần trăm thay đổi từ một cặp số.

+0

Bạn có biết thuật ngữ này hoặc bạn đã giải mã từ mã của mình không? – Abhijit

+0

@Abhijit hơi :) Chỉ cần ánh xạ đầu vào cho đầu ra :) –

+0

Chỉ là một FYI thông thường, điều này không thành công với phân chia bằng 0 nếu bất kỳ số nào bằng 0. – mikkom

15

Tôi không biết danh sách số lượng của bạn sẽ lớn như thế nào, nhưng nếu bạn định xử lý một số lượng lớn các con số, bạn nên có cái nhìn gọn gàng. Tác dụng phụ là các phép tính trông đơn giản hơn rất nhiều.

Với NumPy, bạn tạo một mảng cho dữ liệu của bạn

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

và làm việc với các mảng như thể chúng là con số đơn giản

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

Thực ra, những gì bạn thực sự muốn là 'np.diff (a)/np.abs (a [: - 1]) * 100.'. Hơn nữa, một mục trong một có thể là 0, vì vậy để tránh chia cho 0 lỗi bạn có thể muốn làm một cái gì đó như 'a [a == 0] = 0.000000001' –

Các vấn đề liên quan