窗函数(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. 获取CPU ID--查看CPU数量/核数

    Ubuntu 获取CPU序列号或者主板序列号 CPU ID 代码: sudo dmidecode -t 4 | grep ID ID: 54 06 05 00 FF FB 8B 0F 主板序列号 代码 ...

  2. SpringBoot之oauth2.0学习之服务端配置快速上手

    现在第三方登录的例子数见不鲜.其实在这种示例当中,oauth2.0是使用比较多的一种授权登录的标准.oauth2.0也是从oauth1.0升级过来的.那么关于oauth2.0相关的概念及其原理,大家可 ...

  3. 全网最详细的IDEA、Eclipse和MyEclipse之间于Java web项目发布到Tomcat上运行成功的对比事宜【博主强烈推荐】【适合普通的还是Maven方式创建的】(图文详解)

    不多说,直接上干货! IDEA [适合公司业务]全网最详细的IDEA里如何正确新建[普通或者Maven]的Java web项目并发布到Tomcat上运行成功[博主强烈推荐](类似eclipse里同一个 ...

  4. java远程调试(idea)

    遇见一个怪异问题,无奈线上数据库有限制,只能远程调试下代码.突然发现,远程调试代码真的好简单,简单记录下操作步骤. 1.在idea里创建一个Remote,远程连接的入口. 找到 Edit Config ...

  5. leetcode — reverse-nodes-in-k-group

    /** * Source : https://oj.leetcode.com/problems/reverse-nodes-in-k-group/ * * Created by lverpeng on ...

  6. spring boot 2.0 源码分析(一)

    在学习spring boot 2.0源码之前,我们先利用spring initializr快速地创建一个基本的简单的示例: 1.先从创建示例中的main函数开始读起: package com.exam ...

  7. #1 初识Python

    前言 要说现在最时髦的编程语言是什么,那么一定是Python无疑了.让我们来一起来领略其风采吧! 一.Python介绍 Python的创始人为吉多·范罗苏姆(Guido van Rossum),被大家 ...

  8. SpringBoot入门之基于Druid配置Mybatis多数据源

    上一篇了解了Druid进行配置连接池的监控和慢sql处理,这篇了解下使用基于基于Druid配置Mybatis多数据源.SpringBoot默认配置数据库连接信息时只需设置url等属性信息就可以了,Sp ...

  9. ARM常用汇编指令列表 --- 转自百度文库

  10. C#基础知识回顾-- 属性与字段

    今天在公交车上,突然想属性和字段到底有什么区别?很多字段属性都存在 get{}和set{} 和普通的变量没什么区别(可读可写) 我就感觉属性就是给字段一个多的选择方式,有的字段是不允许更改的.. 刚写 ...