一、Numpy
1.numpy数组的转化
'''numpy'''
#为何需要引入numpy
# 再看列表
height = [176,158,163,177,172,169]
weight = [82,61,70,69,89,78]
# BMI 指数 (BMI = 体重(kg)/身高(m)的平方)
BMI = weight / (height/100)**2
# 用 一维数组 吧!
import numpy as np
# 将列表转为数组
Height = np.array(height)
Weight = np.array(weight)
BMI = Weight / (Height/100)**2
print(BMI)
首先,我们为何要引入numpy,因为之前根据数据创建的列表是不能直接用来计算的,需要将列表转化为数组之后再进行计算,上边直接用列表进行计算是显示错误的,转化为一维数组之后才显示可以计算。
#1.1.1 一维数组
#创建一维数组
#方法:
#数组的创建可以使用Numpy模块中的array函数实现
#一维数组只需要给array函数传入一个 列表或元组
#借助于array函数可以将列表或元组转换为数组,从而参与后续计算
import numpy as np
# 单个列表创建一维数组
arr1 = np.array([3,10,8,7,34,11,28,72])
print('一维数组:\n',arr1)
#1.1.2 二维数组
#创建方法:
#二维数组给array传入嵌套的列表或元组
import numpy as np
# 单个列表创建一维数组
#arr1 = np.array([3,10,8,7,34,11,28,72])
# 嵌套元组创建二维数组
arr2 = np.array(((8.5,6,4.1,2,0.7),(1.5,3,5.4,7.3,9),(3.2,3,3.8,3,3),(11.2,13.4,15.6,17.8,19)))
print('二维数组:\n',arr2)
#二维数组:
[[ 8.5 6. 4.1 2. 0.7]
[ 1.5 3. 5.4 7.3 9. ]
[ 3.2 3. 3.8 3. 3. ]
[11.2 13.4 15.6 17.8 19. ]]
那应该如何创建数组呢,常见的一维数组可以直接用 np.array 函数对列表进行转换,下边的代码演示了如何创建二维数组,可以根据括号数量的不同来判断数组的维数。
2.多元线性方程组以及特征向量和特征根的求解
#多元线性方程组
import numpy as np
A=np.array([[3,2,1],[2,3,1],[1,2,3]])
b=np.array([39,34,26])
x=np.linalg.solve(A,b)
print('三元一次方程组的解:\n',x)
#三元一次方程组的解:
[9.25 4.25 2.75]
#计算方阵的特征向量和特征根
arr16=np.array([[1,2,5],[3,6,8],[4,7,9]])
print('计算3x3方阵的特征根和特征向量:\n',arr16)
print('求解结果为:\n',np.linalg.eig(arr16))
#计算3x3方阵的特征根和特征向量:
[[1 2 5]
[3 6 8]
[4 7 9]]
求解结果为:
(array([16.75112093, -1.12317544, 0.37205451]), array([[-0.30758888, -0.90292521, 0.76324346],
[-0.62178217, -0.09138877, -0.62723398],
[-0.72026108, 0.41996923, 0.15503853]]))
除了简单的计算之外,使用 numpy 还可以进行复杂的应用,如上所示的计算三元一次方程组的解和特征向量特征根的求解。
# 返回一个数组的行数,列数 shape
print(arr1.shape)
print(arr2.shape)
#1.1.3 由numpy内置函数创建 数组
# 创建2x2的全0数组
a = np.zeros((2,2))
print(a)
# 创建1x2的全1数组
b = np.ones((1,2))
print(b)
# 创建2x2定值为7的数组
c = np.full((2,2), 7)
print(c)
#创建一个对角线为10,20,30,50的对角矩阵
d_1 = np.diag([10,20,30,50])
print(d_1)
#(实用技巧)创建一个一维的0-14的数组
e = np.arange(15)
print(e)
#创建一个一维的4-9的数组
e_1 = np.arange(4,10)
print(e_1)
#创建一个一维的1-13且以间隔为3的数组
e_2 = np.arange(1,14,3)
print(e_2)
#(实用技巧)创建一个一维的范围在0-10,长度为6的数组
f = np.linspace(0,10,6)
print(f)
#(实用技巧)把arange创建的一维数组转换为3行4列的二维数组
g = np.arange(12).reshape(3,4)
print(g)
#创建一个取值范围在[4,15),2行2列的随机整数矩阵
i = np.random.randint(4,15,size = (2,2))
print(i)
# 一维数组元素的获取
print('arr1 = \n',arr1)
print('\n获取指定位置的元素结果 \n',arr1[[2,5,7]])
# 二维数组元素的获取
print('arr2 = \n',arr2)
# 第1行第2列元素(注意行列从0开始!)
print('\n第1行第2列元素:',arr2[1,2])
# 第2行所有元素
print('\n第2行所有元素:\n',arr2[2,:])
# 第1列所有元素
print('\n第1列所有元素\n',arr2[:,1])
# 第1至3行,1至4列(注意,端点左闭右开哦!)
print('\n第1至3行,1至4列\n',arr2[1:4,1:5])
进行一维和二维数组元素获取时注意区分括号位置的不同,一维数组中选取多个点时在中括号之内需要再添加一个中括号,二维数组中选取一个点时,选择那个点的位置坐标时只有一个中括号,大家注意寻找区别。
二、pandas的应用
1、Series
import pandas as pd
from pandas import Series, DataFrame
x1 = Series([1,2,3,4])#默认index: 0,1,2...
x2 = Series(data=[1,2,3,4],
index=['a', 'b', 'c', 'd'])#指定incex
print (x1)
print (x2)
#通过索引获取数据
x1[3]
x2['c']
x1[[1,3]]
假如我们不自己指定的话会用默认的索引 0 ,1 ,2 ,3,假如自己定义索引的话需要加入自己想定义的索引序列,比如 a , b , c ,d,或者其他的索引都是可以的。
2.Dataframe
import numpy as np
print("第一种方法创建DataFrame")
arr2=np.array(np.arange(12)).reshape(4,3)
print("数组2:",arr2)
print("数组2的类型",type(arr2))
df1=pd.DataFrame(arr2)
print("\n\n数据框1:\n",df1)
print("数据框1的类型:",type(df1))
# 0 1 2 3 4
0 8.5 6.0 4.1 2.0 0.7
1 1.5 3.0 5.4 7.3 9.0
2 3.2 3.0 3.8 3.0 3.0
3 11.2 13.4 15.6 17.8 19.0
数据框1的类型: <class 'pandas.core.frame.DataFrame'>
Dataframe 相比于Series是二维的数据结构,其它与Series类似。
3.Pandas读写数据查询
#2.2.1读数据
#(1) csv 数据
import pandas as pd
data1 = pd.read_csv('data1.csv',
encoding = 'gb2312', sep=',')
data2 = pd.read_csv('data1.csv',encoding = 'gb2312')
print(data1.head()) # 显示前5行
print('\n\n',data1.head(3)) # 指定显示行数
print('\n\n',data1.tail()) #显示后5行
print('\n 全部列名\n',data1.columns) #返回全部列名
# 查询指定的行
data1.iloc[[0,2,3,7]]
print(data1.shape)#返回文件形状
print(data1.loc[1:2]) #打印第1到2行
#查询指定的列
data1[['食品','交通']].head()
# 查询指定的行和列
data1.loc[[1,4],['衣着','医疗']]
#查询食品为3000以上的交通在1000以下的信息
data1[(data1['食品']>=3000) & (data1['交通']<=1000)].head()
利用 Pandas 进行读写 csv 数据查询时, csv 数据是用 ‘,’隔开的,所以有的版本在读取 csv 格式文件时要加入 sep ,encoding的加入是为了汉字的正常读入,这个必须要加入,经过检验两种读取方式都是可以的,加不加sep的情况都可以读入。head( )内不填入数字时是默认读取前五行的,要读取显示的其它行可以再进行指定。
#(2) xls数据
import pandas as pd
data2 = pd.read_excel('data2.xlsx')
print(data2.head())
#(3) txt数据
data3 = pd.read_table('data3.txt', sep='\t')
data3.head()
同时使用Pandas 读取xls 数据和 txt 都是可以的。
三、Matplotlib
'''matplotlib'''
#1 饼图的绘制
#例1 导入第三方模块
import matplotlib
import matplotlib.pyplot as plt
matplotlib.rcParams['font.family'] = 'SimHei'
#显示中文 https://blog.csdn.net/skyli114/article/details/77508247
# 构造数据
edu = [0.2515,0.3724,0.3336,0.0368,0.0057]
labels = ['中专','大专','本科','硕士','其他']
# 绘制饼图
plt.pie(x = edu, # 绘图数据
labels=labels, # 添加教育水平标签
autopct='%.1f%%' # 设置百分比的格式,这里保留一位小数
)
# 添加图标题
plt.title('失信用户的教育水平分布')
# 显示图形
plt.show()
#例2 添加修饰的饼图
explode = [0,0.1,0,0,0] # 生成数据,用于突出显示大专学历人群
colors=['#9999ff','#ff9999','#7777aa','#2442aa','#dd5555'] # 自定义颜色
# 中文乱码和坐标轴负号的处理
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
# 将横、纵坐标轴标准化处理,确保饼图是一个正圆,否则为椭圆
plt.axes(aspect='equal')
# 绘制饼图
plt.pie(x = edu, # 绘图数据
explode=explode, # 突出显示大专人群
labels=labels, # 添加教育水平标签
colors=colors, # 设置饼图的自定义填充色
autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
pctdistance=0.8, # 设置百分比标签与圆心的距离
labeldistance = 1.1, # 设置教育水平标签与圆心的距离
startangle = 180, # 设置饼图的初始角度
radius = 1.2, # 设置饼图的半径
counterclock = False, # 是否逆时针,这里设置为顺时针方向
wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'},# 设置饼图内外边界的属性值
textprops = {'fontsize':10, 'color':'black'}, # 设置文本标签的属性值
)
# 添加图标题
plt.title('失信用户的受教育水平分布')
# 显示图形
plt.show()
#例3 导入第三方模块
import pandas as pd
# 构建序列
data1 = pd.Series({'中专':0.2515,'大专':0.3724,'本科':0.3336,'硕士':0.0368,'其他':0.0057})
# 将序列的名称设置为空字符,否则绘制的饼图左边会出现None这样的字眼
data1.name = ''
# 控制饼图为正圆
plt.axes(aspect = 'equal')
# plot方法对序列进行绘图
data1.plot(kind = 'pie', # 选择图形类型
autopct='%.1f%%', # 饼图中添加数值标签
radius = 1, # 设置饼图的半径
startangle = 180, # 设置饼图的初始角度
counterclock = False, # 将饼图的顺序设置为顺时针方向
title = '失信用户的受教育水平分布', # 为饼图添加标题
wedgeprops = {'linewidth': 1.5, 'edgecolor':'green'}, # 设置饼图内外边界的属性值
textprops = {'fontsize':10, 'color':'black'} # 设置文本标签的属性值
)
# 显示图形
plt.show()
#-------------------------------
#2 条形图的绘制--垂直条形图
# 读入数据
GDP = pd.read_excel('Province GDP 2017.xlsx')
# 设置绘图风格(不妨使用R语言中的ggplot2风格)
plt.style.use('ggplot')
# 绘制条形图
plt.bar(left = range(GDP.shape[0]), # 指定条形图x轴的刻度值
height = GDP.GDP, # 指定条形图y轴的数值
tick_label = GDP.Province, # 指定条形图x轴的刻度标签
color = 'steelblue', # 指定条形图的填充色
)
# 添加y轴的标签
plt.ylabel('GDP(万亿)')
# 添加条形图的标题
plt.title('2017年度6个省份GDP分布')
# 为每个条形图添加数值标签
for x,y in enumerate(GDP.GDP):
plt.text(x,y+0.1,'%s' %round(y,1),ha='center')
# 显示图形
plt.show()