• Numpy+Pandas+Matplotlib学习


    参考的教程是哔哩哔哩孙兴华UP主的视频,边学边做

    BV1ji4y157uB
    
    • 1

    代码及所用的数据已上传至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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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列:\n{c}')
    d = np.random.randn(3, 2, 4)
    print(f'3块,每块是2行4列:\n{d}')
    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))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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)  # 按第一行顺序排序
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    在这里插入图片描述
    饼图

    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到指定的角度。
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述
    散点图

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    在这里插入图片描述
    玫瑰图
    在这里插入图片描述
    树状图

    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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    以上只展示了部分代码及图片
    学无止境,温故而知新

    项目地址
    learn_numpy_pandas_matplotlib

  • 相关阅读:
    c++图解内存管理
    OpenMMLap之Hook机制详解
    国产低功耗MCU芯片:Si24R03
    86579-06-8,十七肽KAERADLIAYLKQATAK
    【Linux基础】2.1 关机、用户(组)、密码相关命令
    Hive-安装与配置(1)
    YOLOv5改进实战 | 更换主干网络Backbone(四)之轻量化模型MobileNetV3
    MySQL 定时备份的几种方式(非常全面)
    各类软件docker安装
    【蓝桥每日一题]-前缀和与差分(保姆级教程 篇1)
  • 原文地址:https://blog.csdn.net/weixin_46322367/article/details/126919206