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

前言

Hello,大家好我又来了(๑╹◡╹)ノ”!本人开学三个月只学到python的皮毛(ಥ﹏ಥ),难免在语法或者使用方面有点繁琐,哪里不够好可以指出一起学习(* ̄︶ ̄),这次给大家分享的是一个月前匆匆做出来的代码,那么废话不多说我们直接进入正题吧ヾ(◍°∇°◍)ノ゙

1.问题重述

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

任务 1 数据 处理与分析

  • 任务 1.1 根据附件 1 中的数据,提取每台售货机对应的销售数据,保存
    在 CSV 文件中,文件名分别为“task1-1A.csv”、“task1-1B.csv”、…、task1-1E.csv”。
  • 任务 1.2 计算每台售货机 2017 年 4 月份的交易额、订单量及所有售货机
    交易总额和订单总量,以表格形式体现在报告中。
  • 任务 1.3 计算每台售货机每个月的每单平均交易额与日均订单量,以表
    格形式体现在报告中。

2.问题分析

附件 1 是70681行(包括表头)销售记录的csv文件,下图是该文件的前10行数据:
在这里插入图片描述
给出的这个附件是没有异常数据的,因此就大胆进行处理。每一条销售记录一共有9个标签,那么将每一条销售记录做成9个元素的列表,然后将这列表装进一个空的列表里形成二维列表,这样就是对数据的初步处理,3个小任务的求解见下面。

3.问题的求解

  • 针对任务1.1,我们将初步处理之后的数据列表里面的地点元素给提取出来进行比较,如果是A,那么就把整一条销售记录装进task1-1A.csv文件里面,以此类推一直到 task1-1E.csv
  • 针对任务1.2,是将4月五台销售机的销售记录进行统计,那么就利用任务1.1分出来的五台销售机销售记录文件,提取出各个销售机销售记录列表里面的支付时间进行筛选。这里的时间是2017/X/X X:XX这种格式,因此提取出来之后需要以 ‘/’ 为分隔符将年月日分开另外形成一个时间列表再提取出月份数字。这里的时间列表对应的销售记录序号是一致的,因此这里只需要使用python的列表下标即可提取出初步处理数据列表的4月份销售记录,就可以得到五台销售机各自的交易额和订单量,总交易额和总订单量就是对这五台销售机的交易额和订单量的求和。最终的结果将体现在生成的ASale,BSale等的变量中。
  • 针对任务1.3,与处理任务1.2的方法类似,也是提取出支付时间进行筛选,只不过这里使用了一个简单的12次循环,将月份这个数字累加上去,每台销售机都进行12次处理,一共120项数据写成5x12的AMonthList,BMonthList等二维列表中,其中每一个元素列表中第一个元素是日均销售额,第二个是日均订单量。

4.代码展示

# -*- coding=utf-8 -*-
#任务1.1函数
def task1Sys1(file,level):
    DataList = [line.rstrip('\n').split(',') for line in open('program\\附件1.csv','r')][1::]
    with open('result\\'+file,'w+') as f:
        SaleList = [line for line in DataList if line[6] == level]
        for line in SaleList:
            for i in line:
                f.write(i+',')
            f.write('\n')


#任务1.2函数
def task1Sys2(file):
    SaleList = [line.rstrip('\n').split(',') for line in open('result\\'+file,'r')]
    TimeList = [line[5].replace('/',' ').split(' ') for line in SaleList]
    SiyueSale = [round(float(SaleList[index][3]),1) for index,line in enumerate(TimeList) if line[1] == '4']
    return round(sum(SiyueSale),1),len(SiyueSale)


#任务1.3函数
def task1Sys3(file):
    Month = [31,28,31,30,31,30,31,31,30,31,30,31]
    SaleList = [line.rstrip('\n').split(',') for line in open('result\\'+file,'r')]
    TimeList = [line[5].replace('/',' ').split(' ') for line in SaleList]
    SaleMonthList = []
    a = 0
    while a < 12:
        a += 1
        MonthMoney = [round(float(SaleList[index][3]),1) for index,line in enumerate(TimeList) if int(line[1]) == a]
        SaleMonthList.append([round(sum(MonthMoney)/len(MonthMoney),4),round(len(MonthMoney)/Month[a-1] ,4)])          
    return SaleMonthList


#程序开始
import os
os.chdir(os.path.dirname(os.getcwd()))
if not os.path.exists('result'):
    os.mkdir('result')

#仅仅调用函数实现简化操作
task1Sys1('task1-1A.csv','A')
task1Sys1('task1-1B.csv','B')
task1Sys1('task1-1C.csv','C')    
task1Sys1('task1-1D.csv','D')
task1Sys1('task1-1E.csv','E')

#这一块的数据处理用函数进行封装,详情可见上面的函数
ASale,ANum = task1Sys2('task1-1A.csv')
BSale,BNum = task1Sys2('task1-1B.csv')
CSale,CNum = task1Sys2('task1-1C.csv')
DSale,DNum = task1Sys2('task1-1D.csv')
ESale,ENum = task1Sys2('task1-1E.csv')
SumSale,SumNum = ASale+BSale+CSale+DSale+ESale,ANum+BNum+CNum+DNum+ENum


AMonthList = task1Sys3('task1-1A.csv')
BMonthList = task1Sys3('task1-1B.csv')
CMonthList = task1Sys3('task1-1C.csv')
DMonthList = task1Sys3('task1-1D.csv')
EMonthList = task1Sys3('task1-1E.csv')
#程序结束

5.结果展示

  • 任务1.1
    在这里插入图片描述

  • 任务1.2
    在这里插入图片描述

  • 任务1.3
    在这里插入图片描述

6.对代码的一些注释

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

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

后语

正所谓前言后语嘛,那就让我再屁话一下(´-ω-`)。附件1以及原题在上文的问题重述,后续我还会分享B题任务二任务三的代码,可以点个关注(没错我就是来骗关注的),走过路过别忘记点赞,这是你对我的最大支持(〃‘▽’〃),有不同的见解也请大方在下面留言!谢谢大家!!!

  • 26
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值