Python-本年度3个月移动平均数

Python-本年度3个月移动平均数,python,average,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(): ave

基本上,我创建了一个函数,可以显示以下输出:

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)
带索引的循环

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)
有更好的方法可以用发电机来实现这一点,但为了保持简短,这是可行的


更新:对于基于生成器的解决方案,您可以使用我称之为滑动窗口的术语,该术语取自网络

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)

根据你发布的内容,我将把它简化为如下所示

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循环

还有一个关于平均值计算器的旁注:
这个函数中的强制转换是不必要的,因为我假设sum将是一个浮点数。我写它也是为了模仿你正在做的事情。但是//是python中的floor division运算符-9//2=4这意味着函数将始终返回int,即使将其转换为float,它也将变为9.0//2.0=4.0。我不完全确定你在程序中做了什么,但以防万一你不知道,因为它看起来像是你想要一个浮点数来打印
9.32
之类的东西。要返回浮点除法结果,可以在Python2中强制转换为浮点,或者只使用Python3中的普通除法运算符。(您也可以从python 2中的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

此代码:

    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\u calculator()
计算每个平均值,然后打印每个平均值。我使用if报表来说明过去3个月的情况,因为此打印报表与其他报表不同


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

虽然我没有python的背景,一般都是重复的,但是你可以把它放在某种循环中,通过编码RainValue的开始和结束索引,你希望将其平均化为变量,而不是硬编码的常量。因此,我们不应该看到像
rainValue[7:10]
这样的东西,而应该看到像
rainValue[startIndex:stopIndex]
这样的东西,其中
startIndex
stopIndex
是程序控制下的变量。它们可以在一个循环中自动增加。感谢您的帮助:)了解如何减少代码以及代码如何工作真的很有帮助!没问题,如果你觉得我能完全解释这个过程并完全回答你的问题,就把它标记为最好的答案。