python数据分析
什么是数据分析:从一大堆无规则存入数据库的数据中,画出图,找到规律。别人可以根据这些规律为后续的决策提供数据上的支持。
流程:提出问题->准备数据->分析数据->获得结论->成果可视化
一、Matplotlib基本使用
- 作用:使数据进行可视化,更直观的呈现
- 定义:python底层绘图库,做数据可视化图表。模仿MATLAB构建
1.1、基础绘图
注:以上图形会存在很多问题,如x,y轴表示什么?还可以做的更好。
1.2、改进生成的图像
1.2.1、设置图片大小
plt.figure(figsize=(20, 8),dpi=80) #dpi每英寸的像素点
1.2.2、保存
plt.savefig(“./t1.png”) #保存到当前目录下
1.2.3、修改轴的刻度
- x轴刻度
plt.xticks(x) #设置x轴的刻度,根据x值 - y轴刻度
plt.yticks()
1.2.4、设置中文设置
- matplotlib默认不支持中文字符
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
1.2.5、给图形添加描述信息
# 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度 单位(℃)")
plt.title("10点到12点每分钟的气温变化情况")
1.2.6、添加图例
plt.plot(x, y, label = "自己")
plt.legend()
1.3、不同图像
- 折线图:plt.plot(x,y)
- 散点图:plt.scatter(x,y)
- 条形图(柱状图):plt.bar(x,y)
x:表示很多电影
y:这些电影的票房 - 多次条形图:plt.bar(x,y)
- 直方图:plt.hist(data,bins):如250部电影的时长,希望统计出这些电影时长的分布状态(如100-120分钟的电影有几部)。
data:数据
bins:组数
二、Numpy基本使用
一个在python中做科学计算的基础库,用于大型、多维数组上执行数值计算
2.1、产生数组
- 产生数组
a = np.array([0, 1, 2, 3])
a = np.array([0, 1, 2, 3],[0, 1, 2, 3]) #二维数组
f = np.arange(1, 4)
# 使用前先导入Numpy包
import numpy as np
# 从列表产生数组
a = np.array([0, 1, 2, 3]) # array([0,1,2,3])
# 修改数据类型
a = a.astype('float') # [0. 1. 2. 3.]
# 生成全0数组
b = np.zeros(5) # array([0.,0.,0.,0.,0.]) 默认都是浮点数
# 生成全1数组
c = np.ones(5) # array([1.,1.,1.,1.,1.]) 默认都是浮点数
d = np.ones(5, dtype='int') # array([1,1,1,1,1]) 默认都是整数
e = np.ones(5, dtype='bool') # array([True,True,True,True,True])
# 使用fill方法将数组设为指定值
d.fill(5) # [5,5,5,5,5]
# 生成整数序列
f = np.arange(1, 4) # [1,2,3]
g = np.arange(1, 4, 2) # [1,3] 间隔2
# 生成等差数列
g = np.linspace(1, 5, 2) # [1. 5.] 包含5,生成2个数字的等差数列
# 生成随机数
np.random.rand(2) # 生成2个0-1不包含1的随机数
np.random.randint(1,10,10) # 1-10里面10个随机整数
2.2、数组属性
# 查看类型
a = np.array([0, 1, 2, 3])
type(a) # <class 'numpy.ndarray'>
# 查看数组中的数据类型
a.dtype # int32
# 查看形状,返回一个元组,每个元素代表这一维的元素数目
print(a.shape) # (4,)
# 查看数组里面元素的数目
print(a.size) # 4
# 查看数组的维度
print(a.ndim) # 1
2.3、索引与切片
- 索引就和java中取数组中元素,修改数组元素一样
a = np.array([0, 1, 2, 3])
# 切片
print(a[1:3]) # [1 2],3取不到
-
已知一部电影的累积票房数组a,如何知道每日票房是多少?
b=a[1:]-a[:-1]
后一个元素-前一个元素 -
注:切片中内存中使用的是引用机制。但是列表中并没有使用引用机制。这样做的好处是对于很大的数组,不用大量复制多余的值,节省了空间。缺点在于可能出现改变一个值改变另一个值的情况。如果不想这样,可以copy()产生一个复制,申请新的内存。
a = np.array([0, 1, 2, 3, 4])
b = a[2:4]
b[0] = 10
print(a) # [ 0 1 10 3 4]
a = [0, 1, 2, 3, 4]
b = a[2:4]
b[0] = 10
print(a) # [0, 1, 2, 3, 4]
2.4、花式索引
切片只支持连续或者等间隔的切片操作,相实现任意位置的操作,需要使用花式索引fancy slicing
- 一维花式索引
a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
index = [1, 2, -3] # 花式索引需要指定索引位置
# 花式索引需要指定索引位置
y = a[index] # [1 2 7]
mask = np.array([0, 1, 1, 0, 0, 0, 0, 1, 0, 0], dtype=bool) # 布尔数组必须与数组长度相等
# 使用布尔数组进行花式索引
y = a[mask] # [1 2 7]
- 二维花式索引
# 二维数组
a = np.array([[0, 1, 2, 3, 4, 5], [10, 11, 12, 13, 14, 15], [20, 21, 22, 23, 24, 25], [30, 31, 32, 33, 34, 35], [40, 41, 42, 43, 44, 45]])
"""
[[ 0 1 2 3 4 5]
[10 11 12 13 14 15]
[20 21 22 23 24 25]
[30 31 32 33 34 35]
[40 41 42 43 44 45]]
"""
# 返回主对角线上的5个值
a[(0, 1, 2, 3, 4), (0, 1, 2, 3, 4)] # [ 0 11 22 33 44]
# 返回最后三行的第1,3,5列
print(a[2:, [0, 2, 4]])
"""
[[20 22 24]
[30 32 34]
[40 42 44]]
"""
# 可以使用mask进行索引
mask = np.array([1, 0, 1, 0, 0], dtype=bool)
a[mask, 2] # [2 22],第一行和第三行在第2列上的元素
注:
和切片不同,花式索引返回的是原对象的一个复制,而不是引用
2.5、where语句
where(array):函数返回所有非零元素的索引组成的元组
2.6、astype函数
作用:数组内部元素进行类型转换
a.astype(float) #把数组a中的元素类型转换为float
注:astype方法返回一个新数组,上述的a数组本身没有发生任何变化。
2.7、数组操作
sort函数
np.sort(数组):升序排序,返回一个新的数组,数组本身没有发生变化
argsort函数
返回从小到大排列在原数组中的索引位置组成的数组,返回一个新的数组,数组本身没有发生变化
求和
np.sum(数组)
数组.sum()
最大值/最小值
np.max(数组)
数组.max()
均值(平均值)
np.mean(数组)
数组.mean()
标准差
np.std(数组)
数组.std()
相关系数矩阵
np.cov(数组1,数组2)
改变数组形状
数组.shape=行数,列数 #修改原来数组
数组.reshape=行数,列数 #不会修改原来数组
转置
数组.T
数组.transpose()
数组连接
concatenate((数组1,数组2,…,数组N),axis=0)
#axis=0,默认=0,按列进行拼接;axis=1,按行进行拼接
对数组内元素求绝对值
np.abs(数组)
三、pandas
pandas为了解决数据分析任务而创建的,提供了大量能快速处理数据的函数和方法。
3.1、基本数据结构
3.1.1、Series
一维数组,和Numpy中的以为array类似。二者都和python基本数据结构List相近。Series能保存不同种数据类型,如字符串,boolean,数字等。
# 一维Series初始化
s = pd.Series([1, 3, 5, 7])
print(s)
"""
0 1
1 3
2 5
3 7
dtype: int64
"""
# 值
print(s.values) # [1 3 5 7]
3.1.2、DataFrame
可以将DataFrame理解为Series的容器。
# 构造一组时间序列,作为第一维的下标
date = pd.date_range('20180101', periods=6)
print(date)
"""
DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
'2018-01-05', '2018-01-06'],
dtype='datetime64[ns]', freq='D')
"""
# 创建一个DataFrame结构,传入二维数组
df = pd.DataFrame(np.random.randn(6, 4), index=date, columns=list('ABCD'))
print(df)
"""
A B C D
2018-01-01 0.028054 -0.011711 -1.815449 -1.660712
2018-01-02 0.023858 0.029602 0.555685 -0.821091
2018-01-03 0.933844 -1.981967 -0.315082 2.741088
2018-01-04 0.656855 -0.933361 -1.157772 -0.125711
2018-01-05 -1.288328 -0.393373 0.016868 -0.475785
2018-01-06 0.687355 -1.174336 1.352607 0.749655
"""
查看数据
- 头尾数据
head和tail方法分别可以查看最前面几行和最后面几行的数据(默认为5)
pd.head(行数,不写默认5):查看前面几行
pd.tail(行数,不写默认5):查看后面几行 - 下标、列标、数据
# 下标用index属性查看
print(df.index)
"""
DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
'2018-01-05', '2018-01-06'],
dtype='datetime64[ns]', freq='D')
"""
# 列标用colums属性查看
print(df.columns)
"""
Index(['A', 'B', 'C', 'D'], dtype='object')
"""
# 数据值用values查看
print(df.values)
"""
[[-0.75791157 0.21739634 -1.74623798 0.75583372]
[-0.55662077 -1.33064347 -0.07855572 -0.67922539]
[-0.29366036 0.67709975 -1.30220829 0.56232418]
[ 1.30443261 -0.34130766 -0.10806951 -0.10036263]
[ 1.47973816 -0.13419599 0.50770077 1.87527065]
[ 1.52196624 0.1338611 1.49359467 -0.68272916]]
"""
3.2、读取数据及数据操作的
读取如excel文件,
- 行操作
可以使用切片查看其中某些行操作,添加一行,删除一行。 - 列操作
查看某几列的内容(可以设置看哪几行数据),添加一列,删除一列。 - 条件选择
进行条件的筛选
3.3、缺失值和异常值的处理
-
缺失值
- 判断缺失值
判断每个空是否有值缺失,根据条件,每个空返回true或false
- 填充缺失值
- 删除缺失值
有缺失值的行进行删除
- 判断缺失值
-
异常值
即在数据集中存在不合理的值,如年龄为-1,笔记本的重量为1吨等。通常的处理方法是在不影响整体数据分布的情况下进行删除。
3.4、数据保存
数据处理之后,重新保存,如重新保存到excel(不存在可以创建)中。
3.5、数据格式转换
很多异常值是经过格式转换之后才会发现,对我们规整数据,清洗数据有重要作用(表面上看数据没有异常,但是可能数据内涵的格式会有不同,在转换过程中就会发生错误)
- 查看格式
dtype - 修改格式
astype
3.6、排序
- 默认排序
按照index进行排序 - 按照某一列的取值进行排序
sort_values
3.7、基本统计分析
- 描述性统计
- describe():对dataframe中的数值型数据进行描述性统计(count,mean,std,min等)。
- 通过描述性统计可以发现一些异常值(如年代特别大,时长是负值等),很多异常值是需要逐步去发现的。
- 最值
max,min - 均值和中值
mean():平均值
medium():中值 - 方差和标准差
方差:var
标准差:std - 求和
sum - 相关系数、协方差
相关系数:corr
协方差:cov - 计数
len
3.8、数据透视表
excel中的数据透视表使用非常广泛,pandas也提供了类似的功能pivot_table(处理数值类型的数据)。数据透视就是按照不同列进行分组,然后获取统计分析。即筛选。
3.9、数据重塑和轴向旋转
3.9.1、层次化索引
使一个轴上拥有多个索引。
- series的层次化索引
- 通过unstack方法可以将series变成一个dataframe,dataframe可以转换为层次化索引series
- dataframe的层次化索引
对于dataframe来说,行和列都能够进行层次化索引。- set_index把列变成索引
- 优点:简化筛选操作(不似筛选操作代码那么复杂)
- 取消层次化索引:reset_index()
3.9.2、数据旋转
- 行列旋转
3.10、数据分组和分组运算
- GroupBy技术
实现数据的分组和分组运算,作用类似于数据透视表。只会对数值型数据进行分组运算。- 层次化索引series通过unstack方法转化为dataframe可能会产生缺失值(dataframe不是每个值在层次化索引中都是有值得)。
3.11、离散化处理(区间化,分组)
在实际的数据分析项目中,对有的数据属性,往往不关注数据的绝对取值,只关注它所在的区间或等级。如把评分9分以上的电影定义为A,7-9分的电影定义为B。
- cut()函数处理分组
3.12、合并数据集
append
一般用于有相同列的合并
merge
类似于数据库的合并,可以有左连接右连接。2个数据集进行合并
concat
多个数据集进行批量合并