本人是在一家零售行业工作,所出的教程,都是我日常工作中遇到的 复杂而大量重复的工作 我用python代替去完成它,都是原创内容,非粘贴复制,如果我的文章能够帮助到大家,希望帮忙点个关注。当然,如果有很多错别字,也请见谅。
问题来了:
领导总是叫我每天导出来分析,但是我们公司分析数据总是要到 大区和小区,因为我们大区和小区都有负责人,KPI考核要对应负责人,通过数据去体现问题。这一次领导叫我把线上的门店自提订单数据导出来做数据分析。
题外话:因为公司对接到第三方ERP系统都是以门店为主去对接的,因为我们钱给的少,所以第三方数据不支持定制化数据分析。只能靠我们手工用excel 去做表。但是如果只是做一次,还勉强用excel 能做好。如果是天天都需要数据跟进,那天天都需要做数据赛选和匹配。虽然excel 可以做到输入好公式,把数据源复制粘贴进去,可以自动计算。但是excel 公式多,会非常的吃电脑性能,而且出现无响应等。所以这个时候我们需要利用代码去完成这个,我们叫的高大上的名字 办公自动化
先给大家看下从ERP导出来的数据源是什么样子:
订单状态 | 订单金额(实付) | 下单时间 | 提货门店 | 销售门店(code) | 客服备注 | 商品金额总计 |
订单支付已过期 | 0.10 | 2019-09-17 10:45:56 | 多多一上总部 | A9999 | 0.10 | |
订单支付已过期 | 0.10 | 2019-09-17 17:33:07 | 江南摩尔店 | A9999 | 0.10 | |
订单支付已过期 | 0.10 | 2019-09-17 17:33:59 | 多多一上总部 | A9999 | 0.10 | |
订单支付已过期 | 0.10 | 2019-09-17 17:35:04 | 江南摩尔店 | A9999 | 0.10 | |
订单支付已过期 | 0.10 | 2019-09-18 08:24:09 | 江南摩尔店 | A9999 | 0.10 | |
订单支付已过期 | 0.10 | 2019-09-18 08:28:07 | 江南摩尔店 | A9999 | 0.10 | |
订单支付已过期 | 0.10 | 2019-09-18 08:29:25 | 嘉兴平湖店 | A9999 | 0.10 | |
订单支付已过期 | 0.10 | 2019-09-18 08:53:05 | 江南摩尔店 | A9999 | 0.10 | |
订单支付已过期 | 0.10 | 2019-09-18 09:51:24 | 多多一上总部 | A9999 | 0.10 | |
订单支付已过期 | 0.10 | 2019-09-18 09:56:04 | 多多一上总部 | A9999 | 0.10 | |
订单支付已过期 | 0.10 | 2019-09-18 10:17:22 | 多多一上总部 | A9999 | 0.10 | |
订单取消 | 0.01 | 2019-09-18 10:55:52 | 江南摩尔店 | A9999 | 0.01 | |
待备货 | 29.00 | 2019-09-23 19:36:06 | 兰溪星辰店 | A0012 | 29.00 | |
待备货 | 29.00 | 2019-09-23 19:38:32 | 巫山祥云店 | B0203 | 29.00 | |
订单支付已过期 | 19.00 | 2019-09-23 19:38:51 | 全椒新华路 | A0466 | 19.00 | |
订单取消 | 29.00 | 2019-09-23 19:49:06 | 宣恩解放街 | A0465 | 29.00 | |
订单支付已过期 | 29.00 | 2019-09-23 19:49:12 | 临沂兰山店 | A0265 | 29.00 | |
待备货 | 29.00 | 2019-09-23 19:49:34 | 枣庄薛城财富步行街 | A0295 | 29.00 | |
待备货 | 67.00 | 2019-09-23 19:50:12 | 三水湾店 | A0105 | 67.00 | |
待备货 | 67.00 | 2019-09-23 19:50:12 | 三水湾店 | A0105 | 67.00 | |
待备货 | 67.00 | 2019-09-23 19:50:12 | 三水湾店 | A0105 | 67.00 |
在数据合并前需要准备一个带有大区,小区 ,门店 的表去根据 “提货门店” 和 下方 的 “门店” 合并 如下表:我看到数据后先做的是 python 的 merge 数据合并,这里合并就是excel 函数的vlookup 是一样的基本功能,如果要区别的,我觉得merge 还是要强大。
大区 | 小区 | 门店 |
南方大区 | 温州大区 | 温州楠江店 |
南方大区 | 温州大区 | 温州新桥店 |
南方大区 | 温州大区 | 温州状元店 |
南方大区 | 温州大区 | 温州浦西店 |
南方大区 | 温州大区 | 温州北白象新店 |
南方大区 | 温州大区 | 路桥金清店 |
南方大区 | 温州大区 | 温岭松门店 |
南方大区 | 温州大区 | 温州蟠凤商业街 |
南方大区 | 温州大区 | 区域合计 |
北方大区 | 江苏一区 | 淮安幸福店 |
北方大区 | 江苏一区 | 漕运广场店 |
北方大区 | 江苏一区 | 东长街店 |
北方大区 | 江苏一区 | 淮安盱眙店 |
北方大区 | 江苏一区 | 阜宁阜师路 |
北方大区 | 江苏一区 | 淮安汇通店 |
北方大区 | 江苏一区 | 东大街店 |
北方大区 | 江苏一区 | 少年宫店 |
代码如下:
#encoding:utf-8
import pandas as pd #导入pandas包
rd_excel1 = pd.read_excel(r"D:\111\Book1.xlsx") #读取具有大区,小区,门店的表
rd_excel2 = pd.read_excel(r"D:\111\12049_2019092810070530368495.xls") #读取数据源表
merge_excel = pd.merge(rd_excel1,rd_excel2,left_on='门店',right_on='提货门店') # 进行指定相同值的合并
merge_excel.to_excel(r"D:\111\merge.xlsx") #保存为merge.xlsx
合并后效果如下:
事情还没完,这个只是在数据源中匹配合并好了提货门店所属的大区和小区
下面我们据需要根据上面的数据源 进行 对数据的分类汇总 和 计数 以及修改列名。
第一步,修改列名:
为了生成的数据更好理解 所以需要修改列名 。把数据源列名的 订单状态 修改为 订单数量,购买数量 修改为 购买件数
代码如下:
rd_merge = pd.read_excel(r"D:\111\merge.xlsx") #读取刚刚合并好的excel
changer =rd_merge.rename(columns={'订单状态':'订单数量','购买数量':'购买件数'}) #修改列名
第二步,赛选出不要的数值,这里是在excel 中 订单状态 那列除了“已自提”,“待备货”,“待自提” 且 商品总金额 大于0。
这里主要去除掉不要的数据,方便在生成的时候,不占用太多资源。
代码如下:
df = pd.DataFrame(changer) #讲上面改变列名的表格转成 DF
title = ['已自提','待备货','待自提'] #定义一个列表,就是需要选中的列的值
sel_excel = df[(df['订单数量'].isin(title)) & (df["商品金额总计"]>1)] #进行赛选
第三步,按条件进行分类汇总(按条件进行求和),进行按条件进行计数。
这里主要根据自己工作业务逻辑去做求和 和 计数 等计算方式
代码如下:
province = sel_excel.groupby(['大区']).agg({'订单数量':'count','商品金额总计':'sum','购买件数':'sum'})
to_city = sel_excel.groupby(['小区']).agg({'订单数量':'count','商品金额总计':'sum','购买件数':'sum'})
shop = sel_excel.groupby(['门店']).agg({'订单数量':'count','商品金额总计':'sum','购买件数':'sum'})
上述代码解释,以一行代码为例解释,
province = sel_excel.groupby(['大区']).agg({'订单数量':'count','商品金额总计':'sum','购买件数':'sum'})
按照上面“进行赛选” 后得出的数据进行 分组统计,也就是 groupby函数,然后集合agg函数,网上说agg 功能主要是提供基于列的聚合操作。在 groupby()中的值 就是要计算的条件。而后面的出 在订单数量【前名字为订单状态】为计数,商品金额总计为求和,购买件数 为 求和 都是计算方式。
第四步,新建表格,将上面 大区,小区,门店,写入到excel 不同sheet中。
代码如下:
writer = pd.ExcelWriter(r"D:\111\m2.xlsx") #新建 m2.xlsx 表
sheet1 = pd.DataFrame(province) #进行转成DF格式
sheet2 = pd.DataFrame(to_city) #进行转成DF格式
sheet3 = pd.DataFrame(shop) #进行转成DF格式
sheet1.to_excel(writer,sheet_name='大区') #写入到m2.xlsx 的名叫 大区的sheet中
sheet2.to_excel(writer,sheet_name='小区') #写入到m2.xlsx 的名叫 小区的sheet中
sheet3.to_excel(writer,sheet_name='门店') #写入到m2.xlsx 的名叫 门店的sheet中
writer.save() #保存
writer.close() #关闭excel
最后代码执行后效果如下:
下方是sheet的截图
下方是门店sheet中的数据:
门店 | 订单数量 | 商品金额总计 | 购买件数 |
万州五桥上海大道 | 3 | 87 | 3 |
万州新城一店 | 4 | 96 | 4 |
万州新城二店 | 2 | 116 | 2 |
三台老西街 | 2 | 58 | 2 |
三水湾店 | 5 | 249 | 5 |
上虞青春店 | 4 | 192 | 4 |
东大街店 | 3 | 77 | 3 |
东长街店 | 10 | 431 | 11 |
中江上南街店 | 2 | 38 | 2 |
临沂义堂店 | 3 | 145 | 3 |
下方是小区sheet中的数据:
小区 | 订单数量 | 商品金额总计 | 购买件数 |
安徽一区 | 18 | 508 | 18 |
安徽二区 | 19 | 669 | 19 |
安徽四区 | 28 | 866 | 28 |
山东一区 | 54 | 2125 | 56 |
山东二区 | 40 | 1870 | 46 |
江苏一区 | 55 | 1918 | 56 |
江苏三区 | 29 | 1215 | 32 |
浙北大区 | 24 | 969 | 25 |
浙西一区 | 6 | 182 | 6 |
浙西二区 | 10 | 448 | 10 |
温州大区 | 17 | 939 | 17 |
下方是大区sheet中的数据:
大区 | 订单数量 | 商品金额总计 | 购买件数 |
北方大区 | 243 | 9171 | 255 |
南方大区 | 57 | 2538 | 58 |
成都大区 | 399 | 15550 | 411 |
湖南大区 | 112 | 3848 | 116 |
贵州大区 | 104 | 7487 | 115 |
重庆大区 | 124 | 4419 | 126 |
分享就到这里了,可能文字描述逻辑有些不对,还请原谅。
别忘记,如果对你带来启发和灵感,给我点个关注呗。