本文可以学习到以下内容:

  1. 使用 pandas 中的 read_sql 读取 sqlite 中的数据
  2. 获取指定的日期的周一和周日
  3. 使用 groupby+agg 方法统计每周的商品总销量和总退单量
  4. 使用 value_counts 方法统计商品的退单数据
  5. 使用 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分析商品退单数据并找出异常商品的更多相关文章

  1. 第十五章、Python多线程之信号量和GIL

    目录 第十五章.Python多线程之信号量和GIL 1. 信号量(Semaphore) 2. GIL 说明: 第十五章.Python多线程之信号量和GIL 1. 信号量(Semaphore) 信号量用 ...

  2. 第十五章、Python多线程同步锁,死锁和递归锁

    目录 第十五章.Python多线程同步锁,死锁和递归锁 1. 引子: 2.同步锁 3.死锁 引子: 4.递归锁RLock 原理: 不多说,放代码 总结: 5. 大总结 第十五章.Python多线程同步 ...

  3. 第十五章、python中的进程操作-开启多进程

    目录 第十五章.python中的进程操作-开启多进程 一.multprocess模块 二.multprocess.process模块 三.Process()对象方法介绍 四.Process()对象属性 ...

  4. 第十五章:Python の Web开发基础 (二) JavaScript与DOM

    本課主題 JavaScript 介绍 DOM 介绍 JavaScript 介绍 JavaScript 是一门编程语言,它可以让网页动起来的,JavaScript 的变量有两种,一个是局部变量:一个是全 ...

  5. Vue框架H5商城类项目商品详情点击返回弹出推荐商品弹窗的实现方案

    需求场景: 非推荐商品详情页返回的时候弹出弹窗推荐商品,点击弹窗按钮可以直接访问推荐商品: 只有直接进入商品详情页返回才会弹出推荐商品弹窗: 每个用户访问只能弹一次(除非清除缓存). 需求分析: 1. ...

  6. 第五章:Python基础の生成器、迭代器、序列化和虚拟环境的应用

    本课主题 生成器介紹和操作实战 迭代器介紹和操作实战 序例化和反序例化 Json 和 Pickle 操作实战 字符串格式化的应用 创建虚拟环境实战 本周作业 生成器介紹和操作实战 什么是生成器,生成器 ...

  7. 《Android群英传》读书笔记 (2) 第三章 控件架构与自定义控件详解 + 第四章 ListView使用技巧 + 第五章 Scroll分析

    第三章 Android控件架构与自定义控件详解 1.Android控件架构下图是UI界面架构图,每个Activity都有一个Window对象,通常是由PhoneWindow类来实现的.PhoneWin ...

  8. 第五章:深入Python的dict和set

    第五章:深入Python的dict和set 课程:Python3高级核心技术 5.1 dict的abc继承关系 class Mapping(Collection): __slots__ = () &q ...

  9. 【学习笔记】第五章 python3核心技术与实践--字典和集合

    [第四章]思考题的答案,仅供参考: []比list()更快,因为调用了list函数有一定的时间,而[]却没有. 前面我们学习了 Python 中的列表和元组,了解了他们的基本操作和性能比较.这节章,我 ...

  10. Python第五章__模块介绍,常用内置模块

    Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群  群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...

随机推荐

  1. 笔记:C#Datatable 根据某字段数量 自动复制该行的数量

    /// <summary> /// 根据Datatable某字段数量自动复制该行查询 /// </summary> /// <param name="dt&qu ...

  2. 【已解决】rust 报错 no_std can't find crate for `test` || vscode 工作区多文件夹

    遇到下面的问题,请修改vscode的设置文件 如下 { "rust-analyzer.checkOnSave.allTargets": false, "rust-anal ...

  3. vscode 配置复盘

        第一句话,看文档!code.visualstudio.com/docs/editor- 从这里开始看,上下辐射看完debug看task,然后再看其他的诸如"智能感知"    ...

  4. WSL 2 内配置Fcitx自启动

    前言 我通过配置成fcitx进行服务进行,但其权限是root,在普通模式下无法使用 我用的是xserver ( moba xterm),我要在gtk mode 下启动fcitx,其实 不用这么写 操作 ...

  5. Web前端--HTML+Canvas+Js实现3D魔方小游戏

    一.案列效果 二.案例思路 1.先将平面上的6个DIV拼接在一起.形成一张类似于3d立方体图形展开的平面图. 2.我们需要将每一个面旋转到相应的位置上,每一个面的旋转轴都是不一样的.上下,左右,分别对 ...

  6. 我在京东做研发 | 从好玩到好用,爆火ChatGPT前沿分享

    | 嘉宾:吴友政,京东集团高级总监.京东科技语音语言算法部负责人. 2006年中科院自博士毕业后,先后在日本国立信息通信研究机构.英国爱丁堡大学.索尼中国研究院从事自然语言处理相关研究工作,主要聚焦自 ...

  7. Canvas:绘制曲线

    前言 画曲线要用到二次贝塞尔曲线或三次贝塞尔曲线.贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如 PhotoShop. 二次贝塞尔曲线 二次贝塞尔曲线在 ...

  8. PostgreSQL事务隔离级别

    一.概念 并发控制是多个事务在并发运行时,数据库保证事务一致性(Consistency)和隔离性(Isolation)的一种机制.PostgreSQL使用了多版本并发控制技术的一种变体:快照隔离San ...

  9. Landsat数据在USGS中无法下载Surface Reflectance产品的解决方法

      本文介绍在USGS官网下载Landsat遥感影像数据时,出现报错信息,无法下载地表反射率产品(Surface Reflectance)的解决办法.   最近,利用这篇文章批量下载Landsat遥感 ...

  10. IntelliJ IDEA 程序运行的控制台乱码

    参考:https://blog.csdn.net/zp357252539/article/details/124614007 上方导航栏"Run→Edit Configurations-&q ...