У меня есть набор данных всех категориальных столбцов, из которых мне нужно найти пропорции target_class, то есть 1 в каждом уровне категориальной переменной.А затем добавьте корреляцию каждого уровня с target_class, создав фиктивную переменную.Ниже приведен пример входных данных и ожидаемого вывода:
#Input Data:
df_data = pd.DataFrame(
{'production' : ['1101100000','1101100000','100100000','100100000','1101100000','1101100000','1001000000','1101100000','1101100000','1101100000'],
'enc_svod' : ['Free','Free','Pay','','Pay','Free','Free','','','Pay'],
'status' : [1,0,0,0,1,0,0,0,0,1]}
)
Код для поиска пропорций и корреляции с target_class:
cat_cols = ['production','enc_svod']
# Code to find proportions and correlation with target_class:
# Now traverse through each column and calculate correlation and generate
metrics
cat_count = 0
cat_metrics_df = pd.DataFrame()
for each_col in cat_cols:
df_temp = pd.DataFrame()
df_single_col_data = df_data[[each_col]]
cat_count += 1
# Calculate uniques and nulls in each column to display in log file.
uniques_in_column = len(df_single_col_data[each_col].unique())
nulls_in_column = df_single_col_data.isnull().sum()
print('Working on column %s, converting to dummies and finding correlation with target' %(each_col))
df_categorical_attribute = pd.get_dummies(df_single_col_data[each_col].astype(str), dummy_na=True, prefix=each_col)
df_categorical_attribute = df_categorical_attribute.loc[:, df_categorical_attribute.var() != 0.0]# Drop columns with 0 variance.
df_temp['correlation'] = df_categorical_attribute.corrwith(df_data['status'])
try:
# Calculate Index : Proportions of 1's within each CAT level
frames = [df_single_col_data,df_data['status']]
df_proportions = pd.concat(frames,axis = 1)
df_proportions = df_proportions.fillna('nan').groupby(each_col,as_index = True).mean()
df_proportions.index = [str(df_proportions.index.name) + '_' + str(x) for x in df_proportions.index.values]
df_temp['Index'] = df_temp.join(df_proportions)['status']
df_temp['Attribute'] = str(each_col)
cat_metrics_df = cat_metrics_df.append(df_temp)
except ValueError:
print("Error for column %s:" %(each_col))
continue
Причина, по которой я пробую, кроме как здесь, заключается в том, что для некоторых переменныхОшибка значения Ошибка, как показано ниже:
Traceback (most recent call last):
File "/user/data_processing_functions.py", line 443, in metrics_categorical
df_temp['Index'] = df_temp.join(df_proportions)['disco_status']
File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py", line 2331, in __setitem__
self._set_item(key, value)
File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py", line 2397, in _set_item
value = self._sanitize_column(key, value)
File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py", line 2547, in _sanitize_column
value = reindexer(value)
File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py", line 2539, in reindexer
raise e
File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/frame.py", line 2534, in reindexer
value = value.reindex(self.index)._values
File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/series.py", line 2426, in reindex
return super(Series, self).reindex(index=index, **kwargs)
File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py", line 2515, in reindex
fill_value, copy).__finalize__(self)
File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py", line 2533, in _reindex_axes
copy=copy, allow_dups=False)
File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py", line 2627, in _reindex_with_indexers
copy=copy)
File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/internals.py", line 3886, in reindex_indexer
self.axes[axis]._can_reindex(indexer)
File "/user/anaconda3/lib/python3.6/site-packages/pandas/core/indexes/base.py", line 2836, in _can_reindex
raise ValueError("cannot reindex from a duplicate axis")
ValueError: cannot reindex from a duplicate axis
Для некоторых столбцов существует больше уникальных значений (19), чем число категорий, оставшихся после:
df_categorical_attribute = df_categorical_attribute.loc[:, df_categorical_attribute.var() != 0.0]# Drop columns with 0 variance.
Это происходит, когдаЯ запускаю его на сервере, на котором установлена версия 0.20.3 для панд, тогда как на моем локальном компьютере это самая последняя версия - 0.23.4.Я не уверен, является ли это причиной или есть какая-то другая причина этой ошибки.Я подумал об использовании Try Except, чтобы в случае таких ошибок ValueError пропустить этот столбец.Я не уверен, почему это происходит, я предполагаю, что из-за пробелов в целых данных - 2,5 миллиона строк * 1200 столбцов (я использую выборку - 50000 на локальном уровне), которые, возможно, не фиксируют те случаи, я думаю.