Python 熊猫-无法计算移动平均线

Python 熊猫-无法计算移动平均线,python,python-3.x,pandas,Python,Python 3.x,Pandas,我尝试按照本教程计算SMA: 我想得到所有值的SMA,但我只得到5。在我想要获取值的框架中有17个值。如果我增加滚动窗口,我就不会得到SMA的任何值,这是为什么 谢谢你的帮助,因为我刚接触熊猫 def example(self): frame = {'date': ['2017-06-19', '2017-06-16', '2017-06-15', '2017-06-14', '2017-06-13', '2017-06-12', '2017-06-09', '2017-06-0

我尝试按照本教程计算SMA:

我想得到所有值的SMA,但我只得到5。在我想要获取值的框架中有17个值。如果我增加滚动窗口,我就不会得到SMA的任何值,这是为什么

谢谢你的帮助,因为我刚接触熊猫

    def example(self):
    frame = {'date': ['2017-06-19', '2017-06-16', '2017-06-15', '2017-06-14', '2017-06-13', '2017-06-12', '2017-06-09', '2017-06-08', '2017-06-07', '2017-06-06', '2017-06-05', '2017-06-02', '2017-06-01', '2017-05-31'], 'indexes': ['146.3400', '142.2700', '144.2900', '145.1600', '146.5900', '145.4200', '148.9800', '154.9900', '155.3700', '154.4500', '153.9300', '155.4500', '153.1800', '152.7600']}

    df = pd.DataFrame(frame)
    df['SMA'] = df.iloc[:, 1].rolling(window=4).mean()
    print(df.head())
输出:

         date   indexes     SMA
0  2017-06-19  146.3400       NaN
1  2017-06-17  142.2700       NaN
2  2017-06-16  144.2900       NaN
3  2017-06-15  145.1600  144.5150
4  2017-06-14  146.5900  144.5775

计算移动平均值时,需要对其进行
n
采样,这是移动窗口的大小。因为您已经设置了
window=4
,所以需要4个样本来计算平均值。也就是说,这些
NaN
值只是表明,在这一点上,没有足够的数据来计算窗口大小为4的MA。

计算移动平均值时,需要对其进行
n
采样,即移动窗口的大小。因为您已经设置了
window=4
,所以需要4个样本来计算平均值。也就是说,这些
NaN
值只是表明,在这一点上,没有足够的数据来计算窗口大小为4的MA。

解决方案 如果必须始终使用窗口4计算滚动平均值,则需要使用
'NA'
删除结果。但是,如果您想要的只是在没有足够的观测值时计算滚动平均值,那么可以使用类似于
df[column\u name].rolling(window=4,min\u periods=1)
的方法。但请注意,这不是正确的滚动平均值。这里有一个例子

例子
#虚拟数据
df=pd.DataFrame(日期,列=['Date']))
df['Counts']=[16,6,8,5,15,7]
#计算最小优先级为1的滚动平均值
df['rolling_mean']=df.Counts.rolling(窗口=4,最小周期=1).mean()
打印(df)
输出

日期计数滚动平均值
0 2020-01-01      16         16.00
1 2020-01-02       6         11.00
2 2020-01-03       8         10.00
3 2020-01-04       5          8.75
4 2020-01-05      15          8.50
5 2020-01-06       7          8.75
正在删除
NA
df.Counts.rolling(窗口=4.mean().dropna())
##输出
# 3    8.75
# 4    8.50
# 5    8.75
#名称:计数,数据类型:float64
NA
值替换为某些首选值 比方说,您想用
0
替换所有
NA
值。这是你需要做的

df.Counts.rolling(窗口=4.mean().fillna(0)
##输出
# 0    0.00
# 1    0.00
# 2    0.00
# 3    8.75
# 4    8.50
# 5    8.75
#名称:计数,数据类型:float64
解决方案 如果必须始终使用窗口4计算滚动平均值,则需要使用
'NA'
删除结果。但是,如果您想要的只是在没有足够的观测值时计算滚动平均值,那么可以使用类似于
df[column\u name].rolling(window=4,min\u periods=1)
的方法。但请注意,这不是正确的滚动平均值。这里有一个例子

例子
#虚拟数据
df=pd.DataFrame(日期,列=['Date']))
df['Counts']=[16,6,8,5,15,7]
#计算最小优先级为1的滚动平均值
df['rolling_mean']=df.Counts.rolling(窗口=4,最小周期=1).mean()
打印(df)
输出

日期计数滚动平均值
0 2020-01-01      16         16.00
1 2020-01-02       6         11.00
2 2020-01-03       8         10.00
3 2020-01-04       5          8.75
4 2020-01-05      15          8.50
5 2020-01-06       7          8.75
正在删除
NA
df.Counts.rolling(窗口=4.mean().dropna())
##输出
# 3    8.75
# 4    8.50
# 5    8.75
#名称:计数,数据类型:float64
NA
值替换为某些首选值 比方说,您想用
0
替换所有
NA
值。这是你需要做的

df.Counts.rolling(窗口=4.mean().fillna(0)
##输出
# 0    0.00
# 1    0.00
# 2    0.00
# 3    8.75
# 4    8.50
# 5    8.75
#名称:计数,数据类型:float64

谢谢,所以除非使用window=1,否则无法获取今天的移动平均值?如果我用1,那它就没用了?如何增加行数?移动平均值依赖于样本的移动窗口。要使其正常工作,您确实需要指定给移动窗口的采样数。您可以编写某种脚本,使用较少的样本为这些
NaN
数据生成值,但这样它们就不会完全是移动平均值。是的,移动窗口大小为1是非常无用的,因为它引用了最新值的副本。要增加行数,可能需要更多数据。我不知道您显示的是什么数据,也不知道它来自何处,因此我无法帮助您获取更多数据。谢谢,因此除非使用window=1,否则无法获取今天的移动平均值?如果我用1,那它就没用了?如何增加行数?移动平均值依赖于样本的移动窗口。要使其正常工作,您确实需要指定给移动窗口的采样数。您可以编写某种脚本,使用较少的样本为这些
NaN
数据生成值,但这样它们就不会完全是移动平均值。是的,移动窗口大小为1是非常无用的,因为它引用了最新值的副本。要增加行数,可能需要更多数据。我不知道您显示的是什么数据,也不知道它来自何处,因此我无法帮助您获取更多数据。@brodude请查看此选项。嗨!非常感谢你的解释。我会把它作为解决方案,但加布里埃尔给了我正确的方向,我已经把他的答案作为解决方案。再次感谢您的长期友好合作walktrough@brodude没问题。但是,如果看到任何答案的优点,请考虑投票给他们。另外,请注意,Stackoverflow支持在任何时间点对最佳答案进行向上投票。作为问题的作者,你是法官