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



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

我可以使用CCD_ 1提取每一列;只是";使用pd.load_csv()将文件中的一列转换为Pandas,但速度非常慢,加载时使用了大约228GB的RAM,然后其中一列的RAM恢复到46GB,而对于其他一些测试,我的256GB RAM系统开始交换并停止运行。

是否有某种方法可以合理快速地计算标准统计数据,如每列的平均值、中位数、标准差和标准误差,并且需要更少的RAM?

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

注意:有些列有用于未知/丢失数据的u,而有些列则没有用于相同数据的CCD-3,否则所有列都是整数或浮点。

如果有人在寻找答案,评论中有一些不使用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)

最新更新