python机器学习(七)数据分析利器,NumPy,pandas与Matplotlib

image.png

一、Numpy

NumPy库名字来源于“Numerical Python” 的缩写。

1.1、数组的概念

a为定义的一个列表,b为定义的一个数组。

import numpy as np
a = [1, 2, 3, 4, 5]  # 定义一个列表
b = np.array([1, 2, 3, 4, 5])  # 定义一个数组
image.png
image.png
image.png
1.2、数据list和列表ndarray的区别
image.png
image.png

总结: 数组和列表的区别,相同的索引机制,但是数组的元素通过空格隔开,列表的元素通过逗号隔开。

为什么数据分析选用数组ndarray而不用列表?看两个栗子。

1.2.1、让数组和列表都同时乘以2运算


image.png
image.png

总结: 列表list乘以2后只是将数据复制了一遍,而数组ndarray则是将其中的每个元素都乘以了2。那么在实际运用中,ndarray更能满足我们对于数学运算的需求。

1.2.2、让数组和列表都存储3个小列表

a = [[1,2,3], [4,5,6], [7,8,9]]
b = np.array([[1,2,3], [4,5,6], [7,8,9]])
image.png
image.png

总结:列表list虽然包含3个小列表,但是结构是一维的。数组ndarray则是3行3列的三维结构,列表list只能存储一维结构,数组ndarray能存储二维,三维,甚至多维的结构。

以上两点就是为什么数据分析中使用数组ndarray而不是列表list的主要原因。

1.3、创建数组的方式
创建一维数组

创建二维数据


image.png

通过np.arange创建


image.png
image.png
image.png

通过随机数创建


image.png

image.png

需要注意的是:通过np.random.rand() 生成的随机数都在0~1的范围之内。

通过arange()创建


image.png

通过随机整数二维数组创建


image.png

二、pandas

pandas库是基于NumPy库的一个开源Python库,名字来源于 “panel data”(面板数据)。pandas库提供了非常直观的数据结构和强大的数据处理功能。

2.1、二维数据表格DataFrame的创建
2.1.1、通过列表创建

image.png

总结:pandas库中的DataFrame更像Excel中的二维表格数据,有行索引和列索引。需要注意的是,索引都是从0开始的。

定义行索引和列索引:


image.png

通过空 DataFrame创建:


image.png

2.1.2、通过字典创建DataFrame

image.png

通过from_dict()函数创建


image.png

可以看到,通过from_dict()把字典键变成了行索引,参数orient指定字典键为列索引还是行索引,默认值为columns,即默认字典键为列索引,如果设置成index,则表示字典键为行索引。

通过.T转置:


image.png

总结:.T (转置)的效果和 orient='index'的效果一样。

2.1.3、通过二维数据创建DataFrame

image.png

修改行索引和列索引:


image.png

查看index的值:


image.png

将行索引改成某列内容:


image.png

改成数字索引:


image.png

2.2、Excel文件的读取和写入
2.2.1、文件的读取:

import pandas as pd
data = pd.read_excel('Customer_value.xlsx')
data.head()
image.png

参数的设置:

data = pd.read_excel('Customer_value.xlsx', sheet_name=0, encoding='utf-8', delimiter=',')

sheet_name : 表示读取第几张sheet页的表格
delimiter : 表示分割符号

2.2.2、文件的写入

a = pd.DataFrame(np.arange(15).reshape(3,5), index=['张三', '李四', '王五'], columns=['A', 'B', 'C', 'D', 'E'])
a.to_excel('data_test.xlsx')
# 或者
a.to_csv('data_test.csv')

参数的设置:

a.to_excel('data_test.xlsx', columns=['B', 'C'], index=False)

columns : 指定要写入的字段
index = False : 不对行索引index进行写入

2.3、数据的选取与处理

image.png

2.3.1、数据的选取
按列选取

image.png

image.png

总结:通过 d['col2']选取的是一个一维的Series类型的数据,是不包含columns的,而通过 d[['col2']]返回的是一个二维的表格数据。而要选取多列时,必须要通过列表的方式进行访问,即[['col1', 'col2']]

选取多列:


image.png

按行选取

image.png

