# -*- coding: utf-8 -*- """ Created on Sat May 8 10:42:49 2021 @author: hzh """ import matplotlib.pyplot as plt import pandas as pd from mydisplay import * plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体) plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题) # 折线图 x = [1, 2, 3, 4] y = [1.2, 2.5, 4.5, 7.3] '''第一个参数是序号,可为数字或字符串,用来区分不同画布;可用figsize参数指明画布大小。 fig1=plt.figure('fig1', figsize=(7,5)) 默认使用一个画布 如果要拥有多个画布,可用figure函数创建!''' fig1 = plt.figure('fig1', figsize=(7, 5)) # plt.plot(x, y) # plot函数作图 plt.plot(x, y, color="r", linestyle="--", marker="*", linewidth=1.0, label='虚线') plt.plot(x, x, color="b", linestyle="-.", marker="o", linewidth=1.3, label='点实线') plt.legend(loc='upper left') # 图例显示位置 plt.title('折线图') plt.ylabel('Y') plt.xlabel('X') plt.grid() # 网格 plt.savefig('line.png') # 保存 plt.show() # 看得到图形则不用这条语句 # 条形图1:bar() x = [0, 1, 2, 3] # 季度 y = [1000, 1500, 1300, 1800] # 销量 colors = ['red', 'green', 'cyan', 'blue'] plt.bar(x, y, width=0.8, color=colors, label='季度销售情况') plt.xticks(x, ['春', '夏', '秋', '冬']) # 水平条形图:barh() # plt.barh(x, y,height=0.8,color=colors) # 值标签 for i, j in zip(x, y): plt.text(i, j, j) plt.legend() plt.show() # 用bar函数绘制条形图2 # plt.bar(left,height,width,bottom) # Left为x轴坐标,height为条形高度,width为宽度(默认0.8),bottom为条形起始位置(ex4.py) import numpy as np import matplotlib matplotlib.rcParams['font.family'] = 'simHei' N = 5 y = [20, 10, 30, 25, 15] x = np.arange(N) # print(x) plt.bar(x, y, width=0.5, bottom=0, color='g', ) # plt.show() # 如何显示图例? for i, j in zip(x, y): plt.text(i, j, j) plt.legend() plt.show() # 用bar函数绘制条形图3 import matplotlib.pyplot as plt name_list = ['Monday', 'Tuesday', 'Friday', 'Sunday'] num_list = [1.5, 0.6, 7.8, 6] plt.bar(range(len(num_list)), num_list, color='rgb', tick_label=name_list) plt.show() # 添加图例与数据标签的条形图4 # 将全局的字体设置为黑体 matplotlib.rcParams['font.family'] = 'SimHei' N = 5 y = [20, 10, 30, 25, 15] x = np.arange(N) str1 = ("北京", "上海", "武汉", "深圳", "重庆") # 绘图 x x轴, height 高度, 默认:color="blue", width=0.8 p1 = plt.bar(x, height=y, width=0.5, label="城市指标", tick_label=str1) # 添加数据标签 for a, b in zip(x, y): plt.text(a, b, '%.0f' % b, ha='center', va='bottom', fontsize=10) # 添加图例 plt.legend() # 展示图形 plt.show() # 用pie函数绘制饼图1:pie() # plt.pie(data,explode) # Data为绘图数据;explode为图形显示的方式,为0表示该部分与整个图不分离,大于0表示该部分与整个图分离,分离距离与该数据大小有关。 labels = '优秀', '良好', '中等', '及格', '不及格' x = [8, 20, 35, 27, 10] y = [0, 0.2, 0, 0, 0.1] # explode,分离的距离 fig1 = plt.figure('fig1') plt.pie(x, y, labels, autopct='%1.2f%%') plt.show() # 饼图2:pie() labels = ['娱乐', '育儿', '饮食', '房贷', '交通', '其它'] sizes = [2, 5, 12, 70, 2, 9] explode = (0, 0, 0, 0.1, 0, 0) plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%') plt.title("8月份家庭支出") # 载入数据 df = pd.read_csv('sales_data_sample9.csv', encoding='gbk') print(df) # 查看数据的基本信息 df.info() # 查看数据整体情况 print(df.head(3)) # 前面n行 print(df.tail(3)) # 末尾n行 print(df.shape) # 数据集规模 print(df.dtypes) # 数据类型 # 数据预处理 df.count() df = df.dropna() # 默认丢弃任何含有NaN的行 df = df.dropna(how='all') # 只丢弃全为NaN的行 df = df.dropna(how='all', axis=1) # 只丢弃全为NaN的列 df = df.fillna(0) # 用0填充缺失数据 df['总分'].fillna(df['总分'].mean(), inplace=True) # 用列均值填充 # 练习:2003年金额最大的订单,最小单价对应的行索引号,金额最大的5张订单 df1 = df[df['年份'] == 2003] print(df1) df1['金额'].idxmax() df1['单价'].idxmin() df2 = df1.sort_values(by=['金额'], ascending=False) print(df2.head(5)) # 探索性分析 # 排序:按订单号、订单行号升序排序 print(df.sort_values(by=['订单号', '订单行号'], ascending=True)) # 分组统计:groupby(by=列名/列名列表) dfg = df.groupby(by='订单号')['金额'].sum() # 各订单销售总额 dfg1 = df.groupby(by=['年份', '订单号'])['金额'].sum() dfg2 = df.groupby(by='年份').size() # size跟count的区别: size计数时包含NaN值,而count不包含NaN值 dfg3 = df.订单号.nunique() # 订单号数量 print(dfg) # 练习:各个季度销售总额升序排序,各季度订单号数量 # 统计2004年各季度销售量: m = df[df['年份'] == 2004].groupby(by='季度')['金额'].sum() print(m) plt.bar(m.index, m.values) # 绘图 plt.xticks([1, 2, 3, 4]) # x轴刻度 plt.ylim(0, 2500000) # y轴取值范围 plt.xticks([1, 2, 3, 4], ['春', '夏', '秋', '冬']) for x, y in zip(m.index, m.values): # 值标签 plt.text(x, y, '%.2f' % y, ha='center', va='bottom') # 练习:不同年度销售总额对比 # 2004年不同季度销售额占比 m = df[df['年份'] == 2004].groupby(by=['季度'])['金额'].sum() explode = [0, 0, 0, 0.1] plt.pie(m, explode=explode, labels=['春', '夏', '秋', '冬'], autopct='%.2f%%') plt.legend() # 练习:2004年不同季度订单数量占比 # 不同年份各月销售总额对比 m = df[df['年份'] == 2003].groupby(by=['月份'])['金额'].sum() # 不同年份各月销售总额 n = df[df['年份'] == 2004].groupby(by=['月份'])['金额'].sum() plt.plot(m.index, m.values, label='2003') plt.plot(n.index, n.values, label='2004') plt.legend() plt.title('不同年份销售额曲线对比') plt.grid(True) plt.xticks(range(1, 13), ['%d月' % x for x in range(1, 13)]) plt.ticklabel_format(style='plain', axis='y') # 练习:不同年度各月订单数量对比 # 散点图 x = [0.1, 0.2, 0.4, 0.5, 0.7, 0.8, 0.89, 0.91, 0.92, 0.93, 0.94] y = [0.6, 0.65, 0.7, 0.8, 0.86, 0.9, 0.93, 0.96, 0.98, 0.99, 1.0] plt.scatter(x, y) # plt.plot(x,y) plt.title('scatter') plt.xlabel('X') plt.ylabel('Y') plt.show() df = pd.read_csv('sales_data_sample9.csv', encoding='gbk') myprint(df.info(), 'df.info()') # 查看数据整体情况 myprint(df.head(3), 'df.head(3)') # 前面n行 myprint(df.tail(3), 'df.tail(3)') # 末尾n行 myprint(df.shape, 'df.shape') # 数据集规模 myprint(df.dtypes, 'df.dtypes') # 数据类型 df.count() df = df.dropna() # 默认丢弃任何含有NaN的行 df = df.dropna(how='all') # 只丢弃全为NaN的行 df = df.dropna(how='all', axis=1) # 只丢弃全为NaN的列 df = df.fillna(0) # 用0填充缺失数据 myprint(df) df['金额'].fillna(df['金额'].mean(), inplace=True) # 用列均值填充 # 基本统计方法 # • sum() 求和 # • max() 最大值 idxmax() 最大值对应索引号 # • min() 最小值 idxmin() 最小值对应索引号 # • var() 方差 std() 标准差 # • median() 中位数 mean() 均值 # • nlargest(n,列名)该列最大的n个值 # • nsmallest(n,列名)该列最小的n个值 # • describe():计算各列的频率、均值、标准差、级值、四分位数 # • 练习:2003年金额最大的订单,最小单价对应的行索引号,金额最 # 大的5张订单 print(df.sort_values(by=['订单号', '订单行号'], ascending=True)) dfg1 = df.groupby(by='订单号')['金额'].sum() # 各订单销售总额 dfg2 = df.groupby(by=['年份', '订单号'])['金额'].sum() dfg3 = df.groupby(by='年份').size() # size跟count的区别: size计数时包含NaN值,而count不包含NaN值 dfg4 = df.订单号.nunique() # 订单号数量 m = df[df['年份'] == 2004].groupby(by='季度')['金额'].sum() plt.bar(m.index, m.values) # 绘图 plt.xticks([1, 2, 3, 4]) # x轴刻度 plt.ylim(0, 2500000) # y轴取值范围 plt.xticks([1, 2, 3, 4], ['春', '夏', '秋', '冬']) for x, y in zip(m.index, m.values): # 值标签 plt.text(x, y, '%.2f' % y, ha='center', va='bottom') plt.show() # 练习:不同年度销售总额对比 # 2004年不同季度销售额占比 m = df[df['年份'] == 2004].groupby(by=['季度'])['金额'].sum() explode = [0, 0, 0, 0.1] plt.pie(m, explode=explode, labels=['春', '夏', '秋', '冬'], autopct='%.2f%%') plt.legend() plt.show() # 练习:2004年不同季度订单数量占比 # 不同年份各月销售总额对比 m = df[df['年份'] == 2003].groupby(by=['月份'])['金额'].sum() # 不同年份各月销售总额 n = df[df['年份'] == 2004].groupby(by=['月份'])['金额'].sum() k = df[df['年份'] == 2005].groupby(by=['月份'])['金额'].sum() plt.plot(m.index, m.values, label='2003') plt.plot(n.index, n.values, label='2004') plt.plot(k.index, n.values, label='2005') plt.legend() plt.title('不同年份销售额曲线对比') plt.grid(True) plt.xticks(range(1, 13), ['%d月' % x for x in range(1, 13)]) plt.ticklabel_format(style='plain', axis='y') plt.show() # 练习:不同年度各月订单数量对比