数据分析:
1.数据处理:
1>.Pandas:
1).numpy:
1.概述:numpy是专注于数值计算的拓展包,其算法库是由C写成的(调用C的API),提供了核心数据类型ndarray(多维数组)。其特点一是要求数组中的元素类型保持一致(相比list不限制元素类型,ndarray可在内存上连续存储),另一特点是摆脱了GIL支持并线化运算(可以更快速地对数据进行矩阵计算),因此效率更高,更适合操作大型数据集。
2.ndarray:
(1).使用np.array(传入一个迭代器)可以实例化一个ndarray数组实例,数组中的元素必须保持一致的类型。与List类似(ndarray有自身的方法tolist可以转换成list),ndarray同样可以按索引读写元素和切片,且可使用外部函数np.append、insert、delete来增删元素。值得注意的是轴方向,axis=0时是按行的索引进行操作(针对行),axis=1时则是按列的索引进行操作(针对列)。
(2).ndarray数组由于自身的两个核心特点,使得可以一次并行操作整个数组中的元素,这个特征适用于许多常规操作(尤其针对数值类型的元素),比如通过ndarray+n就可以使得数组所有成员都+n。另外,两个数组相运算的效果会类似zip,即拿相同位置的两个元素进行运算。
(3).ndarray十分注重成员类型和维度,因此可以通过数组的dtype属性查看元素类型(astype方法改类型),通过shape属性查看数组的维度及每个维度的长度(可以根据元素总数reshape)。
(4).当数组的shape不规则时,数组会把不同长度的列表对象认为list,比如np.array([[1,1],[1,1,1]])为一个1维长度为2的数组,元素是两个list对象,而np.array([[1,1],[1,1]])则是一个2维长度为2的数组,元素为整型对象。
2).pandas:
1.概述:
(1).pandas实际上是基于numpy的数据分析工具(最熟知的是提供了常见的二维表格式数据类型--DataFrame)
(2).Series:与numpy中array类似的一维数组对象,由索引标签和数据(一般为numpy的各种数据类型)组成,一个Series对象相当于DF中的一列,其索引即相当于DF中的行索引(可以视为一个一维的属性队列,每个索引标志一个样本)。在使用时一般通过pd.Series, 除了传入可迭代对象外作为数据外,还可以传入可选参数index指定索引(若传入的数据原类型是字典,那么就自带了index),Series可以像字典一样通过指定索引访问元素(甚至可以通过索引列表一次访问多个元素)。注意元素个数不能超过指定的index数(可以少于,会被空值填充)。值得注意的是,由于Series支持对元素批量操作(跟Numpy类似),因此调用类似isin(参数为可迭代对象)和isnull这样的方法,都会对队列中的各个元素进行批量处理,并且返回一个队列结果(比如上述两个方法就会获得布尔值结果队列),同时也可以正常使用如unique、max等聚合函数得出聚合结果。
(3).DataFrame:类似表格形式的二维数据结构(实际上可以理解成由多个Series实例构成的字典),其中每列数据的类型相同(建议用库表概念去理解,即每个样本的同个属性都应该是相同的数据类型)。
2.数据导入DF:
(1).可以通过pd.DataFrame直接将二维可迭代对象转换为DF对象,并可以在入参时(不指定会默认,也可以实例化后再属性修改)指定index(行名)和columns(列名,另外需要注意,如果是入参数据是最外层为字典类型的二维数据,那么入参时不能再指定columns)。
(2).pandas提供了将各种表格式文件导入DF的接口,如read_csv、read_excel,导入时可以指定如编码(encoding)之类的一些参数。
3.数据预处理:
(1).对象的info方法可以查看DF的列情况和类型等一些信息,通过shape属性能够查看行列数;同样可以通过和Series相同的对象方法astype来变更整个DF或指定列的类型。
(2).由于每一列其实都是一个Series,而DF是这些队列的字典,因此列相当于是DF的属性,DF可以通过点运算、字典方式(甚至如果想要同时查看多个列可以在中括号中传入一个以指定列名为元素的列表)来查看指定列。
(3).获取指定行:对df直接进行切片就可以查看指定的行范围。另外更专业的方式是使用loc(按index)和iloc(按位置索引),两种方法也同样可以使用切片。值得注意的是,df.loc既然是通过索引index定位数据,那么实际上也可以在中括号中传入df类型,loc同样会按入参df里的index取数,如df.loc[df['X']=='x'] 。
(4).获取指定列:df获取指定列一般需要指定列名,所以按位置获取的话一般都需要切片,可以是df[df.columns[n:m]],也可以使用loc、iloc,如df.iloc[1:,n:m]或df.iloc[1:,[n,m]]。
4.数据调整:
(1).数据操作:
1.列新增:df可以直接通过列名(字典方法)修改或新增一整列,可以赋一个值(整列均为次值),也可以赋一个列表或数组对象(需匹配长度必须匹配)。除此之外也可以通过insert插入一列,其中第一个参数指定插入的列位置,第二个是列名,其后是传入的数组。
2.行新增:通过对象方法append可以新增行数据(如果不指定新增数据行的name,那么就必须使入参ignore_index=True)。
3.行列删除:对象方法drop,通过指定入参axis(默认为0),既可以删除行也可以删除列,删除时需要入参行(列)的索引(可使用列表指定多个索引批量删除),入参inplace表示是替换原df还是生成副本。
4.轴(axis):0是竖轴—操作行(一般默认),1是横轴-操作列。根据轴的方向,同一时间实际上只能操作行或者列其中一个,但是当操作其中一个时,另外一个可用来筛选(并不是操作,而是用于展示)。
(2).数据筛选:
1.通过df['x']==a的方式可以生成一列布尔值Series数组,将该数组传入df的选值范围即可以实现整个df的筛选,如:df[df['x']==a],多个条件时用逻辑符号链接,如df[(df['x']==a)&(df['y']==b)]。
2*.可以理解成df做条件筛选时,其中括号中是放入一个布尔值的队列,并通过这个长度和df行数相同的布尔值队列将对应位置为True的df行筛选了出来。
(3).数据查询:df.query是比普通数据筛选更专业的查询方式,可以通过类似sql中where后跟的条件语句进行查询如df.query("x==a and y==b")。
(4).DF互运算:DF之间是按索引进行数学运算(加减乘除)的,索引匹配不上的元素位置会被置空,但是可以通过比如df1.add(df2,fill_value=0)中fill_value参数设置其中一方缺失位置的默认值。
5.统计聚合:
(1).描述分析:通过对象的describe方法,可以查看df的基本描述分析,会展示各列缺失值、均值、标准差、范围等一些基本统计学特征,可以传参include,仅查看指定列。
(2).常见统计:
1.值分布:通过对象的value_counts方法可以查看object和bool类型的元素分布,一般会对某一列使用,且可通过入参normalize显示比例结果。
2.排序:通过对象的sort_values方法可以实现df的排序,入参by用来指定排序的key(通常为列名,也可以通过列表指定多个列名,从前向后降维排序),ascending用来指定升序或者降序。
3.其他:常用的统计还有对象方法count、mean、max、min等。
(3).UDF:
1.apply:对象方法apply可以应用函数到df的列、行甚至单元格,默认情况下apply是基于行索引的(axis=0),即对行的操作。若是整个df调用apply,一般是为了将多行进行聚合,即一个列一个结果值,而当指定某一列(Series)调用apply时,则一般用于对多行的此列(属性)进行批量操作;当入参指定axis=1时,函数则基于列索引,一般用于将多列进行聚合(即一行一个值,如df.apply(np.max,axis=1))。
2.map:可以用字典形式的参数进行批量映射,一般由df某列调用。
6.分组与关联:
(1).groupby:
1.常见格式:df.groupby(by=grouping_columns)[columns_to_show].function()(聚合函数)
2.说明:一个df在分组时,会首先进行拆分,将df分成逻辑上的几个分区,而后对每个分区使用聚合函数,再将聚合结果拼接起来展示,这点可以用sql的思路去理解,groupby是需要对非分组列以外的列(属性)使用聚合函数才能成立的。
3.agg:agg与apply一样,同样是用于将函数应用于df数据,区别是agg主要是应用聚合函数。另外,agg中不仅可以传入一个聚合函数,也可以使用列表传入多个函数。值得关注的是,还可以传入字典对象(key为列名,value为函数),针对不同列使用不同的聚合函数。*最后,根据实践看出,agg实际是将整列值作为数组传给了函数(而apply则是将列的每个值),这点影响了匿名函数的编写,比如agg中lambda x中的x是一个数组(类似列表),而apply中lambda x中的x是列表中的每个元素,从这也可以看出agg的目标是应用聚合函数。
(2).merge:
1.常见格式:pd.merge(left,right,how,on,left_index,right_index,sort,suffixes...)
2.说明:基本可以用sql的关联去理解,函数除只有前两个参数是必选,how参数即填写关联方式(inner、left、outer),on参数用来指定关联键(列名),也可以通过另外两个参数left_index、right_index指定两个表各自的关联键。另外常用的参数是suffixes,该参数需要传入一个二元列表(或元组),分别表示在merge过程中存在相同列名时在两表列名后面添加的后缀。
3.其他:concat是个静态方法,也可以将两个df合并,同样可以指定axis参数指定拼接的轴方向。
7.输出和绘图:
(1).输出:
1>.透视表:
1.格式:df.pivot_table(values,index,columns,aggfunc='mean',fill_value=None...)
2.说明:透视表是用来分类汇总(即按照指定维度进行统计分析)的表格样式。在函数的入参中,values是需要统计计算的属性值(可以理解成要展示的列),index是分类的键(类似groupby,指明样本的类别或者说是行索引),aggfunc则与agg相同(默认是mean),用来指定聚合函数。*仅仅这样则透视表实际上跟groupby的结果类似,而columns才真正展示了透视表的能力--下钻,即会以columns指定的列为新维度对数据进一步分类(会将原本展示的values按新维度columns里的枚举值再次分类,展示出来类似二级列名)。
2>.交叉表:
1.格式:pd.crosstab(index,columns,values,aggfunc,margins...)
2.说明:交叉表是一种用于计算分组频率的特殊透视表(机器学习经常就拿它看效果),交叉图其实与透视表是十分类似的,但是它是用于展示数值分布的(一般仅通过传入index和columns就可以查看数量分布)。注意点在于:一方面其似乎是静态方法,因此index、columns、values需要传入df的列对象(即Series),而不是列名(列明列表);其次,当传入values时,意味着维度增加(不仅仅是计算数量了),此时就需要指定aggfunc对values进行聚合(为了在二维表展示)。
3>.文件输出:
1.pd输出的接口非常多,常见的to_excel可以将DF直接输出成xlsx文件。如果想要将DF插入到已有的excel中,可以使用openpyxl的load_workbook先将excel加载到pd.ExcelWriter对象上,再将df插入该Writer。
2.xlsxwriter是个可以实现高度定制化excel的接口库,它实际上是通过接口的方式在按单元格“编辑”excel。首先该库会获取一个worksheet,并提供了内容格式设置的接口add_format,包括字体大小颜色、背景颜色、框线、对齐方式、是否自动换行等。那么接下来就可以通过worksheet的wirte和wirte_row方法向指定单元格(或行)写入指定格式的指定数据,格式如write(单元格坐标,数据,单元格式)。另外,还有对象方法用来合并单元格,具体格式如merge_range(单元格范围,数据,单元格式)。编辑完后需要close。
(2).绘图:
1>.常见图形:散点图scatter(常用于查看数值分布与相关性)、折线图plot(常用于时间序列数据)、柱状图bar(常用于分类展示的数据)、热力图heatmap(常用于在二维平面通过颜色展示多维数据)、箱线图、饼图等。
2>.图形对象:通常一个图形是由画板、画纸、标题、坐标轴构成,其中的具体对象还有点、线、刻度、网格、图例等。
3>.常见模块:Matplotlib、seaborn(基于matplotlib,提供更多现成图形,一般推荐使用)
1.步骤:定义要展示的数据(如x和y,这里注意下,是可以多传入几组x、y的,就是多个数据对象),设置图形属性(颜色形状刻度范围),添加文本(标题注释图例),最后通过show显示。需要注意的是在show之前都是“绘制”过程,这个概念需要理解(比如绘制过程中可以在同一个画纸上反复多次地画散点图)。
2.多图:通过figure创建画板,可以通过subplot方法创建和选择新画纸
3.实践:import matplotlib.pyplot as plt或者import seabron as sns,然后具体就用啥时搜啥、照着代码模板套和改吧。
2>.分词:待整理
3>.情感分析:待整理