因果推断-【The MineThatData E-Mail Analytics And Data Mining Challenge】思路分析与Python实现代码

2023-11-17

目录

一、数据集介绍

二、问题及分析思路

1、问题

2、分析思路

三、代码


一、数据集介绍

数据集来源于用户在网上的购物行为,涵盖了过去一年有购买行为的64000个用户,这些用户被用于电子邮件营销活动的实验分析。实验的目的是衡量哪个版本的电子邮件营销活动最有效,以及针对哪部分人群最有效。用户被随机地分为以下三组:

  • 1/3的用户会收到一封以男士商品为主的电子营销邮件(实验组-男士版)
  • 1/3的用户会收到一封以女士商品为主的电子营销邮件(实验组-女士版)
  • 1/3的用户不会收到邮件(对照组)

两周后收集实验结果,可用的特征有:

  • Recency:距离最近一次购买行为,经过了多少个月
  • History:过去一年用户实际花费的金额
  • Mens: 1/0,1-过去一年用户购买过男士用品
  • Womens: 1/0,1-过去一年用户购买过女士用品
  • Zip_Code::地区
  • Newbie: 1/0,1-过去一年内的新用户
  • Channel: 过去一年用户的购物渠道

用于描述用户的分组信息:

  • Segment:有三个枚举值分别是Mens-E-mail、Womens-E-mail和No-E-mail

实验有三个评价指标,分别是:

  • Visit:1/0,1-用户在两周内访问了网站
  • Conversion:1/0,1-用户在两周内有购买行为
  • Spend:用户在两周内实际消费的金额

二、问题及分析思路

1、问题

数据集的提供者提出了8个问题:

  1. 哪个电子邮件活动最有效,男士版还是女士版?
  2. 男士版电子邮件活动为每位顾客带来了多少销售额的增加?女士版电子邮件活动为每位顾客带来了多少销售额的增加?
  3. 如果你只能给10000个顾客发送Email,你会选择哪些顾客?为什么?
  4. 如果你可以从收到电子邮件的顾客中剔除10000个人,不让他们参加此活动,你会选择哪些顾客?为什么?
  5. 对于不同的客户群体,男士版本和女士版本的活动效果有差异吗?
  6. 当选择不同的评价指标,比如访问、转化和消费额时,活动效果有差异吗?
  7. 你是否观察到任何异常或奇怪的发现?
  8. 根据实验结果,你会将男士版和女士版的投放定位到哪些顾客?你会用哪些数据来支持你的建议?

2、分析思路

Q1&Q6:

结论:

男士版活动最有效,visit、conversion、spend三个指标均比女士版效果明显。

思路:

这两个Q思路是一样的,本质都是在计算ATE。先做PSM匹配合适的对照样本,然后分别计算vist、conversion和spend三个指标的ATE,比较男士版本和女士版本的差异。

实验结果:

Q2:

思路:

这道题本质是在问,选择spend作为评价指标时的ITE是多少,和第一题的思路差不多,先做PSM,然后计算实验组每个用户的ITE。

Q3&Q4:

思路:

这两个Q本质上是一个问题,即如何按发送邮件的优先级给用户排个序?然后我们只需要取排序后的前10000和后10000个用户即可。

首先,我们可以根据用户的自然行为和受处理后行为这两个维度将用户分成四类,那么第二象限的用户是对营销活动最敏感的,如果发送邮件,应该优先发送给这部分用户。 其次,应该给第一象限的用户发送邮件,邮件对这部分用户也有一定的作用。最后,剩余的用户按照消费间隔(recency)和消费等级(history_segment)综合排序,距离上次购买间隔越久远越优先发送,消费等级越高越优先发送。

Q5&Q8:

结论:

男士版建议投放人群:

    1)历史消费段在$350-1000用户群

    2)多渠道购物用户群

女士版本建议投放人群:

    1)历史消费段在$500-750和$1000+的用户群

    2)多渠道购物用户群

    3)新用户群

思路:

这两个Q本质都是进行HTE分析,通过比较实验在不同细分群体的效果,从而决定最佳投放人群。我们可以以ATE作为benchmark,如果细分群的CATE明显高于ATE,证明细分群的实验效应是显著的。

消费段(history_segment)比较,男士版在$350-500,$500-750和$750-1000这三个消费段的uplift是显著的,而女士版则是在$500-750和$1000+这两个消费段显著。说明男士版对中高档消费人群是有效的,而女士版则是对高档消费人群更有效。

 购物渠道(channel)比较,可以看出男士版和女士版都在Multichannel渠道有显著的uplift,说明过去曾在多个渠道有购物行为的用户(各处买买买),对邮件营销更加敏感。

新老用户(Newbie)比较,男士版对新老用户的效果差不多,而女士版显然对新用户更有效果。

Q7:

这里有一个很有意思的发现:女士版的营销邮件对曾购买过女士用品的顾客效果很好,但对购买过男士用品的顾客效果一般。而男士版本的营销邮件却没有存在这个问题。 这反映了现实中的两个现象:

    1)女士一般是家庭购物决策者,所以既会关注女士用品,也会关注男士用品;

    2)男士一般很少给女士买东西,除非在一些纪念日、节假日等有意义的日子,所以女士用品的推荐对男士可能起不到太大作用。

 

三、代码

import pandas as pd
import psmatching.match as psm
import numpy as np
import random
import operator

random.seed(1)  # 生成同一个随机数;
road='/home/jeff/data'# 数据存放的地址

###### 函数部分 ######
# 样本数量均衡测试
def sample_test(dt_treat,dt_control):
        if len(dt_treat)>len(dt_control):
                print('---样本数均衡测试---')
                print('实验组样本数:%d,对照组样本数:%d,实验组需要剔除%d个样本' % (len(dt_treat),len(dt_control),len(dt_treat)-len(dt_control)))
                l = list(dt_treat.index.values)
                sap = random.sample(l, len(dt_treat) - len(dt_control))  # 随机抽取n个元素
                dt_treat = dt_treat.drop(sap)
                print('删除的数据索引为:%s' % str(sap))
                print('Done!')
                print('调整后的实验组样本数:%d,对照组样本数:%d' % (len(dt_treat),len(dt_control)))
                print('\n')
        else:
                pass
        return dt_treat

# 计算实验效应
def effect_calculate(core,dt):
        y_1 = np.average(dt[dt.CASE == 1][core])
        y_0 = np.average(dt[dt.CASE == 0][core])
        ATE = y_1 - y_0
        print('实验组%s:%.4f,对照组%s:%.4f,因果效应:%.4f' % (core, y_1, core, y_0, ATE))

# 用户发送邮件的优先级排序
def send_user(dt):
        dt['recency_history'] = dt['recency'] + dt['history_segment']
        # 根据spend,筛选第二象限用户群(自然不消费,邮件消费)
        spd2=dt[ (dt['ITE_spend']>0)  & ( (dt['spend_mch_1']==0) & (dt['spend_mch_2']==0) & (dt['spend_mch_3']==0) ) ]
        spd2=spd2.sort_values(by=['ITE_spend'], ascending=False )
        # 根据spend,筛选第一象限用户群(自然消费,邮件也消费)
        spd1=dt[ (dt['ITE_spend']>0) & ( (dt['spend_mch_1']!=0) | (dt['spend_mch_2']!=0) | (dt['spend_mch_3']!=0) ) ]
        spd1=spd1.sort_values(by=['ITE_spend'], ascending=False)
        # 根据visit,筛选第二象限用户群(自然不访问,邮件访问)
        vit2=dt[ (dt['ITE_spend']==0) & (dt['ITE_visit']>0) & ( (dt['visit_mch_1']==0) & (dt['visit_mch_2']==0) & (dt['visit_mch_3']==0) ) ]
        vit2=vit2.sort_values(by=['ITE_visit'], ascending=False)
        # 根据visit,筛选第一象限用户群(自然访问,邮件也访问)
        vit1=dt[ (dt['ITE_spend']==0) & (dt['ITE_visit']>0) & ( (dt['visit_mch_1']!=0) | (dt['visit_mch_2']!=0) | (dt['visit_mch_3']!=0) ) ]
        vit1=vit1.sort_values(by=['ITE_visit'], ascending=False)
        # 剩下的用户按照recency和history_segment两个维度综合考虑
        rem1=dt[ (dt['ITE_spend']==0) & (dt['ITE_visit']==0)].sort_values(by=['recency_history'], ascending=False)
        rem2=dt[ (dt['ITE_spend']==0) & (dt['ITE_visit']<0)].sort_values(by=['recency_history'], ascending=False)
        rem3=dt[ dt['ITE_spend']<0 ].sort_values(by=['recency_history'], ascending=False)
        # 合并用户群
        subs = [spd2, spd1, vit2, vit1, rem1, rem2, rem3]
        df = pd.concat(subs).reset_index()

        df.drop(columns=['recency_history','index'],inplace=True)
        return df




