python pandas 中的分块文件上的数百万个键上的 grouby 出现问题

2023-12-15

我有一个非常大的 CSV 文件(数十千兆),其中包含带有以下列的网络日志:user_id, time_stamp, category_clicked。我必须构建一个记分器来识别用户喜欢和不喜欢的类别。请注意,我有超过 1000 万用户。

我首先把它切成块并存放在一个HDFStore named input.h5然后我用groupby on user_id下列的杰夫的方式.

这是我的数据:大约 2 亿行,1000 万个唯一的 user_ids。

user id | timestamp | category_clicked
20140512081646222000004-927168801|20140722|7
20140512081714121000004-383009763|20140727|4
201405011348508050000041009490586|20140728|1
20140512081646222000004-927168801|20140724|1
20140501135024818000004-1623130763|20140728|3

这是我的 pandas.show_version():

INSTALLED VERSIONS
------------------
commit: None
python: 2.7.6.final.0
python-bits: 64
OS: Windows
OS-release: 8
machine: AMD64
processor: AMD64 Family 21 Model 2 Stepping 0, AuthenticAMD
byteorder: little
LC_ALL: None
LANG: fr_FR

pandas: 0.13.1
Cython: 0.20.1
numpy: 1.8.1
scipy: 0.13.3
statsmodels: 0.5.0
IPython: 2.0.0
sphinx: 1.2.2
patsy: 0.2.1
scikits.timeseries: None
dateutil: 2.2
pytz: 2013.9
bottleneck: None
tables: 3.1.1
numexpr: 2.3.1
matplotlib: 1.3.1
openpyxl: None
xlrd: 0.9.3
xlwt: 0.7.5
xlsxwriter: None
sqlalchemy: 0.9.4
lxml: None
bs4: None
html5lib: None
bq: None
apiclient: None

这是我想要的输出:

对于每个 user_id,一个列表[0.1,0.45,0.89,1.45,5.12,0.,0.,0.45,0.12,2.36,7.8]表示用户对每个类别的分数和全局分数。我无法告诉您有关分数的更多信息,但它需要计算所有时间戳和category_clicked。你不能事后总结或者类似的事情。

这是我的代码:

clean_input_reader = read_csv(work_path + '/input/input.csv', chunksize=500000)
with get_store(work_path+'/input/input.h5') as store:
    for chunk in clean_input_reader:
        store.append('clean_input', chunk,
                     data_columns=['user_id','timestamp','category_clicked'],
                     min_itemsize=15)

    groups = store.select_column('clean_input','user_id').unique()
    for user in groups:
        group_user = store.select('clean_input',where=['user_id==%s' %user])
        <<<<TREATMENT returns a list user_cat_score>>>>
        store.append(user, Series(user_cat_score))

我的问题如下:在我看来,这一行:group_user=store.select('clean_input',where=['user_id==%s' %user])时间复杂度太高了,因为我真的有很多组,而且我确信在例程中存在很多冗余排序store.select如果我应用它一千万次。

为了给你一个估计,我采取250 秒处理 1000 个按键使用这种技术,而不是仅仅1 second在通常的情况下groupby读取全内存 CSV 文件read_csv没有分块。

**********更新***********

应用 Jeff 的哈希方法后,我可以在 1 秒内处理 1000 个键(与完全内存方法的时间相同),并且绝对减少了 RAM 使用量。当然,我以前没有经历过的唯一时间损失是我进行分块、保存 100 个哈希组以及从存储中的哈希组中获取真实组所花费的时间。但这个操作不会超过几分钟。


这是任意缩放此问题的解决方案。这实际上是这个问题的高密度版本here

定义一个函数,将特定组值散列到较少数量的组。我会设计这个,以便它将您的数据集划分为内存中可管理的部分。

def sub_group_hash(x):
    # x is a dataframe with the 'user id' field given above
    # return the last 2 characters of the input
    # if these are number like, then you will be sub-grouping into 100 sub-groups
    return x['user id'].str[-2:]

使用上面提供的数据,这会在输入数据上创建一个分组框架,如下所示:

In [199]: [ (grp, grouped) for grp, grouped in df.groupby(sub_group_hash) ][0][1]
Out[199]: 
                             user id  timestamp  category
