利用Python进行数据分析(Ⅳ)

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。利用Python进行数据分析(Ⅳ),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

利用Python进行数据分析(Ⅳ)

本文参考书籍:《利用Python进行数据分析》

目录

10.数据聚合与分组操作

  

10.1 GroupBy机制

  在操作的第一步,数据包含在pandas对象中,可以是Series、DataFrame或其他数据结构,之后根据你提供的一个或多个键分离到各个组中。分离操作是在数据对象的特定轴向上进行的。例如,DataFrame可以在它的行方向(axis=0)或列方向(axis=1)进行分组。分组操作后,一个函数就可以应用到各个组中,产生新的值。最终,所有函数的应用结果会联合为一个结果对象。结果对象的形式通常取决于对数据进行的操作。下图是一个简单的分组聚合样例:
在这里插入图片描述
  分组键可以是多种形式的,并且键不一定是完全相同的类型:

  • 与需要分组的轴向长度一致的值列表或值数组
  • DataFrame的列名的值
  • 可以将分组轴向上的值和分组名称相匹配的字典或Series
  • 可以在轴索引或索引中的单个标签上调用的函数

  后三个方法是可以产生用于分隔对象的值数组的快捷方式。

在这里插入图片描述
  假设想要根据key1标签计算data1列的均值,可以访问data1并使用key1列(它是一个Series)调用groupby方法:
在这里插入图片描述
  grouped变量现在是一个GroupBy对象。除了一些关于分组键df[‘key1’]的一些中间数据之外,它实际上还没有进行任何计算。这个对象拥有所有必须的信息,之后可以在每一个分组上应用一些操作。例如,为了计算分组的均值可以调用GroupBy的mean方法:
在这里插入图片描述
  数据(一个Series)根据分组键进行了聚合,并产生了一个新的Series,这个Series使用key1列的唯一值作为索引,由于DataFrame的列df[‘key1’],结果中的索引名称为’key1’
  若我们将多个数组作为列表传入,则:
在这里插入图片描述
  这里我们使用了两个键对数据进行分组,并且结果Series现在拥有一个包含唯一键对的多层索引:
在这里插入图片描述
  在这个例子中,分组键都是Series,尽管分组键也可以是正确长度的任何数组:
在这里插入图片描述
  分组信息通常包含在同一个DataFrame中,在这种情况下,可以传递列名(无论那些列名是字符串、数字或其他Python对象)作为分组键:
在这里插入图片描述
  GroupBy的size方法返回一个包含组大小信息的Series:
在这里插入图片描述
  

10.1.1 遍历各分组

  GroupBy对象支持迭代,会生成一个包含组名和数据块的2维元组序列:
在这里插入图片描述
  在多个分组键的情况下,元组中的第一个元素是键值的元组:
在这里插入图片描述
  计算数据块的字典:
在这里插入图片描述
  默认情况下,groupby在axis=0的轴向上分组,但也可以在其他任何轴向上进行分组。根据dtype对df的列进行分组:
在这里插入图片描述
  

10.1.2 选择一列或所有列的子集

  将从DataFrame创建的GroupBy对象用列名称或列名称数组进行索引时,会产生用于聚合的列子集的效果:
在这里插入图片描述
  计算data2列的均值,并获得DataFrame形式的结果:
在这里插入图片描述
  若传递的是列表或数组,则此索引操作返回的对象是分组的DataFrame;若只有单个列名作为标量传递,则为分组的Series:
在这里插入图片描述

10.1.3 使用字典和Series分组

  分组信息可能会以非数组形式存在:
在这里插入图片描述
  假设拥有各列的分组对应关系,并且想把各列按组累加:
在这里插入图片描述
  Series也有相同的功能,可以视为固定大小的映射:
在这里插入图片描述

10.1.4 使用函数分组

  与使用字典或Series分组相比,使用Python函数是定义分组关系的一种更为通用的方式。作为分组键传递的函数将会按照每个索引值调用一次,同时返回值会被用作分组名称。考虑上一节的示例DataFrame,其中人的名字作为索引值,根据名字的长度进行分组,可传递len函数:
在这里插入图片描述
  将函数与数组、字典或Series进行混合并不困难,所有的对象都会在内部转换为数组:
在这里插入图片描述

10.1.5 根据索引层级分组

  分层索引的数据集可以在轴索引的某个层级上进行聚合。如:
在这里插入图片描述
  根据层级分组时,将层级数值或层级名称传递给level关键字:
在这里插入图片描述

10.2 数据聚合

  常见的groupby聚合方法如下:
在这里插入图片描述
  可以使用自行制定的聚合,并再调用已经在分组对象上定义好的方法。quantile可以计算Series或DataFrame列的样本分位数。尽管quantile并不是显式地为GroupBy对象实现的,但它是Series的方法,因此也可以用于聚合。在内部,GroupBy对Series进行切片,为每一块调用piece.quantile(0.9),然后将这些结果一起组装到结果对象中:
在这里插入图片描述
  要使用自定义的聚合函数,需要将函数传递给aggregate或agg方法:
在这里插入图片描述
  describe方法也是有效的:
在这里插入图片描述

10.2.1 逐列及多函数应用

  
在这里插入图片描述
  可以根据各列同时使用多个函数进行聚合。首先,根据day和smoker来对tips进行分组:
在这里插入图片描述
  可以将函数名以字符串形式传递:
在这里插入图片描述
  若传递的是函数或者函数名的列表,会获得一个列名是这些函数名的DataFrame:
在这里插入图片描述
  这里我们传递了聚合函数的列表给agg方法,这些函数会各自运用于数据分组
  可以不接受GroupBy对象给予各列的名称。若传递的是(name,function)元组的列表,每个元组的第一个元素将作为DataFrame的列名(可以认为二元元组的列表是一种有序的对应关系):
在这里插入图片描述
  在DataFrame中,有更多的选项,可以指定应用到所有列上的函数列表或每一列上要应用的不同函数。假设想要计算tip_pct列和total_bill列的三个相同的统计值:
在这里插入图片描述
在这里插入图片描述
  可以传递具有自定义名称的元组列表:
在这里插入图片描述
  若想要将不同的函数应用到一个或多个列上,需将含有列名与函数对应关系的字典传递给agg:
在这里插入图片描述
在这里插入图片描述
  只有多个函数应用于至少一个列时,DataFrame才具有分层列

10.2.2 返回不含行索引的聚合数据

  向groupby传递as_index=False来禁用分组键作为索引:
在这里插入图片描述

10.3 应用:通用拆分-应用-联合

  GroupBy方法最常见的目的是apply,apply将对象拆分成多块,然后在每一块上调用传递的函数,之后尝试将每一块拼接到一起

  假设想要按组选出小费百分比(tip-pct)最高的五组。首先,写一个可以在特定列中选出最大值所在行的函数:
在这里插入图片描述
  若按照smoker进行分组,之后调用apply:
在这里插入图片描述
  top函数在DataFrame的每一行分组上被调用,之后使用pandas.concat将函数结果粘贴在一起,并使用分组名作为各组的标签。因此结果包含一个分层索引,该分层索引的内部层级包含原DataFrame的索引值
  若除了向apply传递函数,还传递其他参数或关键字,可以把这些放在函数后进行传递:
在这里插入图片描述

10.3.1 压缩分组键

  在之前的例子中,可以看到所得到的对象具有分组键所形成的分层索引以及每个原始对象的索引。可以向groupby传递group_keys=False来禁用这个功能:
在这里插入图片描述

10.3.2 分位数与桶分析

  
在这里插入图片描述
  cut返回的Categorical对象可以直接传递给groupby:
在这里插入图片描述
  为了根据样本分位数计算出等大小的桶,需要使用qcut。传递labels=False来获得分位数数值:
在这里插入图片描述

10.3.3 示例:使用指定分组值填充缺失值

  可使用fillna填充NA值:
在这里插入图片描述
在这里插入图片描述
  假设你需要填充值按组来变化,一个方法是对数据分组后使用apply和一个在每个数据块上都调用fillna的函数
在这里插入图片描述
  [‘East’]*4生成了一个包含四个[‘East’]中元素的备份的列表。将列表拼接在一起。
在这里插入图片描述
在这里插入图片描述

  在另一种情况下,可能已经在代码中为每个分组预定义了填充值。由于每个分组都有一个内置的name属性,可以这样使用:

