数据分析:Python库之numpy、pandas、matplotlib

目录

一、numpy

二、pandas

三、matplotlib


模块(Module)是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句能够有逻辑地组织 Python 代码段。把相关的代码分配到一个模块里能让Python代码更好用,更易懂。模块能定义函数,类和变量,模块里也能包含可执行的代码。

模块定义好后,使用 import 语句来引入模块,语法:import module_name1[, module_name2,...]

python的常用模块有numpy、pandas、matplotlib等等。

一、numpy

Numerical Python,即数值Python,是Python进行科学计算的一个基础模块。

ndarray即N维数组,是numpy模块的核心数据结构。用多维数组计算,非常便捷高效并且可以节省空间。

导入numpy库:import numpy as np,并取了一个更简略的别名,在调用库函数时,通过在函数名前加np.即可调用:np.function_name()。

1、构造一维数组

import numpy as np

a = np.array([1,2,3,4])         #构造一个一维数组,其中元素的数据类型必须一致
a.ndim                          #输出:1。表示数组是一维的
a.size                          #输出:4。表示数组有四个元素
a>2                             #输出array([False, False,  True,  True])。即大于2的元素索引值
a[a>2]                          #输出array([3, 4])。即取出大于2的元素
a.dtype                         #输出dtype('int32')。表示数组中元素是整型

2、构造二维数组

import numpy as np


b = np.array( [[1,2],[3,4]] )    #构造一个二维数组
b.shape                          #输出(2,2)。表示数组结构为2×2
b.ravel()                        #把多维数组变为一维数组

3、填充

在数组的初始化时,通常调用函数对数组填充固定数值或者随机数。

import numpy as np


np.zeros(4)         #生成一维数组,用0填充
np.zeros((2,2))     #生成二维数组,用0填充
np.ones((3,4))      #生成二维数组,用1填充

#以上数组元素的数据类型默认为浮点数,若要指定整型:
np.zeros((2,2),dtype=np.int)

np.empty((2,2))     #填充随机值

np.random.randint(m,n,(p,q))  #构造一个p×q矩阵,其整型元素的值域为[m,n-1]
np.random.random((3,4))       #构造一个3×4数组,填充(0,1)之间的随机浮点数

np.arange(15)                 #元素值为0-14整数
np.arange(15).reshape(3,5)    #将0-14的元素按3×5矩阵排列
np.arange(0,20,3)             #输出array[0,3,6,9,12,15,18],即0-19之间,从0开始间隔为3的数

4、矩阵乘法

import numpy as np
a = np.empty((2,3))
b = np.empty((3,4))
a*a                #a中每个元素自乘平方
c = a.dot(b)  或者 c = np.dot(a,b)
c.shape            #输出(2, 4)

5、numpy的广播机制

numpy两个数组的相加、相减以及相乘都是对应元素之间的操作。但是如果两个数组的形状不相同,这时候就会自动通过扩展数组实现相加、相减、相乘等操作,这就叫做广播机制(broadcasting)。

当数组与一个数做运算,即通过广播,使每个元素都与这个数做运算,数组形状不变。当两个数组的形状不相同,但它们的后缘维度相等,例如形状分别是(2,3)与(3,)的两个数组,后者会沿着0轴扩展。若形状分别是(4,3)与(4,1),后者会沿着1轴扩展。再比如(2,3,4)和(1,4)也是可以相加的。

import numpy as np
a = np.empty((2,3))
a+1                 #a中每个元素+1
a-1                 #a中每个元素-1
a*2                 #a中每个元素*2
b=np.array([1,2,3]) #创建一维数组,shape为(3,)
a*b                 #广播
np.ones((2,3,4)) * np.ones((1,4))  #广播

6、一些常用函数

import numpy as np

x=np.arange(20).reshape(5,4)

