Группируйте несколько столбцов, затем объединяйте набор столбцов в Pandas (он плохо падает по сравнению с data.table таблицы R) - PullRequest
0 голосов
/ 17 октября 2018

Я относительно новичок в мире Python и пытаюсь использовать его в качестве резервной платформы для анализа данных.Я обычно использую data.table для своих нужд анализа данных.

Проблема заключается в том, что когда я запускаю групповую операцию для большого CSV-файла (рандомизированного, заархивированного, загруженного в http://www.filedropper.com/ddataredact_1), Python throws:

группировка панд возвращает getattr (obj, метод) (* args, ** kwds) ValueError: отрицательные измерения недопустимы

ИЛИ (я даже сталкивался ...)

Файл "C: \ Anaconda3 \ lib \ site-packages \ pandas \ core \ reshape \ util.py", строка 65, в cartesian_product для i, x в файле перечисления (X)]Файл "C: \ Anaconda3 \ lib \ site-packages \ pandas \ core \ reshape \ util.py", строка 65 для i, x в перечислении (X)] Файл "C: \ Anaconda3 \ lib \ site-packages \"numpy \ core \ fromnumeric.py ", строка 445, с повтором return _wrapfunc (a, 'repeat', repeat, axis = axis) Файл" C: \ Anaconda3 \ lib \ site-packages \ numpy \ core \ fromnumeric.py ", строка 51, в _wrapfunc return getattr (obj, method) (* args, ** kwds) MemoryError

Я потратил три дня, пытаясь уменьшить размер файла (мне удалось уменьшить размерна 89%), добавляя точки останова, отлаживая его, но я не смог добиться какого-либо прогресса.

Удивительно, но я подумал о том, чтобы выполнить ту же операцию группы / агрегата в data.table в R, и это вряд ли потребовало1 секунда.Более того, мне не нужно было выполнять какие-либо преобразования типов данных и т. Д., Предложенные в https://www.dataquest.io/blog/pandas-big-data/.

. Я также исследовал другие потоки: Как избежать проблем с памятью для GroupBy на больших пандах DataFrame , Панды: df.groupby () слишком медленный для большого набора данных.Какие-нибудь альтернативные методы? и pandas groupby с sum () в большом CSV-файле? .Кажется, что эти темы больше о матричном умножении.Буду признателен, если вы не отметите это как дубликат.

Вот мой код Python:

finaldatapath = "..\Data_R"
ddata = pd.read_csv(finaldatapath +"\\"+"ddata_redact.csv", low_memory=False,encoding ="ISO-8859-1")

#before optimization: 353MB
ddata.info(memory_usage="deep")

#optimize file: Object-types are the biggest culprit.
ddata_obj = ddata.select_dtypes(include=['object']).copy()

#Now convert this to category type:
#Float type didn't help much, so I am excluding it here.
for col in ddata_obj:
    del ddata[col]
    ddata.loc[:, col] = ddata_obj[col].astype('category')

#release memory
del ddata_obj

#after optimization: 39MB
ddata.info(memory_usage="deep")


#Create a list of grouping variables:
group_column_list = [
                 "Business",
                 "Device_Family",
                 "Geo",
                 "Segment",
                 "Cust_Name",
                 "GID",
                 "Device ID",
                 "Seller",
                "C9Phone_Margins_Flag",
                 "C9Phone_Cust_Y_N",
                 "ANDroid_Lic_Type",
                 "Type",
                 "Term",
                 'Cust_ANDroid_Margin_Bucket',
                 'Cust_Mobile_Margin_Bucket',
# #                'Cust_Android_App_Bucket',
                 'ANDroind_App_Cust_Y_N'
]

print("Analyzing data now...")

def ddata_agg(x):
    names = {
        'ANDroid_Margin': x['ANDroid_Margin'].sum(),
        'Margins': x['Margins'].sum(),
        'ANDroid_App_Qty': x['ANDroid_App_Qty'].sum(),
        'Apple_Margin':x['Apple_Margin'].sum(),
       'P_Lic':x['P_Lic'].sum(),
       'Cust_ANDroid_Margins':x['Cust_ANDroid_Margins'].mean(),
       'Cust_Mobile_Margins':x['Cust_Mobile_Margins'].mean(),
       'Cust_ANDroid_App_Qty':x['Cust_ANDroid_App_Qty'].mean()
    }
    return pd.Series(names)

ddata=ddata.reset_index(drop=True)

ddata = ddata.groupby(group_column_list).apply(ddata_agg) 

Код вылетает при .groupby операции.

Может кто-нибудь помочь мне?По сравнению с другими постами, я, вероятно, потратил большую часть времени на этот пост в StackOverflow, пытаясь исправить его и узнать больше о Python.Однако, я достиг насыщения - это еще больше расстраивает меня, потому что пакет R data.table обрабатывает этот файл за <2 секунды.Этот пост не о плюсах и минусах R и Python, а об использовании Python для большей продуктивности.</p>

Я полностью потерян, и я был бы признателен за любую помощь.


Вот мой data.table R код:

path_r = "../ddata_redact.csv"
ddata<-data.table::fread(path_r,stringsAsFactors=FALSE,data.table = TRUE, header = TRUE)

group_column_list <-c(
  "Business",
  "Device_Family",
  "Geo",
  "Segment",
  "Cust_Name",
  "GID",
  "Device ID",
  "Seller",
  "C9Phone_Margins_Flag",
  "C9Phone_Cust_Y_N",
  "ANDroid_Lic_Type",
  "Type",
  "Term",
  'Cust_ANDroid_Margin_Bucket',
  'Cust_Mobile_Margin_Bucket',
  # #                'Cust_Android_App_Bucket',
  'ANDroind_App_Cust_Y_N'
  )

    ddata<-ddata[, .(ANDroid_Margin = sum(ANDroid_Margin,na.rm = TRUE), 
Margins=sum(Margins,na.rm = TRUE), 
Apple_Margin=sum(Apple_Margin,na.rm=TRUE),  
Cust_ANDroid_Margins = mean(Cust_ANDroid_Margins,na.rm = TRUE),  
Cust_Mobile_Margins = mean(Cust_Mobile_Margins,na.rm = TRUE),
Cust_ANDroid_App_Qty = mean(Cust_ANDroid_App_Qty,na.rm = TRUE),
ANDroid_App_Qty=sum(ANDroid_App_Qty,na.rm = TRUE)
), 
by=group_column_list]

У меня 4-ядерный 16 ГБ ОЗУ на машине Win10x64.Я могу предоставить любые детали, необходимые экспертам.

В дополнение к комментарию Йоземца, здесь есть две темы о agg против apply: В чем разница между agg pandas и apply apply? и Различия панд между функциями apply () и aggregate ()

1 Ответ

0 голосов
/ 24 октября 2018

Я думаю, что вы ищете agg вместо apply .Вы можете передать столбцы вложения в функции, которые вы хотите применить, поэтому я думаю, что это будет работать для вас:

ddata = ddata.groupby(group_column_list).agg({
    'ANDroid_Margin'      : sum,
    'Margins'             : sum,
    'ANDroid_App_Qty'     : sum,
    'Apple_Margin'        : sum,
    'P_Lic'               : sum,
    'Cust_ANDroid_Margins': 'mean',
    'Cust_Mobile_Margins' : 'mean',
    'Cust_ANDroid_App_Qty': 'mean'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...