序列内置一些函数,用于循环对序列的元素执行操作。

一,应用和转换函数

应用apply

对序列的各个元素应用函数:

Series.apply(self, func, convert_dtype=True, args=(), **kwds)

参数注释:

  • func:应用的函数,可以是自定义的函数,或NumPy函数
  • convert_dtype:默认值是True,尝试把func应用的结果转换为更好的数据类型,如果设置为False,把结果转换为dtype=object.
  • args:元组,在序列值之后,传递给func的位置参数(positional arguments)
  • **kwds:传递给func的关键字(keyword)参数,可以有0、1、多个

位置参数和关键字参数的区别是:

  • 位置参数是通过匹配位置来传参,关键字参数是通过匹配参数名称来传参。
  • 关键字参数可以有多个,参数的名称不固定,只能在apply函数()的最后面,例如,关键字参数k1,k2,k3,那么kwargs=[k1,k2,k3]
  • 位置参数args只能有一个

1,传递自定义的函数(使用位置参数)

创建自定义的函数,把函数应用于序列之上

>>> s = pd.Series([20, 21, 12], index=['London', 'New York', 'Helsinki'])
>>> def subtract_custom_value(x, custom_value):
... return x - custom_value
>>> s.apply(subtract_custom_value, args=(5,))
London 15
New York 16
Helsinki 7
dtype: int64

2,传递自定义的函数(使用关键字参数)

可以看到,关键字参数只能在apply函数的后面,

>>> def add_custom_values(x, **kwargs):
... for month in kwargs:
... x += kwargs[month]
... return x
>>> s.apply(add_custom_values, june=30, july=20, august=25)
London 95
New York 96
Helsinki 87
dtype: int64

转换transform

转换是对序列的一个轴进行转换,对于序列来说,axis=0,对行序列进行转换:

Series.transform(self, func, axis=0, *args, **kwargs)

二,分组

对序列分组,返回分组之后的对象,并可以调用聚合函数获得每个分组的聚合值:

Series.groupby(self, by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)

参数注释:

by:用于对序列进行分组,参数by的值可以是函数,列名或列名列表,映射

1,by是函数

如果by是函数,那么调用的是序列索引的值

>>> s=pd.Series([1,2,3,4])
>>> s.groupby(by=lambda x: x<3).count()
False 1
True 3
dtype: int64

可以通过索引值来访问序列的元素值:

>>> s.groupby(by=lambda x: s.iat[x]<3).count()
False 2
True 2
dtype: int64

2,by是标签列表

如果by是标签列表,通常是按照列值来对数据进行分组,通常用于数据框(DataFrame)中

3,映射(字典)

当使用字典作为映射时,字典的key对应序列的值,按照字典的value对原始序列进行分组

>>> s.groupby(by={1:'a',2:'a',3:'b',4:'b'}).count()
a 2
b 1
dtype: int64

4,映射(序列)

当使用序列作为映射时,by序列的值用于对原始序列进行分组,by序列中相同的值对应着原始序列的值属于同一个分组;原始序列和by序列进行匹配的方法是索引对齐。

>>> s.groupby(by=pd.Series(data=[1,2,1,1],index=[0,2,3,1])).mean()
1 2.333333
2 3.000000
dtype: float64

索引对齐是怎么回事?

对于by参数的序列,数据是1, 2, 1, 1,这意味着,把原始序列分为2组,分组的key分别是1和2。

by序列的索引是0, 2, 3, 1,也就是说,当原始序列的索引为0, 3, 1 时,对应的分组key是1,当原始序列的索引为2时,对应的分组key是2。

索引对齐之后,原始序列中的值1,2,4属于分组1;原始序列中的值3属于分组2,再计算每个分组的均值。

三,滚动

滚动窗口计算,每个窗口计算一个聚合值,每次向前滚动一步(一步是一个元素):

Series.rolling(self, window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)

参数注释:

  • window:滚动的窗口值,或偏移量,每一个窗口都是一个固定值。
  • min_periods:每个窗口的最小值,如果窗口中的元素数量小于min_periods,返回NaN;默认情况下,min_periods等于window参数的值。