###### 第一部分:数据预处理 ######
# 读取数据集
dt=pd.read_csv(road+'/EmailAnalytics.csv')

# 历史消费区间,文本型转类别型
dt['history_segment']=dt['history_segment'].apply(lambda x: int(x[0])-1)

# 区域,文本型转类别型
zip_mapping={'Rural':0,'Surburban':1,'Urban':2}
dt['zip_code']=dt['zip_code'].map(zip_mapping)

# 实验分组,文本型转类别型
seg_mapping={'No E-Mail':0,'Mens E-Mail':1,'Womens E-Mail':2}
dt['CASE']=dt['segment'].map(seg_mapping)

# 历史购买渠道,one-hot编码
dt=pd.get_dummies(dt,columns=['channel'])

# 删除没用的字段
dt.drop(columns=['history','segment'],inplace=True)

# 划分实验组和对照组
dt_ctl=dt[dt['CASE']==0]
dt_men=dt[dt['CASE']==1]
dt_wom=dt[dt['CASE']==2]

# 检查实验组和对照组样本比例是否均衡
dt_men=sample_test(dt_men,dt_ctl)
dt_wom=sample_test(dt_wom,dt_ctl)

dt_men=pd.concat([dt_men,dt_ctl])
dt_wom=pd.concat([dt_wom,dt_ctl])

dt_wom.loc[dt_wom['CASE']==2,'CASE']=1

# 保存数据集
dt_men.to_csv(road+'/Email_men.csv')
dt_wom.to_csv(road+'/Email_wom.csv')




###### 第二部分:实验分析 ######

# 数据集的地址,默认数据文件是csv格式,其他格式可能会报错
path=road+r'/Email_men.csv'
# 计算倾向性得分的模型格式,格式:Y~X1+X2+...+Xn,其中Y为treatment列,X为协变量列
model = "CASE ~ recency + history_segment + mens + womens + zip_code + newbie " \
        "+ channel_Phone + channel_Web + channel_Multichannel"
# k每个实验组样本所匹配的对照组样本的数量
k = "3"

# 初始化PSMatch实例
m = psm.PSMatch(path, model, k)

# 计算倾向得分,为接下来的匹配准备数据
dd=m.prepare_data()

# 根据倾向性得分做匹配,其中caliper代表是否有卡尺,replace代表是否是有放回采样
m.match(caliper = None, replace = True)

# 混淆变量与treatment做卡方检验,检验混淆变量和treatment是不是独立的
# m.evaluate()

# 获取匹配的样本子集
mdt = m.matched_data
mdt['OPTUM_LAB_ID']=mdt.index
mdt.index.rename('index',inplace=True)

# 获取匹配的样本编号
mch = m.matches

# 计算实验的因果效应(ATE)
effect_calculate('visit',mdt)
effect_calculate('conversion',mdt)
effect_calculate('spend',mdt)

# 为每个实验组和对照组样本匹配评价指标
mch=pd.merge(mch,mdt[['OPTUM_LAB_ID','visit','conversion','spend']],left_on='CASE_ID',right_on='OPTUM_LAB_ID',how='left').rename(
        columns={'visit':'visit_lab','conversion':'conversion_lab','spend':'spend_lab','OPTUM_LAB_ID':'LAB_ID'})
