当前位置: 首页 > 面试题库 >

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

胡志
2023-03-14
问题内容

我有一个日期范围,并且每个日期都有一个度量值。我想计算每个日期的指数移动平均值。有人知道怎么做这个吗?

我是python的新手。似乎没有将平均值内置到标准python库中,这让我感到有些奇怪。也许我找的地方不对。

因此,给定以下代码,如何计算日历日期的IQ点的移动加权平均值?

from datetime import date
days = [date(2008,1,1), date(2008,1,2), date(2008,1,7)]
IQ = [110, 105, 90]

(可能是一种更好的数据结构方式,任何建议将不胜感激)


问题答案:

编辑:看来SciKits(补充SciPy的附加工具包)的scikits.timeseries.lib.movi​​ng_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 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))

例:

$ 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


 类似资料:
  • 公式链接:https://sciencing.com/calculate-exponential-moving-averages-8221813.html

  • 问题内容: 美好的一天, 我正在使用以下代码来计算9天移动平均线。 但这是行不通的,因为它会在调用限制之前先计算所有返回的字段。换句话说,它将计算该日期之前或等于该日期的所有关闭时间,而不仅仅是最后9个。 因此,我需要从返回的选择中计算出SUM,而不是直接计算出来。 IE浏览器 从SELECT中选择SUM … 现在我将如何去做,这是非常昂贵的还是有更好的方法? 问题答案: 使用类似 内查询返回的所

  • 问题内容: 假设我有一个清单: 我想创建一个计算n天移动平均值的函数。所以如果是5,我希望我的代码计算第一个1-5,将其相加并找到平均值,即3.0,然后继续计算2-6,计算平均值,即4.0,然后3- 7、4-8、5-9、6-10。 我不想计算前n-1天,因此从第n天开始,它将计算前几天。 这似乎可以打印出我想要的内容: 但是,我不知道如何计算这些列表中的数字。有任何想法吗? 问题答案: 旧版本的P

  • 我使用基本的过滤器平滑一些数据: 出于某些原因,我想每X(=8)步做一次。事实是,就目前而言,我不知道如何计算每8°输入的值。我仍然在处理每个输入,并且只“存储”8°。 您将如何“节省CPU”避免在每一步计算它?是否有一个系列,我可以提前计算8°值? 这是我的实际代码(每一步都很平滑): 我想避免将“while的7个步骤”变成一个独特的操作。有可能吗?

  • 问题内容: 我基本上有一个像这样的值数组: 上面的数组过于简化,我在实际代码中每毫秒收集1个值,我需要使用编写的算法处理输出,以找到某个时间点之前最接近的峰值。我的逻辑失败了,因为在上面的示例中,它是真正的峰值,但是我的算法会向后看,并看到最后一个数字是峰值,因为之前的数值减少了。 目标是获取这些值,并对它们应用一种算法,该算法将使它们“平滑”一些,以便获得更多的线性值。(即:我希望自己的成绩是弯

  • 我正在尝试检索大型数据集(15000个值)的最后一个EMA。这是一个非常消耗资源的算法,因为每个值都依赖于前一个值。这是我的代码: 我已经做了什么: 隔离$k,因此不会计算10000次 仅保留最新计算的EMA,而不是将所有EMA都保留在一个数组中 使用for()而不是foreach() $data[]数组没有键;这是一个基本阵列 这使我能够将15000个值的执行时间从2000ms减少到500ms左