0  20140512081646222000004-927168801   20140722         7
3  20140512081646222000004-927168801   20140724         1

with grp作为组的名称,并且grouped作为结果帧

# read in the input in a chunked way
clean_input_reader = read_csv('input.csv', chunksize=500000)
with get_store('output.h5') as store:
    for chunk in clean_input_reader:

        # create a grouper for each chunk using the sub_group_hash
        g = chunk.groupby(sub_group_hash)

        # append each of the subgroups to a separate group in the resulting hdf file
        # this will be a loop around the sub_groups (100 max in this case)
        for grp, grouped in g:

            store.append('group_%s' % grp, grouped,
                         data_columns=['user_id','timestamp','category_clicked'],
                         min_itemsize=15)

现在您有一个包含 100 个子组的 hdf 文件(如果没有代表所有组,则可能更少),每个子组都包含执行操作所需的所有数据。

with get_store('output.h5') as store:

    # all of the groups are now the keys of the store
    for grp in store.keys():

        # this is a complete group that will fit in memory
        grouped = store.select(grp)

        # perform the operation on grouped and write the new output
        grouped.groupby(......).apply(your_cool_function)

因此,在这种情况下,这会将问题减少 100 倍。如果这还不够,那么只需增加 sub_group_hash 即可创建更多组。

您应该争取较小的数量,因为 HDF5 效果更好(例如,不要创建 10M 的子组,这会违背目的,100、1000、甚至 10k 都可以)。但我认为 100 应该对你有用,除非你有一个非常疯狂的群体密度(例如,你在一个群体中有大量的数字,而在其他群体中很少)。

请注意,这个问题很容易扩展;如果需要,您可以将子组存储在单独的文件中,和/或在必要时单独(并行)处理它们。

