第五次练习

手机中的相机是深受大家喜爱的应用之一,现在该手机厂商想要分析手机中的应用(相机)的活跃情况,需统计如下数据:

某日活跃用户(用户id)在后续的一周内的留存情况(计算次日留存用户数,3日留存用户数,7日留存用户数)

指标定义:

•某日活跃用户数,某日活跃的去重用户数。
•N日活跃用户数,某日活跃的用户数在之后的第N日活跃用户数。
•N日活跃留存率,N日留存用户数/某日活跃用户数
•例:登陆时间(20180501日)去重用户数10000,这批用户在20180503日仍有7000人活跃,则3日活跃留存率为7000/10000=70%


image.png

1、分别用Python、sql导入附件(相机.xlsx)的数据进入自己的Mysql当中,要求字段符合、表名符合(可加后缀区分)。

import pandas as pd
import numpy as np
import pymysql
pymysql.install_as_MySQLdb()
from sqlalchemy import create_engine
excel_tab = pd.read_excel('camera_app.xlsx', sheetname='Sheet1')
excel_tab.head()

engine=create_engine("mysql://root@localhost/camera_app_ana?charset=gbk")
excel_tab.to_sql("camear_app_ana_table", con = engine)

2、分析pd.to_sql中的if_exist参数可用哪些,分别是什么,有什么细节区别?认为用哪种更好。

  • fail 直接插入失败
  • append 在原来数据上面追加
  • replace 删除原来的数据,插入新数据。
    一般情况下append好一些

3、总结MYSQL的date_format、concat的用法,并以此数据举例说明。
concat('a', 1, 'b')---->a1b
4、利用MYSQL语句解题,分步骤达到目的再一次性运行,达到题目要求。

•(1)求活跃度计算
•(2)次日留存
•(3)延伸 次日、三日、七日留存

with tab_temp 
as( select uid, dayno from camear_app_ana_table 
where cast(app_name as char(64))='相机' 
GROUP BY uid, dayno) ,-- 去重,只保留相机
temp1 
as( select uid as uid1 from tab_temp where day(dayno)=1 ), 
temp2 
as( select uid as uid2 from tab_temp where day(dayno)=1+1 ), 
temp3 
as( select uid as uid3 from tab_temp where day(dayno)=1+2 ), 
temp7 
as( select uid as uid7 from tab_temp where day(dayno)=1+6 ) 
select count(uid1) as 活跃用户数, 
count(uid2) as 次日留存数 , 
count(uid3) as 三日留存数, 
count(uid7) as 七日留存数, 
count(uid2)/count(uid1) as 次日留存率, 
count(uid3)/count(uid1) as 三日留存率, 
count(uid7)/count(uid1) as 七日留存率 
from ((temp1 left join temp2 on uid1=uid2) --注意连环join的写法
 left join temp3 on uid1=uid3) 
left join temp7 on uid1=uid7;
image.png

5、用Python解题,要求函数封装,利用调用函数计算。

方法一

目标是转为这种样式


image.png
# 先是一堆预处理
cam_data = excel_tab[ excel_tab.app_name=='相机'].copy() # 筛选
cam_data = cam_data.groupby(['uid', 'dayno']).count().reset_index() # 去重

cam_data['day']=cam_data.dayno.apply(lambda x:x.day) # 抽取天 更直观
cam_pure_data = cam_data[ ['uid', 'day']] # 只保留最核心的两列

# groupby
grouped_uid = cam_pure_data.groupby('uid')
grouped_uid

# 把groupby 行转列,搞成新的df
ret_df = pd.DataFrame(columns=range(1,11))
for uid, day_df in grouped_uid:
    day_df_indexed = day_df.set_index('day') 
    #  转化为天--》uid的映射df
    #day     
    #3      3
    #4      3
    #10     3

    day_df_indexed['uid'] = 1 # 只需要区分0 1 即可
    day_series_indexed = day_df_indexed.uid # 转为series
    org_zero = pd.Series(range(1, 11), index=range(1, 11))  # 一共就10天 1日到10日
    #print(day_series_indexed)
    maped = org_zero.map(day_series_indexed) # 最神奇的一步,用了摄像机的天将会变为1, 没用的不会变还是0
    #print(maped)
    ret_df.loc[uid] = maped;
    
ret_df.fillna(0, inplace=True)
print((ret_df))

结果如下:


image.png

有了这个表再计算 活跃留存都是轻轻松松。

def cal_from_df(day):
    sub_df = ret_df[ [day, day+1, day+2, day+6] ].copy()
    sub_df[day+1]=sub_df[day]*sub_df[day+1]
    sub_df[day+2]=sub_df[day]*sub_df[day+2]
    sub_df[day+6]=sub_df[day]*sub_df[day+6]
    c1 = sub_df[day].sum()
    c2 = sub_df[day+1].sum()
    c3 = sub_df[day+2].sum()
    c7 = sub_df[day+6].sum()
    return c1, c2, c3, c7, c2/c1, c3/c1, c7/c1

print(cal_from_df(1))
image.png

方法二

def cal(day):
    cam_data = excel_tab[ excel_tab.app_name=='相机'].copy() # 筛选
    cam_data = cam_data.groupby(['uid', 'dayno']).count().reset_index() # 去重
    
    cam_data['day']=cam_data.dayno.apply(lambda x:x.day) # 抽取天 更直观
    cam_pure_data = cam_data[ ['uid', 'day']] # 只保留最核心的两列
    #print(cam_pure_data)
    set1 = cam_pure_data.loc[cam_pure_data['day']==day]
    set2 = cam_pure_data.loc[cam_pure_data['day']==day+1]
    set3 = cam_pure_data.loc[cam_pure_data['day']==day+2]
    set7 = cam_pure_data.loc[cam_pure_data['day']==day+6]
    c1 = set1.uid.count()
    merged = pd.merge(set1, set2, how='left', on='uid')
    c2 = merged.day_y.count()
    merged = pd.merge(set1, set3, how='left', on='uid')
    c3 = merged.day_y.count()
#     print(merged)
#     print(set1, set3)
    merged = pd.merge(set1, set7, how='left', on='uid')
#     print(merged)
#     print(set1, set7)
    c7 = merged.day_y.count()
    return c1, c2, c3, c7, c2/c1, c3/c1, c7/c1
print(cal(1))
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容