Pandas高级教程之:window操作
简介
在数据统计中,经常需要进行一些范围操作,这些范围我们可以称之为一个window 。Pandas提供了一个rolling方法,通过滚动window来进行统计计算。
本文将会探讨一下rolling中的window用法。
滚动窗口
我们有5个数,我们希望滚动统计两个数的和,那么可以这样:
In [1]: s = pd.Series(range(5))
In [2]: s.rolling(window=2).sum()
Out[2]:
0 NaN
1 1.0
2 3.0
3 5.0
4 7.0
dtype: float64
rolling 对象可以通过for来遍历:
In [3]: for window in s.rolling(window=2):
...: print(window)
...:
0 0
dtype: int64
0 0
1 1
dtype: int64
1 1
2 2
dtype: int64
2 2
3 3
dtype: int64
3 3
4 4
dtype: int64
pandas中有四种window操作,我们看下他们的定义:
| 名称 | 方法 | 返回对象 | 是否支持时间序列 | 是否支持链式groupby操作 |
|---|---|---|---|---|
| 固定或者可滑动的窗口 | rolling |
Rolling |
Yes | Yes |
| scipy.signal库提供的加权非矩形窗口 | rolling |
Window |
No | No |
| 累积值的窗口 | expanding |
Expanding |
No | Yes |
| 值上的累积和指数加权窗口 | ewm |
ExponentialMovingWindow |
No | Yes (as of version 1.2) |
看一个基于时间rolling的例子:
In [4]: s = pd.Series(range(5), index=pd.date_range('2020-01-01', periods=5, freq='1D'))
In [5]: s.rolling(window='2D').sum()
Out[5]:
2020-01-01 0.0
2020-01-02 1.0
2020-01-03 3.0
2020-01-04 5.0
2020-01-05 7.0
Freq: D, dtype: float64
设置min_periods可以指定window中的最小的NaN的个数:
In [8]: s = pd.Series([np.nan, 1, 2, np.nan, np.nan, 3])
In [9]: s.rolling(window=3, min_periods=1).sum()
Out[9]:
0 NaN
1 1.0
2 3.0
3 3.0
4 2.0
5 3.0
dtype: float64
In [10]: s.rolling(window=3, min_periods=2).sum()
Out[10]:
0 NaN
1 NaN
2 3.0
3 3.0
4 NaN
5 NaN
dtype: float64
# Equivalent to min_periods=3
In [11]: s.rolling(window=3, min_periods=None).sum()
Out[11]:
0 NaN
1 NaN
2 NaN
3 NaN
4 NaN
5 NaN
dtype: float64
Center window
默认情况下window的统计是以最右为准,比如window=5,那么前面的0,1,2,3 因为没有达到5,所以为NaN。
In [19]: s = pd.Series(range(10))
In [20]: s.rolling(window=5).mean()
Out[20]:
0 NaN
1 NaN
2 NaN
3 NaN
4 2.0
5 3.0
6 4.0
7 5.0
8 6.0
9 7.0
dtype: float64
可以对这种方式进行修改,设置 center=True 可以从中间统计:
In [21]: s.rolling(window=5, center=True).mean()
Out[21]:
0 NaN
1 NaN
2 2.0
3 3.0
4 4.0
5 5.0
6 6.0
7 7.0
8 NaN
9 NaN
dtype: float64
Weighted window 加权窗口
使用 win_type 可以指定加权窗口的类型。其中win_type 必须是scipy.signal 中的window类型。
举几个例子:
In [47]: s = pd.Series(range(10))
In [48]: s.rolling(window=5).mean()
Out[48]:
0 NaN
1 NaN
2 NaN
3 NaN
4 2.0
5 3.0
6 4.0
7 5.0
8 6.0
9 7.0
dtype: float64
In [49]: s.rolling(window=5, win_type="triang").mean()
Out[49]:
0 NaN
1 NaN
2 NaN
3 NaN
4 2.0
5 3.0
6 4.0
7 5.0
8 6.0
9 7.0
dtype: float64
# Supplementary Scipy arguments passed in the aggregation function
In [50]: s.rolling(window=5, win_type="gaussian").mean(std=0.1)
Out[50]:
0 NaN
1 NaN
2 NaN
3 NaN
4 2.0
5 3.0
6 4.0
7 5.0
8 6.0
9 7.0
dtype: float64
扩展窗口
扩展窗口会产生聚合统计信息的值,其中包含该时间点之前的所有可用数据。
In [51]: df = pd.DataFrame(range(5))
In [52]: df.rolling(window=len(df), min_periods=1).mean()
Out[52]:
0
0 0.0
1 0.5
2 1.0
3 1.5
4 2.0
In [53]: df.expanding(min_periods=1).mean()
Out[53]:
0
0 0.0
1 0.5
2 1.0
3 1.5
4 2.0
指数加权窗口
指数加权窗口与扩展窗口相似,但每个先验点相对于当前点均按指数加权。
加权计算的公式是这样的:
\(y_t=Σ^t_{i=0}{w_ix_{t-i}\over{Σ^t_{i=0}w_i}}\)
其中\(x_t\)是输入,\(y_t\)是输出,\(w_i\)是权重。
EW有两种模式,一种模式是 adjust=True ,这种情况下 \(_=(1−)^\)
一种模式是 adjust=False ,这种情况下:
y_t=(1-a)y_{t-1}+ax_t
\]
其中 0<≤1, 根据EM方式的不同a可以有不同的取值:
\]
举个例子:
In [54]: df = pd.DataFrame({"B": [0, 1, 2, np.nan, 4]})
In [55]: df
Out[55]:
B
0 0.0
1 1.0
2 2.0
3 NaN
4 4.0
In [56]: times = ["2020-01-01", "2020-01-03", "2020-01-10", "2020-01-15", "2020-01-17"]
In [57]: df.ewm(halflife="4 days", times=pd.DatetimeIndex(times)).mean()
Out[57]:
B
0 0.000000
1 0.585786
2 1.523889
3 1.523889
4 3.233686
本文已收录于 http://www.flydean.com/12-python-pandas-window/
最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!
Pandas高级教程之:window操作的更多相关文章
- Pandas高级教程之:GroupBy用法
Pandas高级教程之:GroupBy用法 目录 简介 分割数据 多index get_group dropna groups属性 index的层级 group的遍历 聚合操作 通用聚合方法 同时使用 ...
- Pandas高级教程之:Dataframe的合并
目录 简介 使用concat 使用append 使用merge 使用join 覆盖数据 简介 Pandas提供了很多合并Series和Dataframe的强大的功能,通过这些功能可以方便的进行数据分析 ...
- Pandas高级教程之:处理text数据
目录 简介 创建text的DF String 的方法 columns的String操作 分割和替换String String的连接 使用 .str来index extract extractall c ...
- Pandas高级教程之:处理缺失数据
目录 简介 NaN的例子 整数类型的缺失值 Datetimes 类型的缺失值 None 和 np.nan 的转换 缺失值的计算 使用fillna填充NaN数据 使用dropna删除包含NA的数据 插值 ...
- Pandas高级教程之:category数据类型
目录 简介 创建category 使用Series创建 使用DF创建 创建控制 转换为原始类型 categories的操作 获取category的属性 重命名categories 使用add_cate ...
- Pandas高级教程之:时间处理
目录 简介 时间分类 Timestamp DatetimeIndex date_range 和 bdate_range origin 格式化 Period DateOffset 作为index 切片和 ...
- Pandas高级教程之:plot画图详解
目录 简介 基础画图 其他图像 bar stacked bar barh Histograms box Area Scatter Hexagonal bin Pie 在画图中处理NaN数据 其他作图工 ...
- Pandas高级教程之:统计方法
目录 简介 变动百分百 Covariance协方差 Correlation相关系数 rank等级 简介 数据分析中经常会用到很多统计类的方法,本文将会介绍Pandas中使用到的统计方法. 变动百分百 ...
- Pandas高级教程之:稀疏数据结构
目录 简介 Spare data的例子 SparseArray SparseDtype Sparse的属性 Sparse的计算 SparseSeries 和 SparseDataFrame 简介 如果 ...
随机推荐
- 程序员与年龄:四十岁普通开发、三十五岁首席架构、三十岁基层Leader
最近,有一个词儿特别热门--躺平.有没有人跟你说过:"躺平说起来容易,做起来更容易." 和躺平相对的是另外一个词--内卷,群聊的时候,已经很多次看过草卷起来了.jpg表情包.某些节 ...
- Linux 挂载盘
在192.168.6.203上,挂接第二块硬盘 fdisk -l 1.fdisk /dev/vdb 命令(输入 m 获取帮助):n Partition type: p primary (0 prima ...
- 201871030132-熊文婷 实验二 个人项目―《D{0-1}KP问题》项目报告
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...
- 三维视觉惯性SLAM的有效Schmidt-EKF
三维视觉惯性SLAM的有效Schmidt-EKF An Efficient Schmidt-EKF for 3D Visual-Inertial SLAM 论文地址: http://openaccess ...
- SOC,System on-a-Chip技术初步
SOC,System on-a-Chip技术初步 S O C(拼作S-O-C)是一种集成电路,它包含了电子系统在单个芯片上所需的所有电路和组件.它可以与传统的计算机系统形成对比,后者由许多不同的组件组 ...
- GStreamer 1.0 series序列示例
GStreamer 1.0 series序列示例 OpenEmbedded layer for GStreamer 1.0 这layer层为GStreamer 1.0框架提供了非官方的支持,用于Ope ...
- Java如何使用while和for嵌套循环控制输出数据,使数据奇偶行不同
/* 题目1 使用Eclipse编写控制台应用程, 使用while循环在控制台打印10行10列的如下图形 □ □ □ □ □ □ □ □ □ □ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ □ □ □ ...
- 【NX二次开发】获取边的类型 UF_MODL_ask_edge_type
源码 extern DllExport void ufsta(char *param, int *returnCode, int rlen) { UF_initialize(); int edge_t ...
- kerberos安装配置
目录 前言 服务端安装 组件安装 配置krb5.conf 配置kdc.conf 配置kadm5.acl 创建kdc数据库 在server端创建一个管理员账号,方便远程登录管理kerberos 正式启动 ...
- 5.22考试总结(NOIP模拟1)
5.22考试总结(NOIP模拟1) 改题记录 T1 序列 题解 暴力思路很好想,分数也很好想\(QAQ\) (反正我只拿了5pts) 正解的话: 先用欧拉筛把1-n的素数筛出来 void get_Pr ...