np.abs(x)            #绝对值
np.sqrt(x)           #平方根
np.square(x)         #平方
np.power(x,3)        #三次方
np.exp(x)            #指数e的次方
np.log(x)            #底数为e的log
np.log2(x)           #底数为2的log
np.log10(x)          #底数为10的log
np.sign(x)           #计算正负号:1、0或-1
np.sin(x)            #正弦
np.arcsin(x)         #反三角
x.min()              #最小值
x.max()              #最大值
x.mean()             #均值
x.max(axis=0)        #在0轴上聚合求最大值
np.unique(x)         #去重
np.linspace(0,5,11)  #0到5之间(包含0、5),均分为11个数

7、io

import numpy as np
from io import StringIO

#读取
a = StringIO(u'0 1 2\n3 4 5')
np.loadtxt(a)

b = np.loadtxt('x.csv',delimiter=',',dtype=str)
c = np.genfromtxt('y.csv',delimiter=',',dtype=str) 
#genfromtxt可提供选项,如missing_values,filling_values可处理不完整的csv,如skip_header跳过表头

#写入
np.savetxt('x.txt',b,delimiter=',',fmt = '%s') #在保存时需要指明数据类型,若类型不一致会报错
d = np.random.random((4,5,6))*10    
np.savetxt('y.txt',d.reshape((-1,10)),delimiter=',',fmt = '%d') 
#如果数组ndim>2,需转换成二维才能存储

二、pandas

pandas模块是Python用于数据导入及整理的模块,最初被作为金融数据分析工具而开发出来,它提供了大量能使我们快速便捷地处理数据的函数和方法,对于在数据挖掘工作中数据的处理起到非常大的作用。

pandas模块的常用数据结构主要有两种:

(1)、Series。一维数组,与Numpy中的一维array类似,只是在其基础上增加了一组索引。

(2)、DataFrame。二维的表格型数据结构,可以看做是由相同或不同值类型的Series组成的。

1、Series

import numpy as np
import pandas as pd
from pandas import Series

#通过list创建
s1= Series(['a','f','j','p','s'],index=[0,1,2,3,4])
s1.index      #查看索引
s1.values     #查看数据

#通过array创建
s2 = Series(np.ones(10,))

#通过dict创建
s3 = Series({'Tom':99,'Jerry':100,'Bob':98,'Jim':97})
s3[s3>97].mean()  #计算大于97分的同学的平均分。

#空值
s4 = Series([82,100,60,70,None],index=['Bob','Tom','Jim','Jerry','James'])
s4[pd.isnull(s4)]    #查看空值数据
(s3+s4)/2    #根据索引进行运算

#查找
s3['Tom']
s1[1:4]

2、DataFrame

import pandas as pd
from pandas import Series,DataFrame

s1 = Series({'Tom':99,'Jerry':100,'Bob':98,'Jim':97})
d1 = DataFrame(s1,columns=['score'])  #在Series的基础上,增加列索引

d2 = DataFrame([['Tom',99,12],['Jerry',100,15],['Bob',98,13],['Jim',97,10]],columns=['name','score','age'])
d2.index        #行索引
d2.columns      #列索引
d2.values       #值

#查找
d2['score']      #按列查找
d1.loc['Tom']    #按行索引查找
d2.iloc[0]       #按行号查找
d2.iloc[1:3]     #按行切片
d2.iloc[:,0:2]   #按列切片
d2.iloc[1:3,0:2] #按行和列切片
d2['name'][0:2] 或 d2.name[0:2]   #查找'name'列的第0、1行
d2[1:3]          #查找第1、2行
d2.iloc[1,2] 或 d2.loc[1,'age']     #查找第1行第2列元素值
d2.iat[1,2]      #与iloc等效,但是iat不能切片。d2.iat[1:3,0:2]会报错

d2[d2.age>12]    #过滤出年龄>12的数据
d2[d2!=98]       #整体过滤
d2[(d2==98)|(d2==12)]  #整体过滤
d2[d2.age.isin([13])]  #取出年龄=13的数据

d2.sort_values("age")  #按年龄从小到大排序
d2.sort_values("age",ascending=False) #按年龄从大到小排序
d2.sort_values("age",inplace=True) #会保存排序结果(但行号不会变)
d2.reset_index(drop=True)  #重置行号

