我有一些 CSV 格式的数据(160 亿行,170 列)。
我可以使用
cut
提取每一列,并使用 pd.load_csv()
将文件中的“仅”一列加载到 Pandas 中,但是速度非常慢,并且在加载时使用大约 228GB 的 RAM,然后其中一列又恢复到 46GB而对于其他一些测试者来说,我的 256GB RAM 系统开始交换并逐渐停止。
是否有某种方法可以相当快且需要较少的 RAM 来计算每列的标准统计数据,例如平均值、中位数、标准差和标准误差?
系统都运行 Ubuntu 20.04.3 LTS,我可以通过标准存储库安装任何可用的软件包。
注意:有些列有
u
表示未知/缺失数据,而有些列则没有任何内容,但除此之外,所有列都是整数或浮点数。
如果有人正在寻找答案,评论中有一些关于不使用 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)