举个例子,对于序列,当窗口设置为2时,如果不设置min_periods,那么窗口要想有值,那么窗口的大小必须是2,序列的第一个元素在窗口中只有一个值,因此返回NaN。

>>> s=pd.Series([1,2,3,4])
>>> s.rolling(2).sum()
0 NaN
1 3.0
2 5.0
3 7.0
dtype: float64
>>> s.rolling(window=2,min_periods =1).sum()
0 1.0
1 3.0
2 5.0
3 7.0
dtype: float64

四,扩展

扩展是指由序列的第一个元素开始,逐个元素向后计算聚合值,当聚合函数是sum时,表示从第一个元素开始,计算累加:

Series.expanding(self, min_periods=1, center=False, axis=0)

举个例子,从第一个元素开始计算序列1,2,3,4的累加:

>>> s=pd.Series([1,2,3,4])
>>> s.expanding().sum()
0 1.0
1 3.0
2 6.0
3 10.0
dtype: float64

五,指数加权移动平均

ewm(Exponentially Weighted Moving)是指数加权移动的简称,通常情况下,是对序列的元素进行指数加权,计算加权后的均值:

Series.ewm(self, com=None, span=None, halflife=None, alpha=None, min_periods=0, adjust=True, ignore_na=False, axis=0)

1,参数注释

在进行指数加权时,平滑因子有四种指定方式得出:

adjust:处于初期的衰减调整因子,以解决相对权重不平衡的问题。

  • 当设置adjust为True时,加权均值的计算公式是: (1-alpha)**(n-1), (1-alpha)**(n-2), …, 1-alpha, 1
  • 当设置adjust为False时,加权均值的计算公式是:weighted_average[0] = arg[0]; weighted_average[i] = (1-alpha)*weighted_average[i-1] + alpha*arg[i].

2,指数加权移动平均的意义

指数加权移动均值(EWMA,Exponentially Weighted Moving Average) 的公式是:EWMA(t) = aY(t) + (1-a)EWMA(t-1),t = 1,2,.....,n;

表示的含义是:在t时刻,根据实际的观测值可以求取EWMA(t),其中,EWMA(t)  表示 t 时刻的估计值;Y(t) t时刻的测量值;n 所观察的总的时间;a(0 < a <1)表示对于历史测量值权重系数。

之所以称之为指数加权,是因为加权系数a是以指数式递减的,即各指数随着时间而呈现出指数式递减。系数a越接近1表示对当前抽样值的权重越高,对过去测量值得权重越低,估计值(器)的时效性就越强,反之,越弱。

这种现象可以描述为应付突变的平稳性,平稳性随着a的增大而减小。当设置较小的系数a时,得出的均值更大程度上是参考过去的测量值,在较小程度上参考当前值,表现出很强的平稳性;当设置较大的系数a,得出的均值更大程度上是参考当前的测量值,表现出很强的波动性。举个例子,对于序列,设置较大的指数a=0.8和较小的指数a=0.2,位置越靠后,得出的均值越接近或越远离当前值:

>>> s=pd.Series([1,2,3,4])
>>> s.ewm(alpha=0.8).mean()
0 1.000000
1 1.833333
2 2.774194
3 3.756410
dtype: float64
>>> s.ewm(alpha=0.2).mean()
0 1.000000
1 1.555556
2 2.147541
3 2.775068
dtype: float64

参考文档:

pandas.Series.apply

pandas 学习 第3篇:Series - 数据处理(应用、分组、滚动、扩展、指数加权移动平均)的更多相关文章

  1. pandas 学习 第7篇:DataFrame - 数据处理(应用、操作索引、重命名、合并)

    DataFrame的这些操作和Series很相似,这里简单介绍一下. 一,应用和应用映射 apply()函数对每个轴应用一个函数,applymap()函数对每个元素应用一个函数: DataFrame. ...

  2. pandas 学习 第2篇:Series -(创建,属性,转换和索引)

    序列(Series)是由一组数据(各种NumPy数据类型),以及一组与之相关的数据标签(索引)组成,序列不要求数据类型是相同的. 序列是一个一维数组,只有一个维度(或称作轴)是行(row),在访问序列 ...

  3. pandas 学习 第6篇:DataFrame - 数据处理(长宽格式、透视表)

    长宽格式的转换 宽格式是指:一列或多列作为标识变量(id_vars),其他变量作为度量变量(value_vars),直观上看,这种格式的数据比较宽,举个列子,列名是:id1.id2.var1.var2 ...

  4. pandas 学习 第5篇:DataFrame - 访问数据框

    数据框是用于存储数据的二维结构,分为行和列,一行和一列的交叉位置是一个cell,该cell的位置是由行索引和列索引共同确定的.可以通过at/iat,或loc/iloc属性来访问数据框的元素,该属性后跟 ...

  5. pandas 学习 第8篇:Index 对象 - (创建、转换、排序)

    Index对象负责管理轴标签.轴名称等元数据,是一个不可修改的.有序的.可以索引的ndarry对象.在构建Sereis或DataFrame时,所用到的任何数据或者array-like的标签,都会转换为 ...

  6. pandas 学习 第1篇:pandas基础 - 数据结构和数据类型

    pandas是基于NumPy构建的模块,含有使数据分析更快更简单的操作工具和数据结构,是数据分析必不可少的五个包之一.pandas包含序列Series和数据框DataFrame两种最主要数据结构,索引 ...

  7. Pandas 学习 第9篇:DataFrame - 数据的输入输出

    常用的数据存储介质是数据库和csv文件,pandas模块包含了相应的API对数据进行输入和输出: 对于格式化的平面文件:read_table() 对于csv文件:read_csv().to_csv() ...

  8. pandas 学习 第十一篇:处理缺失值

    Pandas中的缺失值是指nan.None和NaT.如果需要把inf 和 -inf视为缺失值,需要设置 pandas的选项: pandas.options.mode.use_inf_as_na = T ...

  9. pandas 学习 第14篇:索引和选择数据

    数据框和序列结构中都有轴标签,轴标签的信息存储在Index对象中,轴标签的最重要的作用是: 唯一标识数据,用于定位数据 用于数据对齐 获取和设置数据集的子集. 本文重点关注如何对序列(Series)和 ...

随机推荐

  1. JS时间戳与时间字符串之间的相互转换

    时间字符串 转 时间戳 /** * 时间字符串 转 时间戳 * @param {String} time_str 时间字符串(格式"2014-07-10 10:21:12") * ...

  2. java之四种权限修饰符

    java权限修饰符piublic.protected.private.置于类的成员定义前,用来限定对象对该类成员的访问权限. 修饰符 类内部 同一个包 子类 任何地方 private yes     ...

  3. Mac--ModuleNotFoundError: No module named 'magic'

    关于Mac本报错“ ModuleNotFoundError: No module named 'magic' ” 作为一个python程序员,简单粗暴pip install python-magic ...

  4. LeetCode 49: 字母异位词分组 Group Anagrams

    LeetCode 49: 字母异位词分组 Group Anagrams 题目: 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. Given an array o ...

  5. 对于jenkins上前端项目 npm 或 yarn 打包 及 部署 使用

    1.npm和yarn镜像源地址 npmMirror ~~~~~ https://skimdb.npmjs.com/registry/ edunpm ~~~~~~ http://registry.enp ...

  6. JVM内存模型与类加载机制

    一. java虚拟机的内存模型如图: 补习一下jvm内存模型中的各个组成部分 堆: 我们new出来的对象全部放在堆中,他是jvm所能够动态分配的最大的一块空间 优点: 内存动态分配,生命周期不必事先告 ...

  7. (四十)c#Winform自定义控件-开关-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  8. Customize the Application UI and Behavior 自定义应用程序UI和行为

    In XAF, the business model defines the database structure and UI appearance. Changes to your persist ...

  9. redis windows版安装

    首先到 https://github.com/ServiceStack/redis-windows 下载redis 然后将下载的文件解压 然后获取里面的这个压缩包并且解压 这是2.8.2101版本的, ...

  10. Android 媒体格式

    音频格式和编解码器 格式/编解码器 编码器 解码器 细节 支持的文件类型/容器格式 AAC LC • • 支持单声道/立体声/ 5.0 / 5.1内容,标准采样率为8至48 kHz. •3GPP(.3 ...