len(d2)      #查看数据行数
d2.shape      #查看数据规模
d2.head(2)   #显示头部2行
d2.tail(2)   #显示末尾2行

d2["age"]=[10,11,12,13]     #修改列数据
d2["num"]=[996,997,998,999] #新增列

3、聚类

import numpy as np
from pandas import DataFrame

d2 = DataFrame([['Tom',99,12],['Jerry',100,15],['Bob',98,13],['Jim',97,10]],columns=['name','score','age'])
d2.count()
d2.mean()
d2.std()
d2.min()
d2.max()
d2.sum()
d2.describe()    #显示所有聚类结果
d2.count(0)      #按列聚类
d2.count(1)      #按行聚类
d2.age.max()     #按具体列聚类
d2.apply(lambda x:x.max()+x.min())  #自定义函数计算


d3 = DataFrame([['Tom',99,12],['Tom',96,12],['Jerry',100,15],['Jerry',90,15],['Bob',98,13],['Jim',97,10]],columns=['name','score','age'])
#按name计算均值
d3.pivot_table(index="name",values=["age","score"],aggfunc=np.mean)  

4、处理空值

from pandas import DataFrame

d4 = DataFrame([['Tom',99,12],['Jerry',100,15],['Bob',None,13],['Jim',97,None]],columns=['name','score','age'])
d4.isnull()
d4.dropna()  #删除含有空值的行
d4.dropna(axis=1)  #删除含有空值的列
d4.dropna(axis=0,subset=["age"])  #剔除age列含有空值的行

d5=d4.copy()
d5.age=d4.age.fillna(value = 10)
d5.score=d4.score.fillna(value = 98) #按设定值填补空值

5、日期数据

from pandas import DataFrame
import pandas as pd

d6 = DataFrame([['Tom',99,12,'2009/12/27'],['Jerry',100,15,'2006/11/21'],['Bob',98,13,'2008/5/18'],['Jim',97,10,'2011/7/16']],columns=['name','score','age','birth'])
d6['birth']=pd.to_datetime(d6['birth']) 
d6['birth'].dt.year   #显示年份
d6['birth'].dt.month  #显示月份
d6['birth'].dt.day    #显示日期

6、io

import pandas as pd
from pandas import DataFrame

d2 = DataFrame([['Tom',99,12],['Jerry',100,15],['Bob',98,13],['Jim',97,10]],columns=['name','score','age'])

#存储为csv文件
d2.to_csv('x.csv')

# 读取csv文件
x = pd.read_csv('x.csv',sep=',',header=0)  #可以设置分隔符,表头等参数

#相同的也可以用to_excel、read_excel; read_pickle、to_pickle; to_json、read_json等来存取其他类型的文件

三、matplotlib

该模块是一款强大的数据可视化工具,包含丰富的数学绘图函数。不过Matplotlib 默认情况不支持中文,如果要显示中文文字,可以下载OTF 字体。

1、绘制折线图

代码中的“UNRATE.csv”文件统计了美国从1948年1月到2016年8月每个月的失业率。表格中只有DATE和VALUE两列数据。

百度云下载链接:https://pan.baidu.com/s/1vIJ1_L3GNWCTAYOYEXjzJA
提取码:abcd

可从中提取出1950年的数据来绘制时间-失业率的折线图。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

unrate = pd.read_csv("UNRATE.csv")
unrate['DATE'] = pd.to_datetime(unrate['DATE'])

#指定x轴和y轴数据
unrate_1950 = unrate[unrate.DATE.dt.year==1950]
plt.plot(unrate_1950['DATE'], unrate_1950['VALUE'])
#x轴数据值倾斜45显示
plt.xticks(rotation=45)
#指定x轴和y轴数据的标签
plt.xlabel('Month')
plt.ylabel('Unemployment Rate')
#指定标题
plt.title('Monthly Unemployment Trends, 1950')
#是否显示辅助方格线
plt.grid(False)

