weixin_52098007 2024-05-28 09:21 采纳率: 55.6%
浏览 11
已结题

推荐算法实习生想问个问题

想问一下各位,推荐系统中曝光量是怎么统计的呢,我思路是将已经查询出的user_id进行value_count,看一下分布,或者直接label encoder 然后看一下斯皮尔满相关性,但有很多其他都feature,我不太确定,还有mentor让我做一个试验,将两个组的曝光度分布统计并且分析出来。

img

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-28 09:21
    关注

    引自免费微信小程序:皆我百晓生

    在推荐系统中,曝光量(impression)通常是指用户在浏览页面时看到某个项目(例如商品、广告或内容)的次数。为了计算这个指标,你需要收集用户的交互数据,比如他们在平台上的点击行为、浏览历史等。对于这个问题,我将为你提供一个详细的步骤指南来完成这个任务。

    首先,确保你有正确的日志数据,这些数据应该包含用户ID、他们查看的内容ID(例如剧集ID)、以及他们是在哪个页面(如Discover页或Foru页)上看到这些内容的信息。另外,也需要用户是否为VIP会员以及他们的充值金额的数据。

    以下是处理这个问题的一个基本框架,我们将使用Python和pandas库来实现。由于这是一个文本环境,我会描述如何编写代码,而不是实际运行它。如果你在本地环境中运行这些代码,可能需要根据你的具体数据格式进行调整。

    1. 导入所需的库:
    import pandas as pd
    from sklearn.preprocessing import LabelEncoder
    
    1. 加载数据:
    # 假设你的数据存储在CSV文件中
    data = pd.read_csv('your_data.csv')
    
    1. 数据预处理:
    # 对user_id进行唯一值计数
    exposure_counts = data['user_id'].value_counts()
    
    # 使用LabelEncoder对user_id进行编码
    le = LabelEncoder()
    data['encoded_user_id'] = le.fit_transform(data['user_id'])
    
    # 计算斯皮尔曼相关性
    from scipy.stats import spearmanr
    corr, _ = spearmanr(exposure_counts.index, exposure_counts.values)
    print(f"Spearman correlation: {corr}")
    
    1. 分析曝光次数(昨天/昨天+前天/三天):
    def calculate_exposures(df, group):
        # 根据实验组和对照组过滤数据
        group_df = df[df['group'] == group]
        
        # 重置索引并添加时间戳列
        group_df.reset_index(inplace=True, drop=True)
        group_df['timestamp'] = pd.to_datetime(group_df['timestamp'])
        
        # 计算昨天、昨天+前天和三天的曝光次数
        yesterday_exp = group_df[group_df['timestamp'] > pd.Timestamp.now() - pd.Timedelta(days=1)]
        yesterday_plus_yesterday_before_exp = group_df[
            (group_df['timestamp'] > pd.Timestamp.now() - pd.Timedelta(days=2)) & 
            (group_df['timestamp'] <= pd.Timestamp.now() - pd.Timedelta(days=1))
        ]
        three_days_exp = group_df[group_df['timestamp'] > pd.Timestamp.now() - pd.Timedelta(days=3)]
    
        return {
            'yesterday': len(yesterday_exp),
            'yesterday_plus_yesterday_before': len(yesterday_plus_yesterday_before_exp),
            'three_days': len(three_days_exp)
        }
    
    experiment_group_stats = calculate_exposures(data, "foru-test1")
    control_group_stats = calculate_exposures(data, "foru-base")
    
    print("Experiment group exposures:")
    print(experiment_group_stats)
    print("Control group exposures:")
    print(control_group_stats)
    
    1. 用户充值情况(VIP/非VIP,金额,人数):
    def calculate_charges(df, group):
        group_df = df[df['group'] == group]
        
        vip_charges = group_df[group_df['is_vip'] == True]['charge_amount'].sum()
        non_vip_charges = group_df[group_df['is_vip'] == False]['charge_amount'].sum()
        vip_users = group_df[group_df['is_vip'] == True].shape[0]
        non_vip_users = group_df[group_df['is_vip'] == False].shape[0]
    
        return {
            'total_vip_charges': vip_charges,
            'total_non_vip_charges': non_vip_charges,
            'vip_users': vip_users,
            'non_vip_users': non_vip_users
        }
    
    vip_charges_stats = calculate_charges(data, "foru-test1")
    non_vip_charges_stats = calculate_charges(data, "foru-base")
    
    print("VIP charges stats:")
    print(vip_charges_stats)
    print("Non-VIP charges stats:")
    print(non_vip_charges_stats)
    
    1. Discover页和Foru页的充值情况:
    def calculate_page_charges(df, page, group):
        group_df = df[(df['group'] == group) & (df['page'] == page)]
        
        total_charges = group_df['charge_amount'].sum()
        num_users = group_df.shape[0]
        
        return {
            'total_charges': total_charges,
            'num_users': num_users
        }
    
    discover_charges_stats = calculate_page_charges(data, "Discover", "foru-test1")
    foru_charges_stats = calculate_page_charges(data, "Foru", "foru-test1")
    
    print("Discover page charges stats:")
    print(discover_charges_stats)
    print("Foru page charges stats:")
    print(foru_charges_stats)
    
    1. 用户观看剧集情况(人剧集数):
    def calculate_episode_views(df, group):
        group_df = df[df['group'] == group]
        
        user_episode_counts = group_df.groupby(['user_id', 'episode_id']).size().reset_index(name='count')
        
        return user_episode_counts
    
    user_episode_counts = calculate_episode_views(data, "foru-test1")
    
    print("User episode counts:")
    print(user_episode_counts.head())
    

    以上代码仅作为参考,并未考虑到所有可能的数据结构和异常情况。根据实际情况,你可能需要进行一些调整。同时,为了可视化结果,可以使用matplotlib或seaborn库创建图表,展示不同组别的曝光次数、充值金额等的对比情况。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月12日
  • 已采纳回答 6月4日
  • 创建了问题 5月28日

悬赏问题

  • ¥15 程序实在不会写,要秃了
  • ¥15 pycharm导入不了自己的包
  • ¥15 C#.net通过内网url地址获取文件并下载问题,浏览器postman可以正常下载,用程序不行
  • ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
  • ¥15 关于R语言单因素与多因素线性回归的平均值
  • ¥15 服务器清除BIOS之后引导不了
  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。
  • ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
  • ¥15 前端预览docx文件,文件从后端传送过来。
  • ¥15 层次聚类和蛋白质相似度