Обрабатывать подмножество данных на основе типа переменной в python - PullRequest
0 голосов
/ 30 мая 2018

У меня есть данные ниже, которые я храню в CSV (df_sample.csv).У меня есть имена столбцов в списке с именем cols_list.

df_data_sample:

df_data_sample = pd.DataFrame({
                    'new_video':['BASE','SHIVER','PREFER','BASE+','BASE+','EVAL','EVAL','PREFER','ECON','EVAL'],
                    'ord_m1':[0,1,1,0,0,0,1,0,1,0],
                    'rev_m1':[0,0,25.26,0,0,9.91,'NA',0,0,0],
                    'equip_m1':[0,0,0,'NA',24.9,20,76.71,57.21,0,12.86],
                    'oev_m1':[3.75,8.81,9.95,9.8,0,0,'NA',10,56.79,30],
                    'irev_m1':['NA',19.95,0,0,4.95,0,0,29.95,'NA',13.95]
                    })

attribute_dict = {
        'new_video': 'CAT',
        'ord_m1':'NUM',
        'rev_m1':'NUM',
        'equip_m1':'NUM',
        'oev_m1':'NUM',
        'irev_m1':'NUM'
        }

Затем я читаю каждый столбец и выполняю некоторую обработку данных, как показано ниже:

cols_list = df_data_sample.columns
# Write to csv.
df_data_sample.to_csv("df_seg_sample.csv",index = False)
#df_data_sample = pd.read_csv("df_seg_sample.csv")
#Create empty dataframe to hold final processed data for each income level.
df_final = pd.DataFrame()
# Read in each column, process, and write to a csv - using csv module
for column in cols_list:
    df_column = pd.read_csv('df_seg_sample.csv', usecols = [column],delimiter = ',')
    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)
        # Check and remove duplicate columns if any:
        df_target_attribute = df_target_attribute.loc[:,~df_target_attribute.columns.duplicated()]

        for target_column in list(df_target_attribute.columns):
            # If variance of the dummy created is zero : append it to a list and print to log file.
            if ((np.var(df_target_attribute[[target_column]])[0] != 0)==True):
                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

attribute_dict - это словарь, содержащий сопоставление имени переменной: тип переменной как:

{
'new_video': 'CAT'
'ord_m1':'NUM'
'rev_m1':'NUM'
'equip_m1':'NUM'
'oev_m1':'NUM'
'irev_m1':'NUM'
}

Однако для выполнения этой операции столбец за столбцом требуется много времени для набора данных размера ** (5 миллионов строк * 3400 столбцов) **.В настоящее время время работы составляет около 12+ часов.Я хочу максимально уменьшить это, и один из способов, который я могу придумать, - это выполнить обработку для всех столбцов NUM одновременно, а затем переходить от столбца к столбцу для переменных CAT.Однако я не уверен ни в коде на Python, чтобы добиться этого, ни в том, действительно ли это ускорит процесс.Может ли кто-нибудь помочь мне!

Ответы [ 2 ]

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

Для числовых столбцов это просто:

num_cols = [k for k, v in attribute_dict.items() if v == 'NUM']
print (num_cols)
['ord_m1', 'rev_m1', 'equip_m1', 'oev_m1', 'irev_m1']

df1 = pd.read_csv('df_seg_sample.csv', usecols = [num_cols]).fillna(0)

Но код первой части - это проблема производительности, особенно в get_dummies для 5 million rows:

df_target_attribute = pd.get_dummies(df_column[column], dummy_na=True, prefix=column)

К сожалению, есть проблемные процессы get_dummies в кусках.

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

Я бы посоветовал вам ускорить вычисления:

  1. Взгляните на панд HDF5 capabilites.HDF - это двоичный формат файла для быстрого чтения и записи данных на диск.
  2. Я бы прочитал более крупные куски (несколько столбцов) вашего CSV-файла за раз (в зависимости от объема вашей памяти).
  3. Существует множество операций с пандами, которые вы можете применить к каждому столбцу одновременно.Например, nunique () (дает вам количество уникальных значений, поэтому вам не нужно unique (). Size).С помощью этих операций по столбцам вы можете легко фильтровать столбцы, выбирая их с помощью двоичного вектора.Например,
df = df.loc[:, df.nunique() > 100] 
#filter out every column where less then 100 unique values are present

Также этот ответ от автора pandas о работе с большими данными может быть интересен для вас.

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