plt.show()

数据分析:Python库之numpy、pandas、matplotlib_第1张图片

 2、绘制散点图

绘制散点图只需在上列代码中更改以下位置:加上参数"or"。o表示圆点,r表示red红色,即绘制红色圆点。

plt.plot(unrate_1950['DATE'], unrate_1950['VALUE'],"or")

数据分析:Python库之numpy、pandas、matplotlib_第2张图片

 3、绘制多幅子图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import math as m

#创建画图区域,指定长和宽
fig = plt.figure(figsize=(10,10))
#画图区域指定在2*1矩阵中,第三个参数表示子图的位置
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2)
#以0-19为横坐标值,以20个随机数组成的向量为纵坐标值画子图1,线是红色
ax1.plot(np.arange(20), np.random.randint(1,5,20), c='red')
#以[0-2π]为横坐标,以sin([0-2π]的值为纵坐标画子图2,线是蓝色
ax2.plot(np.linspace(0,2*m.pi,20), np.sin(np.linspace(0,2*m.pi,20)), c='blue')

plt.show()

数据分析:Python库之numpy、pandas、matplotlib_第3张图片

 4、在同一图表中绘制多幅图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

unrate = pd.read_csv("UNRATE.csv")
unrate['DATE'] = pd.to_datetime(unrate['DATE'])
unrate['MONTH'] = unrate['DATE'].dt.month

fig = plt.figure(figsize=(8,4))
colors = ['red', 'blue', 'green', 'orange', 'black']
for i in range(5):
    start_index = i*12
    end_index = (i+1)*12
    subset = unrate[start_index:end_index]
    plt.plot(subset['MONTH'], subset['VALUE'], c=colors[i], label=str(1948+i))

#显示图例在最佳位置    
plt.legend(loc='best')
#显示主方格辅助线
plt.grid(True)
#xy轴标签和图表标题
plt.xlabel('Month, Integer')
plt.ylabel('Unemployment Rate, Percent')
plt.title('Monthly Unemployment Trends, 1948-1952')

plt.show()

数据分析:Python库之numpy、pandas、matplotlib_第4张图片

 5、柱形图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

unrate = pd.read_csv("UNRATE.csv")
cols = ['1948', '1949', '1950', '1951', '1952']   #列名
unrate['DATE'] = pd.to_datetime(unrate['DATE'])

bar_heights=[]
for i in range(5):
    bar_height = round(unrate[unrate.DATE.dt.year == (1948+i)].VALUE.mean(),2) #失业率均值
    bar_heights.append(bar_height)

bar_positions = np.arange(5) + 1
# 返回一个 (figure, ax) 的元组
fig,ax = plt.subplots()
# 绘制纵向柱形图
ax.bar(bar_positions, bar_heights, 0.4)     #0.4指定柱的宽度

# 设置x轴bar的位置和x轴数据显示的角度
ax.set_xticks(range(1,6))
ax.set_xticklabels(cols, rotation=45)

# 设置xy轴的标签和图表的标题
ax.set_xlabel('year')
ax.set_ylabel('Unemployment Rate')
ax.set_title('Unemployment Rate , 1948-1952')

plt.show()

数据分析:Python库之numpy、pandas、matplotlib_第5张图片

 若要将柱形图方向改为横向,只需将ax.bar改为ax.barh,设置y轴刻度,并将x、y轴标题对调。即:

……

# 绘制横向柱形图
ax.barh(bar_positions, bar_heights, 0.4)     #0.4指定柱的宽度

# 设置y轴bar的位置和y轴数据显示的角度
ax.set_yticks(range(1,6))
ax.set_yticklabels(cols, rotation=45)

# 设置xy轴的标签和图表的标题
ax.set_xlabel('Unemployment Rate')
ax.set_ylabel('year')
ax.set_title('Unemployment Rate , 1948-1952')

plt.show()

数据分析:Python库之numpy、pandas、matplotlib_第6张图片

你可能感兴趣的:(机器学习,python,数据分析,机器学习,数据可视化)