You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Polars中应用预初始化的多参数映射函数处理用户ID序列?

使用Polars替代Pandas实现LightFM推荐映射函数

我需要将以下映射函数应用到用户ID的Series上:

def generate_lightfm_recs_mapper(
        model: object,
        item_ids: list,
        known_items: dict,
        user_features: list,
        item_features: list,
        N: int,
        user_mapping: dict,
        item_inv_mapping: dict,
        num_threads: int = 4
        ):
    def _recs_mapper(user):
        user_id = user_mapping[user]
        recs = model.predict(
            user_id,
            item_ids,
            user_features = user_features,
            item_features = item_features,
            num_threads = num_threads)
        
        additional_N = len(known_items[user_id]) if user_id in known_items else 0
        total_N = N + additional_N
        top_cols = np.argpartition(recs, -np.arange(total_N))[-total_N:][::-1] 
        
        final_recs = [item_inv_mapping[item] for item in top_cols]
        if additional_N > 0:
            filter_items = known_items[user_id]
            final_recs = [item for item in final_recs if item not in filter_items]
        return final_recs[:N]
    return _recs_mapper

该映射函数已提前完成初始化:

# init mapper to get predictions
mapper = generate_lightfm_recs_mapper(
    lfm_model, 
    item_ids = all_cols, 
    known_items = dict(),
    N = top_N,
    user_features = None, 
    item_features = None, 
    user_mapping = lightfm_mapping['users_mapping'],
    item_inv_mapping = lightfm_mapping['items_inv_mapping'],
    num_threads = 20
)

在Pandas中我可以通过以下代码实现:

local_test_preds['item_id'] = local_test_preds['user_id'].map(mapper)

但由于数据量过大,我担心该操作执行时间过长。请问能否改用Polars实现该功能?我了解Polars有map_elements和map_batches函数,但现有示例中的函数均在with_columns方法内初始化,而我的映射函数已提前完成初始化,希望得到具体的实现方案。

解决方案

可以直接利用Polars的map_elements函数实现需求,无需在with_columns内重新定义映射函数,以下是具体代码:

import polars as pl

# 假设local_test_preds是Polars DataFrame
local_test_preds = local_test_preds.with_columns(
    pl.col("user_id").map_elements(mapper, return_dtype=pl.List(pl.Utf8)).alias("item_id")
)

关键细节说明

  • map_elements适配预初始化函数:该函数会对user_id列的每个元素直接调用你预初始化好的mapper,逻辑和Pandas的map完全对齐。
  • 明确返回类型:必须通过return_dtype指定返回数据类型,这里因为mapper返回字符串列表,所以用pl.List(pl.Utf8);如果你的item_id是数值类型,替换为pl.List(pl.Int64)等对应类型即可。
  • 性能优化:Polars的map_elements默认使用多线程并行执行,相比Pandas单线程map能大幅提升大数据集的处理速度。若需调整并行度,可提前通过pl.set_thread_pool_size()设置线程数。

如果数据集规模极大,还可以考虑将mapper适配为批量处理函数后使用map_batches进一步优化,但对于绝大多数场景,上述map_elements的实现已经足够高效。

内容的提问来源于stack exchange,提问作者Alisa Petrova

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 01:57:18