У меня большой CSV-файл (6 ГБ), и я хочу взять 20% его выборки.

Эти 20% должны иметь тот же дистрибутив, что и большой оригинальный файл.

Например, возьмите данные Kaggles: https://www.kaggle.com/c/avazu-ctr-prediction/ данные

Я думал о чанках, но как сделать так, чтобы распределение было таким же?

Пробовал read_csv, фред но без везения.

Посоветуйте, пожалуйста, как мне это сделать? Мой ноутбук не может обрабатывать 6GB CSV-файл.

3
SteveS 20 Авг 2018 в 14:37

3 ответа

Лучший ответ

С библиотекой RevoScaleR у вас есть много возможностей для анализа данных, которые не помещаются в ОЗУ.

Если вам не нравится этот параметр, вы можете сделать большое количество срезов (100 или 200 процентилей) в своем образце и прочитать файл в пакетном режиме, посчитав, сколько записей приходится на каждый срез. Когда вы закончите, вы добавите их, и вы сможете сравнить частотное распределение всего файла с образцом, и вы сможете реализовать ks-тест, рассчитать средние значения весов и сравнить их, или увидеть различия в графическом виде.

1
Juan Antonio Roldán Díaz 20 Авг 2018 в 11:56

Непонятно, что вы имеете в виду под «попробованным фредом, но без везения». Была ли конкретная ошибка? Сколько оперативной памяти у вашего ноутбука?

На моем ноутбуке (с 16 ГБ памяти) файл может быть прочитан без проблем и займет всего 3,7 ГБ в ОЗУ при загрузке

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")
2
Pasha 8 Сен 2018 в 02:10

Одним из способов решения моей проблемы было использование пакета ff в R. Теперь с помощью: ff::read.csv.ffdf() я получил доступ к файлу на моем диске с помощью указателя. После этого я работал над этим как обычно data.table / data_frame / tibble.

Это помогло мне, надеюсь, это поможет вам.

0
SteveS 21 Авг 2018 в 09:25
51929945