窗函数(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. 移动端真机调试终极利器-BrowserSync(使用方法)

    1. 安装 Node.js BrowserSync是基于Node.js的, 是一个Node模块, 如果您想要快速使用它,也许您需要先安装一下Node.js 安装适用于Mac OS,Windows和Li ...

  2. 在向一个ArrayList中添加大量元素前,可以使用ensureCapacity方法来增加ArrayList的容量

    参考http://www.jianshu.com/p/f174d49b391c ensureCapacity(),该方法就是 ArrayList 的扩容方法.在前面就提过 ArrayList 每次新增 ...

  3. Java高并发之线程池详解

    线程池优势 在业务场景中, 如果一个对象创建销毁开销比较大, 那么此时建议池化对象进行管理. 例如线程, jdbc连接等等, 在高并发场景中, 如果可以复用之前销毁的对象, 那么系统效率将大大提升. ...

  4. Android 性能优化-启动时间

    adb shell am start -W -n com.xxxx(包名)/xxx.xxxActivity(launch Activity)

  5. C#读取Cookie

    public class HttpCookie { [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = ...

  6. 升级mac Mojave系统,git无法使用

    升级mac Mojave系统后 无法使用git,出现如下问题 xcrun: error: invalid active developer path (/Library/Developer/Comma ...

  7. Hibernate学习(五)———— hibernate一对一关系映射详解

    一.一对一关系的概述 一对一关系看起来简单,其实也挺复杂的.其中关系就包含了四种,单向双向和主键关联外键关联. 什么意思呢,也就是包含了单向一对一主键关联.双向一对一主键关联,单向一对一外键关联,双向 ...

  8. FFmpeg编解码处理4-音频编码

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10584948.html FFmpeg编解码处理系列笔记: [0]. FFmpeg时间戳详 ...

  9. MySQL之视图、触发器、事务、存储、函数、流程控制

    一.视图 视图就是一个虚拟表,我们把复杂的sql语句后看到的虚拟表封装起来,给他取个名字,当我们下次使用的时候,就不用再去写复杂的sql语句,直接调用封装后的视图名字,就可以得到我们想要的表,然后就可 ...

  10. 【Java并发编程】9、非阻塞同步算法与CAS(Compare and Swap)无锁算法

    转自:http://www.cnblogs.com/Mainz/p/3546347.html?utm_source=tuicool&utm_medium=referral 锁(lock)的代价 ...