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

多个数据集进行批量合并

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值