numpy模块
计算速度快,提供了数组操作、数组运算、以及统计分布和简单的数学模型,用来存储和处理大型矩阵
创建矩阵
创建一维矩阵
import numpy as np
np.array([1,2,3]) # 一维数组
array([1, 2, 3])
创建二维矩阵
np.array([[1,2,3],[4,5,6]]) # 二维数组
array([[1, 2, 3],
[4, 5, 6]])
创建三维矩阵
np.array([[[1,2,3],[4,5,6]],[[3,2,1],[6,5,4]]]) # 三维数组
array([[[1, 2, 3],
[4, 5, 6]],
[[3, 2, 1],
[6, 5, 4]]])
获取矩阵的行列数
arr = np.array([[1,2,3],[4,5,6]])
arr.shape # 获取多维数组的行和列
(2, 3) # 矩阵的行arr.shape[0],矩阵的列arr.shape[1]
切割矩阵
切分矩阵类似于列表的切割,但是与列表的切割不同的是,矩阵的切割涉及到行和列的切割,但是两者切割的方式都是从索引0开始,并且取头不取尾。
arr[1,2] # 取第二行第三列的元素
6
arr[0,:] # 取第一行的元素
array([1, 2, 3])
arr[:,1] # 取第二列的元素
array([2, 5])
arr[arr>3] # 取大于3的元素,返回一个数组
array([4, 5, 6])
矩阵元素替换
矩阵元素的替换,类似于列表元素的替换,并且矩阵也是一个可变类型的数据,即如果对矩阵进行替换操作,会修改原矩阵的元素
arr[0,:]=0 # 将第一行的元素赋值为0
arr
array([[0, 0, 0],
[4, 5, 6]])
arr[1,1] = 1 # 将第二行第二列元素赋值为1
arr
array([[0, 0, 0],
[4, 1, 6]])
矩阵的合并
arr1 = np.array([[1,2,5],[1,7,2]])
arr2 = np.array([[3,4,2],[1,0,1]])
print(arr1)
print(arr2)
[[1 2 5]
[1 7 2]]
[[3 4 2]
[1 0 1]]
np.vstack((arr1,arr2)) # 合并两个矩阵的列,矩阵应该有相同的列
array([[1, 2, 5],
[1, 7, 2],
[3, 4, 2],
[1, 0, 1]])
np.hstack((arr1,arr2)) # 合并两个矩阵的行,矩阵应该具有相同的行
array([[1, 2, 5, 3, 4, 2],
[1, 7, 2, 1, 0, 1]])
np.concatenate((arr1,arr2),axis=0) # 合并两个矩阵,axis=0表示合并两个矩阵的列
array([[1, 2, 5],
[1, 7, 2],
[3, 4, 2],
[1, 0, 1]])
np.concatenate((arr1,arr2),axis=1) # axis=1表示合并两个矩阵的行
array([[1, 2, 5, 3, 4, 2],
[1, 7, 2, 1, 0, 1]])
通过函数创建矩阵
np.arange(1,10) # 通过arange创建一维数组
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
np.ones((3,4)) # 创建3行4列全为1的二维数组
array([[1., 1., 1., 1.],
[1., 1., 1., 1.],
[1., 1., 1., 1.]])
np.ones((3,4),dtype=int) # dytpe=int表示数组内的数是整型
array([[1, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1]])
np.zeros((2,3)) # 构造2*3的全0矩阵
array([[0., 0., 0.],
[0., 0., 0.]])
np.eye(3) # 构造单位矩阵
array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
矩阵的运算
运算符 |
说明 |
+ |
两个矩阵对应元素相加 |
- |
两个矩阵对应元素相减 |
* |
两个矩阵对应元素相乘 |
/ |
两个矩阵对应元素相除 |
% |
两个矩阵对应元素相除后取余数 |
**n |
单个矩阵每个元素都取n次方 |
arr1+arr2
array([[4, 6, 7],
[2, 7, 3]])
矩阵的点乘与转置
矩阵的点乘必须满足第一个矩阵的列数等于第二个矩阵的行数
np.dot(arr1,arr2.T)
array([[21, 6],
[35, 3]])
arr2.T
array([[3, 1],
[4, 0],
[2, 1]])
矩阵的逆
矩阵行和列相同时,矩阵才可逆
np.linalg.inv(np.dot(arr1,arr2.T))
array([[-0.02040816, 0.04081633],
[ 0.23809524, -0.14285714]])
矩阵的其他操作
arr1.max() # 获取矩阵所有元素中的最大值
7
arr1.min() # 获取矩阵所有元素中的最小值
1
arr1.argmax(axis=1) # 获取矩阵最大元素的索引位置
arr1.mean() # 获取矩阵所有元素的平均值
arr1.mean(axis=0) # 获取矩阵每一列的平均值
arr1.mean(axis=1) # 获取矩阵每一行的平均值
arr1.var() # 获取矩阵所有元素的方差
arr1.var(axis=0) # 获取矩阵每一列的元素的方差
arr1.var(axis=1) # 获取矩阵每一行的元素的方差
arr1.std() # 获取矩阵所有元素的标准差
arr1.std(axis=0) # 获取矩阵每一列的元素的标准差
arr1.std(axis=1) # 获取矩阵每一行的元素的标准差
np.median(arr1) # 获取矩阵所有元素的中位数
np.median(arr1,axis=0) # 获取矩阵每一列的元素的中位数
np.median(arr1,axis=1) # 获取矩阵每一行的元素的中位数
arr1.sum() # 对矩阵的每一个元素求和
arr1.sum(axis=0) # 对矩阵的每一列求和
arr1.sum(axis=1) # 对矩阵的每一行求和
arr1.cumsum() # 累加和,如arr1=[1,2,3],arr1.cumsum=[1,3,6],第n个元素为前n-1个元素累加
numpy.random生成随机数
np.random.rand(3,4) # 产生[0,1)内的均匀分布的随机
array([[0.20445225, 0.87811744, 0.02738759, 0.67046751],
[0.4173048 , 0.55868983, 0.14038694, 0.19810149],
[0.80074457, 0.96826158, 0.31342418, 0.69232262]])
固定随机数
np.random.seed(1) # 随机种子,固定随机数
np.random.rand(3,4)
array([[4.17022005e-01, 7.20324493e-01, 1.14374817e-04, 3.02332573e-01],
[1.46755891e-01, 9.23385948e-02, 1.86260211e-01, 3.45560727e-01],
[3.96767474e-01, 5.38816734e-01, 4.19194514e-01, 6.85219500e-01]])
rs = np.random.RandomState(1) # 固定随机数
rs.rand(3,4)
array([[4.17022005e-01, 7.20324493e-01, 1.14374817e-04, 3.02332573e-01],
[1.46755891e-01, 9.23385948e-02, 1.86260211e-01, 3.45560727e-01],
[3.96767474e-01, 5.38816734e-01, 4.19194514e-01, 6.85219500e-01]])
pandas模块
pandas基于Numpy,可以看成是处理文本或者表格数据。pandas中有两个主要的数据结构,其中Series数据结构类似于Numpy中的一维数组,DataFrame类似于多维表格数据结构。
pandas是python数据分析的核心模块。它主要提供了五大功能:
- 支持文件存取操作,支持数据库(sql)、html、json、pickle、csv(txt、excel)、sas、stata、hdf等。
- 支持增删改查、切片、高阶函数、分组聚合等单表操作,以及和dict、list的互相转换。
- 支持多表拼接合并操作。
- 支持简单的绘图操作。
- 支持简单的统计分析操作
Series
import pandas as pd
pd.Series([1,2,3,4]) # 类似于一维数组,只能放一维的数组
0 1
1 2
2 3
3 4
dtype: int64
DataFrame
pd.DataFrame(np.array([[1,2,3],[3,2,1]])) # 两维以上的数组
dates = pd.date_range('2019-5-15',periods = 7)
goods_list = ['tesla', 'transformer', 'faladi', 'wawa']
prices = np.random.rand(7,4)
df = pd.DataFrame(prices, index=dates, columns=goods_list)
df
|
tesla |
transformer |
faladi |
wawa |
2019-05-15 |
0.860028 |
0.538831 |
0.552822 |
0.842031 |
2019-05-16 |
0.124173 |
0.279184 |
0.585759 |
0.969596 |
2019-05-17 |
0.561030 |
0.018647 |
0.800633 |
0.232974 |
2019-05-18 |
0.807105 |
0.387861 |
0.863542 |
0.747122 |
2019-05-19 |
0.556240 |
0.136455 |
0.059918 |
0.121343 |
2019-05-20 |
0.044552 |
0.107494 |
0.225709 |
0.712989 |
2019-05-21 |
0.559717 |
0.012556 |
0.071974 |
0.967276 |
DataFrame属性
df.dtypes # 查看数据类型
tesla float64
transformer float64
faladi float64
wawa float64
dtype: object
df.index # 查看行序列或者索引
DatetimeIndex(['2019-05-15', '2019-05-16', '2019-05-17', '2019-05-18',
'2019-05-19', '2019-05-20', '2019-05-21'],
dtype='datetime64[ns]', freq='D')
df.columns # 查看各列的标签
Index(['tesla', 'transformer', 'faladi', 'wawa'], dtype='object')
df.values # 查看数据框内的数据
array([[0.86002795, 0.53883106, 0.55282198, 0.84203089],
[0.12417332, 0.27918368, 0.58575927, 0.96959575],
[0.56103022, 0.01864729, 0.80063267, 0.23297427],
[0.8071052 , 0.38786064, 0.86354185, 0.74712164],
[0.55624023, 0.13645523, 0.05991769, 0.12134346],
[0.04455188, 0.10749413, 0.22570934, 0.71298898],
[0.55971698, 0.01255598, 0.07197428, 0.96727633]])
df.describe() # 查看数据每一列的极值,均值,中位数,只可用于数值型数据
|
tesla |
transformer |
faladi |
wawa |
count |
7.000000 |
7.000000 |
7.000000 |
7.000000 |
mean |
0.501835 |
0.211575 |
0.451480 |
0.656190 |
std |
0.311727 |
0.198347 |
0.333747 |
0.343075 |
min |
0.044552 |
0.012556 |
0.059918 |
0.121343 |
25% |
0.340207 |
0.063071 |
0.148842 |
0.472982 |
50% |
0.559717 |
0.136455 |
0.552822 |
0.747122 |
75% |
0.684068 |
0.333522 |
0.693196 |
0.904654 |
max |
0.860028 |
0.538831 |
0.863542 |
0.969596 |
df.transpose() # 转置、行列互换
|
2019-05-15 00:00:00 |
2019-05-16 00:00:00 |
2019-05-17 00:00:00 |
2019-05-18 00:00:00 |
2019-05-19 00:00:00 |
2019-05-20 00:00:00 |
2019-05-21 00:00:00 |
tesla |
0.860028 |
0.124173 |
0.561030 |
0.807105 |
0.556240 |
0.044552 |
0.559717 |
transformer |
0.538831 |
0.279184 |
0.018647 |
0.387861 |
0.136455 |
0.107494 |
0.012556 |
faladi |
0.552822 |
0.585759 |
0.800633 |
0.863542 |
0.059918 |
0.225709 |
0.071974 |
wawa |
0.842031 |
0.969596 |
0.232974 |
0.747122 |
0.121343 |
0.712989 |
0.967276 |
df.sort_index() # 排序,可按行或列index排序输出
|
tesla |
transformer |
faladi |
wawa |
2019-05-15 |
0.860028 |
0.538831 |
0.552822 |
0.842031 |
2019-05-16 |
0.124173 |
0.279184 |
0.585759 |
0.969596 |
2019-05-17 |
0.561030 |
0.018647 |
0.800633 |
0.232974 |
2019-05-18 |
0.807105 |
0.387861 |
0.863542 |
0.747122 |
2019-05-19 |
0.556240 |
0.136455 |
0.059918 |
0.121343 |
2019-05-20 |
0.044552 |
0.107494 |
0.225709 |
0.712989 |
2019-05-21 |
0.559717 |
0.012556 |
0.071974 |
0.967276 |
df.sort_values(by='wawa') # 按指定的数据排序
|
tesla |
transformer |
faladi |
wawa |
2019-05-19 |
0.556240 |
0.136455 |
0.059918 |
0.121343 |
2019-05-17 |
0.561030 |
0.018647 |
0.800633 |
0.232974 |
2019-05-20 |
0.044552 |
0.107494 |
0.225709 |
0.712989 |
2019-05-18 |
0.807105 |
0.387861 |
0.863542 |
0.747122 |
2019-05-15 |
0.860028 |
0.538831 |
0.552822 |
0.842031 |
2019-05-21 |
0.559717 |
0.012556 |
0.071974 |
0.967276 |
2019-05-16 |
0.124173 |
0.279184 |
0.585759 |
0.969596 |
读取CSV文件
test_data = '''
c1,c2,c3,'c4'
5.1,,12,23
23,,,12
,12,11,11
1,2,2,2
1,1,1,1
1,2,3,4
5,6,7,8
’’’
'''
from io import StringIO
test_data = StringIO(test_data)
df = pd.read_csv(test_data)
df
|
c1 |
c2 |
c3 |
'c4' |
0 |
5.1 |
NaN |
12.0 |
23.0 |
1 |
23 |
NaN |
NaN |
12.0 |
2 |
NaN |
12.0 |
11.0 |
11.0 |
3 |
1 |
2.0 |
2.0 |
2.0 |
4 |
1 |
1.0 |
1.0 |
1.0 |
5 |
1 |
2.0 |
3.0 |
4.0 |
6 |
5 |
6.0 |
7.0 |
8.0 |
7 |
’’’ |
NaN |
NaN |
NaN |
处理丢失数据
df.dropna(axis=0) # 把有空值的行删除,不改变df
|
c1 |
c2 |
c3 |
'c4' |
3 |
1 |
2.0 |
2.0 |
2.0 |
4 |
1 |
1.0 |
1.0 |
1.0 |
5 |
1 |
2.0 |
3.0 |
4.0 |
6 |
5 |
6.0 |
7.0 |
8.0 |
df.dropna(axis=1) # 把有空值的列删除,不改变df
df.dropna(thresh=6,axis=1) # 将行(列)中非空值个数小于thresh的行(列)删除,(axis=0表示行,1表示列)
|
c1 |
c3 |
'c4' |
0 |
5.1 |
12.0 |
23.0 |
1 |
23 |
NaN |
12.0 |
2 |
NaN |
11.0 |
11.0 |
3 |
1 |
2.0 |
2.0 |
4 |
1 |
1.0 |
1.0 |
5 |
1 |
3.0 |
4.0 |
6 |
5 |
7.0 |
8.0 |
7 |
’’’ |
NaN |
NaN |
df
|
c1 |
c2 |
c3 |
'c4' |
0 |
5.1 |
NaN |
12.0 |
23.0 |
1 |
23 |
NaN |
NaN |
12.0 |
2 |
NaN |
12.0 |
11.0 |
11.0 |
3 |
1 |
2.0 |
2.0 |
2.0 |
4 |
1 |
1.0 |
1.0 |
1.0 |
5 |
1 |
2.0 |
3.0 |
4.0 |
6 |
5 |
6.0 |
7.0 |
8.0 |
7 |
’’’ |
NaN |
NaN |
NaN |
df.dropna(subset=['c2']) # 把c2列中空值的那行删除
|
c1 |
c2 |
c3 |
'c4' |
2 |
NaN |
12.0 |
11.0 |
11.0 |
3 |
1 |
2.0 |
2.0 |
2.0 |
4 |
1 |
1.0 |
1.0 |
1.0 |
5 |
1 |
2.0 |
3.0 |
4.0 |
6 |
5 |
6.0 |
7.0 |
8.0 |
df.fillna(value=0) # 将空值用value填充
|
c1 |
c2 |
c3 |
'c4' |
0 |
5.1 |
0.0 |
12.0 |
23.0 |
1 |
23 |
0.0 |
0.0 |
12.0 |
2 |
0 |
12.0 |
11.0 |
11.0 |
3 |
1 |
2.0 |
2.0 |
2.0 |
4 |
1 |
1.0 |
1.0 |
1.0 |
5 |
1 |
2.0 |
3.0 |
4.0 |
6 |
5 |
6.0 |
7.0 |
8.0 |
7 |
’’’ |
0.0 |
0.0 |
0.0 |
合并数据
df1 = pd.DataFrame(np.array([[1,2,3],[4,5,6]]))
df2 = pd.DataFrame(np.array([[4,5,6],[1,2,3]]))
pd.concat((df1,df2),axis=1) # axis=0时合并列,axis=1合并行
|
0 |
1 |
2 |
0 |
1 |
2 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
1 |
4 |
5 |
6 |
1 |
2 |
3 |
取值
df.loc[7] # 通过索引取值
c1 ’’’
c2 NaN
c3 NaN
'c4' NaN
Name: 7, dtype: object
df.iloc[0,:] # 取第一行
c1 5.1
c2 NaN
c3 12
'c4' 23
Name: 0, dtype: object
df.iloc[0,:] = 0 # 将第一行赋值为0
df
|
c1 |
c2 |
c3 |
'c4' |
0 |
0 |
0.0 |
0.0 |
0.0 |
1 |
23 |
NaN |
NaN |
12.0 |
2 |
NaN |
12.0 |
11.0 |
11.0 |
3 |
1 |
2.0 |
2.0 |
2.0 |
4 |
1 |
1.0 |
1.0 |
1.0 |
5 |
1 |
2.0 |
3.0 |
4.0 |
6 |
5 |
6.0 |
7.0 |
8.0 |
7 |
’’’ |
NaN |
NaN |
NaN |
导入导出数据
df.to_excel('test.xlsx')
df = pd.read_excel('test.xlsx')
df
|
Unnamed: 0 |
c1 |
c2 |
c3 |
'c4' |
0 |
0 |
0 |
0.0 |
0.0 |
0.0 |
1 |
1 |
23 |
NaN |
NaN |
12.0 |
2 |
2 |
NaN |
12.0 |
11.0 |
11.0 |
3 |
3 |
1 |
2.0 |
2.0 |
2.0 |
4 |
4 |
1 |
1.0 |
1.0 |
1.0 |
5 |
5 |
1 |
2.0 |
3.0 |
4.0 |
6 |
6 |
5 |
6.0 |
7.0 |
8.0 |
7 |
7 |
’’’ |
NaN |
NaN |
NaN |
matplotlib模块
图形可视化,主要用来画图。它可以创建常用的统计图,包括条形图、箱型图、折线图、散点图和直方图
条形图
# 导入模块
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
%matplotlib inline # 只有在使用jupyter时使用这行
font = FontProperties(fname='E:msyh.ttc') #fname是中文字体路径
classes = ['1班','2班','3班','4班']
student_amounts = [30,10,20,40]
classes_index = range(len(classes))
# 绘制条形图
plt.bar(classes_index,student_amounts)
plt.xticks(classes_index,classes,FontProperties=font)
plt.xlabel('班级',FontProperties=font) # x方向加上标签
plt.ylabel('学生人数',FontProperties=font) # y方向加上标签
plt.title('班级-学生人数',FontProperties=font) # 给图添加标题
# 给条形图的上方加上各班级的人数
for ind,student_amount in enumerate(student_amounts):
plt.text(ind,student_amount+1,student_amount)
plt.show()
直方图
mu1,mu2,sigma = 50,100,10
x1 = mu1 + sigma * np.random.randn(10000) # 生成10000个正态分布随机数
x2 = mu2 + sigma * np.random.randn(10000)
# 修改背景
plt.style.use('ggplot')
fig = plt.figure() # 生成一张画布
ax1 = fig.add_subplot(121) # 121表示将画布分成1行2列,第二个1表示第一个
ax2 = fig.add_subplot(122) # 122表示将画布分成1行2列,第二个2表示第二个
# 绘制直方图
ax1.hist(x1,bins=100,color='red')
ax2.hist(x2,bins=200,color='green')
# 分别给两个图加标题
ax1.set_title('红色',fontproperties=font)
ax2.set_title('绿色',fontproperties=font)
# 给整个加大标题
fig.suptitle('大标题',fontproperties=font,fontsize=15,weight='bold') # fontsize字体大小,weight字体粗细bold表示加粗
plt.show()
折线图
data1 = np.random.rand(40) # 生成40个数字
# 画折线图
plt.plot(data1)
# linestyle是线的类型有“-、--、:、-.”四种,alpha表示透明度,label表示标记
plt.plot(data1,color='green',linestyle='--',alpha=0.9,label='红色')
plt.legend(prop=font) # 显示label
plt.show()
# 生成多条折线
arr = np.array([1,2,3,4])
arr2 = arr.cumsum()
plt.plot(arr)
plt.plot(arr2)
plt.show()
散点图
x = np.arange(1,20)
y_linear = x ** 2
y_log = np.log(x) # 取x的对数
# 画散点图
plt.scatter(x,y_linear)
plt.scatter(x,y_log,color='green',marker='*',s=100) # color颜色,marker记号,s表示大小
plt.title('散点图',FontProperties=font)
plt.show()