python求移动平均_在python中计算指数移动平均值

I have a range of dates and a measurement on each of those dates. I'd like to calculate an exponential moving average for each of the dates. Does anybody know how to do this?

I'm new to python. It doesn't appear that averages are built into the standard python library, which strikes me as a little odd. Maybe I'm not looking in the right place.

So, given the following code, how could I calculate the moving weighted average of IQ points for calendar dates?

from datetime import date

days = [date(2008,1,1), date(2008,1,2), date(2008,1,7)]

IQ = [110, 105, 90]

(there's probably a better way to structure the data, any advice would be appreciated)

解决方案

EDIT:

It seems that mov_average_expw() function from scikits.timeseries.lib.moving_funcs submodule from SciKits (add-on toolkits that complement SciPy) better suits the wording of your question.

To calculate an exponential smoothing of your data with a smoothing factor alpha (it is (1 - alpha) in Wikipedia's terms):

>>> alpha = 0.5

>>> assert 0 < alpha <= 1.0

>>> av = sum(alpha**n.days * iq

... for n, iq in map(lambda (day, iq), today=max(days): (today-day, iq),

... sorted(zip(days, IQ), key=lambda p: p[0], reverse=True)))

95.0

The above is not pretty, so let's refactor it a bit:

from collections import namedtuple

from operator import itemgetter

def smooth(iq_data, alpha=1, today=None):

"""Perform exponential smoothing with factor `alpha`.

Time period is a day.

Each time period the value of `iq` drops `alpha` times.

The most recent data is the most valuable one.

"""

assert 0 < alpha <= 1

if alpha == 1: # no smoothing

return sum(map(itemgetter(1), iq_data))

if today is None:

today = max(map(itemgetter(0), iq_data))

return sum(alpha**((today - date).days) * iq for date, iq in iq_data)

IQData = namedtuple("IQData", "date iq")

if __name__ == "__main__":

from datetime import date

days = [date(2008,1,1), date(2008,1,2), date(2008,1,7)]

IQ = [110, 105, 90]

iqdata = list(map(IQData, days, IQ))

print("\n".join(map(str, iqdata)))

print(smooth(iqdata, alpha=0.5))

Example:

$ python26 smooth.py

IQData(date=datetime.date(2008, 1, 1), iq=110)

IQData(date=datetime.date(2008, 1, 2), iq=105)

IQData(date=datetime.date(2008, 1, 7), iq=90)

95.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值