窗函数(window function)经常用在频域信号分析中。我其实不咋个懂,大概是从无限长的信号中截一段出来,然后把这一段做延拓变成一个虚拟的无限长的信号。用来截取的函数就叫窗函数,窗函数又分很多种,什么矩形窗、三角窗、高斯窗。

scipy.signal中有各种我不懂的实现窗函数的方法。浏览了一下,头疼的紧。

那在pandas中也有实现窗函数的方法:rolling()。我呢就不折腾什么信号处理的东西,用金融数据做个小示例好了。

金融时间序列也是一种时间序列数据,前后次序是固定,多为二维数据。例如要看一只股票的平均移动线,就会用到rolling()

先介绍一下这个翻滚函数

DataFrame.rolling(window,
min_periods=None,
freq=None,
center=False,
win_type=None,
on=None,
axis=0)
  • window: 移动窗口的大小。值可以是int(整数值)或offset(偏移)。如果是整数值的话,每个窗口是固定的大小,即包含相同数量的观测值。值为offset(偏移时长,eg:'2s')则指定了每个窗口包含的时间段,每个窗口包含的观测值的数量是不一定的。offset必须在index是时间类型数据时才可以使用。

  • min_periods: 每个窗口最少包含的观测值数量,小于这个值的窗口结果为NA。值可以是int,默认None。offset情况下,默认为1。

  • freq: 弃用。不用管它。

  • center: 把窗口的标签设置为居中。布尔型,默认False,居右。

  • win_type: 窗口的类型。上面介绍的,截取窗的各种函数。字符串类型,默认为None。可用的窗口类型有:

    • boxcar
    • triang
    • blackman
    • hamming
    • bartlett
    • parzen
    • bohman
    • blackmanharris
    • nuttall
    • barthann
    • kaiser (needs beta)
    • gaussian (needs std)
    • general_gaussian (needs power, width)
    • slepian (needs width)
  • on: 可选参数。对于dataframe而言,指定要计算滚动窗口的列。值为列名。

  • axis: int、字符串,默认为0,即对列进行计算。

使用方法,例:

In []: df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})

In []: df.rolling(2).sum()
Out[]:
B
0 NaN
1 1.0
2 3.0
3 NaN
4 NaN

按tab键可以查看rolling对象可用的方法,如下:

In []: r = df.rolling(2)
In []: r
Out[]: Rolling [window=10,center=False,axis=0] In []: r.
r.agg r.cov r.max r.ndim
r.aggregate r.exclusions r.mean r.quantile
r.apply r.is_datetimelike r.median r.skew
r.corr r.is_freq_type r.min r.std
r.count r.kurt r.name r.sum

注:rolling_mean()这种写法已经淘汰了,现在都是df.rolling().mean()df.rolling().std()这样来写。

例:计算苹果收盘价的平均移动线

获取数据

从雅虎获取苹果公司2016年1月1日至今的股票数据。

import pandas_datareader.data as web

apple = web.DataReader(name='AAPL',
data_source='yahoo',
start='2016-1-1')
print(apple.head())

数据大概是这个样子的:

                  Open        High         Low       Close    Volume  \
Date
2016-01-04 102.610001 105.370003 102.000000 105.349998 67649400
2016-01-05 105.750000 105.849998 102.410004 102.709999 55791000
2016-01-06 100.559998 102.370003 99.870003 100.699997 68457400
2016-01-07 98.680000 100.129997 96.430000 96.449997 81094400
2016-01-08 98.550003 99.110001 96.760002 96.959999 70798000 Adj Close
Date
2016-01-04 103.057063
2016-01-05 100.474523
2016-01-06 98.508268
2016-01-07 94.350769
2016-01-08 94.849671

收盘价的折线图

为了方便观察滚完了之后的效果,我们把数据都画图呈现出来。

apple['Close'].plot(figsize=(9, 5), grid=True)
plt.show()
 
收盘价

平均移动线MA

apple['roll_mean'] = apple['Close'].rolling(window=5).mean()
apple[['Close', 'roll_mean']].plot(subplots=True, figsize=(9, 5), grid=True)
plt.show()
 
收盘价和5日平均移动线

这里窗口大小为5,所以前面四个数据是没有值的。把它们合在一起看看(把subplots改为False)。

 
收盘价和5日平均移动线合在一起

拉近一点:

 
 

直观上看更平滑了。毕竟取五天做平均了,第一天涨第二天跌的这种一平均波动就小了。如果窗口变大会更平滑。

windowsize = [5,10,20]
for i in windowsize:
apple['roll_mean_'+str(i)] = apple['Close'].rolling(i).mean()
apple[['roll_mean_5','roll_mean_10','roll_mean_20']].plot(figsize=(9, 5), grid=True)
plt.show()
 
 

补充

除了算平均值,还可以计算方差、相关、最大最小值等等,大部分的统计量都可以计算,就看你需要了。

另外如果已有的函数不能满足需要,我们还可以用lambdaapply()写自己的方法。

例如(直接复制官网的咯):