mch=pd.merge(mch,mdt[['OPTUM_LAB_ID','visit','conversion','spend']],left_on='CONTROL_MATCH_1',right_on='OPTUM_LAB_ID',how='left').rename(
        columns={'visit':'visit_mch_1','conversion':'conversion_mch_1','spend':'spend_mch_1'})
mch=pd.merge(mch,mdt[['OPTUM_LAB_ID','visit','conversion','spend']],left_on='CONTROL_MATCH_2',right_on='OPTUM_LAB_ID',how='left').rename(
        columns={'visit':'visit_mch_2','conversion':'conversion_mch_2','spend':'spend_mch_2'})
mch=pd.merge(mch,mdt[['OPTUM_LAB_ID','visit','conversion','spend']],left_on='CONTROL_MATCH_3',right_on='OPTUM_LAB_ID',how='left').rename(
        columns={'visit':'visit_mch_3','conversion':'conversion_mch_3','spend':'spend_mch_3'})

mch=mch[['LAB_ID','visit_lab','visit_mch_1','visit_mch_2','visit_mch_3',
         'conversion_lab','conversion_mch_1','conversion_mch_2','conversion_mch_3',
         'spend_lab','spend_mch_1','spend_mch_2','spend_mch_3']]

# 计算实验的个体因果效应(ITE)
mch['ITE_visit']=mch['visit_lab']-(mch['visit_mch_1']+mch['visit_mch_2']+mch['visit_mch_3'])/3
mch['ITE_conversion']=mch['conversion_lab']-(mch['conversion_mch_1']+mch['conversion_mch_2']+mch['conversion_mch_3'])/3
mch['ITE_spend']=mch['spend_lab']-(mch['spend_mch_1']+mch['spend_mch_2']+mch['spend_mch_3'])/3

mch=pd.merge(mch,dt[['OPTUM_LAB_ID','recency','history_segment','mens','womens','zip_code','newbie','channel']],
             left_on='LAB_ID', right_on='OPTUM_LAB_ID', how='left').drop(labels=['OPTUM_LAB_ID'],axis=1)

# 优先发送邮件的10000个用户
pri=send_user(mch).head(10000)

# 不应该发送邮件的10000个用户
last=send_user(mch).tail(10000)

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

