Python代码未按预期工作

Python代码未按预期工作,python,pandas,numpy,Python,Pandas,Numpy,我在两周前开始学习Python 我想做一个函数来计算数据的7天移动平均值。有点不对劲,所以我在没有功能的情况下试了一下 moving_average = np.array([]) i = 0 for i in range(len(temp)-6): sum_7 = np.array([]) avg_7 = 0 missing = 0 total = 7 j = 0 for j in range(i,i+7):

我在两周前开始学习Python

我想做一个函数来计算数据的7天移动平均值。有点不对劲,所以我在没有功能的情况下试了一下

moving_average = np.array([])
i = 0
for i in range(len(temp)-6):
    sum_7 = np.array([])
    avg_7 = 0    
    missing = 0    
    total = 7    
    j = 0    
    for j in range(i,i+7):    
        if pd.isnull(temp[j]):    
            total -= 1    
            missing += 1    
        if missing == 7:    
            moving_average = np.append(moving_average, np.nan)    
            break    
    if not pd.isnull(temp[j]):    
        sum_7 = np.append(sum_7, temp[j])    
    if j == (i+6):    
        avg_7 = sum(sum_7)/total    
        moving_average = np.append(moving_average, avg_7)
如果我运行它并查看
sum_7
的值,它只是numpy数组中的一个值,这使得所有的
移动平均值都是错误的。但是,如果我用变量
I
删除第一个
for
循环,并手动设置
I=0
或数据集范围内的任何数字,然后从内部for循环运行完全相同的代码,
sum_7
将显示为长度为7 numpy的数组。最初,我只是做了
sum+=temp[j]
,但同样的问题发生了,总的总和最终只是一个值

我已经盯着它看了3个小时,试图修复它,我不知道是什么问题。最初我是用R编写函数的,所以我所要做的就是转换成python语言,我不知道为什么当有两个for循环时,
sum_7
会作为一个值出现。我试图手动添加一个索引变量作为
I
来在
范围(I,I+7)
中使用它,但得到了一些奇怪的错误。我也不知道这是为什么

嘿,您可以使用pandas的rolling()函数和mean()函数。 链接到文档:

这也会给你一些NaN值,但这是滚动平均值的一部分,因为你没有前6个值的所有过去7个数据点。

嘿,你可以使用pandas中的滚动()函数和平均()函数。 链接到文档:


这也会给你一些NaN值,但这是滚动平均值的一部分,因为你没有前6个值的所有过去7个数据点。

似乎你误解了重要的一行:

moving_average = np.array([])
i = 0
for i in range(len(temp)-6):
    sum_7 = np.array([])
    avg_7 = 0    
    missing = 0    
    total = 7    
    j = 0    
    for j in range(i,i+7):    
        if pd.isnull(temp[j]):    
            total -= 1    
            missing += 1    
        if missing == 7:    
            moving_average = np.append(moving_average, np.nan)    
            break    
    # The following condition should be indented one more level
    if not pd.isnull(temp[j]):
        sum_7 = np.append(sum_7, temp[j])
    #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    if j == (i+6):
        # this ^ condition does not do what you meant 
        # you should use a flag instead
        avg_7 = sum(sum_7)/total    
        moving_average = np.append(moving_average, avg_7)
您可以使用for else构造来代替标志,但这是不可读的。给你


实现此目的的较短方法:

moving_average = np.array([])
for i in range(len(temp)-6):
    ngram_7 = [t for t in temp[i:i+7] if not pd.isnull(t)]
    average = (sum(ngram_7) / len(ngram_7)) if ngram_7 else np.nan
    moving_average = np.append(moving_average, average)
这可以进一步重构:

def average(ngram):
    valid = [t for t in temp[i:i+7] if not pd.isnull(t)]
    if not valid:
        return np.nan
    return sum(valid) / len(valid)

def ngrams(seq, n):
    for i in range(len(seq) - n):
        yield seq[i:i+n]

moving_average = [average(k) for k in ngrams(temp, 7)]

似乎你误解了重要的一句话:

moving_average = np.array([])
i = 0
for i in range(len(temp)-6):
    sum_7 = np.array([])
    avg_7 = 0    
    missing = 0    
    total = 7    
    j = 0    
    for j in range(i,i+7):    
        if pd.isnull(temp[j]):    
            total -= 1    
            missing += 1    
        if missing == 7:    
            moving_average = np.append(moving_average, np.nan)    
            break    
    # The following condition should be indented one more level
    if not pd.isnull(temp[j]):
        sum_7 = np.append(sum_7, temp[j])
    #^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    if j == (i+6):
        # this ^ condition does not do what you meant 
        # you should use a flag instead
        avg_7 = sum(sum_7)/total    
        moving_average = np.append(moving_average, avg_7)
您可以使用for else构造来代替标志,但这是不可读的。给你


实现此目的的较短方法:

moving_average = np.array([])
for i in range(len(temp)-6):
    ngram_7 = [t for t in temp[i:i+7] if not pd.isnull(t)]
    average = (sum(ngram_7) / len(ngram_7)) if ngram_7 else np.nan
    moving_average = np.append(moving_average, average)
这可以进一步重构:

def average(ngram):
    valid = [t for t in temp[i:i+7] if not pd.isnull(t)]
    if not valid:
        return np.nan
    return sum(valid) / len(valid)

def ngrams(seq, n):
    for i in range(len(seq) - n):
        yield seq[i:i+n]

moving_average = [average(k) for k in ngrams(temp, 7)]


你能给出代码的其他相关部分吗?在您的示例中,变量
temp
未初始化。在
for
循环中使用
i
j
之前设置它们的值是没有意义的。您平均的数据是哪种类型的?此外,如果j==(i+6):
测试将始终为真。如果j==(I+6),我有最后一条语句,因为我希望它只在for循环的最后一次迭代中计算总和和平均值。temp变量是数据框的一列。您能给出代码的其他相关部分吗?在您的示例中,变量
temp
未初始化。在
for
循环中使用
i
j
之前设置它们的值是没有意义的。您平均的数据是哪种类型的?此外,如果j==(i+6):测试将始终为真。如果j==(I+6),我有最后一条语句,因为我希望它只在for循环的最后一次迭代中计算总和和平均值。temp变量是数据框的一列。此答案不完整。请提供更多的上下文。哦,这很好。谢谢你的提醒。现在我只想知道为什么上面提到的代码没有按预期工作。嘿@Skywind555你能给我们看看你的数据帧吗?如果要计算特定列的移动平均值,则必须指定它。moving_avg=df['your_column'].rolling(7).mean()此时我不关心计算移动平均值,这只是代码的上下文。我想知道的是,为什么在一个屏幕截图中,输出没有给出我想要的,而另一个屏幕截图中的for循环少了一个,手动指定变量。我不明白为什么,我想知道为什么。知道为什么会有助于我理解和提高我对蟒蛇的整体理解这个答案并不完整。请提供更多的上下文。哦,这很好。谢谢你的提醒。现在我只想知道为什么上面提到的代码没有按预期工作。嘿@Skywind555你能给我们看看你的数据帧吗?如果要计算特定列的移动平均值,则必须指定它。moving_avg=df['your_column'].rolling(7).mean()此时我不关心计算移动平均值,这只是代码的上下文。我想知道的是,为什么在一个屏幕截图中,输出没有给出我想要的,而另一个屏幕截图中的for循环少了一个,手动指定变量。我不明白为什么,我想知道为什么。知道为什么会有助于我理解和提高我对蟒蛇的整体理解,因为它的行为和它应该做的一样。。。我复制粘贴了这个,它运行完全相同。如果我看一下和7,它的长度仍然是1,这导致移动平均计算单个值的平均值,而它应该同时计算7个值的平均值。如果你看看我贴在上面的截图,那就是我的问题。为什么一个例子的长度是7,另一个例子的长度是1谢谢你,我没有捕捉到可以解决所有问题的缩进误差。我明天醒来时会读你关于如何改善的建议这让我整晚睡到早上8点。因为它的行为相同,它没有做它应该做的事情。。。我复制粘贴了这个,它运行完全相同。如果我看一下和7,它的长度仍然是1,这导致移动平均计算单个值的平均值,而它应该同时计算7个值的平均值。如果你看看我贴在上面的截图,那就是我的问题。为什么有一个例子,我的长度是7