第五章:用Python分析商品退单数据并找出异常商品
本文可以学习到以下内容:
- 使用 pandas 中的 read_sql 读取 sqlite 中的数据
- 获取指定的日期的周一和周日
- 使用 groupby+agg 方法统计每周的商品总销量和总退单量
- 使用 value_counts 方法统计商品的退单数据
- 使用 merge 方法合并数据
项目背景
早上刚到公司,小凡就被叫去开晨会。
这么早,肯定有大事要发生。偌大的会议室,挤满了各个部门的人…
“最近公司的商品退单率很高,给公司造成了损失,各个部门汇报一下最近工作”,总经理端坐着,一边听各部门负责人的报告,一边记录着。
接下来就是长达2个小时的报告…
总经理给各个部门分配好任务,这次的任务直接影响年终奖的金额,要求各部门认真负责,积极配合,高效的解决这次危机。
散会后,经理给小凡安排工作。
“小凡,你把最近2个月的商品退单情况整理一下,下午我和业务部门开会要用”,经理安排好,就急匆匆的离开啦。
小凡了解到,退单率是由部分商品引起的,所以小凡需要根据最近2个月的数据,找出退单率高的异常商品。
接杯水后,小凡有了思路:
将2个月分为8周,在这8周内,统计每周的商品退单率排名
如果商品退单率排名超过5次排名靠前,那么就定义为异常商品
新的一天,从敲代码开始!
获取数据
import os
import pandas as pd
import numpy as np
from sqlalchemy import create_engine
from datetime import datetime,timedelta
# 数据库地址:数据库放在上一级目录下
db_path = os.path.join(os.path.dirname(os.getcwd()), "data.db")
engine_path = "sqlite:///" + db_path
# 创建数据库引擎
engine = create_engine(engine_path)
sql = """
select
*
from
shopRefuse
"""
df = pd.read_sql(sql, engine)
df2.sample(5)
shopid:商品id
create_time:商品订单创建时间
total_num:当天总销售商品数
td_num:当天销售商品退单数
数据计算
根据商品的创建时间获取当天对应的周一和周日,函数如下:
def get_monday_to_sunday(today, weekly=0):
"""
:function: 获取指定日期的周一和周日的日期
:param today: '2021-11-16'; 当前日期:today = datetime.now().strftime('%Y-%m-%d')
:param weekly: 获取指定日期的上几周或者下几周,weekly=0当前周,weekly=-1上一周,weekly=1下一周
:return: 返回指定日期的周一和周日日期
:return_type: tuple
"""
last = weekly * 7
today = datetime.strptime(str(today), "%Y-%m-%d")
monday = datetime.strftime(today - timedelta(today.weekday() - last), "%Y-%m-%d")
monday_ = datetime.strptime(monday, "%Y-%m-%d")
sunday = datetime.strftime(monday_ + timedelta(monday_.weekday() + 6), "%Y-%m-%d")
return "{0}|{1}".format(monday, sunday)
将数据重新拷贝一份,避免操作失误导致数据重跑
df2 = df.copy()
# 为新数据添加周维度数据
df2["week_range"] = df2["create_time"].map(lambda x:get_monday_to_sunday(str(x)[:10]))
df2.sample(5)
根据新增的周维度数据,统计每周商品的退单率:
td_rate_df = df2.groupby(by=["shopid","week_range"],as_index=False).agg({"total_num":"sum","td_num":"sum"})
td_rate_df["td_rate"] = td_rate_df["td_num"]/td_rate_df["total_num"]
td_rate_df.sample(1)
统计每周总体的退单率:
week_td_rate_df = df2.groupby(by="week_range",as_index=False).agg({"total_num":"sum","td_num":"sum"})
week_td_rate_df["week_td_rate"] = week_td_rate_df["td_num"]/week_td_rate_df["total_num"]
week_td_rate_df
统计次数
统计每周高于均值的商品的次数:
merge_df = pd.merge(
td_rate_df,week_td_rate_df[["week_range","week_td_rate"]],
on="week_range",
how="left"
)
merge_df["td_count"] = merge_df[["td_rate","week_td_rate"]].apply(lambda x:0 if x[0]<=x[1] else 1,axis=1)
result_df = merge_df.pivot_table(index="shopid",columns="week_range",values="td_count",margins=True,aggfunc=lambda x:x.sum())
异常商品
将超过5次退单率的商品定义为异常商品:
unnormal_shop_df = result_df[result_df["All"]>5]
unnormal_shop_df
小凡将数据保存为excel文件,方便后续的数据展示。
下午5点左右,小凡和经理一起参加业务部门的会议,小凡的分析思路得到了一致的认可。
源码地址
链接:https://pan.baidu.com/s/1XwA0EnvGh-tAb3UM31cXcA?pwd=ptmw
提取码:ptmw
第五章:用Python分析商品退单数据并找出异常商品的更多相关文章
- 第十五章、Python多线程之信号量和GIL
目录 第十五章.Python多线程之信号量和GIL 1. 信号量(Semaphore) 2. GIL 说明: 第十五章.Python多线程之信号量和GIL 1. 信号量(Semaphore) 信号量用 ...
- 第十五章、Python多线程同步锁,死锁和递归锁
目录 第十五章.Python多线程同步锁,死锁和递归锁 1. 引子: 2.同步锁 3.死锁 引子: 4.递归锁RLock 原理: 不多说,放代码 总结: 5. 大总结 第十五章.Python多线程同步 ...
- 第十五章、python中的进程操作-开启多进程
目录 第十五章.python中的进程操作-开启多进程 一.multprocess模块 二.multprocess.process模块 三.Process()对象方法介绍 四.Process()对象属性 ...
- 第十五章:Python の Web开发基础 (二) JavaScript与DOM
本課主題 JavaScript 介绍 DOM 介绍 JavaScript 介绍 JavaScript 是一门编程语言,它可以让网页动起来的,JavaScript 的变量有两种,一个是局部变量:一个是全 ...
- Vue框架H5商城类项目商品详情点击返回弹出推荐商品弹窗的实现方案
需求场景: 非推荐商品详情页返回的时候弹出弹窗推荐商品,点击弹窗按钮可以直接访问推荐商品: 只有直接进入商品详情页返回才会弹出推荐商品弹窗: 每个用户访问只能弹一次(除非清除缓存). 需求分析: 1. ...
- 第五章:Python基础の生成器、迭代器、序列化和虚拟环境的应用
本课主题 生成器介紹和操作实战 迭代器介紹和操作实战 序例化和反序例化 Json 和 Pickle 操作实战 字符串格式化的应用 创建虚拟环境实战 本周作业 生成器介紹和操作实战 什么是生成器,生成器 ...
- 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析
第三章 Android控件架构与自定义控件详解 1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWin ...
- 第五章:深入Python的dict和set
第五章:深入Python的dict和set 课程:Python3高级核心技术 5.1 dict的abc继承关系 class Mapping(Collection): __slots__ = () &q ...
- 【学习笔记】第五章 python3核心技术与实践--字典和集合
[第四章]思考题的答案,仅供参考: []比list()更快,因为调用了list函数有一定的时间,而[]却没有. 前面我们学习了 Python 中的列表和元组,了解了他们的基本操作和性能比较.这节章,我 ...
- Python第五章__模块介绍,常用内置模块
Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群 群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...
随机推荐
- 822. 走方格(acwing)
题目: 先讲变量 n:右下角的x值 m:右下角的y值 ans:答案(有几种可能) a数组:用来存储向下和向右的动作. x:所在的位置的x值 y:所在位置的y值 x1:下一步可以走到位置的x值 y1:下 ...
- Nginx12 openresty使用lua-resty-http模块
1 简介 https://github.com/ledgetech/lua-resty-http 在lua中操作http请求有两种方式 第一种方式:使用通过ngx.location.capture 去 ...
- MRS+LakeFormation:打造一站式湖仓,释放数据价值
摘要:华为LakeFormation是企业级的一站式湖仓构建服务. 本文分享自华为云社区<华为云MRS支持LakeFormation能力,打造一站式湖仓,释放数据价值]>,作者:break ...
- P22_条件渲染
条件渲染 wx:if 在小程序中,使用 wx:if="{{condition}}" 来判断是否需要渲染该代码块: 也可以用 wx:elif 和 wx:else 来添加 else 判 ...
- day11-JSON处理和HttpMessageConverter<T>
JOSN处理和HttpMessageConverter 1.JSON处理-@ResponseBody 说明:在实际开发中,我们往往需要服务器返回的数据都是 JSON 格式. SpringMVC 提供了 ...
- STM32F0_HAL初始化系列:FLASH写入
//读 read_temp = *(__IO uint32_t*)value_address; //写 static void flash_write(uint32_t address, uint32 ...
- Vue3中的响应式api
一.setup文件的认识 特点1:script 中间的内容就是一个对象 特点2:script 在第一层 定义的方法 或者 变量 => 就是这个对象 属性 => 顶层的绑定回被暴露给模板( ...
- 使用idea的maven项目使用mybatis时遇到的坑
在使用idea的maven项目中使用mybatis时遇到的一个问题,这个问题困扰了我一段时间,所以我来这里记录一下! 出现的问题是: 我把相同的代码复制到eclipse中,在eclipse中却能正常运 ...
- JZOJ 2020.07.16【NOIP提高组】模拟
总结 这套题相比昨天,简单了不止一点 然而有的人拿了 \(300\) 多 而我只有 \(198\) 预估应该有 \(268\) 的,假了 \(70\) 分 出现了很多奇怪的 \(mistakes\) ...
- 题解 P5072 【[Ynoi2015] 盼君勿忘】
在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘 ...