python_移动窗口函数(python获取窗口句柄并移动)

网友投稿 654 2022-08-24


python_移动窗口函数(python获取窗口句柄并移动)

python_移动窗口函数

Moving Window Functions# 11.7 移动窗⼝函数# 在移动窗⼝(可以带有指数衰减权数)上计算的各种统计函数也# 是⼀类常⻅于时间序列的数组变换。这样可以圆滑噪⾳数据或断# 裂数据。我将它们称为移动窗⼝函数(moving window# function),其中还包括那些窗⼝不定⻓的函数(如指数加权移# 动平均)。跟其他统计函数⼀样,移动窗⼝函数也会⾃动排除缺# 失值。# 开始之前,我们加载⼀些时间序列数据,将其重采样为⼯作⽇频# 率:import matplotlib.pyplot as pltimport pandas as pdimport numpy as npclose_px_all = pd.read_csv('examples/stock_px_2.csv', parse_dates=True, index_col=0)close_px = close_px_all[['AAPL', 'MSFT', 'XOM']]close_px = close_px.resample('B').ffill()# 现在引⼊rolling运算符,它与resample和groupby很像。可以在# TimeSeries或DataFrame以及⼀个window(表示期数,⻅图11-# 4)上调⽤它:close_px.AAPL.plot()close_px.AAPL.rolling(250).mean().plot()pltplt.figure()

