python计算消费总额_【数据分析案例】用户消费行为
"""user_ud 用戶ID
order_dt: 購買日期
order_products: 購買產(chǎn)品數(shù)
order_amount: 購買金額"""
importpandas as pdimportnumpy as npimportmatplotlib.pyplot as plt
pd.set_option('display.max_columns', None) #顯示完整的列
pd.set_option('display.max_rows', None) #顯示完整的行
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽
columns= ['用戶ID','購買日期','購買產(chǎn)品數(shù)','購買金額']
data= pd.read_table('CDNOW_master.txt',names=columns,sep='\s+') #names設(shè)置表頭 \s+任意的空字符串
#查看是否存在缺失值#print(data.info())
#order_dt: 購買日期 轉(zhuǎn)換成日期類型
#def time_style(x):#time = str(x)[0:4] + "-" + str(x)[4:6] + "-" + str(x)[6:8]#return time#data['購買日期'] = data['購買日期'].apply(time_style)
data['購買日期'] = pd.to_datetime(data['購買日期'],format="%Y%m%d")#print(data.head(3).dtypes)
#計算每個用戶購買商品的平均數(shù)量#print(data.groupby('用戶ID')['購買產(chǎn)品數(shù)'].mean())
#計算所每個用戶購買商品的平均花費(fèi)#print(data.groupby('用戶ID')['購買金額'].mean())
#describe是描述統(tǒng)計 # 計算所有用戶購買商品的平均數(shù)量#print(data.describe())
#M 對月進(jìn)行統(tǒng)計
data['month'] = data['購買日期'].values.astype('datetime64[M]')print(data.head())#用戶每月花費(fèi)的總金額
use_months_by = data.groupby('month')['購買金額'].sum()#print(use_months_by)#
#plt.figure(figsize=(5,4))#plt.plot(use_months_by.index,use_months_by.values,label="用戶每月花費(fèi)的總金額")#plt.legend(loc=0)#plt.savefig("用戶每月花費(fèi)的總金額.jpg")#plt.show()
#所有用戶每月的產(chǎn)品購買量#print(data.groupby('month')['購買產(chǎn)品數(shù)'].sum())
#所有用戶每月的消費(fèi)總次數(shù)#print(data.groupby('month')['用戶ID'].count())
#統(tǒng)計每月的消費(fèi)人數(shù) # 同一個人可能消費(fèi)多次,所以 消費(fèi)人數(shù) 只能是唯一的 .nunique() 去重后余下的#print(data.groupby('month')['用戶ID'].nunique())
#各個用戶消費(fèi)總金額和消費(fèi)總次數(shù)的統(tǒng)計描述#print("各個用戶消費(fèi)總金額",data.groupby('用戶ID')['購買金額'].sum())#print("各個用戶消費(fèi)總次數(shù)",data.groupby('用戶ID')['購買產(chǎn)品數(shù)'].nunique())
#print(data.groupby('用戶ID').sum().describe())
#各個用戶消費(fèi)總金額和消費(fèi)總次數(shù)的散點(diǎn)圖#plt.scatter(data.groupby('用戶ID').sum()['購買產(chǎn)品數(shù)'],#data.groupby('用戶ID').sum()['購買金額'])#plt.xlabel("購買產(chǎn)品數(shù)")#plt.ylabel("購買金額")#plt.show()
#各個用戶消費(fèi)總金額的直方分布圖(消費(fèi)金額在1000之內(nèi)的分布)#總結(jié):在groupby條件后直接限制條件, 限制條件后的結(jié)果取值 作圖#data_f = data.groupby('用戶ID').sum().query(" 購買金額 < 1000 " )['購買金額']#print(data_f)#plt.hist(data_f,bins=10) # bins柱子的個數(shù)#plt.show()
#各個用戶消費(fèi)總次數(shù)的直方分布圖(消費(fèi)次數(shù)在于100內(nèi))#by_number = data.groupby('用戶ID').sum().query('購買產(chǎn)品數(shù) < 100')['購買產(chǎn)品數(shù)']#print(by_number)#plt.hist(by_number,bins=30)#plt.show()
#消費(fèi)次數(shù)在100以內(nèi)的 只有8個人消費(fèi)次數(shù)超過100#print((data['用戶ID'].value_counts() < 100).value_counts() ) # 每個data['用戶ID']出現(xiàn)的次數(shù)(出現(xiàn)次數(shù) == 消費(fèi)的次數(shù))#True 23562#False 8
#用戶第一次消費(fèi)的月的分布,和人數(shù)統(tǒng)計 month已經(jīng)轉(zhuǎn)成時間數(shù)據(jù)類型#print(data.groupby('用戶ID')['month'].min()) # 分組出用戶ID,然后選出分組后每個用戶ID最小的那個#print(data.groupby('用戶ID')['month'].min().value_counts()) # 每個月份的人數(shù)統(tǒng)計#data.groupby('用戶ID')['month'].min().value_counts().plot() # 首購分布圖#plt.show()
#用戶最后一次消費(fèi)的時間分布,人數(shù)統(tǒng)計#print(data.groupby('用戶ID')['month'].max())#print(data.groupby('用戶ID')['month'].max().value_counts())#data.groupby('用戶ID')['month'].max().value_counts().plot() # 最后一次購買的時間分布圖#plt.show()
#新用戶 (只購買一次)
#獲取每個用戶的首購 跟尾夠#第一種方式(結(jié)果是錯誤的)因?yàn)槭且淮蜗M(fèi)的用戶,所有只要挑出購買產(chǎn)品數(shù)為1的 ) 學(xué)到的知識是 判斷兩數(shù)組對比方式#data_left = data.groupby("用戶ID")['month'].agg(['min','max']) # 得到min max日期#print((data_left['min'] == data_left['max']).value_counts())
#print( (data.groupby("用戶ID")['購買產(chǎn)品數(shù)'].sum() == 1).value_counts().values) # 第二種方式[X,X1]
#每個用戶的總購買量 總消費(fèi)金額 and 最近一次消費(fèi)的表格rfm (每個用戶在最近的一次消費(fèi))
rfm = data.pivot_table(index='用戶ID',aggfunc={'購買產(chǎn)品數(shù)':'sum','購買金額':'sum','購買日期':'max',})#每個用戶最近一次交易的時間間隔 (購買日期 - 購買日期的最大值) || 去掉days: / np.timedelta64(1,'D')
rfm['R'] = -(rfm['購買日期'] - rfm['購買日期'].max()) / np.timedelta64(1,'D')#修改名字
rfm.rename(columns={'購買金額':'M',"購買產(chǎn)品數(shù)":"F"},inplace=True)#print(rfm.head())
## 分層次
defrfm_func(x):
level= x.map(lambda x:'1' if x >= 0 else '0') #如果是負(fù)數(shù)的就是0,不是就是1
laber = level.R + level.F + level.M #拼接成 d 對應(yīng)的數(shù)值 進(jìn)行區(qū)分客戶等級
d ={'111':'重要價值客戶','011':'重要保持客戶','101':'重要挽留客戶','001':'重要發(fā)展客戶','110':'一般價值客戶','010':'一般保持客戶','100':'一般挽留客戶','000':'一般發(fā)展客戶',
}
result=d[laber]returnresult
rfm['laber'] =rfm[['R','F','M']].apply(lambda x: x - x.mean()).apply(rfm_func,axis=1)#print(rfm)
#print(rfm.groupby('laber').count())
#
#rfm.loc[rfm.laber == '重要價值客戶','color'] = 'g'#rfm.loc[~(rfm.laber == '重要價值客戶'),'color'] = 'r'#rfm.plot.scatter("F",'R',c = rfm.color)#plt.show()
#統(tǒng)計每個用戶每個月的消費(fèi)次數(shù)
user_order_count_data = data.pivot_table(index='用戶ID',values='購買日期',aggfunc='count',columns='month').fillna(0).head()#1 0 0 0 0 0 0#2 0 0 0 0 0 0
#統(tǒng)計每個用戶每個月是否消費(fèi) 消費(fèi)記錄為1 否者記錄消費(fèi)為0#apply 每一行的數(shù)據(jù)#applymap() 每一個數(shù)據(jù)都執(zhí)行一遍
data_purchase = user_order_count_data.applymap(lambda x:1 if x >= 1 else0)#print(data_purchase)
#活躍用戶判斷
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']defactive_status(data):
status=[]for i in range(18):#若本月沒有消費(fèi)
if data[i] ==0:if len(status) >0:if status[i - 1] == 'unreg': #unreg未注冊用戶
status.append('unreg')else:
status.append('unactive') #不活躍用戶
else:
status.append('unreg')#若本月消費(fèi)
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 pd.Series(status, index=col)
p_status= data_purchase.apply(active_status,axis=1) #將每一行數(shù)據(jù)執(zhí)行函數(shù)一次#print(p_status)
print(p_status.replace('unreg',np.NAN).apply(lambda x:pd.value_counts(x)).T)
總結(jié)
以上是生活随笔為你收集整理的python计算消费总额_【数据分析案例】用户消费行为的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python进程池调用实例方法_Pyth
- 下一篇: python升级命令出现错误_pytho