讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

AniShort
AniShort

AI短剧协同制作平台

如何高效计算按时间滚动的去重姓名加权均值

风宇小哥_2634

风宇小哥_2634

发布时间:2026-03-04 15:24:03

|

832人浏览过

|

来源于php中文网

原创

如何高效计算按时间滚动的去重姓名加权均值

本文介绍一种高效算法,用于在时间序列数据中动态计算滚动均值,要求同一姓名仅保留最新记录(去重),避免重复计算,适用于面试高频题与实际数据分析场景。

本文介绍一种高效算法,用于在时间序列数据中动态计算滚动均值,要求同一姓名仅保留最新记录(去重),避免重复计算,适用于面试高频题与实际数据分析场景。

在数据分析与算法面试中,常遇到一类“带条件的滚动统计”问题:需按时间维度累积计算统计量(如均值),但不能简单叠加所有历史数据,而要对关键维度(如用户ID、姓名)做去重处理——仅保留每个实体在当前时间窗口内的最新观测值。本例即典型代表:给定按 time 排序的记录,对每个时间点 t,需计算所有 time ≤ t 的记录中,每个 name 仅取其最后一次出现的 val,再求这些值的算术平均。

该问题的关键挑战在于避免暴力重算:若对每个时间点都重新扫描全部历史数据并去重求均值,时间复杂度为 O(n²),在大数据量下不可接受。理想解法应具备增量更新能力——利用前一时刻结果,仅处理新增时间点引入的变化。

以下提供一个清晰、高效且易于理解的 Pandas 实现方案(兼顾可读性与性能):

import pandas as pd

def rolling_mean_unique_name(df, time_col='time', name_col='names', val_col='val', keep='last'):
    """
    计算按时间滚动的去重姓名均值(每姓名仅取当前窗口内最新值)

    Parameters:
    -----------
    df : pd.DataFrame
        输入数据框,必须包含 time_col, name_col, val_col 列
    time_col : str
        时间列名(用于定义滚动窗口边界)
    name_col : str
        实体标识列名(如姓名、用户ID),需去重
    val_col : str
        数值列名(用于计算均值)
    keep : str, {'first', 'last'}
        去重时保留策略,默认保留最新('last')

    Returns:
    --------
    dict : {time_point: mean_value},按时间升序排列的滚动均值字典
    """
    # 确保按时间排序(必要前提)
    df = df.sort_values(time_col).reset_index(drop=True)

    # 初始化存储结构
    means = {}
    # 维护一个动态字典:name -> 最新 val(随时间窗口扩展而更新)
    latest_vals = {}

    # 按时间点顺序遍历(天然有序滚动)
    for t in df[time_col].unique():
        # 获取截至时间 t 的所有记录
        window_df = df[df[time_col] <= t]

        # 更新 latest_vals:对 window_df 中每个 name,用其最后出现的 val 覆盖
        # 注意:因 window_df 已按 time 排序,groupby(...).last() 即取最新
        latest_update = window_df.groupby(name_col)[val_col].last()
        latest_vals.update(latest_update.to_dict())

        # 当前有效值列表(所有已知 name 的最新 val)
        current_values = list(latest_vals.values())

        # 计算均值(空情况防错)
        means[t] = sum(current_values) / len(current_values) if current_values else 0.0

    return means

# 示例数据
data = pd.DataFrame({
    'time': [1, 1, 1, 2, 2, 2],
    'names': ["Andy", "Bob", "Karen", "Andy", "Matt", "Sim"],
    'val': [1, 2, 3, 5, 6, 8]
})

result = rolling_mean_unique_name(data)
print(result)
# 输出: {1: 2.0, 2: 4.8}

✅ 算法优势说明:

  • 时间复杂度优化:单次遍历时间点 + 分组聚合,整体接近 O(n),远优于嵌套循环的 O(n²);
  • 空间友好:仅维护 latest_vals 字典(大小为不重复姓名数),不缓存中间 DataFrame;
  • 逻辑清晰:latest_vals 显式表达“每个姓名当前最新值”的状态,符合人类直觉;
  • 可扩展性强:只需修改 keep 参数即可切换去重策略(如首次出现 first),或轻松适配中位数、加权和等其他统计量。

⚠️ 注意事项:

  • 输入数据必须按 time 严格升序排列,否则 groupby(...).last() 无法保证取到真正“最新”值;建议始终调用 sort_values(time_col) 预处理;
  • 若存在同一 time 内多个同名记录,groupby(...).last() 会取该时间点内行序最后者——因此确保同 time 下的多条同名记录已按业务逻辑(如事件戳)二次排序;
  • 对于超大规模流式数据,可进一步将 latest_vals 替换为 LRU Cache 或结合数据库物化视图实现近实时更新。

总结而言,解决此类“条件滚动统计”问题的核心思维是:将滚动过程建模为状态机——定义清晰的状态(如 latest_vals)、明确状态转移规则(新增时间点时如何更新)、并基于状态直接导出结果。这不仅适用于均值,也广泛适用于滚动去重计数、最新值提取、变化率追踪等工业级分析任务。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1911

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

5344

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1849

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

32437

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3827

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3847

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1263

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

616

2023.08.10

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn