Project 2: Automated Data Processing 自动化数据处理

引言

当今社会,大部分的工作是通过电脑完成的。

电脑可以很高效地帮助我们完成一些任务,尤其是有规律可循的、需要大量重复操作的劳动。

这个项目,我们以表格数据处理和自动上报为例,让各位接触操作流程自动化的基本思维。

注意:对于表格处理,使用 Pandas 库会相当方便。但是,我们希望让大家更多地练习和巩固 Python基础语法,所以请尽量先用基础的 Python 实现。完成项目后,如果有余力,可以再去尝试使用 Pandas 实现。

场景介绍

小明是零下五度市场部门的人员,主要负责售后,包括销售数据数据汇总和客户维系。由于销售量大且市场情况瞬息万变,他需要时刻紧盯微店后台的销售数据。

除了与用户进行访谈、根据销售数据撰写汇报等工作外,他还有一个任务:在工作时间,每隔两个小时(整点),需要从微店后台下载一份最新的销售数据表格,经过分析后,向他的上级和库存管理员发送邮件,并向指定用户发送回访问卷。

为此,小明制作了一份 Excel 表格,通过函数和公式把符合要求的用户过滤出来,然后打开特定网页,将手机号以及邮箱粘贴到制定地方,然后提交。虽然比起手动操作已经快了不少,但是仍然有很多问题:
- 他每天花费的时间仍然不少;
- 这个工作总是打断他的思路;
- 他经常忘记做这件事;
- 他极有可能误操作,比如下载错文件,少复制了一行等。

小明向上级反馈了他的困难。市场部门主管听闻后,找到了你。他之前听说你会 Python,觉得你一定可以帮他解决问题。现在正是你大显身手的时候。

准备工作

请先下载初始代码。
下载链接

这份代码里有一份名为 sales.csv 的表格。这是根据零下五度去年微店销售数据制作出来的一份表单(为了保护真实买家的隐私,我们使用了模拟的数据)。

你可以先从处理这份文件开始。在最后,你需要用 Python 自动定时下载最新数据(都和这份表格差不多),并且自动完成所有的分析和反馈。

完成这个项目后,小明每天就只需要运行一下程序,然后双手离开键盘,让电脑做所有剩下的工作了。

那我们现在就开始!

Section 1:数据的读取

这个部分不需要手写。我们需要大家阅读并理解 Section 1 的所有代码,然后尝试运行。如果无法运行,请寻求帮助。

另外,请浏览一下表头,大致理解一下数据的每一列大概的意思。

Section 2:数据统计

这个部分,我们会对表中的数据进行一些简单的统计。

首先,我们要实现 calculateRevenue 这个函数。
我们需要分别计算各个单品的销售额。它需要返回一个字典(Dictionary)索引(key)商品编码内容(value)总销售额。用我们初始代码提供的(不是自动下载的) sales.csv 文件,运行结果如下。

{'2110': 886574, '2102': 693680, '2101': 383145}


然后,我们要实现 calculateStockReduction 这个函数。
我们售卖的是礼包,每种礼包对应指定品种和数量的海鲜,我们需要计算每种海鲜的消耗量,这样库存管理人员可以有所准备。 每种礼包对应的鱼和数量已经在函数中定义好(giftContent 变量)。你需要返回一个 {品种: 数量} 组成的字典,结果应该是:

{'舟山带鱼': 600, '野生小黄鱼': 194, '野生竹节虾': 600, '舟山米鱼': 392, '红果鲤': 196, '舟山乌贼': 392, '舟山黄鱼': 406}


Section 3:数据提取

这个部分中,我们需要把处在江浙沪地区,而且下单时间与收货时间差别在 3 天以上的用户提取出来。这些用户可能等待了比较长的时间,我们可能需要额外关注,以免造成客户流失。

我们需要实现 getSlowedDelivery 函数,需要返回一个字典,包含所有的订单编号,以及对应的用户姓名+空格+手机(注意,都是字符串),结果应该是:

{'81417556230447': '周桂芝 15708740139', '81417556230776': '彭磊 13944167948', '81417556231556': '陈林 15108016839', '81417556230909': '李杰 13777697578', '81417556232786': '赵浩 15627748610', '81417556231346': '胡华 15333751374', '81417556232766': '陈坤 13364097050', '81417556231432': '汤建平 13270650569', '81417556230174': '向梅 15108373401', '81417556232685': '田瑞 15936746224'}


Section 4:发送电子邮件

我们需要把前三个 section 的输出美化一下(组成一个字符串),通过邮件发送给小明的上级。

我们会使用 PythonMIMEText 库来处理邮件,用 smtplib 库来发送邮件。

作为例子,我们需要各位使用自己的 QQ 邮箱,发送邮件到自己的学校邮箱。

由于我们在使用 QQ 邮箱的邮件服务器,我们需要拿到 QQ 邮箱的授权码。具体操作如下:
1. 登录网页版 QQ 邮箱 2. 点击最上方的 设置 3. 点击邮箱设置下的 账户 标签 4. 下拉到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 标签 5. 点击 POP3/SMTP服务 后面的 开启 6. 把出现的授权码复制给代码中的 code 变量。

完成这个 Section 之后,记得把 main 函数里的 sendEmails() 函数调用这一行从注释里拿出来,并且确认自己确实收到了邮件。

Section 5: 定时自动下载和处理

现在,每次运行程序,Python 都会自动帮我们处理文件并且发送邮件了。

但是,我们仍然需要定时手动去后台下载对应文件,这很麻烦。要真正做到双手离开键盘,我们还差最后一步。

我们会使用 sleep 函数,让程序在后台休眠指定时间,配合一个 while True 循环,我们就可以达到定时执行的效果。
为了测试,请把 sleep 的时间设置成 30(秒)。

我们还要使用 Python 的第三方 requests 库,来从指定网址下载文件到本地。
你需要在命令行输入 pip install requests,然后等待它安装完成。
对于安装第三方库的详细解释,我们之后会讲到。

下载文件的后台地址是 https://icewould.com/m5-101/sales-data