Python计算商品复购率

2023-11-09

1. Python计算产品复购率

需求:

给出数据商品购买数据,数据格式.csv,包含:购买月份、手机号,根据该数据计算产品的复购率。

复购率算法:

  1. 算法一:单位时间内(按每月):R = 复购人数/总购买人数
  2. 算法二:单位时间内(按每月):R = 复购交易次数/总交易次数

部分数据样式如下:
在这里插入图片描述

2.参考代码

# coding = utf-8
import pandas as pd
import time


class RepurchaseRate(object):
    """1.普通配置电脑百万条数据运行时间在20min左右;
       2.此版本版本包含 2 种计算方法;
    """

    def cal_repurchase_rate(self, method):
        """复购率计算"""
        if method == 1:
            # 算法一:单位时间内(按每月):R = 复购人数/总购买人数
            total_transactions_dict, data_dict = self.data_processing(1)
        elif method == 2:
            # 算法二:单位时间内:R = 复购交易次数/总交易次数
            total_transactions_dict, data_dict = self.data_processing(2)
        # 复购交易总数表:字典
        repurchase_transactions_dict = {}
        # 对应月份表
        month_list = []
        # 对每月总交易数进行遍历并进行比较,得出每月复购交易数
        for month1 in data_dict.keys():
            repurchase_transactions_list = []  # 每月复购交易数列表
            # 计算每个月在所有月份的复购交易数
            for month2 in data_dict.keys():
                month_list.append(month2)
                # 判断month2对month1是否为后一个月,如果是,则进入复购数计算
                if month2 > month1:
                    i = 0
                    # 对month1来说,计算month2里有多少交易复购的
                    for num in data_dict[month2]:
                        # 该交易数据(手机号)在month1中出现,则认为是复购的,计数器+1
                        if num in data_dict[month1]:
                            i += 1
                    # 将month2中复购数据添加到复购交易列表
                    repurchase_transactions_list.append(i)
                # 如果month2对month1是前一个月,则复购数计为 0,并添加到复购交易列表进行占位,方便后续计算
                else:
                    repurchase_transactions_list.append(0)
            # 将对应月份列表加入到复购交易数据中,方便后续计算或查看
            repurchase_transactions_dict['month'] = month_list
            # 将每月复购交易数列表加入到复购交易数总表中
            repurchase_transactions_dict[month1] = repurchase_transactions_list

        # 计算复购率:R
        repurchase_rate_dict = {}  # 复购率总表
        month_list = []  # 对应月份
        # 对每月总交易数进行遍历
        for key1, value1 in total_transactions_dict.items():
            month_list.append(key1)
            repurchase_rate_list = []  # 每月复购率列表
            # 对每月复购交易数进行遍历
            for key2, value2 in repurchase_transactions_dict.items():
                if key1 == key2:
                    for num in value2:
                        # 计算每月复购率,格式化输出,按百分比保存,保留小数点后2位
                        repurchase_rate = format(num/value1, '.2%')
                        repurchase_rate_list.append(repurchase_rate)
            # 加入相对应的月份列表,方便后续计算或查看
            repurchase_rate_dict['month'] = month_list
            # 将每月复购率加入到复购率总表
            repurchase_rate_dict[key1] = repurchase_rate_list
        return repurchase_rate_dict

    def data_processing(self, x):
        """数据处理:删除缺失值、对数据进行去重、按月对数据进行分组等"""
        # 读取文件
        raw_data = pd.read_csv('./repurchase_data')
        # 判断缺失值是否存在,存在就删除该条(行)数据
        i = 0
        while i < raw_data.shape[0]:
            if pd.isnull(raw_data['收货手机'][i]):
                # 根据行索引来删除该条数据,axis=0 代表行
                raw_data = raw_data.drop(i, axis=0)
            i += 1

        # 通过对订货年月分组得出所有月份和每月总交易数、每月购买人数
        # 每月总交易数:不去重数据
        total_transactions = raw_data.groupby(['订货年月']).count()
        # 将Dateframe数据转化为字典
        total_transactions_dict = total_transactions.to_dict()
        total_transactions_dict = total_transactions_dict['收货手机']

        # 每月购买人数:去重数据
        total_buyers = raw_data.groupby(['订货年月']).收货手机.nunique()
        # 将Dataframe数据转化为字典
        total_buyers_dict = total_buyers.to_dict()

        # 按月对数据进行分组,交易次数为不去重数据,购买人数为去重数据
        # 将raw_data转化成字典
        raw_data_dict = raw_data.to_dict()
        # 这里一个手机号即代表一个交易订单,即按月筛选手机号,存入字典
        data_dict = {}  # 不去重数据:交易次数
        uniq_data_dict = {}  # 去重数据:购买人数
        month_list = [x for x in total_transactions_dict.keys()]
        # 按月遍历添加交易数据
        for month in month_list:
            num_list = []  # 不去重列表
            uniq_num_list = []  # 去重列表
            for key,value in raw_data_dict['订货年月'].items():
                # 如果是这个月的交易数据,则加入列表
                if value == month:
                    num_list.append(raw_data_dict['收货手机'][key])  # 不去重:交易数
                    if raw_data_dict['收货手机'][key] not in uniq_num_list:
                        uniq_num_list.append(raw_data_dict['收货手机'][key])  # 去重:购买人数
            data_dict[month] = num_list
            uniq_data_dict[month] = uniq_num_list

        # 测试程序用
        print('数据处理完成!')

        if x == 1:
            return total_buyers_dict, uniq_data_dict
        elif x == 2:
            return total_transactions_dict, data_dict
        else:
            print('请输入数字1或者2')


