У меня большой CSV-файл (6 ГБ), и я хочу взять 20% его выборки.
Эти 20% должны иметь тот же дистрибутив, что и большой оригинальный файл.
Например, возьмите данные Kaggles: https://www.kaggle.com/c/avazu-ctr-prediction/ данные
Я думал о чанках, но как сделать так, чтобы распределение было таким же?
Пробовал read_csv, фред но без везения.
Посоветуйте, пожалуйста, как мне это сделать? Мой ноутбук не может обрабатывать 6GB CSV-файл.
3 ответа
С библиотекой RevoScaleR
у вас есть много возможностей для анализа данных, которые не помещаются в ОЗУ.
Если вам не нравится этот параметр, вы можете сделать большое количество срезов (100 или 200 процентилей) в своем образце и прочитать файл в пакетном режиме, посчитав, сколько записей приходится на каждый срез. Когда вы закончите, вы добавите их, и вы сможете сравнить частотное распределение всего файла с образцом, и вы сможете реализовать ks-тест, рассчитать средние значения весов и сравнить их, или увидеть различия в графическом виде.
Непонятно, что вы имеете в виду под «попробованным фредом, но без везения». Была ли конкретная ошибка? Сколько оперативной памяти у вашего ноутбука?
На моем ноутбуке (с 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")
Одним из способов решения моей проблемы было использование пакета ff
в R. Теперь с помощью: ff::read.csv.ffdf()
я получил доступ к файлу на моем диске с помощью указателя. После этого я работал над этим как обычно data.table
/ data_frame
/ tibble
.
Это помогло мне, надеюсь, это поможет вам.
Похожие вопросы
Новые вопросы
python
Python - это мультипарадигмальный динамически типизированный многоцелевой язык программирования, разработанный для быстрого (для изучения, использования и понимания) и для обеспечения чистого и унифицированного синтаксиса. Обычно используются две похожие, но несовместимые версии Python, Python 2.7 и 3.x. Для специфичных для версии вопросов Python добавьте тег [python-2.7] или [python-3.x]. При использовании варианта или библиотеки Python (например, Jython, PyPy, Pandas, Numpy), пожалуйста, включите их в теги.