我开始学习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)
中使用它,但却得到了一些奇怪的错误。我也不知道为什么会这样。
答案 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)]