我写了一个简单的滚动平均函数,效果很好。我也不想使用像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方法。我有一点大脑冻结,我最有凝聚力的尝试是三行评论,但它跳过一个值。
答案 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-1
与i >= period-1
的特定逻辑。以这种方式构建你的逻辑。nums = data[i-period:i]
以使您能够捕获3个值的所有分组。一旦您对此解决方案感到满意,您可能希望了解其他实施方案,例如: itertools
,numpy
,pandas
。
答案 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.deque
与maxlen=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]