# 表达式rolling(250)与groupby很像,但不是对其进⾏分组、创建# ⼀个按照250天分组的滑动窗⼝对象。然后,我们就得到了苹果# 公司股价的250天的移动窗⼝。# 默认情况下,诸如rolling_mean这样的函数需要指定数量的⾮NA# 观测值。可以修改该⾏为以解决缺失数据的问题。其实,在时间# 序列开始处尚不⾜窗⼝期的那些数据就是个特例(⻅图11-5):appl_std250 = close_px.AAPL.rolling(250, min_periods=10).std()appl_std250[5:12]appl_std250.plot()# 要计算扩展窗⼝平均(expanding window mean),可以使⽤# expanding⽽不是rolling。“扩展”意味着,从时间序列的起始处开# 始窗⼝,增加窗⼝直到它超过所有的序列。apple_std250时间序# 列的扩展窗⼝平均如下所示:expanding_mean = appl_std250.expanding().mean()plt.figure()# 对DataFrame调⽤rolling_mean(以及与之类似的函数)会将转# 换应⽤到所有的列上(⻅图11-6):close_px.rolling(60).mean().plot(logy=True)close_px.rolling('20D').mean()Exponentially Weighted Functionsplt.figure()指数加权函数# 另⼀种使⽤固定⼤⼩窗⼝及相等权数观测值的办法是,定义⼀个# 衰减因⼦(decay factor)常量,以便使近期的观测值拥有更⼤# 的权数。衰减因⼦的定义⽅式有很多,⽐较流⾏的是使⽤时间间# 隔(span),它可以使结果兼容于窗⼝⼤⼩等于时间间隔的简单# 移动窗⼝(simple moving window)函数。# 由于指数加权统计会赋予近期的观测值更⼤的权数,因此相对于# 等权统计,它能“适应”更快的变化。# 除了rolling和expanding,pandas还有ewm运算符。下⾯这个例# ⼦对⽐了苹果公司股价的60⽇移动平均和span=60的指数加权移# 动平均(如图11-7所示):# 指数加权函数# 另⼀种使⽤固定⼤⼩窗⼝及相等权数观测值的办法是,定义⼀个# 衰减因⼦(decay factor)常量,以便使近期的观测值拥有更⼤# 的权数。衰减因⼦的定义⽅式有很多,⽐较流⾏的是使⽤时间间# 隔(span),它可以使结果兼容于窗⼝⼤⼩等于时间间隔的简单# 移动窗⼝(simple moving window)函数。# 由于指数加权统计会赋予近期的观测值更⼤的权数,因此相对于# 等权统计,它能“适应”更快的变化。# 除了rolling和expanding,pandas还有ewm运算符。下⾯这个例# ⼦对⽐了苹果公司股价的60⽇移动平均和span=60的指数加权移# 动平均(如图11-7所示):aapl_px = close_px.AAPL['2006':'2007']ma60 = aapl_px.rolling(30, min_periods=20).mean()ewma60 = aapl_px.ewm(span=30).mean()ma60.plot(style='k--', label='Simple MA')ewma60.plot(style='k-', label='EW MA')plt.legend()Binary Moving Window Functions⼆元移动窗⼝函数# 有些统计运算(如相关系数和协⽅差)需要在两个时间序列上执# ⾏。例如,⾦融分析师常常对某只股票对某个参考指数(如标准# 普尔500指数)的相关系数感兴趣。要进⾏说明,我们先计算我# 们感兴趣的时间序列的百分数变化:# ⼆元移动窗⼝函数# 有些统计运算(如相关系数和协⽅差)需要在两个时间序列上执# ⾏。例如,⾦融分析师常常对某只股票对某个参考指数(如标准# 普尔500指数)的相关系数感兴趣。要进⾏说明,我们先计算我# 们感兴趣的时间序列的百分数变化:plt.figure()
spx_px = close_px_all['SPX']spx_rets = spx_px.pct_change()returns = close_px.pct_change()# 调⽤rolling之后,corr聚合函数开始计算与spx_rets滚动相关系数corr = returns.AAPL.rolling(125, min_periods=100).corr(spx_rets)corr.plot()plt.figure()假设你想要⼀次性计算多只股票与标准普尔500指数的相关系# 数。虽然编写⼀个循环并新建⼀个DataFrame不是什么难事,但# ⽐较啰嗦。其实,只需传⼊⼀个TimeSeries和⼀个DataFrame,# rolling_corr就会⾃动计算TimeSeries(本例中就是spx_rets)与# DataFrame各列的相关系数。结果如图11-9所示:# 假设你想要⼀次性计算多只股票与标准普尔500指数的相关系# 数。虽然编写⼀个循环并新建⼀个DataFrame不是什么难事,但# ⽐较啰嗦。其实,只需传⼊⼀个TimeSeries和⼀个DataFrame,# rolling_corr就会⾃动计算TimeSeries(本例中就是spx_rets)与# DataFrame各列的相关系数。结果如图11-9所示:corr = returns.rolling(125, min_periods=100).corr(spx_rets)corr.plot()User-Defined Moving Window Functionsplt.figure()⽤户定义的移动窗⼝函数# rolling_apply函数使你能够在移动窗⼝上应⽤⾃⼰设计的数组函# 数。唯⼀要求的就是:该函数要能从数组的各个⽚段中产⽣单个# 值(即约简)。⽐如说,当我们⽤rolling(...).quantile(q)计算样本# 分位数时,可能对样本中特定值的百分等级感兴趣。# scipy.stats.percentileofscore函数就能达到这个⽬的(结果⻅图# ⽤户定义的移动窗⼝函数# rolling_apply函数使你能够在移动窗⼝上应⽤⾃⼰设计的数组函# 数。唯⼀要求的就是:该函数要能从数组的各个⽚段中产⽣单个# 值(即约简)。⽐如说,当我们⽤rolling(...).quantile(q)计算样本# 分位数时,可能对样本中特定值的百分等级感兴趣。# scipy.stats.percentileofscore函数就能达到这个⽬的(结果⻅图from scipy.stats import percentileofscorescore_at_2percent = lambda x: percentileofscore(x, 0.02)result = returns.AAPL.rolling(250).apply(score_at_2percent)result.plot()C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:9: FutureWarning: Currently, 'apply' passes the values as ndarrays to the applied function. In the future, this will change to passing it as Series objects. You need to specify 'raw=True' to keep the current behaviour, and you can pass 'raw=False' to silence this warning if __name__ == '__main__':pd.options.display.max_rows = PREVIOUS_MAX_ROWS---------------------------------------------------------------------------NameError Traceback (most recent call last) in ()----> 1 pd.options.display.max_rows = PREVIOUS_MAX_ROWSNameError: name 'PREVIOUS_MAX_ROWS' is not


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python_时间序列_重采样及频率转换(python统计DNA序列频率)
下一篇:Java Servlet响应httpServletResponse过程详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~