基于Python开发数据宽表实例

搭建宽表作用,就是为了让业务部门的数据分析人员,在日常工作可以直接提取所需指标,快速做出对应专题的数据分析。在实际工作中,数据量及数据源繁多,如果每个数据分析人员都从计算加工到出报告,除了工作效率巨慢也会导致服务器资源紧张。因此建设数据集市层,包含了该宽表层并在非工作时间做自动生成。

本文引用CDNow网站的一份用户购买CD明细数据,梳理业务需求,搭建一套数据宽表。
该CD数据包括用户ID,购买日期,购买数量,购买金额四个字段(此项目中用userid,datatime,products,amounts字段来表示)
业务逻辑参考文章:zhuanlan.zhihu.com/p/109767465

指标维度整理如下:

(实际业务场景中,由于获取的数据维度非常多,基础指标及衍生指标的加工最后有几千个指标都很正常,本次该数据集主要用于提出思路。另外,基于机器学习算法自动生成的衍生指标不在本次文章讨论范围,本次宽表指标主要是从业务角度出发,开发具备可解释性指标)

ps:指标名、统计口径、数据类型、小数位的统一非常重要

数据加载

import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
%matplotlib inline

df = pd.read_table('CDNOW_master.txt',delim_whitespace=True,header=None,names=['userid','datetime','products','amounts'])
df['datetime'] = pd.to_datetime(df['datetime'],format='%Y%m%d')
#加入月维度
df['month'] = df['datetime'].values.astype('datetime64[M]')
df.head()

在这里插入图片描述

一、时间维度

①基础指标:销售额/销量/消费次数/消费人数,可用以支撑RMF模型

#每月的总销售额/销量/消费次数
df_m_total_1 = df.pivot_table(index='month',values=['amounts','userid','products',]
                              ,aggfunc={'amounts':'sum','userid':'count','products':'sum'}) 
#每月的消费人数
df_m_total_consume = pd.DataFrame(df.groupby('month')['userid'].nunique()) 
#合并
df_m_total = pd.merge(df_m_total_1, df_m_total_consume, on=['month']) 
#修改列名
df_m_total.columns = ['m_total_amount','m_total_count','m_total_volumn','m_total_consume'] 

②活跃度指标:新用户/活跃用户/不活跃用户/回流用户

#每个用户每月的消费次数
pivoted_counts = df.pivot_table(index='userid',columns='month',values='datetime',aggfunc='count').fillna(0) 
#1代表本月消费,0代表未消费
df_purchase = pivoted_counts.applymap(lambda x:1 if x>0 else 0) 

col = ['1997-01-01', '1997-02-01', '1997-03-01', '1997-04-01',
               '1997-05-01', '1997-06-01', '1997-07-01', '1997-08-01',
               '1997-09-01', '1997-10-01', '1997-11-01', '1997-12-01',
               '1998-01-01', '1998-02-01', '1998-03-01', '1998-04-01',
               '1998-05-01', '1998-06-01']

def active_status(data): #data是df_purchase的一行
    status=[]
    for i in range(18): #一共有18个月,判断每一个月的消费情况,也可以使用len(df_purchase.columns)
        #若本月没有消费
        if data[i]==0:
            if len(status)>0:#之前有记录
                if status[i-1]=='m_unreg': #一直没有注册,看作未注册用户
                    status.append('m_unreg') #未注册用户
                else:
                    status.append('m_unactive') #这个月没消费,之前消费过
            else:#之前没有记录
                status.append('m_unreg') #第一个月没有消费,未注册
        #若本月消费
        else:
            if len(status)==0:#之前没有记录
                status.append('m_new')  #第一次消费
            else:#之前有记录
                if status[i-1]=='m_unactive':
                    status.append('m_return') #前几个月不活跃,现在又消费了,回流
                elif status[i-1]=='m_unreg':
                    status.append('m_new')  #判断第一次消费
                else:
                    status.append('m_active')  #一直在消费
    return pd.Series(status,index = col)

pivoted_status = df_purchase.apply(active_status,axis = 1)
#用NaN替代m_unreg,以便后续计算不包含这些数据,未注册不考虑
purchase_stats_ct=pivoted_status.replace({'m_unreg':np.NaN}).apply(lambda x:x.value_counts()) 
#分层图
purchase_stats_ct.fillna(0).T.plot.area()
#每月活跃情况数量
df_active_level = purchase_stats_ct.T.fillna(0)
#每月活跃情况数量占比
df_active_level_por = pd.DataFrame(purchase_stats_ct.fillna(0).T.apply(lambda x:x/x.sum(),axis = 1))

