Python数据分析与应用
常见的数据分析工具,也就是用到的第三方库有:Numpy
,Pandas
,Matplotlib
,Scipy
1.NumPy库
NumPy是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
1.N维的数组对象
N维的数组对象是科学计算的基础,创建数组的方法有以下几种:
1.array()函数,参数为列表或元组
import numpy as np
d1=np.array([1,2,3])
d2=np.array([[1,2,3],[4,5,6]])
2.arange()函数可以创建一个等差数组
import numpy as np
#区间是[1,10),步长为3
d3=np.arange(1,10,3)
3.random()相关函数
#d4 3行4列 数的范围是[0,1)
d4=np.random.rand(3,4)
#d5 3行4列 数的范围是[2,8)
d5=np.random.uniform(2,8,size=(3,4))
#d6 3行4列 数的均值为0,方差为1
d6=np.random.randn(3,4)
#d7 3行4列 数的范围是[10,20)
d7=np.random.randint(10,20,size=(3,4))
创建特殊数组的方法有如下几种方法:
1.zero()函数创建元素值都是0的数组
#生成一个3行4列的元素都为0的数组
d8=np.zeros([3,4])
#或者 d8=np.zeros((3,4))
2.ones()函数创建元素值都是1的数组
#生成一个3行4列的元素都为1的数组
d9=np.ones([3,4])
注意,
zero()
函数和ones()
函数在使用时的参数不能直接写(3,4),参数必须是列表类型或者元组类型
。
2.数组对象的重要属性
3.NumPy数组运算
数组运算可以分为以下三种:
1.矢量化运算
例如a=[1,2,3],b=[10,20,30],求a+b?
d1=np.array((1,2,3))
d2=np.array((10,20,30))
print(d1+d2)
运行结果:
[11 22 33]
2.广播机制
3.数组与标量运算
标量运算会产生一个与数组具有相同行和列的新矩阵,其原始矩阵的
每个元素都被相加、相减、相乘或者相除。
例如:
d1=np.array((1,2,3))
print(d1+10)
运行结果:
[11 12 13]
4.数组的转置与轴对称
数组的转置指的是将数组中的每个元素按照一定的规则进行位置变换,最常见的就是行与列的互换。
数组的转置与轴对称有三种实现方式:
- T属性
- transpose(指定顺序排列所有的轴编号)
- swapaxes(相交换的两个轴编号)
所谓轴编号,就是例如
d4=np.random.rand(3,4)
,对它这个二维数组来说,轴编号为0的就是行(3行),轴编号为1的就是列(4列)。那么对于三维的数据类型来说,分为块,行,列所对应的轴编号就是0,1,2。
1.T属性
d7=np.random.randint(10,20,size=(3,4))
d8=d7.T
print(d7)
print(d8)
运行结果:
[[15 15 12 16]
[18 18 18 11]
[17 12 11 18]]
[[15 18 17]
[15 18 12]
[12 18 11]
[16 11 18]]
2.transpose()
d7=np.random.randint(10,20,size=(3,4))
d8=d7.transpose(1,0)
print(d7)
print(d8)
运行结果:
[[19 19 13 16]
[16 11 19 18]
[19 19 17 11]]
[[19 16 19]
[19 11 19]
[13 19 17]
[16 18 11]]
3.swapaxes()
d7=np.random.randint(10,20,size=(3,4))
#下面这句话的意思就是将0轴与1轴交换,那么你写swapaxes(1,0)也是一样的
d8=d7.swapaxes(0,1)
print(d7)
print(d8)
运行结果:
[[18 15 16 11]
[17 16 16 13]
[18 14 17 19]]
[[18 17 18]
[15 16 14]
[16 16 17]
[11 13 19]]
5.NumPy通用函数
接受一个数组参数的函数称为一元通用函数
具体格式为:
import numpy as np
b=np.sqrt(a)
接受两个数组参数的则称为二元通用函数
6.数组统计运算
7.线性代数模块
矩阵乘法的dot()方法:
例如:
d7=np.random.randint(0,3,size=(2,3))
d8=np.random.randint(0,3,size=(3,2))
print(d7)
print(d8)
d9=np.dot(d7,d8)
print(d9)
运行结果:
[[2 2 0]
[2 0 2]]
[[2 2]
[2 0]
[0 0]]
[[8 4]
[4 4]]
2.Pandas库
Pandas库中有两个主要的数据结构:Series和DataFrame。
1.Series对象
Series的创建:
pandas.Series( data = None , index = None )
其中,data
表示传入的数据,index
表示索引,默认创建0-N的整数索引。
例如:
import pandas as pd
#创建一维数据
a=pd.Series([1,2,3,4,5])
print(a)
#创建一维数据 并指定索引
b=pd.Series([1,2,3,4,5],index=['a','b','c','d','e'])
print(b)
运行结果:
0 1
1 2
2 3
3 4
4 5
dtype: int64
a 1
b 2
c 3
d 4
e 5
这里跟字典中的键值对类似,当然也能用字典来构建Series对象:
year_data={2001:17.8,2002:20.1,2003:16.5}
ser_obj2=pd.Series(year_data)
Series对象的两个属性的获取
获取Series对象的索引:
ser_obj.index
获取Series对象的数据:
ser_obj.values
2.DataFrame对象
DataFrame是一个类似于**二维数组或表格(如excel)**的对象,它每列的数据可以是不同的数据类型。如下图:
注意,DataFrame的索引不仅有行索引还有列索引,数据可以有多列。
DataFrame对象的创建:
pandas。DataFrame( data = None , index = None , columns = None)
其中,data
表示传入的数据,index
表示行标签,默认自动创建0-N的整数索引,columns
表示列标签。
例如:
#通过传入数组来创建DataFrame类对象
demo_arr=np.array([['a','b','c'],['d','e','f']])
df_obj=pd.DataFrame(demo_arr)
print(df_obj)
运行效果:
0 1 2
0 a b c
1 d e f
用上columns
属性之后:
demo_arr=np.array([['a','b','c'],['d','e','f']])
df_obj=pd.DataFrame(demo_arr,columns=['NO1','NO2','NO3'])
print(df_obj)
运行效果:
NO1 NO2 NO3
0 a b c
1 d e f
DataFrame对象的数据的获取:
通过列索引的方式获取数据:
d=df_obj['NO2']
通过访问属性的方式获取数据:
d=df_obj.NO2'
另外还有一些操作:
增加一列数据:df_obj['NO2'] = ['g','h']
(这和字典的操作是差不多的)
删除一列数据:del df_obj['NO3']
3.Pandas读写文件
1.读取文件
read_csv()
:读取CSV文件数据,转换成DataFrame对象
例如:pd.read_csv(path,sep=',',names=None...)
其中,path
指的是文件路径,sep
是指定使用的分隔符,默认用,
分隔,names
:如果不包含标题行,则将参数设置为None。
1.写入文件
to_csv()
:读取CSV文件数据,转换成DataFrame对象
例如:pd.read_csv(path=None,sep=',',index=True...)
其中,path
指的是文件路径,sep
是指定使用的分隔符,默认用,
分隔,index
:默认为True,若设置为False,则将不会显示索引。
下面看一个简单的实验,读取CSV文件操作学生数据计算总分并写入新的CSV文件:
方法一:
a=pd.read_csv('a.csv',names=None)
a['总分']=a['语文']+a['数学']+a['英语']
a.to_csv('b.csv',index=False,sep=' ')
方法二:
a=pd.read_csv('a.csv',names=None)
#axis=1就是对行求和,这与之前的swapaxes有点区别,不光时参数名字不同,行与列的轴编号也不同。
sum_lt=a.sum(axis=1)
a['总分']=sum_lt
a.to_csv('c.csv',index=False,sep=' ')
源文件a.csv:
姓名,语文,数学,英语
张三,80,80,80
李四,90,90,90
王五,70,70,70
赵六,70,80,90
运行结果:
b.csv和c.csv:
姓名 语文 数学 英语 总分
张三 80 80 80 240
李四 90 90 90 270
王五 70 70 70 210
赵六 70 80 90 240