从非常大的 CSV 计算粗略统计数据的最佳方法

问题描述 投票:0回答:1

我有一些 CSV 格式的数据(160 亿行,170 列)。

我可以使用

cut
提取每一列,并使用
pd.load_csv()
将文件中的“仅”一列加载到 Pandas 中,但是速度非常慢,并且在加载时使用大约 228GB 的 RAM,然后其中一列又恢复到 46GB而对于其他一些测试者来说,我的 256GB RAM 系统开始交换并逐渐停止。

是否有某种方法可以相当快且需要较少的 RAM 来计算每列的标准统计数据,例如平均值、中位数、标准差和标准误差?

系统都运行 Ubuntu 20.04.3 LTS,我可以通过标准存储库安装任何可用的软件包。

注意:有些列有

u
表示未知/缺失数据,而有些列则没有任何内容,但除此之外,所有列都是整数或浮点数。

python pandas large-data median standard-deviation
1个回答
0
投票

如果有人正在寻找答案,评论中有一些关于不使用 CSV 文件的好建议。

在几乎所有情况下,使用 CSV 以外的其他东西是最好的,但有时(就像我的例子),这是你必须使用的。有几种解决方案效果相当好,具体取决于因素。

我找不到解决方案,所以我自己写了。

计算标准偏差标准误差(和置信区间)不需要将所有变量保存在RAM中;但是,如果您选择不将它们保存在 RAM 中,则必须读取它们两次。一次用于计算平均值,第二次用于计算平均值与值平方之差的总和(有时称为均方)。通过这两个数字和变量数量,您可以计算大多数最常见的统计数据。

示例代码:

#!/usr/bin/env python3
import csv
import math


def calc_some_stats(infile, col_idx):
    n, tot = 0, 0
    with open(infile, 'r') as fh:
        reader = csv.reader(fh)
        for row in reader:
            try:
                val = float(row[col_idx])
                n += 1
                tot += val
            except ValueError:
                # Ignore nulls, 'u', and 'nan'
                pass
            pass
        pass
    mean, sum_mean_sq = tot / n, 0
    with open(infile, 'r') as fh:
        reader = csv.reader(fh)
        for row in reader:
            try:
                val = float(row[col_idx])
                sum_mean_sq += (mean - val)**2
            except ValueError:
                pass
            pass
        pass
    variance = sum_mean_sq / n
    standard_deviation = math.sqrt(variance)
    standard_error = standard_deviation / math.sqrt(n)
    return n, mean, standard_deviation, standard_error


n, mean, stdev, sem = calc_some_stats("somefile.csv", 12)
© www.soinside.com 2019 - 2024. All rights reserved.