Python三剑客之 numpy , pandas , matplotlib

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值