python求解典型相关系数_统计师的Python日记【第5天:Pandas,露两手】

本文是【统计师的Python日记】第5天的日记

回顾一下:

第1天学习了Python的基本页面、操作,以及几种主要的容器类型;

第2天学习了python的函数、循环和条件、类。

第3天了解了Numpy这个工具库。

第4天初步了解了Pandas这个库

原文复习(点击查看):

今天将带来第5天的学习日记。

目录如下:

前言

一、描述性统计

1. 加总

2. 描述性统计

3. 相关系数

二、缺失值处理

1. 丢弃缺失值

2. 填充缺失值

三、层次化索引

1. 用层次索引选取子集

2. 自定义变量名

3. 变量名与索引互换

4. 数据透视表

四、数据导入导出

1. 数据导入

2. 数据导出

统计师的Python日记【第5天:Pandas,露两手】

前言

根据我的Python学习计划:

Numpy → Pandas→ 掌握一些数据清洗、规整、合并等功能 → 掌握类似与SQL的聚合等数据管理功能 → 能够用Python进行统计建模、假设检验等分析技能 → 能用Python打印出100元钱 → 能用Python帮我洗衣服、做饭 → 能用Python给我生小猴子......

上一集开始学习了Pandas的数据结构(Series和DataFrame),以及DataFrame一些基本操作:改变索引名、增加一列、删除一列、排序。

今天我将继续学习Pandas。

一、描述性统计

想拿一个简单的数据试试手,翻到了一份我国2012-2015年季度GDP的数据,如下表(单位:万亿),

想整理到DataFrame中,如何处理?

用DataFrame:

gdp=DataFrame([[11.61,13.08, 13.67, 15.05],[12.81, 14.30, 15.07, 16.62], [13.87, 15.52, 16.35, 17.87], [14.80, 16.62,17.36, 18.94]], index=['2012', '2013', '2014', '2015'], columns=['s1', 's2','s3', 's4'])

得到了一张非常清爽的DataFrame数据表。

现在我要对这张表进行简单的描述性统计:

1. 加总

.sum()是将数据纵向加总(每一列加总)

这就很奇怪了,2012、2013、2014、2015四个年份的第一季度加总,这是什么鬼?其实我更想看横向加总,就是每一年四个季度加总,得到一年的总和,原来,指定axis=1即可:

特别注意的是缺失值的情况!

如果有缺失值,比如四个数值2,3,1,NaN,那么加总的结果是2+3+1+NaN=6,也就是缺失值自动排除掉了!这点特别注意,因为这可能会导致你的数据不必苛,比如某一年少一个季度的值,那么这一年其实就是三个季度的加总,跟其他年份四个季度怎么比?

因为刚入行的时候在excel上犯过这类错误,所以在此记录一下。

解决办法是指定 skipna=False,有缺失值将不可加总:

>>>df=DataFrame([[1.4, np.nan], [7.1, -4.5], [np.nan, np.nan], [0.75, -1.3]], index=['a', 'b', 'c', 'd'], columns=['one', 'two'])

>>>df

这是一组有缺失值的数据,现在来加总:

还可以累积加总:

关于缺失值,在后面还要专门学习(二、缺失值)。

2. 描述性统计

pandas除了加总,还可以利用 .describe()得到每列的各种描述性分析:

当然,除了用 .describe()还可以自己用函数来得到,比如:

一些函数记录在此(参考书本《利用Python进行数据分析》):

方法描述

count()非NA值的数量

describe()各列的汇总统计

min()、max()最小、最大值

argmin()、argmax()最小、最大值对应的索引位置

idxmin()、idxmax()最小、最大值对应的索引值

quantile()样本分位数

sum()加总

mean()均值

median()中位数

mad()根据平均值计算的平均绝对离差

var()方差

std()标准差

skew()偏度

kurt()峰度

cumsum()累计和

cummax()、cummin()累计最大值和累计最小值

cumprod()累计积

diff()一阶差分

pct_change()百分数变化

3. 相关系数

利用.corr()可以计算相关系数,比如计算四个季度的相关系数:

计算年份的相关系数呢?转置一下就可以了:

然而可惜的是——没有P值!

也可以单独只计算两列的系数,比如计算S1与S3的相关系数:

二、缺失值处理

Pandas和Numpy采用NaN来表示缺失数据,

1. 丢弃缺失值

两种方法可以丢弃缺失值,比如第四天的日记中使用的的城市人口数据:

将带有缺失的行丢弃掉:

这个逻辑是:“一行中只要有一个格缺失,这行就要丢弃。”

那如果想要一行中全部缺失才丢弃,应该怎么办?传入 how=’all‘即可。

Chu那行被丢弃掉了。

另一种丢弃缺失值的方法是 data[data.notnull()],但是只能处理 数值型数据。

2. 填充缺失值

用 .fillna()方法对缺失值进行填充,比如将缺失值全部变为0:

还可以指定填充方法:

method='ffill' 向前填充,即将前面的内容填充进来;

'bffill' 向后填充,即将后面的内容填充进来。

举个例子:

后面baoding的pop被填充进来了。

三、层次化索引

我们前面的索引就是Chu、Bao、Ha、Hu......,单一层次索引,如果索引为亚洲-中国-各个省-各个市,变量为人口,这就是典型的层次化索引。

>>> worldPop = pd.Series([13.74,13.41, 13.08, 1.27, 3.21, 3.09],index=[['China','China','China','Japan','US','US'],[2015,2010,2005,2015,2015,2010]])

这个例子中索引有两层,国家和年份,来学习一些简单的操作。

1. 用层次索引选取子集:

选取多个子集呢?

2. 自定义变量名

自定义变量名的好处很多,可以更方便的对数据进行选择。使用 columns= 自定义变量名:

索引的名字也可以当变量一样命名,分别命名country和year两个索引名:

用 .swaplevel()可以调换两个索引contry和year的位置:

3. 将索引与变量互换

使用.reset_index([])可以将索引变成列变量。

使用 .set_index([]),也可以讲变量变成索引:

4. 数据透视表

大家都用过excel的数据透视表,把行标签和列标签随意的布局,pandas也可以这么实施,使用 .unstack()即可:

四、数据的导入导出

1. 数据导入

表格型数据可以直接读取为DataFrame,比如用 read_csv 直接读取csv文件:

有文件testSet.csv:

存在D盘下面,现在读取:

发现了一个问题——第一行被当做变量名了!所以要指定 header=None:

变量名变成了0、1,还是变扭啊,我们来指定个变量吧:

用 names= 可以指定变量名。

看到var1那列,如果想用这列做索引,咋办?好办!

用index_col=即可指定索引。

除了read_csv,还有几种读取方式:

函数说明

read_csv读取带分隔符的数据,默认分隔符为逗号

read_table读取带分隔符的数据,默认分隔符为制表符

read_fwf读取固定宽格式数据(无分隔符)

read_clipboard读取剪贴板中的数据

read_table可以读取txt的文件,说到这里,想到一个问题——如果txt文件的分隔符很奇怪怎么办?

比如——

这个testSet.txt文件用“loves”做分隔符!

隐隐觉得有人向我表白,但是有点恶心......

在实际中,更可能是某种乱码,解决这种特殊分隔符,用sep= 即可。

忽略红色背景的部分。

还有一种情况是开头带有注释的:

使用 skiprows= 就可以指定要跳过的行:

从我多年统计师从业经验来看,学会了如何跳过行,也要学如何读取某些行,使用nrows=n 可以指定要读取的前n行,以数据

为例:

2. 数据导出

导出csv文件使用 data.to_csv 命令:

data.to_csv(outFile, index=True, encoding='gb2312')

index=True指定输出索引,当数据中有中文的时候用 encoding= 来解码,否则会出现乱码,一般 gb2312即可,有些例外的情况用 gb18030基本都能解决。

无私的把日记给大家分享,觉得我帅也赞一下吧,越多人觉得我帅,我就越想公开越多的日记给大家看。

因为我帅啊~

你可能感兴趣的:(python求解典型相关系数)