在R / Python中分析巨大的csv文件并根据文件的分布对X%进行采样?

问题描述 投票:3回答:3

我有一个大的csv文件(6 GB),我想要20%的样本。

这些20%应与大型原始文件具有相同的分布。

例如,采取Kaggles数据:https://www.kaggle.com/c/avazu-ctr-prediction/data

我考虑过块,但我怎样才能使分布变得相同?

尝试read_csv,fread但没有运气。

请告知我该怎么办?我的笔记本电脑无法处理6GB的csv文件。

python r dataframe datatable
3个回答
1
投票

使用RevoScaleR库,您可以选择多种方法来分析不适合RAM的数据。

如果您不喜欢此选项,则可以在样本中进行大量剪切(100或200百分位),并分批读取文件,计算每次剪切的记录数。完成后,添加它们,您可以将完整文件的频率分布与样本进行比较,您可以实现ks-test,计算权重均值并进行比较,或以图形方式查看差异。


2
投票

目前尚不清楚你的意思是“尝试过,但没有运气”。有特定错误吗?你的笔记本电脑有多少内存?

在我的笔记本电脑上(16GB内存),文件可以毫无问题地读取,加载时只占用3.7GB RAM:

import numpy as np
import datatable as dt
from datatable import f

train = dt.fread("~/datasets/avazu/train.csv")
print(train.shape)
# (40428967, 24)
sample = train[np.random.binomial(1, 0.2, size=train.nrows).astype(bool), :]
sample.to_csv("train20.csv")  # produces roughly 1.25GB file

但是,如果由于某种原因你的计算机真的无法加载原始文件,那么我建议按列分段加载它;然后将相同的切片应用于每个部分,最后结合结果:

train1 = dt.fread("~/datasets/avazu/train.csv", columns=slice(0, 8))
smp = dt.Frame(np.random.binomial(1, 0.2, size=train1.nrows).astype(bool))
sample1 = train1[smp, :]
del train1

train2 = dt.fread("~/datasets/avazu/train.csv", columns=slice(8, 16))
sample2 = train2[smp, :]
del train2

train3 = dt.fread("~/datasets/avazu/train.csv", columns=slice(16, 24))
sample3 = train3[smp, :]
del train3

sample = dt.cbind(sample1, sample2, sample3)
sample.to_csv("train20.csv")

0
投票

解决我的问题的方法之一是在R中使用ff包。现在使用:ff::read.csv.ffdf()我已经使用指针访问了我的磁盘上的文件。之后我作为常规data.table / data_frame / tibble进行了研究。

它帮助了我,希望它能帮到你。

© www.soinside.com 2019 - 2024. All rights reserved.