Python代码无法按预期工作

时间:2017-10-26 09:35:05

标签: python pandas numpy

我开始学习Python< 2周前。

我试图创建一个函数来计算数据的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数组中的一个值,它使所有moving_average值都错误。但是,如果我使用变量for删除第一个i循环并手动设置i = 0或数据集范围内的任何数字,并从内部for循环运行完全相同的代码, sum_7以长7个numpy数组出现。最初,我刚刚做sum += temp[j]但是发生了同样的问题,总和最终只是单个值。

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

https://gyazo.com/d900d1d7917074f336567b971c8a5cee

https://gyazo.com/132733df8bbdaf2847944d1be02e57d2

2 个答案:

答案 0 :(得分:2)

嘿,你可以使用pandas中的rolling()函数和mean()函数。 链接到文档: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.rolling.html

CMake Error: Error required internal CMake variable not set, cmake may not be built correctly.
Missing variable is:
CMAKE_Cxx_LINK_EXECUTABLE
CMake Error: Cannot determine link language for target "spectogram".
CMake Error: CMake can not determine linker language for target: spectogram

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

答案 1 :(得分:1)

好像你错过了重要的一句话:

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 构造而不是标志,但这不可读。这是the relevant documentation

更短的方法:

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)]