Python - 全年3个月移动平均线

时间:2014-11-09 21:30:30

标签: python average

基本上我创建了一个允许我显示以下输出的函数:

Jan - Mar 24.00
Feb - Apr 25.00
Mar - May 26.00
Apr - Jun 27.00
May - Jul 28.00
Jun - Aug 29.00
Jul - Sep 30.00
Aug - Oct 31.00
Sep - Nov 32.00
Oct - Dec 44.00

我做了以下功能,但我觉得它太大了。请问我可以帮助减少这个尺寸吗?所有这些值都存储在列表中。

def movingMean():
    average = sum(rainValues[0:3])
    finalavg = float(average)//3
    print(months[0],"-",months[2],"%.2f" %finalavg)

    average = sum(rainValues[1:4])
    finalavg = float(average)//3
    print(months[1],"-",months[3],"%.2f" %finalavg)

    average = sum(rainValues[2:5])
    finalavg = float(average)//3
    print(months[2],"-",months[4],"%.2f" %finalavg)

    average = sum(rainValues[3:6])
    finalavg = float(average)//3
    print(months[3],"-",months[5],"%.2f" %finalavg)

    average = sum(rainValues[4:7])
    finalavg = float(average)//3
    print(months[4],"-",months[6],"%.2f" %finalavg)

    average = sum(rainValues[5:8])
    finalavg = float(average)//3
    print(months[5],"-",months[7],"%.2f" %finalavg)

    average = sum(rainValues[6:9])
    finalavg = float(average)//3
    print(months[6],"-",months[8],"%.2f" %finalavg)

    average = sum(rainValues[7:10])
    finalavg = float(average)//3
    print(months[7],"-",months[9],"%.2f" %finalavg)

    average = sum(rainValues[8:11])
    finalavg = float(average)//3
    print(months[8],"-",months[10],"%.2f" %finalavg)

    average = sum(rainValues[9:])
    finalavg = float(average)//3
    print(months[9],"-",months[11],"%.2f" %finalavg)

2 个答案:

答案 0 :(得分:2)

根据您发布的内容,我会将其简化为类似的内容。

def movingMean(): 
    #Assuming python3, use xrange in python 2
    #Generate numbers 0 - 9
    for x in range(0, 10):
        #Hardcoding 9 because you are dealing with dates and this won't change
        if x == 9:
            average = average_calculator(rainValues[x:])
            print(months[x],"-",months[],"%.2f" %average)
        else:
            average = average_calculator(rainValues[x:x+3])
            print(months[x],"-",months[x+3],"%.2f" %average)


    #Function assumes you are passing float into it, returns an int as it is
def average_calculator(sum):
    return sum // 3

在查看您发布的代码时,它只执行2项操作,1 - 计算平均值,2 - 打印平均值。所以我将程序拆分为一个可重用的函数来计算平均值和一个带有print语句的for循环。

也只是关于average_calculator的旁注:
这个函数内部的转换是不必要的,因为我假设sum将是一个浮点数。我也写它来模仿你正在做的事情。然而//是python中的floor division运算符 - 9 // 2 = 4这意味着该函数将始终返回一个int,即使你将它转换为float也将变为9.0 // 2.0 = 4.0。我不完全确定你在你的程序中做了什么,但是如果你不知道,因为看起来你想要一个像9.32之类的打印浮动。要返回浮点除法结果,可以在Python 2中转换为浮点数,或者只使用Python 3中的常规除法运算符。(您也可以在python 2中从__future__导入)

此代码:

    average = sum(rainValues[0:3])
    finalavg = float(average)//3

成为对average_calculator的调用,如下所示:

average_calculator(sum(rainValues[0:3]))

这会返回一个表示计算出的平均值的浮点数,但不是为每个月份重复此代码,而是使用变量,因此可以重复使用。

然后你的打印语句如下所示:

print(months[0],"-",months[2],"%.2f" %finalavg)

一般来说,硬编码这样的数字是不好的做法,尽管这取决于你自己的判断,因为它们是几个月,无论如何都会有12个月。

我用这个替换了你的打印语句:

#Assuming python3, use xrange in python 2
#Generate numbers 0 - 9
for x in range(0, 10):
    #Hardcoding 9 because you are dealing with dates and this won't change
    if x == 9:
        average = average_calculator(rainValues[x:])
        print(months[x],"-",months[],"%.2f" %average)
    else:
        average = average_calculator(rainValues[x:x+3])
        print(months[x],"-",months[x+3],"%.2f" %average)

以便通过更改x的值来循环,使用average_calculator()调用计算每个平均值并打印每个平均值。我使用if语句来说明过去3个月,因为这个打印语句与其他所有语句不同。

我无法测试此代码,因为您发布的代码不完整且没有数据集,但我相信这应该可以正常工作,如果您有任何问题请告诉我。

答案 1 :(得分:0)

循环索引

for i in range(len(rainValues)-2):
    average = sum(rainValues[i:i+3]) // 3
    print(months[i],"-",months[i+2],"%.2f" % average)

虽然您应该意识到// 3除以int,并且在点之后总是有两个0。另外,格式是首选。

for i in range(len(rainValues - 2)):
    average = sum(rainValues[i:i+3]) / 3
    print("{} - {} {:.2f}".format(months[i], months[i+2], average)

使用生成器有更好的方法可以做到这一点,但为了保持这一点,这是有效的。


更新:对于基于生成器的解决方案,您可以使用我称之为 sliding_window 的术语来自网络。

import itertools

def sliding_window(iterable, win_sz):
    for i in itertools.count():
        ret = iterable[i:i+win_sz]
        if len(ret) != win_sz: break
        yield ret

然后可以使用3作为窗口大小。如果你想要,你也可以将大小作为函数的参数,并提供不同长度的平均值。

for vals in sliding_window(rainValues, 3):
    average = sum(vals) / len(vals)
    print(average)