Python自动化:基于faker批量生成模拟数据(以电商行业销售数据为例)

引言:个人认为,“造数据”是一个数据分析师的一项基本技能,当然啦,“造数据”不是说胡编乱造,而是根据自己的需求去构造一些模拟数据集,用于测试等用途,而且使用虚拟数据不用担心数据隐私和安全问题,嘿嘿。

文章思路:random标准库 → faker第三方库 → 构造销售数据集示例

效果展示:


一、random标准库常用方法

random.seed(a=None) 可以设置随机数生成器的种子,使得每次运行时的随机数序列相同。

(一)生成整数

生成指定区间范围内的随机整数:

# 生成一个在 1 到 100 之间的随机整数
random.randint(1, 100)

(二)生成浮点数

生成指定范围内的随机浮点数,使用round控制小数精度:

# 生成一个在 10 到 100 之间的随机浮动数
random.uniform(10, 100)   # 例如输出:54.7938611692445
# 保留2位小数
round(random.uniform(10, 100), 2)

(三)随机抽取、打乱序列

1、从序列中随机抽取一个元素:

# 从列表中随机选择一个元素
random.choice([1, 2, 3, 4, 5])

2、从随机序列中随机抽取k个元素,支持设置权重(每个元素被选中的概率):

# random.choices(seq, weights=None, k=1)
# 从列表中随机选择两个元素,且weights为每个元素被选中的概率
random.choices([1, 2, 3, 4, 5], weights=[0.1, 0.1, 0.3, 0.2, 0.3], k=2)  # 例如输出:[3, 5]

 3、与上条类似,从给定的序列中随机选择 k元素,返回一个新列表,原序列不受影响:

# 从列表中随机选择 3 个不重复的元素
random_sample = random.sample([1, 2, 3, 4, 5], k=3)   # 例如输出:[1, 4, 3]

4、随机打乱序列:

# 将列表随机排列
lst = [1, 2, 3, 4, 5]
random.shuffle(lst)   # 例如输出:[2, 5, 4, 1, 3]

(四)生成随机布尔值

1、随机生成1个随机布尔值:

# 生成一个随机浮动数,并转换为布尔值
random_bool = random.random() < 0.5

2、生成一个随机布尔序列:

list(random.random() < 0.5 for _ in range(10))

二、faker第三方库(需要下载)

faker 库是 Python 中常用的生成假数据的库,提供了大量的功能来生成各种类型的虚拟数据,如姓名、地址、日期等。以下是 faker 库的一些常用方法,按类别整理:

注:使用前一般要初始化,如下

from faker import Faker
fake = Faker()

(一)个人信息类

1、生成一个随机姓名(也可以只生成姓或名)

# 生成一个随机姓名
name = fake.name()  # 例如:'John Doe'

# 生成一个随机名
first_name = fake.first_name()

# 生成一个随机姓氏
last_name = fake.last_name()

2、生成一个随机地址

# 手续代码我就不做赋值了,只列方法
fake.address()

3、生成一个随机城市、州/省份、国家

# 城市
fake.city()  # 例如:'New York'

# 州/省份
fake.state()  # 例如:'California'

# 国家
fake.country()  # 例如:'United States'

4、电子邮件email

fake.email()  # 例如:'john.doe@example.com'

5、电话号码

fake.phone_number()  # 例如:'(555) 555-5555'

6、身份证

fake.ssn()   # 生成一个18位的身份证号

(二)日期

生成指定时间范围内的随机日期,还要结合 datetime 库:

from faker import Faker
from datetime import date

fake = Faker()

# 使用 datetime.date() 来创建日期对象
start_date = date(2023, 1, 1)
end_date = date(2023, 12, 31)

# 生成指定范围内的随机日期
random_date = fake.date_between(start_date=start_date, end_date=end_date)
print(random_date)  # 例如:'2023-06-15'

(三)文本和公司信息

# 生成一个随机的句子
fake.sentence()  # 例如:'The quick brown fox jumps over the lazy dog.'

# 生成一个随机段落
fake.paragraph()  # 例如:'Lorem ipsum dolor sit amet, consectetur adipiscing elit.'

# 生成一个随机的公司名称
fake.company() 

# 生成一个随机的职位名称
fake.job()  # 例如:'Software Engineer'

(四)用户 ID

# 生成一个随机的 UUID
fake.uuid4()  # 例如:'f9a86cc4-f7f7-4686-b49b-76d1b74f9f39'

三、虚拟电商行业销售数据生成案例

生成一个有1000条记录的销售数据集,包含以下字段:用户ID、用户名、email、产品名称、购买数量、单价、消费总金额、(下单)购买日期。

from faker import Faker
from datetime import date
import pandas as pd
import random

fake = Faker()   # 初始化Faker实例

# 定义电商数据生成函数
def func(data_size):
    datas = []
    for i in range(data_size):
        # 生成用户id
        id = str(fake.uuid4())  
        # 生成用户名字
        name = fake.name()  
         # 生成用户邮箱
        email = fake.email()   
        # 生成商品名称
        product_name = fake.word()    
        # 生成购买数量
        quantity = random.randint(1,10)    
        # 生成单价。使用uniform生成a~b之间的随机浮动数,并使用round保留两位小数
        unit_price = round(random.uniform(50,200), 2)
        # 生成同消费金额
        total_price = round(quantity*unit_price, 2)
        # 随机生成2024上半年这个时间段的购买日期
        sale_date = fake.date_between(start_date=date(2024,1,1), end_date=date(2024,6,30))

        datas.append({
            'id': id,
            'name': name,
            'email': email,
            'product_name': product_name,
            'quantity': quantity,
            'unit_price': unit_price,
            'total_price': total_price,
            'sale_date': sale_date
        })
        
    return pd.DataFrame(datas)  # 将数据转化为DataFrame形式,作为返回值


# 测试入口
data_size = 1000   # 确定要造的数据数量
df = func(data_size)
print(df.head(5))

输出前5条数据,如下:

但是,这样的数据集是存在问题的,为什么呢?

因为数据集是销售数据,存储的是用户下单的历史记录,用户可能不止一次下单购买,换句话来说,在数据集中,用户id 是可能重复的,出现重复id表示该id的用户下单多次,但是按照上面的方法生成的数据集,id 是没有重复的。

怎么解决?往下看代码,增加了一个_generate_ids函数用于生成1000条包含id可以重复的数据:

from faker import Faker
from datetime import date
import pandas as pd
import random

fake = Faker()   # 初始化Faker实例

# 定义生成可重复ID的函数,其中参数ration为重复的ID占比,比如0.3
def _generate_ids(data_sizes, ration):
    # 计算重复的id数
    num_dupl = int(data_sizes*ration)
    # 先生成一部分不重复的id
    ids = [str(fake.uuid4()) for _ in range(data_sizes - num_dupl)]
    # 随机抽取一部分id来重复
    ids.extend(random.sample(ids, num_dupl))
    # 打乱顺序
    random.shuffle(ids)
    return ids

# 定义生成数据的函数
def func(data_sizes, ration):
    datas = []
    ids = _generate_ids(data_sizes, ration)

    for id in ids:
        # 生成用户名字
        name = fake.name()  
         # 生成用户邮箱
        email = fake.email()   
        # 生成商品名称
        product_name = fake.word()    
        # 生成购买数量
        quantity = random.randint(1,10)    
        # 生成单价。使用uniform生成50~200之间的随机浮动数,并使用round保留两位小数
        unit_price = round(random.uniform(50,200), 2)
        # 生成同消费金额
        total_price = round(quantity*unit_price, 2)
        # 随机生成2024上半年这个时间段的购买日期
        sale_date = fake.date_between(start_date=date(2024,1,1), end_date=date(2024,6,30))

        datas.append({
            'id': id,
            'name': name,
            'email': email,
            'product_name': product_name,
            'quantity': quantity,
            'unit_price': unit_price,
            'total_price': total_price,
            'sale_date': sale_date
        })
        
    return pd.DataFrame(datas)  # 将数据转化为DataFrame形式,作为返回值


data_size = 1000   # 确定要造的数据数量
ration = 0.3   # 确定重复比例
df = func(data_size, ration)

# 查找 'id' 列中重复的行
df[df.duplicated(subset='id')]

找出并输出 id 重复的行(即记录),可以发现刚好有300条数据重复,符合代码里设置的含0.3重复数据的比例。

当然了,其他字段(列名)如果也要求可以有重复 ,可以按照类似方法更改代码。

以增加一个可以重复的 “商品类别” 字段为例,:

# 先确定类别有几类,假如有5个类别
producct_categories = ['A', 'B', 'C', 'D', 'E']   # 方法一:手动定义
# 最后随机挑取一个类别作为该条数据的类别即可
category = random.choice(producct_categories)


