Кодирование и сохранение нескольких массивов в петле for - PullRequest
0 голосов
/ 01 июня 2018

Я предварительно обрабатываю данные для глубокой нейронной сети, и у меня есть переменные, которые мне нужны для горячего кодирования.Пока что это то, что я делаю, и это работает нормально.Однако мне было интересно, смогу ли я реализовать это в цикле for, поскольку это может быть более эффективным?

# Only Educational Establishment Type
X6 = X.drop(['Sex', 'Applicant Domicile (High Level)', 'Applicant Domicile (Low Level)', 'Age Band (5 Levels)', 'POLAR3 Quintile', 'Subject Group (Detailed Level)', 'Subject Group (Summary Level)'], axis=1)
X6 = onehotencoder.fit_transform((X6).apply(encoder.fit_transform)).toarray()
# print(X6.head)

# Only Subject Group (Detailed Level)
X7 = X.drop(['Sex', 'Applicant Domicile (High Level)', 'Applicant Domicile (Low Level)', 'Age Band (5 Levels)', 'POLAR3 Quintile', 'Educational Establishment Type', 'Subject Group (Summary Level)'], axis=1)
X7 = onehotencoder.fit_transform((X7).apply(encoder.fit_transform)).toarray()
# print(X7.head)

# Only Subject Group (Summary Level)
X8 = X.drop(['Sex', 'Applicant Domicile (High Level)', 'Applicant Domicile (Low Level)', 'Age Band (5 Levels)', 'POLAR3 Quintile', 'Educational Establishment Type', 'Subject Group (Detailed Level)'], axis=1)
X8 = onehotencoder.fit_transform((X8).apply(encoder.fit_transform)).toarray()

Мне также нужно сохранить закодированный массив в формате npy для последующего вызова.Я попытался реализовать все это в цикле for следующим образом;однако он не сохраняет файл для каждого массива по своему желанию и фактически не обновляет существующие кадры данных в одну горячо закодированную коллекцию.

all_x = [X, X1, X2, X3, X4, X5, X6, X7, X8]

idx = 0
for num_x in all_x: 
   encoder=LabelEncoder()
   (num_x) = (num_x).apply(encoder.fit_transform)   
   onehotencoder = OneHotEncoder(categorical_features='all')
   (num_x) = onehotencoder.fit_transform(num_x).toarray()
   np.save('X%d' % idx, num_x)
   idx+=1
   print(num_x)

1 Ответ

0 голосов
/ 01 июня 2018

Вы не обновляете существующие фреймы данных ни в одной из версий;вы просто создаете новые фреймы данных.

Разница в том, что в повторяющемся коде вы привязываете каждую из переменных X, X1 и т. д. к каждому из этих новых фреймов данных, в то время как вваш цикл, вы снова и снова привязываете num_x к каждому новому фрейму данных, поэтому, в конце концов, где-то сохраняется только последний.

В идеале, вы, вероятно, захотите переписать свой код, чтобы он не имелэти отдельные переменные, во-первых, имеют только список из 9 кадров данных - или, может быть, набор из 9 кадров данных с именами X, X1 и т. д., если имена действительно значимы.

Но если это слишком большое изменение, вы можете сделать что-то вроде этого:

all_x = [X, X1, X2, X3, X4, X5, X6, X7, X8]
idx = 0
for num_x in all_x:
   encoder=LabelEncoder()
   (num_x) = (num_x).apply(encoder.fit_transform)   
   onehotencoder = OneHotEncoder(categorical_features='all')
   # store the new dataframe back into the list
   all_x[idx] = num_x = onehotencoder.fit_transform(num_x).toarray()
   np.save('X%d' % idx, num_x)
   idx+=1
   print(num_x)
# store the list of new dataframes back into the original variable names
X, X1, X2, X3, X4, X5, X6, X7, X8 = all_x

Есть способы, которыми вы можете сделать это чище (например, используя for idx, num_x in enumerate(all_x):), но я придерживался как можно ближев существующий код.

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