绘制标准偏差与带宽上的平均值之比

时间:2019-09-09 23:51:15

标签: python numpy matplotlib scipy statistics

我想通过计算给定带宽上的标准偏差与平均值之比来揭示数据之间的相关性。窗口将向右移动一个频率仓,然后再次计算比率,依此类推。我认为可以从Matplotlib或scipy库使用ready函数吗?非常感谢您向我展示解决方案。

1 个答案:

答案 0 :(得分:0)

您要计算的是相对标准偏差(RSD)的 滚动版本 ,也称为变异系数(CV)。 Wikipedia Investopedia

RSD = CV = SD /平均值。

让我们首先制作一些时间序列数据。

import pandas as pd
import numpy as np

# some sample data
ts = pd.Series(np.random.randn(1000), 
               index=pd.date_range('1/1/2000', 
                                   periods=1000)).cumsum()

解决方案

以下代码段将为您提供所需的内容。

选项-A

window = 60
rolling_rsd = ts.rolling(window=window).std()/ts.rolling(window=window).mean()

选项B

或者,您可以使用此便捷功能:

def rsd(ts, window = 60):
    """
    Returns the Relative Standard Deviation (RSD), 
    a.k.a Coefficient of Variation (CV) for a 
    given rolling window size on a time series data-column.

    ts = time series data
    window = window size to compute rolling mean, std, rsd
    Example:
       rolling_rsd, rolling_mean, rolling_std = rsd(ts, window = 60)
    """
    rolling_mean = ts.rolling(window=window).mean()
    rolling_std = ts.rolling(window=window).std()
    rolling_rsd = rolling_std/rolling_mean

    return (rolling_rsd, rolling_mean, rolling_std)

详细示例


import pandas as pd
import numpy as np

# some sample data
ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)).cumsum()

#plot the time series
ts.plot(style='k--')

def rsd(ts, window = 60):
    """
    Returns the Relative Standard Deviation (RSD), 
    a.k.a Coefficient of Variation (CV) for a 
    given rolling window size on a time series data-column.

    ts = time series data
    window = window size to compute rolling mean, std, rsd
    Example:
       rolling_rsd, rolling_mean, rolling_std = rsd(ts, window = 60)
    """
    rolling_mean = ts.rolling(window=window).mean()
    rolling_std = ts.rolling(window=window).std()
    rolling_rsd = rolling_std/rolling_mean

    return (rolling_rsd, rolling_mean, rolling_std)

(rolling_rsd, rolling_mean, rolling_std) = rsd(ts, window = 60)

# calculate a 60 day rolling mean and plot
rolling_mean.plot(style='k')

# add the 20 day rolling standard deviation:
rolling_std.plot(style='b')

# add the 20 day rolling standard deviation:
rolling_rsd.plot(style='r')

注意:

您也可以直接按以下方式计算此值(如果您不想使用其他函数)。

# calculate a 60 day rolling standard deviation (rsd)

rolling_rsd = ts.rolling(window=60).std()/ts.rolling(window=60).mean()

相关解决方案/问题
1. How can I simply calculate the rolling/moving variance of a time series in python?

相关问题