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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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