swall2001的个人博客分享 http://blog.sciencenet.cn/u/swall2001

博文

[转载][转帖]利用python进行数据分析-汇总和计算描述统计

已有 1540 次阅读 2019-11-21 09:36 |系统分类:科研笔记|文章来源:转载

第五章:pandas入门

第三节,汇总和计算描述统计

DataFrame当中的一些数学和统计方法 

>>> 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 

····one two 

a 1.40 NaN 

b 7.10 -4.5 

c NaN NaN 

d 0.75 -1.3 

调用DataFrame的sum方法将会返回一个含有列小计的Series,得到的结果是每一列的数字加和,NA值会自动被排除 

>>> df.sum() 

one 9.25 #columns 1 

two -5.80 #columns 2 

dtype: float64 

如果加入axis=1这个参数将会对行进行求和运算,NA值会自动被排除 

>>> df.sum(axis=1) 

a 1.40 

b 2.60 

c NaN 

d -0.55 

dtype: float64 

NA值会自动被排除,除非整个切片(这里指行或者列)都是NA,通过skipna选项可以禁用该功能 

>>> df.mean(axis=1, skipna=False) 

a NaN 

b 1.300 

c NaN 

d -0.275 

dtype: float64 

计算结果是如果进行的是行加和计算,如果该行有NaN值则结果用NaN值的最终结果表示,如果该列有NaN值则结果用NaN值的最终结果表示 

表5-9:约简方法的选项 

| 选项 | 说明 | 

| axis | 约简的轴。DataFrame的行用0,列用1 | 

| skipna | 排除缺失值,默认值为True | 

| level | 如果轴是层次化索引的(即MultiIndex),则根据level分组约简 | 

idxmin和idxmax表示间接统计(得到的是最小值或最大值的索引) 

>>> df 

····one two 

a 1.40 NaN 

b 7.10 -4.5 

c NaN NaN 

d 0.75 -1.3 

>>> df.idxmax() #输出最大值的索引 

one b 

two d 

dtype: object 

>>> df.cumsum() #输出每一列的按照行进行累加和结果 

····one two 

a 1.40 NaN 

b 8.50 -4.5 

c NaN NaN 

d 9.25 -5.8 

describe()方法能够得到多个汇总结果 

>>> df.describe() 

···· one two 

count 3.000000 2.000000 #除缺失值以外的元素数量 

mean 3.083333 -2.900000 #平均值 

std 3.493685 2.262742 #标准偏差 

min 0.750000 -4.500000 #最小值 

25% 1.075000 -3.700000 

50% 1.400000 -2.900000 

75% 4.250000 -2.100000 

max 7.100000 -1.300000 #最大值


>>> obj=Series(['a', 'a', 'b', 'c']*4) 

>>> obj 

0 a 

1 a 

2 b 

3 c 

4 a 

5 a 

6 b 

7 c 

8 a 

9 a 

10 b 

11 c 

12 a 

13 a 

14 b 

15 c 

dtype: object 

>>> obj.describe() 

count 16 #元素总量 

unique 3 #元素种类 

top a #第一个元素 

freq 8 #元素出现最多的频率 

dtype: object


表5-10:描述和汇总统计 

| 方法 | 说明 | 

| count | 非NA值的数量 | 

| describe | 针对Series或各DataFrame列计算汇总统计 | 

| min、max | 计算最小值和最大值 | 

| argmin、argmax | 计算能够获取到最小值和最大值的索引位置(整数) | 

| idxmin、idxmax | 计算能够获取到最小值和最大值的索引值 | 

| quantile | 计算样本的分位数(0到1) | 

| sum | 值的总和 | 

| mean | 值的平均数 | 

| median | 值的算术中位数(50%分位数) | 

| mad | 根据平均值计算平均绝对离差 | 

| var | 样本值的方差 | 

| std | 样本值的标准差 | 

| skew | 样本值的偏度(三阶矩) | 

| kurt | 样本值的峰度(四阶矩) | 

| cumsum | 样本值的累计和 | 

| cummin、cummax | 样本值的累计最大值和累计最小值 | 

| cumprod | 样本值的累计积 | 

| diff | 计算一阶差分(对时间序列很有用) | 

| pct_change | 计算百分数变化 |


2,相关系数与协方差

>>> import pandas.io.data as web 

Traceback (most recent call last): 

File "<stdin>", line 1, in <module> 

File "/home/D05/language/Python-2.7.13/lib/python2.7/site-packages/pandas/io/data.py", line 2, in <module> 

"The pandas.io.data module is moved to a separate package " 

