|
|
|
|
# -*- 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()
|
|
|
|
|
# 练习:不同年度各月订单数量对比
|