2011-03-30 60 views
4

我有一些基于每日收盘价的股票数据。我需要能够将这些值插入到python列表中,并获得最后30次关闭的中间值。有没有这样做的Python库?蟒蛇的滚动中位数

+0

http://code.activestate.com/recipes/577059-running-median/ – syrion 2011-03-30 12:29:25

+0

做最后29个值的中位数会更有效。如果30是一个任意的选择,那么如果选择奇数窗口大小,则可以避免必须计算中间值的平均值。 – 2011-03-30 12:54:28

+0

这就是为什么有一个专门的库很好,所以我不必操纵我的偏好,因为担心我的算法中存在一个错误。它看起来像熊猫处理任意时间间隔和时间戳数据。太好了! – yueerhu 2011-03-30 13:03:35

回答

4

你有没有考虑pandas?它基于numpy,并且可以自动将时间戳与您的数据相关联,并且只要您填写numpy.nan即可丢弃任何未知日期。它还通过matplotlib提供了一些非常强大的图形。

基本上它是为python中的财务分析而设计的。

+3

不错:http://pandas.sourceforge.net/generated/pandas.stats.api.rolling_median.html?highlight=median#pandas.stats.api.rolling_median – 2011-03-30 12:45:01

9

在纯Python,具有在Python列表a你的数据,你可以做

median = sum(sorted(a[-30:])[14:16])/2.0 

(假设a至少有30项。)

使用NumPy的包,你可以使用

median = numpy.median(a[-30:]) 
2

是不是中位值在一个有序范围内?

因此,假设您的列表是stock_data

last_thirty = stock_data[-30:] 
median = sorted(last_thirty)[15] 

现在,你只需要得到发现并修复该关闭的情况的一个错误,也处理的stock_data小于30元的情况下...

让我们试着在这里一点:

def rolling_median(data, window): 
    if len(data) < window: 
     subject = data[:] 
    else: 
     subject = data[-30:] 
    return sorted(subject)[len(subject)/2] 
+1

对于具有偶数个值的列表,中位数是两个中间值的平均值。 – 2011-03-30 12:39:13