Python库之numpy、pandas、matplotlib

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

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

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

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

一、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
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)

4、一些常用函数

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个数

二、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、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、绘制折线图

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、在同一图表中绘制多幅图

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_第2张图片
3、柱形图

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_第3张图片
4、散点图

import matplotlib.pyplot as plt
import numpy as np
 
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([1, 4, 9, 16, 7, 11, 23, 18])
colors = np.array(["red","green","black","orange","purple","beige","cyan","magenta"])//设置散点图的颜色
 
plt.scatter(x, y, c=colors)
plt.show()

Python库之numpy、pandas、matplotlib_第4张图片

你可能感兴趣的:(python,numpy,pandas)