因果推断-【The MineThatData E-Mail Analytics And Data Mining Challenge】思路分析与Python实现代码 的相关文章

  • 是否有解决方法可以通过 CoinGecko API 安全检查?

    我在工作中运行我的代码 一切都很顺利 但在不同的网络 家庭 WiFi 上 我不断收到403访问时出错CoinGecko V3 API https www coingecko com api documentations v3 可以观察到 在
  • 保存为 HDF5 的图像未着色

    我目前正在开发一个将文本文件和 jpg 图像转换为 HDF5 格式的程序 用HDFView 3 0打开 似乎图像仅以灰度保存 hdf h5py File Sample h5 img Image open Image jpg data np
  • 为什么从 Pandas 1.0 中删除了日期时间?

    我在 pandas 中处理大量数据分析并每天使用 pandas datetime 最近我收到警告 FutureWarning pandas datetime 类已弃用 并将在未来版本中从 pandas 中删除 改为从 datetime 模块
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • 处理 Python 行为测试框架中的异常

    我一直在考虑从鼻子转向行为测试 摩卡 柴等已经宠坏了我 到目前为止一切都很好 但除了以下之外 我似乎无法找出任何测试异常的方法 then It throws a KeyError exception def step impl contex
  • Python getstatusoutput 替换不返回完整输出

    我发现了这个很棒的替代品getstatusoutput Python 2 中的函数在 Unix 和 Windows 上同样有效 不过我觉得这个方法有问题output被构建 它只返回输出的最后一行 但我不明白为什么 任何帮助都是极好的 def
  • 在Python中连接反斜杠

    我是 python 新手 所以如果这听起来很简单 请原谅我 我想加入一些变量来生成一条路径 像这样 AAAABBBBCCCC 2 2014 04 2014 04 01 csv Id TypeOfMachine year month year
  • 如何将张量流模型部署到azure ml工作台

    我在用Azure ML Workbench执行二元分类 到目前为止 一切正常 我有很好的准确性 我想将模型部署为用于推理的 Web 服务 我真的不知道从哪里开始 azure 提供了这个doc https learn microsoft co
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • 如何使用 Mysql Python 连接器检索二进制数据?

    如果我在 MySQL 中创建一个包含二进制数据的简单表 CREATE TABLE foo bar binary 4 INSERT INTO foo bar VALUES UNHEX de12 然后尝试使用 MySQL Connector P
  • 在 Sphinx 文档中*仅*显示文档字符串?

    Sphinx有一个功能叫做automethod从方法的文档字符串中提取文档并将其嵌入到文档中 但它不仅嵌入了文档字符串 还嵌入了方法签名 名称 参数 我如何嵌入only文档字符串 不包括方法签名 ref http www sphinx do
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 从 NumPy ndarray 中选择行

    我只想从 a 中选择某些行NumPy http en wikipedia org wiki NumPy基于第二列中的值的数组 例如 此测试数组的第二列包含从 1 到 10 的整数 gt gt gt test numpy array nump
  • 如何使用原始 SQL 查询实现搜索功能

    我正在创建一个由 CS50 的网络系列指导的应用程序 这要求我仅使用原始 SQL 查询而不是 ORM 我正在尝试创建一个搜索功能 用户可以在其中查找存储在数据库中的书籍列表 我希望他们能够查询 书籍 表中的 ISBN 标题 作者列 目前 它
  • 如何在 pygtk 中创建新信号

    我创建了一个 python 对象 但我想在它上面发送信号 我让它继承自 gobject GObject 但似乎没有任何方法可以在我的对象上创建新信号 您还可以在类定义中定义信号 class MyGObjectClass gobject GO
  • python import inside函数隐藏现有变量

    我在我正在处理的多子模块项目中遇到了一个奇怪的 UnboundLocalError 分配之前引用的局部变量 问题 并将其精简为这个片段 使用标准库中的日志记录模块 import logging def foo logging info fo
  • 实现 XGboost 自定义目标函数

    我正在尝试使用 XGboost 实现自定义目标函数 在 R 中 但我也使用 python 所以有关 python 的任何反馈也很好 我创建了一个返回梯度和粗麻布的函数 它工作正常 但是当我尝试运行 xgb train 时它不起作用 然后 我
  • 模拟pytest中的异常终止

    我的多线程应用程序遇到了一个错误 主线程的任何异常终止 例如 未捕获的异常或某些信号 都会导致其他线程之一死锁 并阻止进程干净退出 我解决了这个问题 但我想添加一个测试来防止回归 但是 我不知道如何在 pytest 中模拟异常终止 如果我只
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重