③复购类指标:每月购买两次以上的客户数/购买一次的客户数

#购买两次以上标为1,一次为0,无购买记录为空
user_df2=pivoted_counts.applymap(lambda x : 1 if x > 1 else np.NaN if x == 0 else 0)
#汇总转置
user_df3 = user_df2.apply(lambda x:x.value_counts()).T
#修改列名
user_df3.columns=['m_buy_one','m_buy_mul']

④回购类指标:回购人数

#某一个时间窗口内消费的用户,在下一个时间窗口仍旧消费的占比。比如,
#我1月消费用户1000,他们中有400个2月依然消费,回购率是40%。

def purchase_return(data):
    status=[]
    for i in range(17):
        if data[i]==1:
            if data[i+1]==1:
                status.append(1)
            if data[i+1]==0:
                status.append(0)
        else:
            status.append(np.nan)
    status.append(np.nan)  #定义最后一个月的数据
    return pd.Series(status,index = col)

pivoted_purchase_return= df_purchase.apply(purchase_return,axis=1)
#占比图
(pivoted_purchase_return.sum() / pivoted_purchase_return.count()).plot(figsize=(10,4))

#复购人数加总
pivoted_purchase_return2 = pd.DataFrame(pivoted_purchase_return.apply(lambda x:x.sum()))
#修改列名
pivoted_purchase_return2.columns=['m_repurchase']

⑤指标合并

df_m_index = pd.merge(pd.merge(pd.merge(df_m_total,df_active_level_por,right_index=True,left_index=True)
                  ,user_df3,right_index=True,left_index=True),pivoted_purchase_return2,right_index=True,left_index=True)
df_m_index.head()

在这里插入图片描述

二、用户维度

消费总额/消费次数/消费量/首次消费时间/最近一次消费时间/消费间隔

df_user = df.pivot_table(index='userid',values=['datetime','products','amounts']
               ,aggfunc={'datetime':['max','min'],'products':['sum','count'],'amounts':'sum'})
df_user['gap'] = (df_user['datetime']['max']-df_user['datetime']['min'])/np.timedelta64(1,'D')

df_user.columns=['u_total_amount','u_datetime_max','u_datetime_min','u_total_count','u_total_volumn','u_datetime_gap']
df_user.head()

在这里插入图片描述


学习交流,有任何问题还请随时评论指出交流。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python数据分析项目实例包括:使用机器学习进行预测分析,使用 Python 开发网络爬虫,从网站上收集数据,构建基于 Python数据库系统,使用 Python 分析大数据,使用 Python数据进行可视化,以及使用 Python 创建自动化报表。 ### 回答2: Python数据分析项目实例可以涉及各种领域,比如金融、医疗、社交媒体等。这里以一个电商平台的数据分析项目为例进行说明。 假设我们想要对某电商平台的销售数据进行分析,了解产品销售情况和顾客行为。首先,我们需要获取数据,可以从电商平台的数据库中导出销售记录和顾客信息等数据。 接下来,我们可以使用Python中的pandas库进行数据清洗和预处理,例如去除重复数据、处理缺失值等。然后,我们可以使用pandas进行数据的基本统计分析,如平均销售额、销售量最多的产品等。 此外,我们可以使用matplotlib库绘制可视化图表,比如折线图、柱状图等,来展示产品销售趋势和销售额的变化。通过图表可以直观地看到哪些产品受欢迎,哪些时间段销售量高等等。 另外,我们也可以使用Python的机器学习库scikit-learn对用户行为进行分析。例如,我们可以使用聚类算法对用户进行分群,了解不同用户群体的购买偏好和行为特点,从而为推广和营销提供决策支持。 最后,我们可以利用Python的Web开发框架(例如Flask或Django)搭建一个数据分析报告的网页应用,将分析结果呈现给决策者和其他相关人员,方便他们了解销售情况和用户行为,以便做出相应的业务调整和优化。 综上所述,Python数据分析项目实例可以通过数据获取、数据清洗、统计分析和可视化呈现等步骤,对电商平台销售数据进行深入研究和分析,为决策提供可靠的数据支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值