ImportError: The pandas.io.data module is moved to a separate package (pandas-datareader). After installing the pandas-datareader package (https://github.com/pydata/pandas-datareader), you can change the import ``from pandas.io import data, wb`` to ``from pandas_datareader import data, wb``. 

提示的是模块迁移这个信息 

所以根据提示要进行模块安装 

./pip2.7 install pandas-datareader -i https://pypi.tuna.tsinghua.edu.cn/simple/ 

首先安装pandas-datareader模块 

>>> import pandas_datareader.data as web 

>>> all_data={} 

>>> for ticker in ['AAPL', 'IBM', 'MSFT', 'GOOG']: 

...····all_data[ticker]=wb.get_data_yahoo(ticker, '1/1/2000', '1/1/2010') 

... 

>>> price=DataFrame({tic: data['Adj Close'] for tic, data in all_data.iteritems()}) 

>>> volume=DataFrame({tic: data['Volume'] for tic, data in all_data.iteritems()}) 

>>> price.tail() 

····AAPL GOOG IBM MSFT 

Date 

2009-12-24 26.866302 307.241699 107.624130 25.316008 

2009-12-28 27.196602 309.422516 109.058350 25.454838 

2009-12-29 26.874012 307.698730 108.679207 25.634502 

2009-12-30 27.200455 309.352966 109.272659 25.283342 

2009-12-31 27.083506 307.986847 107.896149 24.891350 

>>> returns=price.pct_change() #计算价格的百分数变化 

>>> returns.tail() 

····AAPL GOOG IBM MSFT 

Date 

2009-12-24 0.034340 0.011117 0.004384 0.002587 

2009-12-28 0.012294 0.007098 0.013326 0.005484 

2009-12-29 -0.011861 -0.005571 -0.003477 0.007058 

2009-12-30 0.012147 0.005376 0.005461 -0.013699 

2009-12-31 -0.004300 -0.004416 -0.012597 -0.015504 

Series的corr方法用于计算两个Series中重叠的、非NA的、按索引对齐的值的相关系数。与此类似,cov用于计算协方差 

>>> returns.MSFT.corr(returns.IBM) 

0.49435859704574198 

>>> returns.MSFT.cov(returns.IBM) 

0.00021582143441601349 

DataFrame的corr和cov方法将以DataFrame的形式返回完整的相关系数或协方差矩阵 

>>> returns.corr() 

····AAPL GOOG IBM MSFT 

AAPL 1.000000 0.470676 0.412392 0.423597 

GOOG 0.470676 1.000000 0.390689 0.443586 

IBM 0.412392 0.390689 1.000000 0.494359 

MSFT 0.423597 0.443586 0.494359 1.000000 

对角线是自己对自己的相关系数,所以值为1 

>>> returns.cov() 

····AAPL GOOG IBM MSFT 

AAPL 0.001030 0.000303 0.000254 0.000309 

GOOG 0.000303 0.000580 0.000142 0.000205 

IBM 0.000254 0.000142 0.000369 0.000216 

MSFT 0.000309 0.000205 0.000216 0.000516 

利用DataFrame的corrwith方法,你可以计算其列或行跟另一个Series或DataFrame之间的相关系数。传入一个Series将会返回一个相关系数值Serise(针对各个列进行计算) 

>>> returns.corrwith(returns.IBM) 

AAPL 0.412392 

GOOG 0.390689 

IBM 1.000000 

MSFT 0.494359 

dtype: float64 

传入一个DataFrame则会计算按列名配对的相关系数。计算百分比简化与成交量的相关系数 

>>> returns.corrwith(volume) 

AAPL -0.057665 

GOOG 0.062647 

IBM -0.006592 

MSFT -0.014228 

dtype: float64 

传入axis=1即可按行进行计算。在计算相关系数之前,所有的数据项都会按标签对齐


3,唯一值、值计数以及成员资格

unique函数,可得到Series中的唯一值数组 

>>> obj=Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c', 'c']) 

>>> uniques=obj.unique() 

>>> uniques 

array(['c', 'a', 'd', 'b'], dtype=object) 

unique函数返回的唯一值是未排序的,如果需要进行唯一值返回结果排序,可利用.unique().sort() (obj.unique().sort 

built-in method sort of numpy.ndarray object at 0x2af6939d5f30)该方法返回一个对象关系,但不知如何输出结果 

value_counts()用于计算一个Series中各个值出现的频率 

>>> obj.value_counts() 

c 3 

a 3 

b 2 

d 1 

`dtype: int64 

value_counts()返回结果是按照频率降序排列的,所以也可按照索引值的顺序排列 

>>> pd.value_counts(obj.values, sort=False) 

a 3 

c 3 

b 2 

d 1 

dtype: int64 

pd.value_counts()利用pandas中的value_counts方法,将对象obj.values方法放入括号内,并加入sort的参数 

isin方法,可用于判断矢量化集合的成员资格,可用于选取Series中或DataFrame列中数据的子集 

>>> mask=obj.isin(['b', 'c']) 

>>> mask 

0 True 

1 False 

2 False 

3 False 

4 False 

5 True 

6 True 

7 True 

8 True 

dtype: bool 

isin函数返回的是一个布尔型的逻辑矩阵,通过矩阵的布尔型关系,能够提取相关的结果 

>>> obj[mask] 

0 c 

5 b 

6 b 

7 c 

8 c 

dtype: object 

根据mask的布尔型True的结果,可输出行索引为True的对象 

表5-11:唯一值、值计数、成员资格方法 

| 方法 | 说明 | 

| isin | 计算一个表示“Series各值是否包含于传入的值序列中”的布尔型数组 | 

| unique | 计算Series中的唯一值数组,按发现的顺序返回 | 

| value_counts | 返回一个Series,其索引为唯一值,其值为频率,按计数值降序排列 |

————————————————

版权声明:本文为CSDN博主「genome_denovo」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/genome_denovo/article/details/78015343




https://blog.sciencenet.cn/blog-1195113-1206976.html

上一篇:训练集与测试集合的选取
收藏 IP: 218.95.4.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-24 10:55

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部