选取1到2行,中括号中的数字,是前面的数字包括,后面的数字不包括。

image.png

总结:直接d[1:3] 和 d.iloc[1:3] 的效果是一样的,panda库推荐使用iloc方法,更加直观。

选取前1行:


image.png

选取最后1行:


image.png

注意:head() 和 tail() 括号中的数字如果不填的话,默认是5.

** 按区块选取数据**


image.png
image.png
image.png

总结:d[['col1', 'col2']][1:3]和d[1:3][['col1', 'col2']],d.iloc[1:3][['col1', 'col2']]三者的选取效果是一样的,不过pandas库官方更推荐用 d.iloc[1:3][['col1', 'col2']]

2.3.2、数据筛选
单条件筛选:

image.png

多条件筛选:


image.png

2.3.3、整体数据查看
查看数据的行与列的个数:

image.png

查看数据的描述性分析:


image.png

查看数据在1%,10%,25% ,50%,75%,90%,99%上的分布:


image.png

查看数据概览:


image.png

统计某一列的数据的频次:


image.png

2.3.4、数据的运算,排序与删除
数据的运算:
二维数据的行列之间具有广播功能,可以直接进行加减乘除的运算

image.png

数据的排序:


image.png

参数说明:by用来指定要按哪一列来排序,ascending默认为True,表示升序排序,设置为False则是倒序排序。

image.png

sort_index() 函数表示根据索引来进行排序。

数据的删除:
按列索引删除:

image.png
image.png

需要注意的是,用drop删除时要用a = a.drop进行赋值,这样才能删除成功。如果直接用 a.drop()删除,再去查看a时,是没有真正删除的。如果想不用a=进行赋值的话,可以加上参数 inplace = True,表示在a的基础上进行删除。这和a=赋值是等价的。代码如下:

a.drop(columns=['col2', 'col3'], inplace=True)
a = a.drop(columns=['col2', 'col3'])  
# 这两句代码的效果一样

按行索引删除:


image.png

行索引中的inplace用法一样,不再说明。

2.4、数据表拼接
pandas提供了merge(),join() ,concat(),append()函数进行拼接,分别介绍。
首先定义2个DataFrame,df1 和 df2:

image.png

image.png

2.4.1、merge()函数

image.png

merge函数不加任何的参数,在默认情况下,是取交集,默认参数how = 'inner' ,内连接。

设置how参数,改成以左表为主表,对右表进行关联:


image.png

以右表为主表,对左表进行关联:


image.png

需要注意的是,以右表为主表关联左表时,左表中没有的数据会用NaN进行填充。

以索引进行合并:


image.png

2.4.2、join函数:

image.png

2.4.3、concat函数

image.png

concat函数默认纵向拼接,没有的数据用NaN进行填充。

2.4.4、append函数

image.png

image.png

三、Matplotlib

3.1、绘制折线图

import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore") # 忽略警告
x = [1, 2, 3]
y = [3, 6, 9]
plt.plot(x, y)  # 绘制折线图
plt.show() #展示图形
image.png
import matplotlib.pyplot as plt
x = [1, 2, 3]
y = [3, 6, 9]
y2 = np.array(y) + 1
plt.plot(x, y2, linestyle='--')
plt.plot(x, y) 
plt.show()
image.png

3.2、绘制柱形图

import matplotlib.pyplot as plt
x = np.arange(5)
y = [5, 4, 3, 2, 1]
plt.bar(x, y)
plt.show()
image.png

3.3、绘制散点图

import matplotlib.pyplot as plt
import numpy as np
x = np.random.rand(20)
y = np.random.rand(20)
plt.scatter(x, y)
plt.show()
image.png

3.4、绘制直方图

import matplotlib.pyplot as plt
import numpy as np
data = np.random.randn(1000) # 随机生成1000个服从正态分布的数据
plt.hist(data, bins=20, edgecolor='blue')
plt.show()
image.png

3.5、用pandas库绘制图表

