21、python数据分析项目3

import pandas as pd
import os
###获取数据
path=os.path.join(os.getcwd(),'CDNOW_master.txt')
###第一行不为标题,分隔符为空格,传入列名
df=pd.read_csv(path,header=None,sep='\s+',names=['user_id','order_dt','order_product','order_amount'])
###将日期转化为是时间序列类型
df.order_dt=pd.to_datetime(df.order_dt,format='%Y%m%d')
###获取订单月份
df['order_month']=df['order_dt'].astype('datetime64[M]')
###数据概览
df.describe()
df.info()
df.head()
###获取每月的消费金额
df.groupby(by=['order_month'])['order_amount'].sum()
df.groupby(by=['order_month'])['order_amount'].sum().plot()
###获取每月的购买数量
df.groupby(by=['order_month'])['order_product'].sum()
df.groupby(by=['order_month'])['order_product'].sum().plot()
###获取每月的消费次数
df.groupby(by=['order_month'])['user_id'].count()
###获取每月的消费人数
df.groupby(by=['order_month'])['user_id'].nunique()##去重统计数

在这里插入图片描述

在这里插入图片描述

import matplotlib.pyplot as plt
###用户消费总金额、总数量的统计
order_amount_sum=df.groupby(by=['user_id'])['order_amount'].sum()
order_product_sum=df.groupby(by=['user_id'])['order_product'].sum()
order_count=df.groupby(by=['user_id']).count()['order_dt']
##用户消费总金额与总数量的散点图
plt.scatter(order_amount_sum,order_product_sum)
##用户消费总金额的直方图(<=1000)
order_amount_sum[order_amount_sum<=1000].hist()
df.groupby(by=['user_id']).sum().query('order_amount<=1000')['order_amount'].hist()
##用户消费总数量的直方图(<=100)
order_product_sum[order_product_sum<=100].hist()
df.groupby(by=['user_id']).sum().query('order_product<=100')['order_product'].hist()

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

###用户第一次消费的月份
df.groupby(by=['user_id'])['order_month'].min()
###用户第一次消费的月份分布
df.groupby(by=['user_id'])['order_month'].min().value_counts()
df.groupby(by=['user_id'])['order_month'].min().value_counts().plot()

###用户最后一次消费的月份
df.groupby(by=['user_id'])['order_month'].max()
###用户最后一次消费的月份分布
df.groupby(by=['user_id'])['order_month'].max().value_counts()
df.groupby(by=['user_id'])['order_month'].max().value_counts().plot()
####第一次和最后一次为同一天为新客户,否则为老客户
df1=df.groupby(by=['user_id'])['order_dt'].agg(['min','max'])
(df1['min']==df1['max']).value_counts()

在这里插入图片描述

df1=df.pivot_table(index='user_id',aggfunc={'order_amount':'sum','order_product':'sum','order_dt':'max'})
import numpy as np
max_dt=df['order_dt'].max()
df1['R']=(max_dt-df.groupby(by='user_id')['order_dt'].max())/np.timedelta64(1,'D')
df1.drop('order_dt',axis=1,inplace=True)
df1.columns=['M','F','R']

def rfm_func(x):
    
    level=x.map(lambda x: '1' if x>=0 else '0' )###将函数应用到series的每个元素
    label=level.R+level.F+level.M
    d={'111':'重要价值用户',
       '011':'重要保持用户',
       '101':'重要挽留用户',
       '001':'重要发展用户',
       '110':'一般价值用户',
       '010':'一般保持用户',
       '100':'一般挽留用户',
       '000':'一般发展用户'
        
    }
    result=d[label]
    return result 
###apply默认axis=0,依次传入每一列,为series类型,索引为行索引,axis=0依次传入每一行,为series类型,索引为列索引
###lambda的输入参数为整列,rfm_func的输入参数为整行
df1['label']=df1[['R','F','M']].apply(lambda x: x-x.mean()).apply(rfm_func,axis=1)
df1['label']=df1[['R','F','M']].apply(lambda x: x-x.mean()).apply(rfm_func,axis=1)
###apply默认axis=0,依次传入每一列,为series类型,索引为行索引,axis=0依次传入每一行,为series类型,索引为列索引

在这里插入图片描述

###透视表:columns为列项、index为行向,values为计算的对象,aggfunc为计算的方式
df1=df.pivot_table(columns='order_month',values='order_dt',index='user_id',aggfunc='count',fill_value=0)
####applymap将函数应用到dataframe上
df1.applymap(lambda x: 1 if x>0 else 0 )
####unreg观望用户(前两月没买,第三个月才买,前两个月为观望用户)
####unactive首月购买后,后续月份没有购买的在没有购买的月份钟该用户非活跃
####new当前月首次购买的用户,当前月为新用户
####active连续月份购买的用户在这些月中为活跃用户
####return购买之后间隔n月再次购买的第一个月为回头客
def active_status(data):
    status=[]
    for i in range(18):
        ###若本月没有消费
        if data[i]==0:
            if len(status)>0:
                if status[i-1]=='unreg':
                    status.append('unreg')
                else:
                    status.append('unactive')
            else:
                status.append('unreg')
        
        else:
            if len(status)==0:
                status.append('new')
            else:
                if status[i-1]=='unactive':
                    status.append('return')
                elif status[i-1]=='unreg':
                    status.append('new')
                else:
                    status.append('active')
    return status
df2=df1.apply(active_status,axis=1) ###将单行输入返回取值的列表,df2为列表组成的series              
df2.head()   

在这里插入图片描述

df3=pd.DataFrame(data=df2.values.tolist(),index=df1.index,columns=df1.columns)###values:Series对象的值作为ndarray返回,tolist:将ndarray转列表
###各种
df3.apply(lambda x:pd.value_counts(x)).fillna(0)   

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值