这应该使你的解决时间大约O(number_of_sub_groups).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python pandas 中的分块文件上的数百万个键上的 grouby 出现问题 的相关文章

  • 使用 pandas.date_range() 生成多个日期时间,每周两个日期

    我在用着pd date range start date end date freq W MON 每周一生成每周频率日期时间start date 2017 01 01 and end date 2017 12 31 这意味着每月大约生成 4
  • McNemar 在 Python 中的测试以及分类机器学习模型的比较 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有用 Python 实现的好的 McNemar 测试 我在 Scipy stats 或 Scikit
  • 尝试从网页Python和BeautifulSoup获取编码

    我试图从网页检索字符集 这会一直改变 目前我使用 beautifulSoup 来解析页面 然后从标题中提取字符集 这工作正常 直到我遇到一个网站 到目前为止 我的代码以及与其他页面一起使用的代码是 def get encoding soup
  • 使用 Python 3 动态插入到 sqlite

    我想使用 sqlite 写入多个表 但我不想提前手动指定查询 有数十种可能的排列 例如 def insert sqlite tablename data list global dbc dbc execute insert into tab
  • python array(10,1) 和 array(10,) 之间的区别

    我正在尝试将 MNIST 数据集加载到数组中 当我使用 X train y train X test y test mnist load data 我得到一个数组 y test 10000 但我希望它的形状为 10000 1 数组 1000
  • 使用 Pytest 的参数化添加测试功能的描述

    当其中一个测试失败时 可以在测试正在测试的内容的参数化中添加描述 快速了解测试失败的原因 有时您不知道测试失败的原因 您必须查看代码 通过每个测试的描述 您就可以知道 例如 pytest mark parametrize num1 num2
  • python celery -A 的无效值无法加载应用程序

    我有一个以下项目目录 azima init py main py tasks py task py from main import app app task def add x y return x y app task def mul
  • 如何在 Python 中的函数入口、内部和退出处进行日志记录

    我希望能够使用 Python 日志记录工具在我的代码中进行简单且一致的日志记录 我能够执行以下操作 我希望所有现有 未来的模块和函数都有 输入 和 完成 日志消息 我不想添加相同的代码片段来定义日志记录参数 如下所示don t want t
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • 时间序列数据预处理 - numpy strides 技巧以节省内存

    我正在预处理一个时间序列数据集 将其形状从二维 数据点 特征 更改为三维 数据点 时间窗口 特征 在这样的视角中 时间窗口 有时也称为回顾 指示作为输入变量来预测下一个时间段的先前时间步长 数据点的数量 换句话说 时间窗口是机器学习算法在对
  • App Engine 实体到字典

    将 google app engine 实体 在 python 中 复制到字典对象的好方法是什么 我正在使用 db Expando 对象 所有属性均为扩展属性 Thanks 有一个名为foo尝试 foo dict
  • Flask 应用程序路由中的多个参数

    烧瓶怎么写app route如果我在 URL 调用中有多个参数 这是我从 AJax 调用的 URL http 0 0 0 0 8888 createcm summary VVV change Feauure 我试图写我的烧瓶app rout
  • 使用seaborn绘制简单线图

    我正在尝试使用seaborn python 绘制ROC曲线 对于 matplotlib 我只需使用该函数plot plt plot one minus specificity sensitivity bs where one minus s
  • 将字符串中的随机字符转换为大写

    我尝试随机附加文本字符串 这样就不只是有像这样的输出 gt gt gt david 我最终会得到类似的东西 gt gt gt DaViD gt gt gt dAviD 我现在的代码是这样的 import random import stri
  • 如何从列表类别中对 pandas 数据框进行排序?

    所以我在下面有这个数据集 我想根据我的列表从 名称 列进行排序 以及按 A 升序和按 B 降序排序 import pandas as pd import numpy as np df1 pd DataFrame from items A 1
  • PyInstaller“ValueError:源代码字符串不能包含空字节”

    我得到了一个ValueError source code string cannot contain null bytes执行命令时pyinstaller main py在具有和不具有管理员权限的cmd中 Traceback most re
  • 仅允许正小数

    在我的 Django 模型中 我创建了一个如下所示的小数字段 price models DecimalField u Price decimal places 2 max digits 12 显然 价格为负或零是没有意义的 有没有办法将小数
  • 将时间添加到日期时间

    我有一个像这样的日期字符串 然后使用strptime 所以就像这样 my time datetime datetime strptime 07 05 15 m d Y 现在我想添加 23 小时 59 分钟my time 我努力了 timed
  • 如何绘制更大的边界框和仅裁剪边界框文本 Python Opencv

    我正在使用 easyocr 来检测图像中的文本 该方法给出输出边界框 输入图像如下所示 Image 1 Image 2 使用下面的代码获得输出图像 But I want to draw a Single Bigger bounding bo
  • Python 中的 Unix cat 函数 (cat * > merged.txt)? [复制]

    这个问题在这里已经有答案了 一旦建立了目录 有没有办法在Python中使用Unix中的cat函数或类似的函数 我想将 files 1 3 合并到 merged txt 我通常会在 Unix 中找到该目录 然后运行 cat gt merged

