[任务2.3已更新,后续还将继续更新]Python-2018年"泰迪杯"数据分析职业技能大赛B题任务二-个人代码分享

用python完成泰迪杯B题的任务二

  • 前言
    • 1.问题重述
    • 2.问题分析
    • 3.问题的求解
    • 4.代码展示
    • 5.结果展示
    • 6.对代码的一些注释
  • 后语

前言

Hello,大家好我双来了(๑╹◡╹)ノ”!首先先祝大家元旦快乐()!这次给大家带来泰迪杯任务二的代码分享,那么废话不多说直接开始吧!

1.问题重述

题目源文件:https://pan.baidu.com/s/1HZvjMo9ct5nG5FYqzcta4Q

  • 任务 2.1 绘制 2017 年 6 月销量前 5 的商品销量柱状图。
  • 任务 2.2 绘制每台售货机每月总交易额折线图及交易额月环比增长率柱
    状图。
  • 任务 2.3 绘制每台售货机毛利润占总毛利润比例的饼图(假设饮料类毛
    利率为 25%,非饮料类为 20%)。
  • 任务 2.4 绘制 4 月每台售货机交易额与订单量气泡图,横轴为售货机编
    号,纵轴为月订单量。
  • 任务 2.5 绘制售货机 C 6、7、8 三个月订单量的热力图,横轴以天为单
    位,纵轴以小时为单位。从热力图可以分析得出哪些结论?

2.问题分析

  • 针对任务2.1,要重新对数据进行处理,得到一个只有六月份的销售记录再进行处理。
  • 针对任务2.2,直接使用前面任务1.3的数据,每月的数据都要乘上相对应的天数才能进行使用。
  • 针对任务2.3,需要将附件2中的大类和二级类添加到原来的销售记录形成新的销售记录进行处理才能计算,因此会有读取附件2的操作,然后就是利用自己写的一种饼状图函数来绘制出饼状图。

3.问题的求解

任务二会承接之前任务一的代码(详情可见Python-2018年"泰迪杯"数据分析职业技能大赛B题任务一-个人代码分享[代码已更新]),任务2.1要重新做数据处理;任务2.2可以直接调用task1的数据;任务2.3是对数据进行标签的结合形成新的数据,再利用新的数据进行分析。最后调用第三方库的matplotlib的子模块pyplot来进行可视化处理。

注意!这里的matplotlib.pyplot是第三方模块,原生的python编辑器上并没有安装该模块,需要自行pip安装,嫌麻烦的小伙伴可以用Anaconda运行,Anaconda一般都包含比较热门的第三方模块,其中就用有matplotlib.pyplot模块。

4.代码展示

# -*- coding=utf-8 -*-
#计算6月份销量前5的商品销量函数
def JuneHigherFive():
    JuneList = [DataList[index] for index,line in enumerate(TimeList) if line[1] == '6'];SaleNumDict = {}.fromkeys(NameList,0)
    for line in JuneList:
        SaleNumDict[line[4]] += 1
    return sorted(SaleNumDict.items(),key = lambda d:d[1],reverse = True)[0:5]



#各台销售机饮料和非饮料类商品的毛利润函数
def SaleClass(file):
    SaleClassDict = {'饮料':0,'非饮料':0}
    DataList = [line.rstrip(' \n').split(',')[0:-1] for line in open('result\\'+file,'r')]
    for line in DataList:
        for line1 in ClassList:
            if line[4] == line1[0]:
                line.append(line1[1])
                line.append(line1[2])
    SaleClassDict = {'饮料':0,'非饮料':0}
    for line in DataList:
        SaleClassDict[line[9]] += float(line[2])
    SaleClassDict['饮料'] = round(SaleClassDict['饮料']*0.25,3)
    SaleClassDict['非饮料'] = round(SaleClassDict['非饮料']*0.20,3)
    #print(SaleClassDict)
    return SaleClassDict



#柱状图函数
def Bar(x,y,title,xlabel,ylabel):
    plt.rcParams['font.sans-serif']=['simHei']#用simHei字体显示图像的中文标签
    plt.title(title)
    plt.xlabel(xlabel)
    plt.ylabel(ylabel)
    plt.bar(x,y)
    plt.show()
    