mad = lambda x: np.fabs(x - x.mean()).mean()
apple['Close'].rolling(window=5).apply(mad).plot(figsize=(9, 5), grid=True)
plt.show()

这里计算的是平均绝对偏差。

 
 

我的图长得漂亮是因为安装了seaborn库,画图之前悄悄加载了一下。

另外,pandas中也有好些金融函数,比如计算指数加权移动平均,就现成的pandas.ewma()。待挖掘的东西好多呢。

作者:ChZ_CC
链接:https://www.jianshu.com/p/f6e489de57f7
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Python数据分析_Pandas_窗函数的更多相关文章

  1. Python数据分析基础教程

    Python数据分析基础教程(第2版)(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1_FsReTBCaL_PzKhM0o6l0g 提取码:nkhw 复制这段内容后 ...

  2. [Python数据分析]新股破板买入,赚钱几率如何?

    这是本人一直比较好奇的问题,网上没搜到,最近在看python数据分析,正好自己动手做一下试试.作者对于python是零基础,需要从头学起. 在写本文时,作者也没有完成这个小分析目标,边学边做吧. == ...

  3. 【Python数据分析】Python3多线程并发网络爬虫-以豆瓣图书Top250为例

    基于上两篇文章的工作 [Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 [Python数据分析]Python3操作Excel(二) 一些问题的解决与优化 已经正确地实现 ...

  4. 【Python数据分析】Python3操作Excel(二) 一些问题的解决与优化

    继上一篇[Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 对豆瓣图书Top250进行爬取以后,鉴于还有一些问题没有解决,所以进行了进一步的交流讨论,这期间得到了一只尼玛 ...

  5. 【搬砖】【Python数据分析】Pycharm中plot绘图不能显示出来

    最近在看<Python数据分析>这本书,而自己写代码一直用的是Pycharm,在练习的时候就碰到了plot()绘图不能显示出来的问题.网上翻了一下找到知乎上一篇回答,试了一下好像不行,而且 ...

  6. Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识

    Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...

  7. Python数据分析(二): Numpy技巧 (1/4)

    In [1]: import numpy numpy.__version__ Out[1]: '1.13.1' In [2]: import numpy as np  

  8. Python数据分析(二): Numpy技巧 (2/4)

    numpy.pandas.matplotlib(+seaborn)是python数据分析/机器学习的基本工具. numpy的内容特别丰富,我这里只能介绍一下比较常见的方法和属性.   昨天晚上发了第一 ...

  9. Python数据分析(二): Numpy技巧 (3/4)

    numpy.pandas.matplotlib(+seaborn)是python数据分析/机器学习的基本工具. numpy的内容特别丰富,我这里只能介绍一下比较常见的方法和属性.   昨天晚上发了第一 ...

随机推荐

  1. underscore.js源码解析【对象】

    // Object Functions // ---------------- // Keys in IE < 9 that won't be iterated by `for key in . ...

  2. cropper实现图片剪切上传

    一.引入文件 <script src="jquery.min.js"></script> <link rel="stylesheet&quo ...

  3. php生成mysql数据字典

    <?php /** * 生成mysql数据字典 */ // 配置数据库 $database = array(); $database['DB_HOST'] = '127.0.0.1'; $dat ...

  4. Mapreduce的api编程

    KEYIN:输入的KEY是maptask所读取到的一行文本的起始偏移量,longVALUEIN:输入的VALUE的类型,输入的VALUE是maptask所读取到的一行文本内容,StringKEYOUT ...

  5. 【Mybatis】一对一实例

    ①创建数据库和表,数据库为mytest,表为father和child DROP TABLE IF EXISTS child; DROP TABLE IF EXISTS father; CREATE T ...

  6. POM、STS、IOC、DI、AOP

    POM:全称:poject object model 说明:项目对象模型.maven用来管理项目的依赖.编译.文档等信息 STS: 全称:spring tool suite 说明:spring 基于e ...

  7. The Minimum Cycle Mean in a Digraph 《有向图中的最小平均权值回路》 Karp

    文件链接 Karp在1977年的论文,讲述了一种\(O(nm)\)的算法,用来求有向强连通图中最小平均权值回路(具体问题请参照这里) 本人翻译(有删改): 首先任取一个节点 \(s\) ,定义 \(F ...

  8. TortoiseSVN 1.9.5安装 与 Eclipse4.4.2及以上版本中安装SVN插件

    引自: http://blog.csdn.net/chenchunlin526/article/details/54631458 TortoiseSVN 1.9.5安装 与 Eclipse4.4.2及 ...

  9. openlayer3之高级标注实现

    首先看实现效果: 实现要点: 1)树形标注实现 2)复杂标注样式定义 3)效率优化 1.树形标注实现 树形标注采用字体符号来实现,包括以下几个步骤 1)载入字体 2)设置标注值与字体对照关系 3)设置 ...

  10. 自定义控件详解(二):Path类 相关用法

    Path:路径 绘制路径:void drawPath (Path path, Paint paint) Path 可以绘制的路径 一.直线路径 1.基本方法 void moveTo (float st ...