import matplotlib.pyplot as plt
import numpy as np
data = np.random.randn(1000) # 随机生成1000个服从正态分布的数据
df = pd.DataFrame(data)
df.hist(bins=20, edgecolor='black')
plt.show()
image.png
import matplotlib.pyplot as plt
import pylab as mpl  #导入中文字体,避免显示乱码
mpl.rcParams['font.sans-serif']=['SimHei']  #设置为黑体字
df = pd.DataFrame({'姓名':['张三', '李四', '王五'], '语文':[88, 80, 70], '数学':[100, 95, 90], '外语':[95, 98, 99]})
df.set_index(keys='姓名', inplace=True)
df['数学'].plot(kind='line')
df['数学'].plot(kind='bar')
image.png
df['数学'].plot(kind='pie')
image.png
df['数学'].plot(kind='box')
image.png

3.6、数据可视化常用技巧
3.6.1、添加文字说明:

import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore") # 忽略警告
x = [1, 2, 3]
y = [3, 6, 9]
plt.title('这里是标题')
plt.xlabel('这里是x轴')
plt.ylabel('这里是y轴')
plt.plot(x, y)  # 绘制折线图
plt.show() #展示图形
image.png

3.6.2添加图例:

import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore") # 忽略警告
x = [1, 2, 3]
y = [3, 6, 9]
y2 = np.array(y) + 1
plt.plot(x, y2, linestyle='--', label='y=x+1')
plt.plot(x, y, label='y2=y+2') 
plt.legend()
plt.show()
image.png

3.6.3设置双坐标轴:

import matplotlib.pyplot as plt
x = [1, 2, 3]
y = [3, 6, 9]
y2 = np.array(y) + 1
plt.plot(x, y2, linestyle='--', label='y=x+1')
plt.plot(x, y, label='y2=y+2') 
plt.legend()
plt.twinx() # 设置双坐标轴
plt.show()
image.png

3.6.4设置图表大小:

import matplotlib.pyplot as plt
x = [1, 2, 3]
y = [3, 6, 9]
y2 = np.array(y) + 1
plt.figure(figsize=(10,5))  # 设置图表大小
# 或者用 plt.rcParams['figure.figsize'] = [10, 5]
plt.plot(x, y2, linestyle='--', label='y=x+1')
plt.plot(x, y, label='y2=y+2') 
plt.show()
image.png

3.6.5设置x轴刻度角度:

import matplotlib.pyplot as plt
x = [1, 2, 3]
y = [3, 6, 9]
y2 = np.array(y) + 1
plt.xticks(rotation=45)  # 设置 x 轴的刻度为45度角
plt.plot(x, y2, linestyle='--', label='y=x+1')
plt.plot(x, y, label='y2=y+2') 
plt.show()
image.png

3.6.6解决中文显示问题:

import pylab as mpl  #导入中文字体,避免显示乱码
mpl.rcParams['font.sans-serif']=['SimHei']  #设置为黑体字

3.6.7绘制多图:
方式一:

import matplotlib.pyplot as plt
df = pd.DataFrame({'姓名':['张三', '李四', '王五'], '语文':[88, 80, 70], '数学':[100, 95, 90], '外语':[95, 98, 99]})
df.set_index(keys='姓名', inplace=True)
plt.rcParams['figure.figsize'] = [15, 8]

ax1 = plt.subplot(221)  # 221分别表示子图的行数,列数,子图的序号
df['数学'].plot(kind='line')
df['数学'].plot(kind='bar')

ax2 = plt.subplot(222) 
df['数学'].plot(kind='box')

ax2 = plt.subplot(223) 
df['数学'].plot(kind='pie')

ax2 = plt.subplot(224) 
df['数学'].plot(kind='area')
plt.show()
image.png

方式二:

import matplotlib.pyplot as plt
df = pd.DataFrame({'姓名':['张三', '李四', '王五'], '语文':[88, 80, 70], '数学':[100, 95, 90], '外语':[95, 98, 99]})
df.set_index(keys='姓名', inplace=True)

fig, axes = plt.subplots(2,2,figsize=(15,8))
ax1, ax2, ax3, ax4 = axes.flatten()
ax1.plot(df['数学'])
ax2.bar([1,2,3], df['数学'])
ax3.scatter([1,2,3], df['数学'])
ax4.pie(df['数学'])
plt.show()
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351