Python dataframe:过去一年数据的标准差
Python dataframe: Standard deviation of last one year of data
我有 dataframe df
,其中包含 10 年的每日股市,其中包含列 Date
、Open
、Close
。
我想计算 close
价格的每日标准差。为此,数学公式为:
第 1 步:计算 Close
的日间变化
Step2:接下来,计算最近1年数据的每日日间变化(从Step1计算)的每日标准差
目前,我已经按照下面的代码弄清楚了Step1。 Interday_Close_change
列计算每一行与一天前数值的差值
df = pd.DataFrame(data, columns=columns)
df['Close_float'] = df['Close'].astype(float)
df['Interday_Close_change'] = df['Close_float'].diff()
df.fillna('', inplace=True)
问题:
(一)。我如何获得一列 Daily_SD
来计算最近 252 天(即 1 年的交易日)的标准差?在 Excel 上,我们有公式 STDEV.S()
来执行此操作。
(b)。 Daily_SD
应该从数据的第 252 行开始,因为那时数据将有 252 个数据点可供计算。我如何实现这一点?
您似乎在尝试计算滚动标准偏差,滚动 window 由之前的 252 行组成。
Pandas有很多.rolling()
methods,其中一个为标准差:
df['Daily_SD'] = df['Interday_Close_change'].rolling(252).std().shift()
如果可用于计算标准偏差的行少于 252 行,则该行的结果将为空值 (NaN
)。想一想你是否真的想应用 .fillna('')
方法来填充空值,就像你正在做的那样。这会将整个列从数字 (float
) 数据类型转换为 object
数据类型。
如果没有 .shift()
方法,当前行的值将包含在计算中。 .shift()
方法会将所有滚动标准偏差值向下移动 1 行,因此当前行的结果将是前 252 行的标准偏差,如您所愿。
with pandas
version >= 1.2 你可以用这个代替:
df['Daily_SD'] = df['Interday_Close_change'].rolling(252, closed='left').std()
closed=left
参数将从计算中排除 window 中的最后一个点。
我有 dataframe df
,其中包含 10 年的每日股市,其中包含列 Date
、Open
、Close
。
我想计算 close
价格的每日标准差。为此,数学公式为:
第 1 步:计算 Close
Step2:接下来,计算最近1年数据的每日日间变化(从Step1计算)的每日标准差
目前,我已经按照下面的代码弄清楚了Step1。 Interday_Close_change
列计算每一行与一天前数值的差值
df = pd.DataFrame(data, columns=columns)
df['Close_float'] = df['Close'].astype(float)
df['Interday_Close_change'] = df['Close_float'].diff()
df.fillna('', inplace=True)
问题:
(一)。我如何获得一列 Daily_SD
来计算最近 252 天(即 1 年的交易日)的标准差?在 Excel 上,我们有公式 STDEV.S()
来执行此操作。
(b)。 Daily_SD
应该从数据的第 252 行开始,因为那时数据将有 252 个数据点可供计算。我如何实现这一点?
您似乎在尝试计算滚动标准偏差,滚动 window 由之前的 252 行组成。
Pandas有很多.rolling()
methods,其中一个为标准差:
df['Daily_SD'] = df['Interday_Close_change'].rolling(252).std().shift()
如果可用于计算标准偏差的行少于 252 行,则该行的结果将为空值 (NaN
)。想一想你是否真的想应用 .fillna('')
方法来填充空值,就像你正在做的那样。这会将整个列从数字 (float
) 数据类型转换为 object
数据类型。
如果没有 .shift()
方法,当前行的值将包含在计算中。 .shift()
方法会将所有滚动标准偏差值向下移动 1 行,因此当前行的结果将是前 252 行的标准偏差,如您所愿。
with pandas
version >= 1.2 你可以用这个代替:
df['Daily_SD'] = df['Interday_Close_change'].rolling(252, closed='left').std()
closed=left
参数将从计算中排除 window 中的最后一个点。