(自学)利用Python进行数据分析-第五章(pandas入门)

  • 第五章(pandas入门)
    • 简介
      • Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。
      • 安装和使用
        • pip install pandas
        • import pandas as pd
      • pandas与NumPy
        • 尽管pandas采用了很多NumPy的代码风格,但最大的不同在于pandas是用来处理表格型或者异质性数据的,而NumPy则相仿,他更加适合处理同质性的数值类数组数据
      • 中文网站
        • https://www.pypandas.cn
    • pandas数据结构介绍
      • 简介
        • 为了入门pandas,你需要熟悉两个常用的工具数据结构:series和DataFrame。尽管它们并不能解决所有的问题,但它们为大多数应用提供了一个有效、易懂的基础。
      • Series
        • 一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近。Series如今能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
        • Series是一种一维的数组型对象,他包含了一个值序列(与NumPy中的类型相似),并且包含了数据标签称为索引。
        • 交互式环境中Series的字符串表示,索引在左边,值在右边。由于我们不为数据指定索引,默认生成索引从0到N-1(N是数据的长度),你可以通过values和index属性分别获取Series对象的值和索引
        • 与NumPy的数组相比,你可以在从数据中选择数据的时候使用标签index来进行索引:obj[index],obj[[index1,index2]]
        • 使用NumPy的函数或者NumPy风格的操作,比如使用布尔值数组进行过滤obj[obj > 2],与标量相乘obj * 2或者是应用数学函数np.exp(obj),这些操作将保存索引值连接
        • 你可以认为Series他是一个长度固定切有序的字典,因为它将索引值和数据值按位置配对,在可能会使用到字典的上下文中也是可以使用Series
        • 如果你已经 有数据包含在Python字典中,是可以直接生成一个Series pd.Series(字典)
        • 当你把字典传递给Series构造函数是,产生的Series的索引将是排序好的字典键。你可以将字典键按照你所想要的顺讯传递给构造函数,从而生成的Series的索引顺序符合你的预期。备注:当索引中不包含字典键时,会排除不包含的字典键值,不包含的索引对应的值将会是NaN 缺失值或者NA(缺失数据)
        • isnull、notnull 可以用来检查Series中的缺失值返回Bool数组。pd.isnull(obj)、obj.isnull()
        • obj1 + obj2 索引index相同相加,一个存在一个不存在的保留索引index 值为NaN
        • series对象自身和其索引都有name属性,这个特性与pandas其他重要功能集成在一起  obj.name = '' ,obj.index.name = ''
        • series的索引可以通过按位置赋值的方式进行改变。obj.index = ['i1','i2']
      • DataFrame
        • DataFrame表示的是矩阵数据表,它包含已排序的列集合,每一列可以是不同的值类型(数值、字符串、布尔值等)。
        • DataFrame既有行索引也有列索引,他可以被视为一个共享相同索引的Series的字典
        • 尽管DataFrame是二维的,但你可以利用分层索引在DataFrame中展现更高纬度的数据。(分层索引时pandas中一种更为高级的数据处理特性,我们将在第八章中讨论)
        • 基础操作
          • 利用包含等长度列表或者Numpy数组字典来构建DataFrame  (pd.DataFrame(对象))
          • 构建产生的DataFrame会自动为Series分配索引,并且列会按照排序的顺序排列
          • 如果使用Jupyter notebook、pandas的DataFrame对象将会展示位一个对浏览器更为友好的HTML表格
          • 对于大型的DataFrame,head方法将会值选出头部5行数据进行展示  dfobj.head()
          • DataFrame的列可以按照指定顺序排列。pd.DataFrame(data,columns=['列名','列名'])
          • 传入列不包含在字典中将会在结果中初选缺失值NaN
          • data.columns、data.index 可以获取数据中的行列列表
        • 使用操作
          • DataFrame中一列,可以按字典标记或者属性那样检索为Series。data['colunm']、data.colunm
          • data[colunm]对于任意列名均有效,但是data.column只在列名是有效的Python变量名时才有效
          • 注意:返回的Series与袁DataFrame有相同的索引,且Series的name属性也会被合理的设置
          • 行可以通过位置或特殊属性loc进行选取。 data.loc[colunm]
          • 列的引用可以修改。data[colunm] = 值(当你将列表或者数组赋值给一个列是,值的长度必须和DataFrame的长度匹配。如果你将Series赋值给一列时,Series的索引将会按照DataFrame的索引重新排列,并在空缺的地方填充缺失值NaN)
          • 如果赋值的列不存在,则会生成一个新的列。(data.column语法是无法创建新列)
          • del方法可以用于移除列。del data[column]
          • 注意:从DataFrame中选取列的数据的视图,而不是拷贝。因此对Series的修改会映射到DataFrame中。如果需要复制,则应当显式的使用Series的copy方法
          • 如果将嵌套字典赋值给DataFrame,pandas会将字典的键作为列,将内部字典的键作为行索引。(无数据会用缺失值NaN补全)
          • 可以使用类似NumPy的语法对DataFrame进行转置操作(调换行和列)。data.T
          • 内部字典的键被联合、排序后形成了结果的索引。如果已经显式指明索引的话,内部字典键将不会被排序。
          • 包含Series的字典也可以用于构造DataFrame
          • 和Series类似,DataFrame的values属性将包含在DataFrame中数据以二维ndarray的形式返回
          • 如果DataFrame的列是不通dtypes,则values的dtype会自动选择适合所有列的类型
        • DataFrame构造函数的有效输入
          • 2D ndarray 注释:数据的矩阵,航和列的标签是可选参数
          • 数组、列表和元组构成的字典  注释:每个序列称为DataFrame的一列,所有的序列必须长度相等
          • NumPy结构化/记录化数组  注释:与数组构成的字典一致
          • Series构成的字典  注释:每个值成为一列,每个Series的索引联合起来形成结果的行索引,也可以显式地传递索引
          • 字典构成的字典  注释:每一个内部字典称为一列,键联合起来形成结果的行索引
          • 字典或Series构成的列表  注释:列表中的一个元素形成DataFrame的一行,字典键或Series索引联合起来形成DataFrame的列标签
          • 列表或元组构成的列表  注释:与2D ndarray的情况一致
          • 其他DataFrame  注释:如果不显示传递索引,则会使用原DataFrame的索引
          • NumPy MaskedArray  注释:与2D ndarray的情况类似,丹隐藏值会在结果DataFrame中称为NA/缺失值
      • 索引对象
        • pandas中的索引对象是用于存储轴标签和其他元数据的(例如轴名称或者标签)。在构造Series或DataFrame时,你所使用的任意数组或者标签序列都可以在内部转换为索引对象。
        • 索引对象是不可变的,用户是无法修改索引对象的。(不变性使得在多种数据结构中分享索引对象更为安全)
        • 一些用户并不经常利用索引对象提供的功能,但是因为一些操作会产生包含索引化数据的结果,理解索引如何工作还是特别重要的
        • 与Python集合不同,pandas索引对象可以包含重复标签对应的数据。根据重复标签进行筛选,会选取所有重复标签对应的数据。
        • 索引对象的方法和属性
          • append  将额外的索引对象粘贴到原索引后,产生一个新的索引
          • difference  计算两个索引的差集
          • intersection  计算两个索引的交集
          • union  计算两个索引的并集
          • isin  计算表示每一个值是否在传值容器中的布尔数组
          • delete  将位置i的元素删除,并产生新的索引
          • drop  根据穿参删除指定索引值,并产生新的索引
          • insert  在位置i插入元素,并产生新的索引
          • is_monotonic  如果索引序列递增则返回True
          • is_unique  如果索引序列唯一则返回True
          • unique  计算索引的胃一直序列
    • 基本功能
      • 简介
        • 主要了解Series和DataFrame中数据交互的基础机制
      • 重建索引
        • relindex是panadas对象的重要方法,该方法用于创建一个符合新索引的新对象,Series调用reindex方法时,会将数据按照新的索引进行排列,如果某个索引值之前并不存在则会引入缺失值NaN
        • 对于顺序数据,比如时间序列,在重建索引时可能会需要进行插值或者填值。method可选参数允许我们使用诸如ffill等方法在重建索引时插值,ffill方法将会将值前向填充
        • 在DataFrame中reindex可以改变行索引、列索引,也可以同时改变二者。行索引参数index,列索引参数columns
        • 也可以使用loc进行更为简洁的标签索引。data.loc[[index],[columns]](备注:使用有警告可以忽略,大意是使用loc方法会有keyError异常用reindex替代)
        • reindex方法参数
          • index  新建作为索引的序列,可以是索引实例或任意其他序列型Python数据结构,索引使用时无需复制
          • method  插入值方式;‘ffill’为前向填充,‘bfill’是后向填充
          • fill_value  通过重新索引引入缺失数据时使用的替代值
          • limit  当前向或者后向填充时,所需填充的最大尺寸间隙(以元素数量)
          • tolerance  当前向或者后向填充时,所需填充的不精确匹配下的最大尺寸间隙(以绝对数字距离)
          • level  匹配MultiIndex级别的简单索引;否则选择子集
          • copy  如果为True,即使新索引等于旧索引,也总是复制底层数据;如果是False,则在索引相同时不要复制数据
      • 轴向上删除条目
        • 如果你已经拥有索引数组或者不含条目的列表,在轴向上删除一个或者更多的条目就非常容易,但这样需要一些数据操作和集合逻辑,drop方法会返回一个含有指示值或轴向上删除值的新对象
        • 在DataFrame中,索引值可以从轴向上删除
        • 调用drop时使用标签序列会根据行标签删除值,你可以通过传递axis=1或者axis='columns'来从列中删除值
        • drop函数,修改Series或DataFrame的尺寸或形状,使用inplace属性直接操作原对象而不会返回新对象。(很多函数类似)
      • 索引、选择与过滤
        • Series的索引(obj[....])与NumPy数组索引的功能类似,只不过Series的索引值可以不仅仅是整数。
        • 普通的Python切片中是不包含尾部的,Series的切片与之不同(obj['index':'index'])。也可以使用这种方式修改Series相应的部分。
        • 使用单个值或序列,可以从DataFrame中索引出一个或者多个列。
        • 行选择的语法obj[start:stop].传递单个元素或一个列表到[]符号中可以选择列
        • DataFrame可以是对标量进行比较产生的布尔值进行索引
        • 使用loc和iloc选择数据
          • 针对DataFrame允许你使用轴标签(loc)或整数标签(iloc)以NumPy风格的语法选择数组的行和列的子集
          • 通过标签选择除单行多了的数据。obj.loc['行索引',['列索引集合']]
          • 通过使用整数标签iloc选择数据。obj.iloc[行下标,[列下标集合]]
          • loc还可以通过索引切片来选择数据。obj.loc[start:stop,stat:stop/[数组]]、obj.loc[start:stop,stat:stop/[数组]][判断条件]
          • 在早期设计pandas时,我认为使用frame[:,col]来选择一列太过冗余(也容易出错),这是因为列选择是最为常用的操作。我做了设计权衡,将所有的神奇索引行为(包括标签和整数)都放到ix操作符中。事实上,这导致了整数轴标签数据中的许多边缘情况,所以pandas团队决定创建loc和iloc运算符分别用于严格处理基于标签和基于整数的索引。ix索引依然存在,但已经启用。不推荐使用他
          • DataFrame索引选项
            • df[val]  从DataFrame中选择单列或者列序列;特殊情况的便利:布尔数组(过滤行),切片(切片行)或者布尔值DataFrame(根据某些标量设置的值)
            • df.loc[val]  根据标签选择DataFrame的单行或者多行
            • df.loc[:,val]  根据标签选择单列或者多列
            • df.loc[val1,val2]  同时选择行和列的一部分
            • df.iloc[where]  根据整数位置选择单行或者多行
            • df.iloc[:,where]  根据整位置选择单列或者多列
            • df.iloc[where_i,where_j]  根据整数位置选择行和列
            • df.at[label_i,label_j]  根据行、列标签选择单个标量值
            • df.iat[i,j]  根据行、列整数位置选择丹哥标量值
            • reindex方法  通过标签选择行或者列
            • get_value,set_value方法  根据行和列的标签设置单个值
      • 整数索引
        • 在pandas对象上使用整数索引对新用户来说经常会产生歧义,这是因为他在和在列表、元组等Python内建数据结构上进行索引有些许不同。ser = pd.Series(np.arange(3.))print(ser)# print(ser[-1])(会报错)
        • pandas可以“回退”到整数索引,但这个的方式难免会引起一些微小的错误。因为推断用户所需的索引方式(标签索引或者位置索引)是很难的
        • 对于非整数索引则不会有潜在的歧义
        • 为了保持一致性,如果你有一个包含整数的轴索引,数据选择时请始终使用标签索引。
        • 为了更加精确的处理,可以使用loc(用于标签)或iloc(用于整数)
      • 算术和数据对齐
        • 不同索引的对象之间的算术行为是pandas提供给一些应用的一项重要特性。当你将对象相加时,如果存在某个索引对不相同,则返回结果的索引将是索引对的并集。对数据库用户来说,这个特性类似于索引标签的自动外连接(outer join)。
        • 没有交叠的标签位置上,内部数据对齐会产生缺省值NaN。缺省值会在后续的算术操作上产生影响,并且行和列都会执行对齐
        • 如果你将两个行或列完全不同的DataFrame对象相加,结果将全部为空
        • 使用填充值的算术方法
          • 在两个不同的索引化对象之间进行算术操作时,你可能会想要使用特殊填充值,比如当轴标签在一个对象中存在,在另一个对象中不存在时,你想将缺失值填充为0,就要使用对象的方法了
          • 使用add方法将另一个对象和一个fill_value座位参数传入就可以填充缺省值。obj.add(obj1,fill_value=0)
          • 算术方法中的每一个都以一个以r开头的副本,这些副本方法的参数是翻转的
          • 当对Series或DataFrame重建索引时,你也可以指定一个不同的填充值
          • Series/DataFrame算术方法
            • add,radd 加法(+)
            • sub,rsub  减法(-)
            • div,rdiv  除法(/)
            • floordiv,rfloordiv  整除(//)
            • mul,rmul  乘法(*)
            • pow,rpow  幂次方(**)
        • DataFrame和Series间的操作
          • DataFrame和Series间的算术操作与NumPy中不同维度数组间的操作类似。
          • arr = np.arange(12.).reshape((3,4))print(arr)print(arr[0])print(arr - arr[0])当我们从arr中减去arr[0]时,减法在每一个行都进行了操作,这就是所谓的广播机制,后续我们将会在附录A中涉及对通用NumPy数组的内容更加深入的解释。DataFrame和Series间的操作时类似的
          • 默认情况下,DataFrame和Series的数学操作中会将Series的索引和DataFrame的列进行匹配并广播到各行
          • 如果一个索引值不在DataFrame的列中,也不在Series的索引中,则对象会重建索引并形成联合
          • 如果你想改为在列上进行广播,在行上进行匹配,你必须使用算术方法。frame = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'), index=['Utah', 'Ohio', 'Texas', 'Oregon'])series3 = frame['d']print(series3)print(frame)print(frame.sub(series3, axis='index'))
          • 你传递的axis值是用于匹配轴的
      • 函数应用和映射
        • NumPy的通用函数(逐元素数组方法)对pandas对象也是一样有效的。
        • DataFrame的apply方法可以将函数应用到一行或一列的一维数组上:fram = pd.DataFrame(np.random.randn(4, 3), columns=list('bde'),                    index=['Utah', 'Ohio', 'Texas', 'Oregon']) f = lambda x: x.max() - x.min()print(fram.apply(f))
        • 上述的函数f可以计算Series最大值和最小值的差,会被frame中的每一列调用一次。如果你传递axis=‘columns’给apply函数,函数将会被每一行调用一次print(fram.apply(f, axis='columns'))
        • 大部分最常用的数组统计(比如sum和mean)都是DataFrame的方法,因此计算统计值时使用apply并不是必须的。传递给apply的函数并不一定要返回一个标量值,也可以返回带有多个值的Series。def f(x):  return pd.Series([x.min(), x.max()],index=['min', 'max'])print(fram.apply(f))
        • 逐元素的Python函数也可以使用,DataFrame的使用方法是applymap方法。format = lambda x : '%.2f' % xprint(fram.applymap(format))
        • 使用applymap作为函数名是因为Series有map方法,可以将一个逐元素的函数应用到Series。
      • 排序和排名
        • 根据某些准则对数据集进行排序是另一个重要的内建操作。如需按行或者列索引进行字典型排序,需要使用sort_index方法,该方法返回一个新的、排序好的对象。
        • 在DataFrame中,你可以在各个轴上按索引排序。数据默认会升序排序,但是也可以按照降序排序。(ascending=False)
        • 如果根据Series的值进行排序,使用sort_values方法。默认情况下,所有的缺失值都会被排序至Series的尾部。
        • 当对DataFrame排序时,你可以使用一列或多列作为排序键。为了实现这个功能,传递一个或者多个列名给sort_values的可选参数by。
        • 排名是指对数据从1到有效数据点总数分配名次的操作。Series和DataFrame的rank方法是实现排名的方法,默认情况下,rank通过将平均排名分配到每个组来打破平级关系。(排名也可以根据他们在数据中的观察顺序进行分配)
        • 降序排名使用ascending=False
        • 排名中的平级关系打破方法
          • ‘average’ 默认:在每个组中分配平均排名
          • ‘min’ 对整个组使用最小排名
          • ‘max’ 对这个组使用最大排名
          • ‘first’ 按照值在数据出现的次序分配排名
          • ‘dense’ 类似于method='min',但组间排名总是增加1,而不是一个组中的相等元素的数量
      • 含有重复标签的轴索引
        • 目前为止我们所见过的示例中,轴索引都是唯一的(索引值)。尽管很多pandas函数(比如reindex)需要标签是唯一的,但这个并不是强制性的。
        • 索引的is_unique属性可以告诉我们他的标签是否是唯一的。False不唯一,True唯一
        • 带有重复索引的情况下,数据选择是与之前操作有差别的主要情况,根据一个标签索引多个条目会返回一个序列,而丹哥条目会返回一个标量值。
    • 描述性统计的概述和计算
      • 简介
        • pandas对象装配了一个常用数学、统计学方法的集合。其中大部分属于归约或汇总拥挤的类别,这些方法从DataFrame的行或列中抽取一个Series或一系列值的单个值(入总和或平均值)。与NumPy数组中的类似方法相比,他们内建了处理缺失值的功能。
        • 调用DataFrame的sum方法返回一个包含列上加和的Series。
        • 传入axis='columns'或者axis=1,则会将一行上各个列的值相加。
        • 除非整个切片上(在本例中是行或者列)都是NA,否则NA值是被自动排除的,可以通过禁用skipna来实现不排除NA值。
        • 归约方法可选参数
          • axis  归约轴,0位行向,1位列向
          • skipna  排除缺失值,默认为True
          • level  如果轴是多层索引(MultiIndex),改参数可以缩减分层层级。
        • 除了归约方法,有的方法是积累性方法。如:cumsum
        • 还有一列方法既不是归约型方法也不是积累型方法。describe一次性产生多个汇总统计
        • 描述性统计和汇总统计
          • count  非NA值的个数
          • describe  计算Series和DataFrame各列的汇总统计集合
          • min、max  计算最小值、最大值
          • argmin、argmax  分别计算最小值、最大值所在的索引位置(整数)
          • idxmin、idxmax  分别计算最小值、最大值所在的索引标签
          • quantile  计算样本的从0到1间的分位数
          • sum  均加
          • mean  均值
          • median  中位数(50%分位数)
          • mad  平均值的平均绝对偏差
          • prod  所有值的积
          • var  值的样本方差
          • std  值的样本标准差
          • skew  样本偏度(第三时刻)值
          • kurt  样本峰度(第四时刻)的值
          • cumsum  累计值
          • cummin、cummax  累计值的最小值或者最大值
          • cumprod  值的累计积
          • diff  计算第一个算术差值(对时间序列有用)
          • pct_change  计算百分比
      • 相关性和协方差
        • 在一些汇总统计,比如相关性和协方差,是由多个参数计算出的。考虑某些使用附加pandas-datareader库从Yahoo!Finance上获取的包含股价和交易量的DataFrame。
        • pandas-datareader安装  pip install pandas_datareader
        • 为了获取一些股票行情,使用pandas-datareader模块下载一些数据import pandas_datareader.data as weball_data = {ticker: web.get_data_yahoo(ticker) for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOG']}print(all_data)price = pd.DataFrame({ticker: data['Adj Close'] for ticker ,data in all_data.items()})print(price)volume = pd.DataFrame({ticker: data['Volume'] for ticker,data in all_data.items()})print(volume)
        • 计算股价的百分比returns = price.pct_change()print(returns.tail())
        • Series的corr方法计算的是两个Series中重叠的、非NA的、按索引对齐的值的相关性,相应的,cov计算的是协方差returns = price.pct_change()print(returns.tail())a = returns['MSFT'].corr(returns['IBM'])print(a)b = returns['MSFT'].cov(returns['IBM'])print(b)由于MSFT是一个有效的Python属性,我们可以使用更为简洁的语法来获得这些数据c = returns.MSFT.corr(returns.IBM)print(c)
        • 另一方面,DataFrame的corr和cov方法会分别以DataFrame的形式返回相关协和协方差矩阵print(returns.corr())print(returns.cov())
        • 使用DataFrame的corrwith方法,你可以计算出DataFrame中的行或列与另一个序列或DataFrame的相关性。该方法传入一个Series时,会返回一个含有为每列计算相关性值的Series。print(returns.corrwith(returns.IBM))
        • 传入一个DataFrame时,会计算匹配到列名的相关性数值。在这里我计算出交易量百分比变化的相关性print(returns.corrwith(volume))
        • 传入axis='columns'会逐行地进行计算。
      • 唯一值、计数和成员属性
        • 另一类相关的方法可以从一维Series包含的数值中提取信息。第一个函数是unique,他会给出Series中的唯一值。
        • 唯一值并不一定按照排序好的顺序返回,但是如果需要的话可以进行排序(uniques.sort())。相应的value_counts可以计算出Series包含值的个数。
        • 为了方便,返回的Series会按照数量降序排序。value_counts也是有效的pandas顶层方法,可用于任意数组或序列。(pd.value_counts(obj.values,sort=False))
        • isin执行向量化的成员属性检查,还可以将数据集以Series或DataFrame一列的形式过滤为数据集的值子集。
        • 与isin相关的Index.get_indexer方法,可以提供一个索引数组,这个索引数组可以将可能非唯一值数组转换为另一个唯一值数组。
        • 唯一值、计数和集合成员属性方法
          • isin  计算表征Series中每个值是否包含传入序列的布尔值数组
          • match  计算数组中每个值的整数索引,形成一个唯一值数组。有助于数据对齐和join类型操作
          • unique  计算Series值中的唯一值数组,按照观察顺序返回
          • value_counts  返回一个Series,索引时唯一值序列,值是计数个数,按照个数降序排序

你可能感兴趣的:(Python)