#折线图函数
def Plot(color_,label_,y,x=['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],title='五台售货机每月总交易额折线图',xlabel='月份',ylabel='交易额/元'):
    plt.rcParams['font.sans-serif']=['simHei']#用simHei字体显示图像的中文标签
    plt.title(title)
    plt.xlabel(xlabel)
    plt.ylabel(ylabel)
    plt.plot(x,y,color=color_,label=label_)
    #如果要得到单个售货机的图像,删除下面两条注释语句前面的'#'即可
    #plt.legend()
    #plt.show()



#饼状图函数
def Pie(x,labels,title):
    plt.rcParams['font.sans-serif']=['simHei']#用simHei字体显示图像的中文标签
    plt.title(title)
    plt.pie(x = x,
            labels = labels,
            autopct='%.4f%%'#保留拼图中数据的4位小数
            )
    plt.show()




#程序开始
import matplotlib.pyplot as plt



#数据预处理
DataList = [line.rstrip('\n').split(',') for line in open('附件1.csv','r')][1::]
TimeList = [line[5].replace('/',' ').split(' ') for line in DataList]
NameList = list(set([line[4] for line in DataList]))#去掉重复的名字再重新变成列表



#%任务2.1
JuneSaleFiveList = JuneHigherFive()
x = [i[0] for i in JuneSaleFiveList];y=[i[1] for i in JuneSaleFiveList]
while True:
    choice = input('是否要查看 2017 年 6 月销量前 5 的商品销量柱状图?0/1[否/是]')
    if choice == '1':
        Bar(x,y,'6月销量前5的商品销量柱状图','商品名','销量/条')#调用画柱状图函数
        break
    elif choice == '0':
        break
    else:
        print('输入错误,请重新输入!')



#%任务2.2
from task1 import AMonthList,BMonthList,CMonthList,DMonthList,EMonthList#调用前面task1所得到的数据
MonthList = [31,28,31,30,31,30,31,31,30,31,30,31]
AMonthSale = [round(i[0]*MonthList[index],2) for index,i in enumerate(AMonthList)]
BMonthSale = [round(i[0]*MonthList[index],2) for index,i in enumerate(BMonthList)]
CMonthSale = [round(i[0]*MonthList[index],2) for index,i in enumerate(CMonthList)]
DMonthSale = [round(i[0]*MonthList[index],2) for index,i in enumerate(DMonthList)]
EMonthSale = [round(i[0]*MonthList[index],2) for index,i in enumerate(EMonthList)]
AMonthNum = [int(round(i[1]*MonthList[index],0)) for index,i in enumerate(AMonthList)]
BMonthNum = [int(round(i[1]*MonthList[index],0)) for index,i in enumerate(BMonthList)]
CMonthNum = [int(round(i[1]*MonthList[index],0)) for index,i in enumerate(CMonthList)]
DMonthNum = [int(round(i[1]*MonthList[index],0)) for index,i in enumerate(DMonthList)]
EMonthNum = [int(round(i[1]*MonthList[index],0)) for index,i in enumerate(EMonthList)]
AMonthPrecent = [round((AMonthSale[i+1]-AMonthSale[i])/AMonthNum[i],6) for i in range(11)]
BMonthPrecent = [round((BMonthSale[i+1]-BMonthSale[i])/BMonthNum[i],6) for i in range(11)]
CMonthPrecent = [round((CMonthSale[i+1]-CMonthSale[i])/CMonthNum[i],6) for i in range(11)]
DMonthPrecent = [round((DMonthSale[i+1]-DMonthSale[i])/DMonthNum[i],6) for i in range(11)]
EMonthPrecent = [round((EMonthSale[i+1]-EMonthSale[i])/EMonthNum[i],6) for i in range(11)]

while True:
    choice = input('是否要查看每台售货机每月总交易额折线图及交易额月环比增长率柱状图?0/1[否/是]')
    if choice == '1':
        #五台售货机每月总交易额折线复合图
        Plot('red','A销售机',AMonthSale)
        Plot('blue','B销售机',BMonthSale)
        Plot('yellow','C销售机',CMonthSale)
        Plot('pink','D销售机',DMonthSale)
        Plot('black','E销售机',EMonthSale)
        plt.legend()
        plt.show()
        break

        #五台售货机交易额月环比增长率柱状图
        Bar(['2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],AMonthPrecent,'A销售机交易额月环比增长率柱状图','月份','增长率/*100%')
        Bar(['2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],BMonthPrecent,'B销售机交易额月环比增长率柱状图','月份','增长率/*100%')    
        Bar(['2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],CMonthPrecent,'C销售机交易额月环比增长率柱状图','月份','增长率/*100%')
        Bar(['2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],DMonthPrecent,'D销售机交易额月环比增长率柱状图','月份','增长率/*100%')
        Bar(['2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月'],EMonthPrecent,'E销售机交易额月环比增长率柱状图','月份','增长率/*100%')
    elif choice == '0':
        break
    else:
        print('输入错误,请重新输入!')



#%任务2.3
ClassList = [line.rstrip('\n').split(',') for line in open('program\\'+'附件2.csv','r')][1::]#将附件2的数据提取出来做成列表
#这一步是将附件2中的大类和二级类全部加在原本附件1每条销售记录的后面形成新的销售记录
for line in DataList:
    for line1 in ClassList:
        if line[4] == line1[0]:
            line.append(line1[1])
            line.append(line1[2])

AllSaleClassDict = {'饮料':0,'非饮料':0}#创建并初始化两个键的值字典
for line in DataList:
    AllSaleClassDict[line[9]] += float(line[2])
    AllSaleClassDict[line[9]] = round(AllSaleClassDict[line[9]],1)
AllSaleClassDict['饮料'] = round(AllSaleClassDict['饮料']*0.25,3)#按照题目要求进行的计算
AllSaleClassDict['非饮料'] = round(AllSaleClassDict['非饮料']*0.20,3)

#调用函数
ASaleClassDict = SaleClass('task1-1A.csv')
BSaleClassDict = SaleClass('task1-1B.csv')
CSaleClassDict = SaleClass('task1-1C.csv')
DSaleClassDict = SaleClass('task1-1D.csv')
ESaleClassDict = SaleClass('task1-1E.csv')

#饼状图的数据处理
DrinkList = [round(ASaleClassDict['饮料']/AllSaleClassDict['饮料'],4),round(BSaleClassDict['饮料']/AllSaleClassDict['饮料'],4),round(CSaleClassDict['饮料']/AllSaleClassDict['饮料'],4),round(DSaleClassDict['饮料']/AllSaleClassDict['饮料'],4),round(ESaleClassDict['饮料']/AllSaleClassDict['饮料'],4)]
NDrinkList = [round(ASaleClassDict['非饮料']/AllSaleClassDict['非饮料'],4),round(BSaleClassDict['非饮料']/AllSaleClassDict['非饮料'],4),round(CSaleClassDict['非饮料']/AllSaleClassDict['非饮料'],4),round(DSaleClassDict['非饮料']/AllSaleClassDict['非饮料'],4),round(ESaleClassDict['非饮料']/AllSaleClassDict['非饮料'],4)]

while True:
    choice = input('是否要查看每台售货机毛利润占总毛利润比例的饼图?0/1[否/是]')
    if choice == '1':
        Pie(DrinkList,['A销售机','B销售机','C销售机','D销售机','E销售机'],'每台售货机饮料毛利润占总毛利润比例的饼图')
        Pie(NDrinkList,['A销售机','B销售机','C销售机','D销售机','E销售机'],'每台售货机非饮料毛利润占总毛利润比例的饼图')
        break
    elif choice == '0':
        break
    else:
        print('输入错误,请重新输入!')


5.结果展示

  • 任务2.1
    [任务2.3已更新,后续还将继续更新]Python-2018年
  • 任务2.2
    [任务2.3已更新,后续还将继续更新]Python-2018年[任务2.3已更新,后续还将继续更新]Python-2018年
  • 任务2.3

[任务2.3已更新,后续还将继续更新]Python-2018年[任务2.3已更新,后续还将继续更新]Python-2018年

6.对代码的一些注释

为什么下面主程序开始的地方要加入这样一个文件操作?

因为泰迪杯B题的要求是将附件1和程序放进program文件夹里面,生成的结果文件放进同program等级的result文件夹,因此才需要这样一个文件目录的操作。

后语

因为还会持续更新,所以就不多废话了,后续的三个任务再慢慢做吧,快到期末考试了,大家加油!(⊙︿⊙) - 2020.1.2

关于任务2.3的代码,其实说实话我不太清楚是不是这样做,如果有错误的希望大家指出我的错误,同时这也是过年之后的第一次小更,喜欢的话点个赞/关注,这是对我的最大支持,抱歉祝福晚了,祝大家新年快乐,元宵节快乐!() - 2020.2.8

【Python-2018年"泰迪杯"数据分析职业技能大赛B题任务一-个人代码分享】

你可能感兴趣的:(python)