Обработка одного столбца за раз вместо хранения всех данных в памяти в Python - PullRequest
0 голосов
/ 24 мая 2018

У меня большой набор данных в красном смещении (~ 3 миллиона строк и 1500 столбцов).В настоящее время я извлекаю все данные и выполняю некоторую обработку данных, например, вычисление пропущенных значений, создание макетов и т. Д. Я делаю это для каждого столбца, просматривая имена столбцов.Это занимает много памяти из-за размера данных, так как я сохраняю все данные в кадре данных до тех пор, пока обработка не будет завершена.

Я думаю о сохранении данных в CSV, а затем прочитать в каждом столбце, сделатьобработка данных и запись обработанного столбца в CSV.

Data

sv_m1   rev     ioip    dvr_m1  geo
0       15.31   40      0       NJN
0       64.9    0       0       CT
0       18.36   20      0       AX
0       62.85   0       0       AL
0       10.31   20      0       BS
0       12.84   10      13.95   MN
0       69.95   0       0       CT
0       32.81   20      13.95   FX

Так скажу, мой CSV, который имеет все данные: seg_data.csv

Я хочучтобы прочитать в первом столбце, выполнить обработку и записать ее в другой файл csv - final_seg.csv.Затем я хочу сделать то же самое для следующего столбца и следующего и аналогично для всех столбцов.Обработка данных может включать создание фиктивных переменных, если переменная является категориальной, например, geo.Я поддерживаю сопоставление имени и типа переменной в отдельном csv, который загружаю в dict (attribute_dict).

Ниже приведено то, что я делаю в настоящее время после чтения данных из БД и сохранения их в df_data_sample.

df_final = pd.DataFrame()
for column in df_data_sample.columns:
        df_column = df_data_sample[[column]]
        if (((attribute_dict[column] == 'CAT') & (df_column[column].unique().size < 100))==True):
            df_target_attribute = pd.get_dummies(df_column[column], dummy_na=True, prefix=column)
            df_target_attribute.fillna(0) 
            df_final[target_column] = df_target_attribute[[target_column]]


        elif (attribute_dict[column] == 'NUM'):
            #Let's impute with 0 for numeric variables:
            df_target_attribute = df_column
            df_target_attribute.fillna(value=0,inplace=True)
            df_final[column] = df_target_attribute

Таким образом, я не хочу хранить df_data_sample в памяти и загружать только один столбец за раз, обрабатывать его, записывать обработанный столбец (если числовой) и столбцы (фиктивные, если категоричный) в другой CSV.,Это должно происходить для всех столбцов.

Ожидаемый вывод csv

sv_m1   rev     ioip    dvr_m1  geo_NJN geo_CT  geo_AX geo_BS   
0       15.31   40      0       1       0       0       0
0       64.9    0       0       0       1       0       0
0       18.36   20      0       0       0       1       0
0       62.85   0       0       1       0       0       0
0       10.31   20      0       0       0       0       1
0       12.84   10      13.95   0       0       1       0
0       69.95   0       0       0       1       0       0
0       32.81   20      13.95   0       0       0       1

Я думаю, что, поскольку я храню только 1 столбец за раз в памяти, это уменьшит использование моей памяти (в настоящее время идетдо 75% на сервере).

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Параметр usecols в read_csv поможет вам достичь этого.Я бы продолжал загружать подмножества данных снова и снова -

cols = ["sv_m1","rev","ioip","dvr_m1","geo_NJN","geo_CT","geo_AX","geo_BS"]
for col in cols:
    df = pd.read_csv('sample.csv', usecols=[col])
    print(df)

Вместо print(df), очевидно, вы бы выполняли обработку с этим столбцом.

Вы можете использовать if/else, чтобы обслуживать различные обработки для разных столбцов.

Надеюсь, это поможет.

0 голосов
/ 24 мая 2018

чтение CSV-файлов происходит медленно, если исходные данные взяты из CSV-файлов, вы можете прочитать CSV-файлы в chuck и добавить их в hdf5-файл, используя to_hdf(..., append=True).Затем прочитайте колонку по pd.read_hdf(..., columns=[...]).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...