Python数据分析_Pandas06_窗函数
来源:互联网 发布:手机灯牌软件 编辑:程序博客网 时间:2024/05/22 20:02
窗函数(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 [2]: df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]})In [3]: df.rolling(2).sum()Out[3]: B0 NaN1 1.02 3.03 NaN4 NaN
按tab键可以查看rolling对象可用的方法,如下:
In [4]: r = df.rolling(2)In [5]: rOut[5]: Rolling [window=10,center=False,axis=0]In [6]: 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 webapple = web.DataReader(name='AAPL', data_source='yahoo', start='2016-1-1')print(apple.head())
数据大概是这个样子的:
Open High Low Close Volume \Date2016-01-04 102.610001 105.370003 102.000000 105.349998 676494002016-01-05 105.750000 105.849998 102.410004 102.709999 557910002016-01-06 100.559998 102.370003 99.870003 100.699997 684574002016-01-07 98.680000 100.129997 96.430000 96.449997 810944002016-01-08 98.550003 99.110001 96.760002 96.959999 70798000 Adj CloseDate2016-01-04 103.0570632016-01-05 100.4745232016-01-06 98.5082682016-01-07 94.3507692016-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,所以前面四个数据是没有值的。把它们合在一起看看(把subplots改为False)。
拉近一点:
直观上看更平滑了。毕竟取五天做平均了,第一天涨第二天跌的这种一平均波动就小了。如果窗口变大会更平滑。
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()
补充
除了算平均值,还可以计算方差、相关、最大最小值等等,大部分的统计量都可以计算,就看你需要了。
另外如果已有的函数不能满足需要,我们还可以用lambda
和apply()
写自己的方法。
例如(直接复制官网的咯):
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()
。待挖掘的东西好多呢。
- Python数据分析_Pandas06_窗函数
- python数据分析常用函数
- Python数据分析常用函数笔记
- Python数据分析模块 | pandas做数据分析(三):统计相关函数
- python数据分析
- Python数据分析入门
- Python数据分析入门
- Python数据分析笔记
- Python分析file_sink数据
- Python数据分析、展示
- python数据分析
- Python数据分析工具
- Python数据分析-1
- Python数据分析
- Python数据分析 读书笔记
- Python数据分析1
- 《python数据分析基础教程》
- Python数据分析
- python两个 list 获取交集,并集,差集的方法
- [学习笔记03]运算符表达式
- struts2:默认的Action(用户友好界面)和后缀
- 安装snmp协议
- JAVA中如何设置图片(图标)自适应Jlable等组件的大小
- Python数据分析_Pandas06_窗函数
- Java反射机制的原理及作用
- JVM类加载过程
- struts2:接受参数
- websocket的WebSocketServer无法注入service
- 史上最全的dedecms表结构,兄弟们,我尽力了。。。。。。
- 服务端连接日志(AsyncMessenger)
- struts2:处理结果类型
- python学习-07-浅谈对象与类(笔记)