编辑:看来SciKits(补充SciPy的附加工具包)的scikits.timeseries.lib.moving_funcs子模块中的
mov_average_expw()功能更适合您的问题的措辞。
要使用平滑因子来计算数据的指数平滑
alpha(
(1- alpha)用Wikipedia的术语):
>>> 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
上面的代码并不漂亮,所以让我们对其进行重构:
from collections import namedtuplefrom operator import itemgetterdef 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))
例:
$ python26 smooth.pyIQData(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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)