def main():
    # 开始计时
    time_start = time.time()
    print('开始计时。。。')
    repurchase_rate = RepurchaseRate()
    result = repurchase_rate.cal_repurchase_rate(1)
    print('计时结束!!!')
    time_end = time.time()
    # 运行所花的时间
    time_c = time_end - time_start
    print(result)
    print('本次计算耗时:%d 秒' % time_c)


if __name__ == "__main__":
    main()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python计算商品复购率 的相关文章

  • 从数据框中按索引删除行

    我有一个数组wrong indexes train其中包含我想从数据框中删除的索引列表 0 63 151 469 1008 要删除这些索引 我正在尝试这样做 df train drop wrong indexes train 但是 代码失败
  • Python中Decimal类型的澄清

    每个人都知道 或者至少 每个程序员都应该知道 http docs oracle com cd E19957 01 806 3568 ncg goldberg html 即使用float类型可能会导致精度错误 然而 在某些情况下 精确的解决方
  • python future 和元组解包

    实现像使用 future 进行元组解包这样的事情的优雅 惯用的方法是什么 我有这样的代码 a b c f x y g a b z h y c 我想将其转换为使用期货 理想情况下我想写一些类似的东西 a b c ex submit f x y
  • 我怎样才能更多地了解Python的内部原理? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我使用Python编程已经有半年多了 我对Python内部更感兴趣 而不是使用Python开发应用程序
  • Python模块可以访问英语词典,包括单词的定义[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 python 模块 它可以帮助我从英语词典中获取单词的定义 当然有enchant 这可以帮助我检查该单词是否存在于英语中
  • 使用 Python pandas 计算调整后的成本基础(股票买入/卖出的投资组合分析)

    我正在尝试对我的交易进行投资组合分析 并尝试计算调整后的成本基础价格 我几乎尝试了一切 但似乎没有任何效果 我能够计算调整后的数量 但无法获得调整后的购买价格有人可以帮忙吗 这是示例交易日志原始数据 import pandas as pd
  • 为什么在 Python 2.4 中使用 Unicode 数据会出现 ASCII 编码错误,而在 2.7 中却不会?

    我有一个程序 当在 Python 2 7 中运行时 会生成正确的 Unicode 输出到标准输出 当在 Python 2 4 中运行时 我得到UnicodeEncodeError ascii codec can t encode chara
  • python suds SOAP 请求中的名称空间前缀错误

    我使用 python suds 来实现客户端 并且在发送的 SOAP 标头中得到了错误的命名空间前缀 用于定义由element ref 在 wsdl 中 wsdl 正在引用数据类型 xsd 文件 请参见下文 问题出在函数上GetRecord
  • 从 python 发起 SSH 隧道时出现问题

    目标是在卫星服务器和集中式注册数据库之间建立 n 个 ssh 隧道 我已经在我的服务器之间设置了公钥身份验证 因此它们只需直接登录而无需密码提示 怎么办 我试过帕拉米科 它看起来不错 但仅仅建立一个基本的隧道就变得相当复杂 尽管代码示例将受
  • 使用鼻子获取设置中当前测试的名称

    我目前正在使用鼻子编写一些功能测试 我正在测试的库操作目录结构 为了获得可重现的结果 我存储了一个测试目录结构的模板 并在执行测试之前创建该模板的副本 我在测试中执行此操作 setup功能 这确保了我在测试开始时始终具有明确定义的状态 现在
  • Seaborn Pairplot 图例不显示颜色

    我一直在学习如何在Python中使用seaborn和pairplot 这里的一切似乎都工作正常 但由于某种原因 图例不会显示相关的颜色 我无法找到解决方案 因此如果有人有任何建议 请告诉我 x sns pairplot stats2 hue
  • 在 pytube3 中获取 youtube 视频的标题?

    我正在尝试构建一个应用程序来使用 python 下载 YouTube 视频pytube3 但我无法检索视频的标题 这是我的代码 from pytube import YouTube yt YouTube link print yt titl
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • 将 2D NumPy 数组按元素相乘并求和

    我想知道是否有一种更快的方法 专用 NumPy 函数来执行 2D NumPy 数组的元素乘法 然后对所有元素求和 我目前使用np sum np multiply A B 其中 A B 是相同维度的 NumPy 数组m x n 您可以使用np
  • 使用 Firefox 绕过弹出窗口下载文件:Selenium Python

    我正在使用 selenium 和 python 来从中下载某些文件web page http www oceanenergyireland com testfacility corkharbour observations 我之前一直使用设
  • 使用 PyTorch 分布式 NCCL 连接失败

    我正在尝试使用 torch distributed 将 PyTorch 张量从一台机器发送到另一台机器 dist init process group 函数正常工作 但是 dist broadcast 函数中出现连接失败 这是我在节点 0
  • 无法在前端使用 JavaScript Fetch API 将文件上传到 FastAPI 后端

    我正在尝试弄清楚如何将图像发送到我的 API 并验证生成的token那是在header的请求 到目前为止 这就是我所处的位置 app post endreProfilbilde async def endreProfilbilde requ
  • 您可以将操作直接应用于map/reduce/filter 中的参数吗?

    map and filter通常可以与列表理解互换 但是reduce并不那么容易被交换map and filter 此外 在某些情况下我仍然更喜欢函数语法 但是 当您需要对参数本身进行操作时 我发现自己正在经历语法体操 最终必须编写整个函数
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1
  • Scrapy Spider不存储状态(持久状态)

    您好 有一个基本的蜘蛛 可以运行以获取给定域上的所有链接 我想确保它保持其状态 以便它可以从离开的位置恢复 我已按照给定的网址进行操作http doc scrapy org en latest topics jobs html http d

随机推荐

  • 【踩坑】parallel并发流导致数据异常

    踩坑 parallel并发流导致数据异常 1 场景 2 代码 3 原因 4 总结 1 场景 今天生产反馈有异常 看看日志是CollectionUtils sort空指针异常 这一眼看就是list中的排序有空元素 首先想到的是sql查出来的字
  • 我的tesseract-orc3.01样本训练记录

    官网样本训练网址 https code google com p tesseract ocr wiki TrainingTesseract3 一步一步来按照官网的步骤来做 由于我用的tesseractORC3 01版本 官网最新的版本是3
  • 耗时的同步请求自动转异步请求

    耗时的同步请求自动转异步请求 问题描述 问题处理 代码实现 问题描述 现在在项目中碰到一个情况 导出数据到excel 在数据量比较下的时候直接下载 在数据量比较大时保存到服务的文件列表 后续再供用户下载 也就是需要避免前端因后端处理时间过长
  • windows下激活conda环境

    windows activate env name linux source root autodl tmp environment bgmv30222 bin activate
  • (2003, "Can't connect to MySQL server on 'IP' ([WinError 10061] 由于目标计算机积极拒绝,无法连接。)")

    2003 Can t connect to MySQL server on IP WinError 10061 与MySql 只能访问localhost 和 127 0 0 1访问 不能通过其他IP访问 问题描述 项目中跨域请求数据 在远程
  • 华为od机试 Python【游戏最高分】

    题目 小明正在和他的朋友们玩一个跳格子的游戏 这个游戏有一个行列 共包含n个格子 每个格子里都有一定的分数 游戏的规则如下 小明可以选择任意一个格子作为起点 从起点开始 小明可以选择跳到任意非相邻的格子 也就是说 如果小明当前在第i个格子
  • java中的resultset类详解

    一 JDBC sun 提供了一套通用性的接口 可以连接任何的数据库 连接数据库的具体得到实例 具体的数据库厂商实现的 连接数据的步骤 别忘了复制jar包 1 注册驱动 Class forName DriverManager 2 获得链接对象
  • CMD中提升帐户到管理员权限

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 提升用户权限 从打开的 命令提示符 窗口中 输入命令 net localgroup administrators 用户名 add 并按回车 即可给当前 用户名 提升为 管理
  • C++函数返回引用

    首先需要明白 C 函数为什么要返回引用 答 这样就不用返回结果的副本 因为返回副本需要做赋值拷贝函数 浪费时间 这时候 实际上 返回是结果的副本 而不是结果本身 如果要返回本身 就返回引用就OK了 例1 const string manip
  • 数据分析入门宝藏!《Python数据分析-从入门到实践》

    在大数据 人工智能时代 数据无处不在 无论处于哪种行业 能够掌握一定的数据分析技能必然是职场的加分项 本笔记提供了丰富的学习内容 包含230个快速示例 17个案例 4个项目 力求为读者打造一本 学习入门 应用 实践一体化 的的Python数
  • Presto 常用配置及操作

    一 介绍 Presto是一个开源的分布式SQL查询引擎 适用于交互式分析查询 数据量支持GB到PB字节 Presto的设计和编写完全是为了解决像Facebook这样规模的商业数据仓库的交互式分析和处理速度的问题 推荐阅读 Presto实现原
  • DVWA 通关XSS(Stored)

    存储型XSS 持久化跨站脚本 持久性体现在XSS代码不是在某个参数 变量 中 而是写进数据库文件等可以永久保存数据的介质中 存储型XSS通常发生在留言板等地方 可以在留言板位置进行留言 将恶意代码写进数据库中 Low 没有任何过滤 直接使用
  • 开源云同步的markdown写作软件——Yosoro

    文章目录 前言 简便的项目管理 舒服的写作体验 支持one driver 存在缺点 前言 Yosoro是一款支持在Win Linux macOS上使用的写作软件 它的界面设计以及交互上表达出的极简主义可以让用户们可以完全沉浸于自己写作世界
  • MyBatis学习——第四篇(拦截器和拦截器分页实现)

    MyBatis架构体图 1 mybatis核心对象 从MyBatis代码实现的角度来看 MyBatis的主要的核心部件有以下几个 SqlSession 作为MyBatis工作的主要顶层API 表示和数据库交互的会话 完成必要数据库增删改查功
  • 【git体验】git基础-3目录之间关系

    1 git目录和工作目录 Git目录并不是Bare repo 而是本地的代码库 即用git init命令在根目录创建的 git 目录 类似SVN的 svn 目录 这个目录就是git实现分布式代码管理的关鍵了 工作目录就是 git的上級目录
  • Angular&TypeScript 经验技巧

    TypeScript 变量声明 var 变量名 类型 值 基本类型 数据类型 关键字 描述 任意类型 any 声明为 any 的变量可以赋予任意类型的值 数字类型 number 双精度 64 位浮点值 它可以用来表示整数和分数 let bi
  • 使用HAL库开发STM32:使用Timer输出PWM信号

    文章目录 目的 基础说明 输出PWM信号 总结 目的 单片机输出PWM信号是很常用的一种功能需求 STM32中通常使用Timer来输出PWM信号 这篇文章将对相关内容做个说明 基础说明 在使用Timer输出PWM信号需要了解一些Timer的
  • Spring Boot, 访问入口配置

    HTTP Server port server port 8080 Make the application accessible on the given context path http localhost 8080 myapp se
  • openGL结合光照与纹理

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 实现思路 二 代码 1 c 主程序 2 顶点着色器 3 片元着色器 运行效果 参考 源码下载 前言 在光照模型中 都是假设我们使用按ADS 定义的光源 照亮按ADS 定
  • Python计算商品复购率

    1 Python计算产品复购率 需求 给出数据商品购买数据 数据格式 csv 包含 购买月份 手机号 根据该数据计算产品的复购率 复购率算法 算法一 单位时间内 按每月 R 复购人数 总购买人数 算法二 单位时间内 按每月 R 复购交易次数