在这里插入图片描述

10.3.4 示例:随机采样与排列

  Series的sample方法可用于随机采样
  构造一副扑克牌:
在这里插入图片描述
  现在拥有了一个长度为52的Series,Series的索引包含了牌名
在这里插入图片描述
  从这副牌中拿出5张牌:
在这里插入图片描述
  从每个花色中随机抽取两张牌:
在这里插入图片描述
在这里插入图片描述

10.3.5 示例:分组加权平均和相关性

  使用一个包含分组键和权重值的数据集:
在这里插入图片描述
  通过category进行分组加权平均:
在这里插入图片描述
在这里插入图片描述
  计算一个DataFrame,它包含标普指数(SPX)每日收益的年度相关性(通过百分比变化计算)。首先创建一个计算每列与’SPX’列成对关联的函数:
在这里插入图片描述
  之后,使用pct_change计算close-px百分比的变化:
在这里插入图片描述
  最后,按年对百分比变化进行分组,可以使用单行函数从每个行标签中提取每个datetime标签的year属性:
在这里插入图片描述
  也可以计算内部列相关性,这里我们计算苹果和微软的年度相关性:
在这里插入图片描述

10.3.6 示例:逐组线性回归

  可以定义以下regress(回归)函数(使用statsmodels计量经济学库),该函数对每个数据块执行普通最小二乘(OLS)回归:
在这里插入图片描述
  计算AAPL在SPX回报上的年度线性回归:
在这里插入图片描述

10.4 数据透视表与交叉表

  计算一张在行方向上按day和smoker排列的分组平均值(默认的pivot_table聚合类型)的表:
在这里插入图片描述
  在tip_pct和size上进行聚合,并根据time分组。把smoker放入表的列,将day放入表的行:
在这里插入图片描述
  可以通过传递margins=True来扩充这个表来包含部分总计。这会添加ALL行和列标签,其中相应的值是单层中所有数据的分组统计值:
在这里插入图片描述
  要使用不同的聚合函数时,将函数传递给aggfunc。例如,’count’或者len将给出一张分组大小的交叉表(计数或出现频率):
在这里插入图片描述
  可以传递fill_value填充空值或NA:
在这里插入图片描述
  pivot_table的选项如下:
在这里插入图片描述
  

10.4.1 交叉表:crosstable

  交叉表是数据透视表的一个特殊情况,计算的是分组中的频率。
在这里插入图片描述
  可能想按照国籍和惯用性来总结这些数据,可以使用pandas.crosstab函数实现该功能:
在这里插入图片描述

  crosstab的前两个参数可以是数组、Series或数组的列表:
在这里插入图片描述

11.时间序列

11.1 日期和时间数据的类型及工具

  Python标准库包含了日期和时间数据的类型,也包括日历相关的功能。如datetime、time和calendar模块。datetime.datetime类型,或简写为datetime,是广泛使用的:
在这里插入图片描述
  datetime既存储了日期,也存储了细化到微秒的时间。timedelta表示两个datetime对象的时间差:
在这里插入图片描述
  可以为一个datetime对象加上(或减去)一个timedelta或其整数倍来产生一个新的datetime对象:
在这里插入图片描述
  以下为datetime模块中的类型:
在这里插入图片描述

11.1.1 字符串与datetime互相转换

  可以使用str方法或传递一个指定的格式给strftime方法来对datetime对象和pandas的Timestamp对象进行格式化
在这里插入图片描述
  datetime的格式说明如下:
在这里插入图片描述
  可以使用datetime.srtptime和格式代码,将字符串转换为日期:
在这里插入图片描述
  dateutil包的parser.parser方法能解析大部分日期表示:
在这里插入图片描述
  可以通过传递dayfirst=True来表示日期在月份之前的情况:
在这里插入图片描述
  pandas的to_datetime方法可以转换很多不同的日期表示格式:
在这里插入图片描述
  to_datetime方法可以处理那些被认为是缺失值的值(None、空字符串等):
在这里插入图片描述
  NaT(Not a time)是pandas中时间戳数据的null值

11.2 时间序列基础

  pandas中的基础时间序列种类是由时间戳索引的Series,在pandas外部则通常表示为Python字符串或datetime对象:
在这里插入图片描述
  在这种情况下,这些datetime对象可以被放入DatetimeIndex中:
在这里插入图片描述
  和其他Series类似,不同索引的时间序列之间的算术运算在日期上自动对齐:
在这里插入图片描述

11.2.1 索引、选择、子集

  当基于标签进行索引和选择时,时间序列的行为和其他的pandas.Series类似:
在这里插入图片描述
  还可以传递一个能解释为日期的字符串:
在这里插入图片描述
  对一个长的时间序列,可以传递一个年份或一个年份和月份来选择数据的切片:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  可以使用datetime对象进行切片:
在这里插入图片描述
  因为大部分的时间序列数据是按时间顺序排列的,可以使用不包含在时间序列中的时间戳进行切片,以执行范围查询:
在这里插入图片描述
  可以传递一个字符串的日期、datetime对象或者时间戳。通过这种方式的切片产生了原时间序列的视图,在切片上的修改会反映在原始数据上

  truncate可以在两个日期间对Series进行切片:
在这里插入图片描述
  上面这些操作也适用于DataFrame,并在其行上进行索引:
在这里插入图片描述

11.2.2 含有重复索引的时间序列

  可能有多个数据观察值落在特定的时间戳上:
在这里插入图片描述
  通过检查索引的is_unique属性,可以看出索引并不是唯一的:
在这里插入图片描述
  对上面的Series进行索引,结果是标量值还是Series切片取决于是否有时间戳是重复的:
在这里插入图片描述
  若想要聚合含有非唯一时间戳的数据,可以使用groupby并传递level=0:
在这里插入图片描述

11.3 日期范围、频率和移位

  可通过resample方法将样本时间序列转换为固定的每日频率数据:
在这里插入图片描述

11.3.1 生成日期范围

  pandas.date_range是用于根据特定频率生成指定长度的DatetimeIndex:
在这里插入图片描述
  默认情况下,date_range生成的是每日的时间戳。若只传递一个起始或结尾日期,必须传递一个用于生成范围的数字:
在这里插入图片描述
  开始日期和结束日期严格定义了生成日期索引的边界。例如,若需要一个包含每月最后业务日期的时间索引,可以传递BM频率(business end of month,月度业务结尾),只有落在或在日期范围内的日期会被包括:
在这里插入图片描述
  基础时间序列频率(不全)如下:
在这里插入图片描述
在这里插入图片描述
  默认情况下,date_range保留开始或结束时间戳的时间(如果有的话):
在这里插入图片描述
  对于包含时间信息的开始日期或结束日期,若想生成标准化为0点的时间戳,可使用normalize选项:
在这里插入图片描述

11.3.2 频率和日期偏置

  pandas中的频率是由基础频率和倍数组成的。基础频率通常会有字符串别名,例如M代表每月,H代表每小时。对于每个基础频率,都有一个对象可以被用于定义日期偏置。例如,每小时的频率可以使用Hour类来表示:
在这里插入图片描述
  可以传递一个整数来定义偏置量的倍数:
在这里插入图片描述
  可以使用字符串别名,无需显式地创建这些对象,如H或4H。在基础频率前放一个整数就可以生成倍数:
在这里插入图片描述
  多个偏置可以通过加法进行联合:
在这里插入图片描述
  类似地,可以传递频率字符串,如1h30min会转换为同等的表达式:
在这里插入图片描述
  

11.3.2.1 月中某星期的日期

  “月中某星期”以’WOM’开始,可获取每月第三个星期五这样的日期:
在这里插入图片描述

11.3.3 移位(前向和后向)日期

  移位指将日期按时间向前移动或向后移动。Series和DataFrame都有一个shift方法用于进行简单的前向或后向移位,而不改变索引:
在这里插入图片描述
  shift常用于计算时间序列或DataFrame多列时间序列的百分比变化:
在这里插入图片描述
  由于简单移位并不改变索引,一些数据会被丢弃。因此,如果频率是已知的,则可以将频率传递给shift来推移时间戳而不是简单的数据:
在这里插入图片描述
  
在这里插入图片描述

11.3.3.1 使用偏置进行移位日期

  pandas日期偏置也可以使用datetime或Timestamp对象完成:
在这里插入图片描述
  若添加了一个锚定偏置量,如MonthEnd,根据频率规则,第一个增量会将日期前滚到下一个日期:
在这里插入图片描述
  锚定偏置可以使用rollforward和rollback分别显式地将日期向前或向后滚动:
在这里插入图片描述
  将移位方法与groupby一起使用是日期偏置的一种创造性用法:
在这里插入图片描述
在这里插入图片描述
  使用resample是更简单的方式:
在这里插入图片描述

11.4 时区处理(略)

11.5 时间区间和区间算术

  时间区间指时间范围,用Period类表示
在这里插入图片描述
  在这个例子中,Period对象表示的是从2007年1月1日到2007年12月31日(包含在内)的时间段。在时间段上增加或减去整数可以根据它们的频率进行移位:
在这里插入图片描述
  若两个区间拥有相同的频率,则它们的差是它们之间的单位数:
在这里插入图片描述
  使用period_range函数可以构造规则区间序列:
在这里插入图片描述
  PeriodIndex类存储的是区间的序列,可以作为任意pandas数据结构的轴索引:
在这里插入图片描述
  若有一个字符串数组,也可以使用PeriodIndex类:
在这里插入图片描述

11.5.1 区间频率转换

  使用asfreq可以将区间和PeriodIndex对象转换为其他的频率。如,假设我们有一个年度区间,并且想要在一年的开始或结束时将其转换为月度区间:
在这里插入图片描述
  
在这里插入图片描述
  这里,年度区间被替换为对应于每个年度区间内的第一个月的月度区间。若我们想要每年最后一个工作日,可以使用’B’频率来表示我们想要的是区间的末端:
在这里插入图片描述

11.5.2 季度区间频率(略)

11.5.3 将时间戳转换为区间(以及逆转换)

  通过时间戳索引的Series和DataFrame可以被to_period方法转换为区间:
在这里插入图片描述
  由于区间是非重叠时间范围,一个时间戳只能属于给定频率的单个区间。尽管默认情况下可根据时间戳推断出新PeriodIndex的频率,但可以指定任何想要的频率。在结果中可以包含重复的区间:
在这里插入图片描述
  使用to_timestamp可以将区间再转换为时间戳:
在这里插入图片描述

11.5.4 从数组生成PeriodIndex

  固定频率数据集有时存储在跨越多列的时间范围信息中,例如,年份和季度在不同列中:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  通过将这些数组和频率传递给PeriodIndex,可以联合这些数组形成DataFrame的索引:
在这里插入图片描述

11.6 重新采样与频率转换

  重新采样是指将时间序列从一个频率转换为另一个频率的过程。将更高频率的数据聚合到低频率被称为向下采样,而从低频率转换到高频率称为向上采样。
  pandas对象都配有resample方法,该方法是所有频率转换的工具函数。resample拥有类似于groupby的API;你调用resample对数据分组,之后再调用聚合函数:
在这里插入图片描述
在这里插入图片描述
  resample方法的参数如下:
在这里插入图片描述

11.6.1 向下采样

  
在这里插入图片描述
  通过计算每一组的加和将这些数据聚合到五分钟的块内:
在这里插入图片描述
  传递的频率按五分钟的增量定义了箱体边界。默认情况下,左箱体边界是包含的,传递closed=right将间隔的闭合端改为右边
  产生的时间序列按照每个箱体左边的时间戳被标记。传递label=’right’可以使用右箱体边界标记时间序列:
在这里插入图片描述
  最后,可能需要将结果索引移动一定的数量,例如从右边缘减去一秒,以使其更清楚地表明时间戳所指的间隔。可向loffset传递字符串或日期偏置(或在结果上调用shift方法):
在这里插入图片描述

11.6.1.1 开端-峰值-谷值-结束(OHLC)重新采样(略)

11.6.2 向上采样与插值

  
在这里插入图片描述
  当对这些数据使用聚合函数时,每一组只有一个值,并且会在间隙中产生缺失值。使用asfreq方法在不聚合的情况下转换到高频率:
在这里插入图片描述
  若想前向填充每周数值,fillna和reindex方法中可用的填充或插值方法可用于重采样:
在这里插入图片描述
  可以选择仅向前填充一定数量的区间:
在这里插入图片描述
  注意新的日期索引无需与旧的索引重叠:
在这里插入图片描述

11.6.3 使用区间进行重新采样

在这里插入图片描述
  在向上采样中,必须在重新采样前决定新频率中在时间段的哪一端放置数值,就像asfreq方法一样。convention参数默认值是start,但也可以是end:
在这里插入图片描述

11.7 移动窗口函数

  统计和其他通过移动窗口或指数衰减而运行的函数是用于时间序列操作的数组变换的一个重要类别。这对平滑噪声或粗糙的数据非常有用。称这些函数为移动窗口函数,尽管它也包含了一些没有固定长度窗口的函数,如指数加权移动平均。这些函数会自动排除缺失数据。
在这里插入图片描述
  rolling算子的行为与resample和groupby类似。rolling可以在Series或DataFrame上通过一个window(以一个区间的数字来表示)进行调用
在这里插入图片描述
在这里插入图片描述
  rolling(250)与groupby的行为类似,但它创建的对象是根据250日滑动窗口分组的而不是直接分组。因此这里我们获得了苹果公司股票价格的250日移动窗口平均值
  默认情况下,滚动函数需要窗口中所有的值必须是非NA值。由于存在缺失值这种行为会发生改变,尤其是在时间序列的起始位置你拥有的数据是少于窗口区间的:
在这里插入图片描述
在这里插入图片描述
  为了计算扩展窗口均值,使用expanding算子,而不是rolling。扩展均值从时间序列的起始位置开始时间窗口,并增加窗口的大小,直到它涵盖整个序列。apple_std250的扩展均值窗口如下:
在这里插入图片描述
  在DataFrame上调用一个移动窗口函数会将变换应用到每一列上:
在这里插入图片描述
  rolling函数也接收表示固定大小的时间偏置字符串,而不只是一个区间的集合数字。对不规则时间序列使用注释非常有用。这些字符串可以传递给resample。例如,可以计算20天的滚动平均值:
在这里插入图片描述

11.7.1 指数加权函数

  指定一个常数衰减因子以向更多近期观测值提供更多权重,可以替代使用具有相等加权观察值的静态窗口尺寸的方法。有多种方式可以指定衰减因子。其中一种流行的方式是使用一个span(跨度),这使得结果与窗口大小等于跨度的简单移动窗口函数
  由于指数加权统计值给更近期的观测值以更多的权重,与等权重的版本相比,它对变化适应地更快
  pandas拥有ewm算子,同rolling、expanding算子一起使用。以下是将苹果公司股票价格的60日均线与span=60的EW移动平均线进行比较的例子:
在这里插入图片描述

11.7.2 二元移动窗口函数

  一些统计算子,例如相关度和协方差,需要操作两个时间序列
在这里插入图片描述
  调用rolling后,corr聚合函数可以根据spx_rets计算滚动相关性:
在这里插入图片描述
  若传递了一个Series或一个DataFrame,rolling_corr这样的函数将会计算Series与DataFrame中每一列的相关性:
在这里插入图片描述

11.7.3 用户自定义的移动窗口函数

  在rolling及其相关方法上使用apply方法提供了一种在移动窗口中应用你自己设计的数组函数的方法。唯一的要求是该函数从每个数组中产生一个单值(缩聚)。scipy.stats.percentileofscore函数可以得到样本中特定值的百分位数:
在这里插入图片描述

12 高阶pandas

  

12.1 分类数据

12.1.1 背景和目标

  unique和value_counts这样的函数允许从一个数组中提取不同值并分别计算这些不同值的频率:
在这里插入图片描述
  维度表包含了不同值,并将主要观测值存储为引用维度表的整数键:
在这里插入图片描述
  可以使用take方法来恢复原来的字符串Series:
在这里插入图片描述

  这种按照整数展现的方式被称为分类或字典编码展现。不同值的数组可以被称为数据的类别、字典或层级。

12.1.2 pandas中的Categorical类型

  pandas拥有的Categorical类型,用于承载基于整数的类别展示或编码的数据
在这里插入图片描述
  这里,df[‘fruit’]是一个Python字符串对象组成的数组。可以通过调用函数将其转换为Categorical对象:
在这里插入图片描述
  fruit_cat的值是pandas.Categorical的实例:
在这里插入图片描述
  Categorical对象拥有categories和codes属性:
在这里插入图片描述
  可以通过分配已转换的结果将DataFrame的一列转换为Categorical对象:
在这里插入图片描述
  可以从其他Python序列类型直接生成pandas.Categorical:
在这里插入图片描述
  若已经从另一个数据源获得了分类编码数据,可以使用from_codes构造函数:
在这里插入图片描述
  除非显式地指定,分类转换是不会指定类别的顺序的。因此categories数组可能会与输入数据的顺序不同。当使用from_codes或其他任意构造函数时,可以为类别指定一个有意义的顺序:
在这里插入图片描述
  输出的[foo<bar<baz]表明foo的顺序在bar之前,以此类推。一个未排序的分类实例可以使用as_ordered进行排序:
在这里插入图片描述

12.1.3 使用Categorical对象进行计算

  
在这里插入图片描述
  计算上面数据的四分位分箱,并提取一些统计值:
在这里插入图片描述
  可以通过在qcut函数中使用labels参数来使用四分位数名称:
在这里插入图片描述
  被标记的bins分类数据并不包含数据中箱体边界的相关信息,因此可以使用groupby来提取一些汇总统计值:
在这里插入图片描述
  结果中的quartile列保留了bins中原始的分类信息,包括顺序:
在这里插入图片描述

12.1.4 分类方法

  
在这里插入图片描述
  特殊属性cat提供了对分类方法的访问:
在这里插入图片描述
  若我们知道该数据的实际类别集合超出了数据中观察到的四个值。可以使用set_categories方法来改变类别:
在这里插入图片描述
在这里插入图片描述
  可以使用remove_unused_categories方法来去除未观察到的类别:
在这里插入图片描述
  pandas中Series的分类方法如下:
在这里插入图片描述

12.1.4.1 创建用于建模的虚拟变量

  当使用统计数据或机器学习工具时,通常会将分类数据转换为虚拟变量,也称为one-hot编码。这会产生一个DataFrame,每个不同的类别都是它的一列。这些列包含一个特定类别的出现次数,否则为0。
  pandas.get_dummies函数将一维的分类数据转换为一个包含虚拟变量的DataFrame:
在这里插入图片描述

12.2 高阶GroupBy应用

12.2.1 分组转换和“展开”GroupBy

  transform与apply方法类似但是会给你可以使用的函数种类加上更多的限制:

  • transform可以产生一个标量值,并广播到各分组的尺寸数据中
  • transform可以产生一个与输入分组尺寸相同的对象
  • transform不可改变它的输入

  
在这里插入图片描述
在这里插入图片描述
  若想要产生一个Series,它的尺寸和df[‘value’]一样,但值都被按’key’分组的均值替代。可以向transform传递匿名函数lambda x:x.mean():
在这里插入图片描述
  可以传递一个字符串别名:
在这里插入图片描述
  与apply类似,transform可以与返回Series的函数一起使用,但结果必须和输入有相同的大小。例如,可以使用lambda函数给每个组乘以2:
在这里插入图片描述
  可以按照每个组的降序计算排名:
在这里插入图片描述
  考虑一个由简单聚合构成的分组转换函数,我们使用transform或apply可以获得等价的结果:
在这里插入图片描述
在这里插入图片描述
  
在这里插入图片描述
在这里插入图片描述

12.2.2 分组的时间重新采样

  对于时间序列数据,resample方法在语义上是一种基于时间分段的分组操作
在这里插入图片描述
  可以按’time’进行索引,然后重新采样:
在这里插入图片描述
  若DataFrame包含多个时间序列,并按一个附加的分组键列进行了标记:
在这里插入图片描述
  要为每个’key’的值进行相同的重新采样,可以使用resample.TimeGrouper对象:
在这里插入图片描述
  之后我们可以设置时间索引,按’key’和time_key进行分组,再聚合:
在这里插入图片描述
在这里插入图片描述
  使用TimeGrouper的一个限制是时间必须是Series或DataFrame的索引

12.3 方法链技术(略)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153774.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!