简单滚动平均值 - 前几个值

时间:2018-04-02 19:03:06

标签: python arrays python-2.7 average

我写了一个简单的滚动平均函数,效果很好。我也不想使用像numpy或pandas这样的外部库,只是你知道。

def get_rolling_average(data, period):

  rolling = []
  for i in range (0, len(data)):

    end = i + period
    nums = data[i:end]

   # if i < (period-1):
   # nums = data[0:i+1]
   # rolling.append(mean(nums))

    if len(nums) == period:
      rolling.append(mean(nums))

  return rolling

def round_nicely(num, places):
  return round(num, places)

def mean(lst):
  summ = sum(lst[0:len(lst)])
  summ = float(summ)
  return round_nicely(summ/len(lst),1)


print("Rolling average!")

xl = [45, 51, 73, 82, 76, 56, 57, 78, 89, 59]
print get_rolling_average(xl, 3)

结果为

Rolling average!
[56.3, 68.7, 77.0, 71.3, 63.0, 63.7, 74.7, 75.3]

但是,如果它们小于句点,我想要包含前几个值。在这个例子中,它只有45&amp; 48.

Rolling average!
[45.0, 48.0, 56.3, 68.7, 77.0, 71.3, 63.0, 63.7, 74.7, 75.3]

 where
 (45)/1 = 45.0
 (45 + 51)/2 = 48.0

我不确定最常用的Pythonic方法。我有一点大脑冻结,我最有凝聚力的尝试是三行评论,但它跳过一个值。

2 个答案:

答案 0 :(得分:1)

你很亲密。尝试修改现有功能,如下所示。

def get_rolling_average(data, period):

  rolling = []

  for i in range (0, len(data)):

    nums = data[i-period+1:i+1]

    if i < period-1:
      rolling.append(mean(data[:i+1]))

    if (i >= period-1) and (len(nums) == period):
      rolling.append(mean(nums))

  return rolling

返回:

[45.0, 48.0, 56.3, 68.7, 77.0, 71.3, 63.0, 63.7, 74.7, 75.3]

<强>解释

  • 您需要i < period-1i >= period-1的特定逻辑。以这种方式构建你的逻辑。
  • 定义nums = data[i-period:i]以使您能够捕获3个值的所有分组。

一旦您对此解决方案感到满意,您可能希望了解其他实施方案,例如: itertoolsnumpypandas

答案 1 :(得分:0)

执行此操作的一种方法是将itertools chain多个标记值用于原始列表的3路tee,例如:

In []:
xl = [45, 51, 73, 82, 76, 56, 57, 78, 89, 59]
ts = [it.chain([0]*c, t) for c, t in enumerate(it.tee(xl, 3))]
[sum(x)/sum(1 for i in x if i) for x in it.zip_longest(*ts, fillvalue=0)]

Out[]:
[45.0,
 48.0,
 56.333333333333336,
 68.66666666666667,
 77.0,
 71.33333333333333,
 63.0,
 63.666666666666664,
 74.66666666666667,
 75.33333333333333,
 74.0,
 59.0]

如果0是列表中的有效值,那么您可以使用另一个标记并明确地filter出来。

或者,您可以将collections.dequemaxlen=3一起使用,例如:

In []:
from collections import deque

d = deque(maxlen=3)
r = []
for x in xl:
    d.append(x)
    r.append(sum(d)/len(d))
for _ in range(len(d)-1):
    d.popleft()
    r.append(sum(d)/len(d))
r

Out[]:
[45.0,
 48.0,
 56.333333333333336,
 68.66666666666667,
 77.0,
 71.33333333333333,
 63.0,
 63.666666666666664,
 74.66666666666667,
 75.33333333333333,
 74.0,
 59.0]