# ——————————————————————————————————————————

# 先确定类别有几类,假如有5个类别
producct_categories = [fake.word() for _ in range(5)]   #方法二:fake.word()函数,生成一个单词作为类别名称
# 最后随机挑取一个类别作为该条数据的类别即可
category = random.choice(producct_categories)

到这里,虚拟销售数据的生成就到此结束啦,还有一个点,就是可以生成中文数据,只需要更改下面一行代码的参数:

# 初始化Faker实例的时候,加入参数"zh_CN"就可以了,不写参数则默认生成英文数据
fake = Faker("zh_CN")   

更改语言后的效果如下 :

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956373.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【全栈开发】----Mysql基本配置与使用

本篇是在已下载Mysql的情况下进行的&#xff0c;若还未下载或未创建Mysql服务&#xff0c;请转到这篇: 2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易&#xff08;保姆级&#xff09;_mysql8.0.40下载安装教程-CSDN博客 本文对于mysql的操作均使用控制台sql原生代码…

微软宣布Win11 24H2进入新阶段!设备将自动下载更新

快科技1月19日消息&#xff0c;微软于1月16日更新了支持文档&#xff0c;宣布Windows 11 24H2进入新阶段。 24H2更新于2024年10月1日发布&#xff0c;此前为可选升级&#xff0c;如今微软开始在兼容的Windows 11设备上自动下载并安装24H2版本。 微软表示&#xff1a;“运行Wi…

15. helm包管理器

helm包管理器 一、helm包管理器介绍、安装1、helm包管理器2、核心概念2.1 chart2.2 repository2.3 release 3、helm安装3.1 安装helm3.2 添加helm国内仓库 二、使用helm安装MySQL 8.01、搜索mysql8.0 chart包2、下载mysql8.0 chart包3、按需定制values.yaml3.1 values.yaml文件…

庄小焱——2024年博文总结与展望

摘要 大家好&#xff0c;我是庄小焱。岁末回首&#xff0c;2024 年是我在个人成长、博客创作以及生活平衡方面收获颇丰的一年。这一年的经历如同璀璨星辰&#xff0c;照亮了我前行的道路&#xff0c;也为未来的发展奠定了坚实基础。 1. 个人成长与突破 在 2024 年&#xff0c…

OSCP - Proving Grounds - BullyBox

主要知识点 如果发现有域名&#xff0c;则可以加入/etc/hosts后重新执行nmap,nikto等扫描dirsearch的时候可以使用完整一些的字典文件&#xff0c;避免漏掉信息.git dump 具体步骤 执行nmap 扫描&#xff0c;发现 80和22端口开放,访问后发现被重定向到 bullybox.local Star…

Linux中的基本指令(一)

一、Linux中指令的存在意义 Linux中&#xff0c;通过输入指令来让操作系统执行&#xff0c;以此达到控制操作系统的目的&#xff0c;类似于Windows中的双击&#xff0c;右键新建文件&#xff0c;新建文件夹等 1.补&#xff1a;关于屏幕的几个操作指令 ①清屏指令 clear 回…

C/C++内存管理(超详解)

目录 1.C/C内存分布 2.C语言动态内存管理 2.1 malloc 2.2 free 2.3 calloc 2.4 realloc 3.C动态内存管理 3.1new/delete操作内置类型 3.2new/delete操作自定义类型 3.3operator new与operator delete函数 3.4定位new表达式(placement-new) 1.C/C内存分布 内存中是如…

【React】静态组件动态组件

目录 静态组件动态组件创建一个构造函数(类)使用 class 实现组件**使用 function 实现类组件** 静态组件 函数组件是静态组件&#xff1a; 组件第一次渲染完毕后&#xff0c;无法基于内部的某些操作让组件更新「无法实现自更新」&#xff1b;但是&#xff0c;如果调用它的父组…

前端【3】--CSS布局,CSS实现横向布局,盒子模型

盒子分类 1、块级盒子 2、内联级盒子 3、内联块级盒子 4、弹性盒子 5、盒子内部分区 方法一&#xff1a;使用 float 普通盒子实现横向布局 方法二&#xff1a;使用 display: inline-block 内联块级元素实现横向布局 方法三&#xff1a;使用弹性盒子 flexbox&#xff0…

Python实现过年烟花效果及打包成可执行文件

博客&#xff1a;Python实现过年烟花效果及打包成可执行文件 在这篇博客中&#xff0c;我们将详细讲解如何使用Python和Pygame库实现一个过年烟花效果的程序&#xff0c;并介绍如何将Python脚本打包成Windows上可以直接执行的exe文件。我们将从代码的各个模块入手&#xff0c;…

新星杯-ESP32智能硬件开发--ESP32的I/O组成-系统中断矩阵

本博文内容导读&#x1f4d5;&#x1f389;&#x1f525; ESP32开发板的中断矩阵、功能描述与实现、相关API和示例程序进行介绍 ESP32中断矩阵将任一外部中断源单独分配到每个CPU的任一外部中断上&#xff0c;提供了强大的灵活性&#xff0c;能适应不同的应用需求。 ESP32中断主…

SpringBoot2 + Flowable(UI)

文章目录 引言I 技术栈软件架构基于 Vue.js 和 Element UI 的后台管理系统工程结构II 依赖rest,logic,conf 的依赖工作流flowable jar包flowable-ui所需jar包III 配置jdbc 配置 nullCatalogMeansCurrent = true引言 I 技术栈 软件架构 前端基于vue 、element-ui框架分模块设…

.Net 6.0 .Net7.0 .Net8.0 .Net9.0 使用 Serilog 按日志等级写入日志及 appsetting.json 配置方式实现

前言 最近使用最新版的Serilog记录日志时&#xff0c;发现以前有些关于Serilog的Nuget弃用了&#xff0c;最关键的是有些配置写法也改变&#xff0c;于是就整理了一下最新版的Serilog配置方式(appsetting.json)的使用 说明&#xff1a;我是用的.Net6&#xff0c;最新长期支持…

sprnigboot集成Memcached

安装Memcached 下载地址 32位系统 1.2.5版本&#xff1a;http://static.jyshare.com/download/memcached-1.2.5-win32-bin.zip 32位系统 1.2.6版本&#xff1a;http://static.jyshare.com/download/memcached-1.2.6-win32-bin.zip 32位系统 1.4.4版本&#xff1a;http://stati…

【数据分析】02- A/B 测试:玩转假设检验、t 检验与卡方检验

一、背景&#xff1a;当“审判”成为科学 1.1 虚拟场景——法庭审判 想象这样一个场景&#xff1a;有一天&#xff0c;你在王国里担任“首席审判官”。你面前站着一位嫌疑人&#xff0c;有人指控他说“偷了国王珍贵的金冠”。但究竟是他干的&#xff0c;还是他是被冤枉的&…

3dmax LOGO的符号、意义和历史,渲染100邀请码1a12

Autodesk 3ds Max 是一款 3D 建模、动画和渲染软件&#xff0c;由 Autodesk, Inc. 于 1996 年开发&#xff0c;其功能是能够创建复杂的数字场景和视觉效果&#xff0c;被专业建筑师、设计师和视频游戏创作者广泛使用&#xff0c;提供了七种语言的 Windows 版本&#xff0c;没有…

线段树优化dp,abc389F - Rated Range

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 F - Rated Range 二、解题报告 1、思路分析 考虑定义 f(i, j) 为 初始分…

青少年CTF练习平台 EasyMD5解题思路

题目 EasyMD5 PHP弱类型/弱等于的判断 翻译 上传之后网页提示&#xff1a;Not a PDF! angry!!! get out from my page 修改文件后缀为pdf 再次上传&#xff0c;答案出来了 s878926199a s155964671a 成功获取flag

Amazon MSK 开启 Public 访问 SASL 配置的方法

1. 开启 MSK Public 1.1 配置 MSK 参数 进入 MSK 控制台页面&#xff0c;点击左侧菜单 Cluster configuration。选择已有配置&#xff0c;或者创建新配置。在配置中添加参数 allow.everyone.if.no.acl.foundfalse修改集群配置&#xff0c;选择到新添加的配置。 1.2 开启 Pu…

SW - 钣金零件保存成DWG时,需要将折弯线去掉

文章目录 SW - 钣金零件保存成DWG时&#xff0c;需要将折弯线去掉概述笔记备注END SW - 钣金零件保存成DWG时&#xff0c;需要将折弯线去掉 概述 如果做需要弯折的切割件&#xff0c;最好做成钣金零件。 最近做了几个小钣金(将钣金展开&#xff0c;建立新草图&#xff0c;在2…