You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
toratoratora/数据分析2学生上课代码清单.py

263 lines
9.3 KiB

# -*- 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() # 看得到图形则不用这条语句
# 条形图1bar()
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.8bottom为条形起始位置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()
# 饼图2pie()
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() 均值
# • nlargestn,列名该列最大的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()
# 练习:不同年度各月订单数量对比