Numpy+Pandas+Matplotlib学习
Posted 数据攻城小狮子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Numpy+Pandas+Matplotlib学习相关的知识,希望对你有一定的参考价值。
参考的教程是哔哩哔哩孙兴华UP主的视频,边学边做
BV1ji4y157uB
代码及所用的数据已上传至Github
learn_numpy_pandas_matplotlib
文章目录
NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库
pandas 是基于NumPy 的一种工具,该工具是为解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。
Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。
以下粘贴部分代码,完整代码目录已上传至Github
Numpy
learn_numpy/demo02
import numpy as np
a = np.array([1, 2, 3, 4, 5])
b = np.array(range(1, 6))
c = np.arange(1, 6)
print(f'a:a')
print(f'b:b')
print(f'c:c')
print('a.dtype:', a.dtype)
print('type(a):', type(a))
a1 = np.array([1, 2, 3, 4, 5], 'int64')
print(f'array中元素的数据类型:', a1.dtype)
print('array的维度/形状:', b.shape)
print('array的维度的数目:', a.ndim)
print('array中所有元素的数目:', a.size)
learn_numpy/demo05
import numpy as np
a = np.random.randn()
print(f'一个随机数:a')
b = np.random.randn(3)
print(f'三个数:b')
c = np.random.randn(3, 2)
print(f'3行2列:\\nc')
d = np.random.randn(3, 2, 4)
print(f'3块,每块是2行4列:\\nd')
print('四舍五入(保留两位小数):', np.round(3.14159, 2))
print('*' * 30)
a = np.array(range(1, 8), dtype=float) # 修改数据类型
b = np.array(range(1, 8), dtype='float32') # 修改数据类型和位数
print(a)
print(b)
print(a.dtype)
print(b.dtype)
print(type(a))
print(type(b))
learn_numpy/demo20
import numpy as np
# lexsort(keys, axis=-1)
# lexsort()根据键值的字典序进行排序,支持对数组按指定行或列的顺序排序,间接排序,不修改原数组,返回索引。一般对一维数组使用argsort()。
# 默认按最后一行元素由小到大排序, 返回最后一行元素排序后索引所在位置。
x = np.array([[0, 12, 48], [4, 18, 14], [7, 1, 99]])
print(np.lexsort(x))
a = np.array([1, 5, 1, 4, 3, 4, 4])
b = np.array([9, 4, 0, 4, 0, 2, 1])
ind = np.lexsort((b, a))
print(ind)
print(list(zip(a[ind], b[ind])))
c = [[1, 5, 1, 4, 3, 4, 4], [9, 4, 0, 4, 0, 2, 1]]
print(np.lexsort(c))
print(x[np.lexsort(x.T)]) # 按最后一列顺序排序
print(x[np.lexsort(-x.T)]) # 按最后一列逆序排序
print(x[np.lexsort(x[:, ::-1].T)]) # 按第一列顺序排序
print(x.T[np.lexsort(x)].T) # 按最后一行顺序排序
print(x.T[np.lexsort(x[::-1, :])].T) # 按第一行顺序排序
Pandas
learn_pandas/demo10
import pandas as pd
url = './data_files/课件011/计算列.xlsx'
data = pd.read_excel(url, index_col='序号')
data['销售金额'] = data['单价'] * data['销售数量']
print(data)
url = './data_files/课件011/计算列.csv'
data = pd.read_csv(url, index_col='序号')
data['销售金额'] = data['单价'] * data['销售数量']
print(data)
url = './data_files/课件011/计算列.csv'
data = pd.read_csv(url, index_col='序号')
for i in range(1, 3):
data['销售金额'].at[i] = data['单价'].at[i] * data['销售数量'].at[i]
print(data)
learn_pandas/demo25
import numpy as np
import pandas as pd
path = './data_files/课件028-029/透视.xlsx'
data = pd.read_excel(path)
# index需要聚合的列名,默认情况下聚合所有数据值的列
data2 = pd.pivot_table(data, index=['部门', '销售人员'])
# values在结果透视的行上进行分组的列名或其它分组键【就是透视表里显示的列】
data3 = pd.pivot_table(data, index=['部门', '销售人员'], values=['数量', '金额'])
# columns在结果透视表的列上进行分组的列名或其它分组键
data4 = pd.pivot_table(data, index=['部门', '销售人员'], values=['数量', '金额'], columns='所属区域')
# Aggfunc聚合函数或函数列表(默认情况下是mean)可以是groupby里面的任意有效函数
data5 = pd.pivot_table(data, index=['部门', '销售人员'], values=['数量', '金额'], columns='所属区域',
aggfunc=[sum, np.mean])
'''
5、fill_value 在结果表中替换缺失值
例如:fill_value = 0
6、dropna 如果为True,将不含所有条目均为Na的列(默认为False)
dropna=True
7、margins 添加行/列小计和总计 (默认为False)
margins =True
'''
# print(data5)
# 交叉表 crosstab
data6 = pd.crosstab([data.日期.dt.month, data.所属区域], data.部门, margins=True)
print(data6)
Matplotlib
叠加柱状图
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_excel('./课件/04.堆叠柱状图.xlsx')
plt.bar(np.arange(9), data['语文'], color="red", label="语文", align='center')
plt.bar(np.arange(9), data['数学'], bottom=data['语文'], color="green", label="数学", align='center')
plt.bar(np.arange(9), data['英语'], bottom=data['语文'] + data['数学'], color="yellow", label="英语", align='center')
# 设置x轴标签
plt.xticks(np.arange(9), data['姓名'])
# 显示图例,上面中心位置,分成3列
plt.legend(loc='upper center', ncol=3)
# 设置y轴的刻度范围
plt.ylim([0, 300])
for x1, y1 in enumerate(data['语文']):
plt.text(x1, y1 - 10, str(y1), ha='center', fontsize=20, color='black')
for x2, y2 in enumerate(data['语文'] + data['数学']):
plt.text(x2, y2 - 10, str(y2), ha='center', fontsize=20, color='black')
for x3, y3 in enumerate(data['语文'] + data['数学'] + data['英语']):
plt.text(x3, y3 - 10, str(y3), ha='center', fontsize=20, color='black')
plt.grid() # 网格线
plt.savefig('./图片/叠加柱状图.jpg')
plt.show()
饼图
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_excel('./课件/07.饼图.xlsx')
plt.pie(x=data.第一次, labels=tuple(data.姓名), explode=(0, 0.2, 0), colors=['r', 'g', 'b'], shadow=True,
autopct='%.2f%%', startangle=90, counterclock=False, labeldistance=0.8, radius=1.3, pctdistance=0.3,
textprops='fontsize': 20, 'color': 'black')
# 将饼图显示为正圆形,plt.axis( )
plt.axis('equal')
# 添加图例,plt.legend( )
# loc = 'upper right' 位于右上角
# bbox_to_anchor=[0.5, 0.5] # 外边距 上边 右边
# ncol=2 分两列
# borderaxespad = 0.3图例的内边距
plt.legend(loc="upper right", fontsize=10, bbox_to_anchor=(1.1, 1.05), borderaxespad=0.3, ncol=3)
plt.savefig('./图片/饼图.jpg', dpi=200, bbox_inches='tight') # bbox_inches='tight' 忽略不可见的轴
plt.show()
'''
def pie(x, explode=None, labels=None, colors=None, autopct=None,
pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None,
radius=None, counterclock=True, wedgeprops=None, textprops=None,
center=(0, 0), frame=False, rotatelabels=False, hold=None, data=None)
x :(每一块)的比例,如果sum(x) > 1会使用sum(x)归一化;
labels :(每一块)饼图外侧显示的说明文字;
explode :(每一块)离开中心距离;
startangle :起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;
shadow :在饼图下面画一个阴影。默认值:False,即不画阴影;
labeldistance :label标记的绘制位置,相对于半径的比例,默认值为1.1, 如<1则绘制在饼图内侧;
autopct :控制饼图内百分比设置,可以使用format字符串或者format function '%1.1f'指小数点前后位数(没有用空格补齐);
pctdistance :类似于labeldistance,指定autopct的位置刻度,默认值为0.6;
radius :控制饼图半径,默认值为1;counterclock :指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时
针。wedgeprops :字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:wedgeprops='linewidth':3设置
wedge线宽为3。
textprops :设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。
center :浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。
frame :布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。
rotatelabels :布尔类型,可选参数,默认为:False。如果为True,旋转每个label到指定的角度。
'''
散点图
import pandas as pd
import matplotlib.pyplot as plt
pd.options.display.max_columns = None
plt.rcParams['font.sans-serif'] = ['SimHei']
data = pd.read_excel('./课件/16.散点图.xlsx')
plt.scatter(data.身高, data.体重, s=data.身高, c='b', marker='o', alpha=0.6, linewidths=20)
plt.savefig('./图片/散点图.jpg')
plt.show()
# 带颜色的散点图
import numpy as np
k = 500
x = np.random.rand(k)
y = np.random.rand(k)
size = np.random.rand(k) * 50 # 生成每个点的大小
# arctan2求反正切值
color = np.arctan2(x, y) # 生成每个点的颜色大小
plt.scatter(x, y, s=size, c=color)
plt.colorbar() # 添加颜色栏
plt.savefig('./图片/带颜色的散点图.jpg')
plt.show()
# 显示所有列,同理:max_rows
pd.options.display.max_columns = None
plt.scatter(data.身高, data.体重, s=data.身高, c=data.身高)
plt.colorbar() # 添加颜色栏
plt.show()
玫瑰图
树状图
import matplotlib.pyplot as plt
import squarify
import pandas as pd
plt.rcParams['font.sans-serif'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False
数据 = pd.read_excel('./课件/29.树状图.xlsx')
自定义颜色 = ['r', 'y', 'b', 'g', 'yellow', 'cyan', 'coral']
图 = squarify.plot(sizes=数据.销售数量, # 指定数据
label=数据.名称, # 指定标签
color=自定义颜色, # 自定义颜色
alpha=0.6,
value=数据.销售数量, # 添加数据标签
edgecolor='white', # 设置边界框颜色为白色
linewidth=3, # 设置边框宽度
text_kwargs='fontsize': 16) # 设置字体大小
图.set_title("销售情况", fontdict='fontsize': 20)
plt.axis('off') # 去掉坐标轴
plt.tick_params(top='off', right='off') # 去掉刻度
plt.show()
以上只展示了部分代码及图片
学无止境,温故而知新
项目地址
learn_numpy_pandas_matplotlib
以上是关于Numpy+Pandas+Matplotlib学习的主要内容,如果未能解决你的问题,请参考以下文章
numpy & pandas & matplotlib 学习笔记
高端实战 Python数据分析与机器学习实战 Numpy/Pandas/Matplotlib等常用库