【问题标题】:Plot the ratio of the standard deviation to the mean over bandwidth绘制标准偏差与带宽平均值的比率
【发布时间】:2020-01-11 17:13:00
【问题描述】:

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

【问题讨论】:

  • 作为忠告,如果您包含一些虚拟数据,例如您创建时间序列数据,人们会更容易回答您的问题:python import pandas as pd import numpy as np ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000)).cumsum()

标签: python numpy matplotlib scipy statistics


【解决方案1】:

解决方案

您要计算的是滚动版本相对标准偏差 (RSD),也称为变异系数 (CV)。请参阅WikipediaInvestopedia 了解有关定义的更多详细信息。

RSD = CV = SD/Mean

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

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)

详细示例

我将使用便利功能,rsd() 用于以下示例。

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

# Using convenience function: rsd()
# calculate rolling RSD, MEAN and STD with window = 60
(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 60 day rolling standard deviation (STD) to the plot
rolling_std.plot(style='b')

# add the 60 day rolling  relative standard deviation (RSD) to the plot
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?

【讨论】:

  • 如何使用数据“ts”进行滚动?我创建“ts”的命令是ts = data.fft()
  • @PawełChmolewski:寻找带有 numpy 数组的 pandas.Series。 ts = pd.Series(data.fft())Source
  • 谢谢你的帮助,现在我完全明白了;)
  • @PawełChmolewski 感谢您选择回复作为 accepted 解决方案。请问您也可以upvote这个解决方案吗?
最近更新 更多