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

sg2wtvxw  于 2023-10-14  发布在  其他
关注(0)|答案(1)|浏览(106)

我有一些CSV格式的数据(160亿行,170列)。
我可以使用cut提取每个列,并使用pd.load_csv()将文件中的“仅”一列加载到Pandas中,但它非常慢,并且在加载时使用了大约228 GB的RAM,然后其中一列返回到46 GB,而对于其他一些测试的256 GB RAM的系统,我开始交换并停止。
有没有一种方法可以合理地快速计算,并且需要更少的RAM来计算每个列上的标准统计数据,如平均值,中位数,标准差和标准误差?
系统都运行Ubuntu 20.04.3 LTS,我可以通过标准存储库安装任何可用的软件包。
注意:有些列有u用于未知/缺失数据,而有些列则没有任何相同的数据,否则所有列都是整数或浮点数。

vmpqdwk3

vmpqdwk31#

如果有人正在寻找答案,评论中有一些不使用CSV文件的好建议。
在几乎所有情况下,使用CSV以外的东西是最好的,但有时(就像我的情况),这是你必须使用的。有几个解决方案,工作相当不错,这取决于因素。
我找不到解决办法,所以我自己写了。
计算Standard DeviationStandard Error(以及Confidence Intervals)不需要在RAM中保存所有变量;但是,如果您选择不在RAM中保存它们,则必须读取它们两次。一次计算Mean,第二次计算平均值与平方值之差的总和(有时称为Mean Squares)。有了这两个数字和变量的数量,你可以计算大多数最常见的统计数据。
示例代码:

#!/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)

相关问题