随机推荐

  • 使用视差屏幕

    我想在我的游戏代码中使用 libgdx 来使用视差屏幕 其中屏幕沿 y 方向移动 我的游戏代码给出为 public class ParallaxLayer public TextureRegion region public Vector2
  • 登录 Python 脚本不起作用:导致日志文件为空

    我有一个具有日志记录功能的脚本 但它停止工作 日志记录 而不是脚本 我写了一个小例子来说明这个问题 import logging from os import remove from os path import exists def se
  • 从azure databricks删除azure sql数据库行

    我在 Azure SQL 数据库中有一个表 我想根据某些条件从该表中删除选定的行 或者从 Azure Databricks 中删除整个表 目前我正在使用truncateJDBC 的属性可以截断整个表而不删除它 然后用新的数据帧重写它 df
  • 如何在 Spring 4 STOMP over WebSocket 配置中回复未经身份验证的用户?

    我正在尝试 Spring 4 WebSocket STOMP 应用程序 有没有办法回复单一未验证用户的条件是每个用户都有唯一的会话 ID 现在我只能广播消息或直接发送到经过验证的 user Controller public class P
  • 使用 equals 比较字符串和整数

    下面代码的输出是false String str 3456 String str1 3456 System out println Integer valueOf str equals str1 我不明白 我以为它会回来true 当我正在准
  • Google colab直接使用Os.listdir访问机器的本地驱动器

    我是 google colab 的新手 我正在弄清楚 google colab 是否能够直接访问我计算机的 cdrive 上的文件 import os path C Users guest Desktop for file in os li
  • 分解日期之间的日期,检查和调整参数

    我使用了一个函数使用函数获取两个日期之间的日期列表效果非常好 但是 我需要对通过的结束日期进行额外检查 有时此日期将为空 因为如果记录仍然是最新的 则不会输入该记录 如果是 我想用当前日期替换它 以便返回从开始日期到当前日期的日期 我想输入
  • 如何设置输入占位符各个部分的样式? [复制]

    这个问题在这里已经有答案了 是否可以对输入占位符的各个部分进行样式设置 一个例子 请输入此处 另请注意 您只能进入一次 你不能用标准做到这一点placeholder属性 我将详细介绍另一种方法 即使用输入元素周围的一些包装器来制作自定义占位
  • 将函数应用于具有多种空白字符的字符串中的每个单词的最Pythonic 方法是什么?

    假设我有一个函数 def f a return a 1 我想将函数 f 应用于字符串上的每个单词 如果字符串仅由空格组成 我可以这样做 gt gt gt s this is a banana gt gt gt join map f s sp
  • 创建带有节点和复选框的 TreeView

    我像这样创建了 TreeView TreeView CreateWindowEx 0 WC TREEVIEW TEXT Tree View WS VISIBLE WS CHILD 0 0 200 500 hwnd HMENU ID TREE
  • 静态表生成适用于 GCC,但不适用于 clang; clang 被窃听了吗?

    我曾经写过一些代码 在编译时为某些模板元编程生成静态表 数组 这个想法是可以在编译时构建 C 风格的字符串 它们只是char数组 这个想法和代码是基于林大卫 s answer include
  • React-Leaflet MapContainer 在状态更新时未使用新位置值进行渲染

    我是基于 Typescript 和 Hook 的 React 应用程序的新传单用户 在我的应用程序中 应用程序使用 chrome 浏览器的地理定位 API 获取了我当前的地理位置 纬度 经度 我已允许浏览器的权限 并且应使用标记在地图中显示
  • Java中如何快速截图?

    我正在实现一个简单的眼动仪 它需要在从网络摄像头捕获视频的同时快速截取屏幕上发生的情况 问题是用机器人来做这件事的方式 这里提到 https stackoverflow com questions 2475303 java library
  • 购物车中每个产品类别仅允许一种产品

    On this 问题 答案我找到了有关如何在 Woocommerce 中的购物车中为每个类别添加一个产品的 PHP 代码 该代码工作得很好 但我想将最新添加的产品添加到购物车 如果购物车中已经有该类别的产品 我想删除最旧的产品 add fi
  • 如何使用 vuetify 使字体大小响应?

    In vuetify他们有排版辅助类 例如 display 4货物用于h1 这是完整列表 当我为某些元素选择 display 1 时 在所有分辨率中 该类都会获得相同的字体大小 34px 我本来期待 display 4屏幕宽度为 1024
  • Spring Cloud Stream @SendTo注释不起作用

    我正在将 Spring Cloud Stream 与 Spring Boot 结合使用 我的应用程序非常简单 示例服务 类 EnableBinding Processor1 class Service public class Exampl
  • 仅用于文件大小的 Windows 命令

    是否有 Windows 命令可以像这样输出指定文件的大小 以字节为单位 gt filesize test jpg 65212 我知道dir命令输出此信息 但它也输出其他信息 我可以轻松编写这样的程序 但如果可能的话 我更愿意使用本机 Win
  • PHP-如何在数组内合并数组[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 php中如何合并n个数组我的意思是我怎样才能完成这样的工作 array merge from result 0 to result count result 1 OR array me
  • Winforms:如何使用C#将图片上传到SQL Server数据库

    我想将图像上传到我的 SQL Server 数据库 我有两个按钮 一个图片框 使用浏览按钮 我可以从磁盘中选择文件 并将其显示在图片框中 问题是我无法将图片从图片框保存到数据库中 请帮我解决代码 欣赏它 您可以直接从其路径保存图像 您已经拥
  • python pandas 中的分块文件上的数百万个键上的 grouby 出现问题

    我有一个非常大的 CSV 文件 数十千兆 其中包含带有以下列的网络日志 user id time stamp category clicked 我必须构建一个记分器来识别用户喜欢和不喜欢的类别 请注意 我有超过 1000 万用户 我首先把它