随机推荐

  • kafka详解及集群环境搭建

    一 kafka详解 安装包下载地址 https download csdn net download weixin 45894220 87020758 1 1Kafka是什么 1 Kafka是一个开源消息系统 由Scala写成 是由Apac
  • layout注意事项_注意事项

    layout注意事项 In the post we will look at how you can orchestrate real time customer journeys with Adobe s Journey Orchestr
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • from: can't read /var/mail/xxx 解决方法

    在执行一个发包脚本的时候 遇到了如下问题 from can t read var mail scapy all 原因 脚本是没有问题的 但它并不是可以被python执行的可执行文件 解决方法 1 使用python 脚本名字 命令执行脚本 2
  • k210自学快速入门(附网址)

    一 获得下载工具IDE https dl sipeed com MAIX MaixPy ide 安装和配置见该博客 http t csdn cn 464lj 二 下载固件 1 用于程序的执行下载站 Sipeed 注意 minimum是最小版
  • sqlalchemy create_engine关于连接池的几个参数

    pool size 设置连接池中 保持的连接数 初始化时 并不产生连接 只有慢慢需要连接时 才会产生连接 例如我们的连接数设置成pool size 10 如果我们的并发量一直最高是5 那么我们的连接池里的连接数也就是5 当我们有一次并发量达
  • 级联菜单的动态实现(数据库绑定)

    效果预览 数据库设计 第一类型 第二类型 第三类型 Controller层代码 RequestMapping noFilterGetAllInfo public void noFilterGetAllInfo Integer firstSe
  • 【调试经验】MySQL - fatal error: mysql/mysql.h: 没有那个文件或目录

    机器环境 Ubuntu 22 04 3 LTS 报错问题 在编译一个项目时出现了一段SQL报错 CGImysql sql connection pool cpp 1 10 fatal error mysql mysql h 没有那个文件或目
  • python推荐系统学习笔记(5)——基于图的模型推荐算法

    python推荐系统学习笔记 5 基于图的模型推荐算法 2 1 用户行为数据的二分图表示 为可以把基于邻域的模型看作基于图的模型的简单形式 用户物品二分图模型 对于数据集中每一个二元组 u i 图中都有一套对应的边e vu vi 其中vu属
  • java listnode 合并链表_java实现链表合并

    输入两个单调递增的链表 输出两个链表合成后的链表 当然我们需要合成后的链表满足单调不减规则 最容易想到的就是新建一个链表 一个一个将节点连接到新链表中 代码 public ListNode Merge ListNode list1 List
  • Linux C/C++解析xls

    libxls作为开源库 支持在Linux C C 环境下解析 读 xls文件 github提供了源码 https github com libxls libxls 但是github的源码需要一堆辅助工具 才能够编译出libxls的C静态库
  • C++中while循环中cin语句被跳过问题解析

    今天在写代码的时候 遇到了一个非常奇怪的问题 while true int select cout lt lt 请输入查找的方式 lt lt endl cout lt lt 1 按职工编号查找 lt lt endl cout lt lt 2
  • 学习数据数据结构的意义

    来源 我是码农 转载请保留出处和链接 本文链接 http www 54manong com id 18 什么是数据结构 为什么要学习数据结构 数据结构是否是一门纯数学课程 它在专业课程体系中起什么样的作用 我们要怎么才能学好数据结构 相信同
  • TCP建立连接三次握手和释放连接四次握手

    TCP建立连接三次握手和释放连接四次握手 尊重原创 转载请注明出处 http blog csdn net guyuealian article details 52535294 在谈及TCP建立连接和释放连接过程 先来简单认识一下TCP报文
  • 哪里期货开户低手续费高交返

    国内商品期货开户流程和股票开户的流程很像似 没有开过期货户的 想要开期货户只需要知道这个就行了 可以考虑传统方式去营业部线下开户 但是线下开户弊端手续费较高 地区性垄断 前些年网上开户还没普及时 基本都采用线下开户的方式 随着互联网时代的到
  • QTextCodec中的setCodecForTr等终于消失了 (Qt5)

    在Qt4中 国内很多新手都喜欢 不分青红皂白地使用如下3行代码 QTextCodec setCodecForTr QTextCodec setCodecForCStrings QTextCodec setCodecForLocale 尽管之
  • C++设计模式——单例模式

    我们应该知道 C 中有21种设计模式 常见的有单例模式 迭代器模式 工厂模式 抽象工厂模式 观察者模式 今天我们先来说一下单例模式 单例模式 Singleton 是设计模式中最为简单 最为常见 最容易实现的模式 单例模式就是怎样去创建一个唯
  • 基于Simulink的BPSK调制通信系统建模和仿真

    基于Simulink的BPSK调制通信系统建模和仿真 本文将介绍如何使用Matlab的Simulink工具进行BPSK调制通信系统的建模和仿真 BPSK Binary Phase Shift Keying 是一种常用的数字调制技术 适用于低
  • python的ndarray、series和dataframe类型转化

    文章目录 创建ndarray类型数据 使用list创建series series和ndarray转化 series转换为ndarray ndarray转换为series 使用list创建dataframe pd DataFrame 将nda
  • 因果推断-【The MineThatData E-Mail Analytics And Data Mining Challenge】思路分析与Python实现代码

    目录 一 数据集介绍 二 问题及分析思路 1 问题 2 分析思路 三 代码 一 数据集介绍 数据集来源于用户在网上的购物行为 涵盖了过去一年有购买行为的64000个用户 这些用户被用于电子邮件营销活动的实验分析 实验的目的是衡量哪个版本的电