From 568c23f7dcc74224505e76a7eb342aeb23b5d0ef Mon Sep 17 00:00:00 2001 From: hnu202110040108 Date: Wed, 22 Jun 2022 14:16:01 +0800 Subject: [PATCH] ADD file via upload --- 数据分析2学生上课代码清单.py | 262 +++++++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 数据分析2学生上课代码清单.py diff --git a/数据分析2学生上课代码清单.py b/数据分析2学生上课代码清单.py new file mode 100644 index 0000000..072da3c --- /dev/null +++ b/数据分析2学生上课代码清单.py @@ -0,0 +1,262 @@ +# -*- 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() +# 练习:不同年度各月订单数量对比