0

0

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

霞舞

霞舞

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

|

772人浏览过

|

来源于php中文网

原创

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

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

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

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

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

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

炫图AI
炫图AI

全能AI修图神器,AI换装、修图、改图、P图

下载
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助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

76

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

12

2026.01.31

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

486

2023.08.14

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

382

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2105

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

357

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

329

2023.10.09

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

4

2026.03.04

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号