Изучение панд
панды и DataFrames
Поскольку вы используете pandas, первая строка, которую вам нужно будет записать в (почти) всех ваших блокнотах, это
import pandas as pd
В пандах DataFrame - это таблица. В DataFrame можно делать много вещей: суммировать по столбцу, строить гистограмму, создавать сводную таблицу…
Для начала просто напишите «pd.» В пустой ячейке и используйте сочетание клавиш Tab, чтобы увидеть все доступные функции в пандах. Вы будете
Создание фреймов данных
Чтобы создать DataFrame, используйте:
pd.DataFrame({ 'age':[10, 45, 13] })
Функция pd.DataFrame () использует словарь:
{ 'age':[10, 45, 13] }
где «возраст» - имя столбца, [10, 45, 13] - значения строк.
Обратите внимание, что у вас может быть несколько столбцов:
{ 'age':[10, 45, 13], 'name': ['George', 'Damien', 'Ingrid'], 'gender': ['male', 'male', 'female'] }
Как видите, это немного неинтуитивно, поскольку мы привыкли визуализировать таблицы в виде списка строк. Вместо этого фреймы данных pandas используют список столбцов. Это первая концепция, которую нужно осознать. Существуют и другие методы создания DataFrame, но это самый распространенный. Остальные заключаются в чтении файлов:
pd.read_excel('myExcelFile.xlsx')
(не забудьте закрыть файл перед его открытием, иначе вы получите сообщение об ошибке)
or
pd.read_csv('myFile.csv')
Объединение DataFrames
Комбинировать DataFrames действительно просто: используйте .join (), .append (), pd.concat () или .merge ().
См. Следующее (это некрасиво, но работает)
С .join ():
pd.DataFrame({ 'age':[10, 45, 13] }).join( pd.DataFrame({ 'name': ['George', 'Damien', 'Ingrid'] }) ).join( pd.DataFrame({ 'gender': ['male', 'male', 'female'] }) )
Возврат
С помощью .append ():
pd.DataFrame({ 'age':[10, 45, 13] }).append( pd.DataFrame({ 'age': ['George', 'Damien', 'Ingrid'] }) ).append( pd.DataFrame({ 'age': ['male', 'male', 'female'] }) )
Возврат
(См. Уродливую индексацию: 0,1,2,0,1,2,0,1,2)
Обратите внимание, что добавление не может присоединяться к DataFrame по столбцам, оно должно быть соединено строками (одна над другой, а не одна рядом с другой). У вас должны быть одинаковые имена столбцов в фреймах данных, иначе вы получите предупреждение.
С pd.concat ():
pd.concat([ pd.DataFrame({ 'age':[10, 45, 13] }), pd.DataFrame({ 'name': ['George', 'Damien', 'Ingrid'] }), pd.DataFrame({ 'gender': ['male', 'male', 'female'] }) ], axis=1)
Возврат
Обратите внимание, что pd.concat () должен использоваться со списком DataFrames, а не DataFrames. Используйте pd.concat ([df1, df2,…]). Обратите внимание на ", axis = 1", которое очень часто встречается в пандах. По сути, ось = 0 - это столбцы, ось = 1 - это строки.
С .merge ():
pd.DataFrame({ 'age':[10, 45, 13], 'name': ['George', 'Damien', 'Ingrid'] }).merge( pd.DataFrame({ 'name': ['George', 'Damien', 'Ingrid'], 'gender': ['male', 'male', 'female'] }), on=['name'] )
Возврат
‘.Merge ()’ - это SQL-запрос JOIN. Вам понадобится хотя бы один столбец, чтобы соответствовать им.
Выполнение операций в DataFrame
Сумма, максимум, минимум, среднее, медиана
pd.DataFrame({ 'age':[10, 45, 13], 'name': ['George', 'Damien', 'Ingrid'], 'gender': ['male', 'male', 'female'] }).mean()
Возврат
Обратите внимание, что он усредняет только числовой столбец.
pd.DataFrame({ 'age':[10, 45, 13], 'name': ['George', 'Damien', 'Ingrid'], 'gender': ['male', 'male', 'female'] }).sum()
Возврат
Видите, что это работает для всех столбцов? !! Он объединяет текст вместе, а также суммирует столбец «возраст». Это потому, что вы можете суммировать текст в Python:
'Damien' + 'George'
Здесь нас не волнует сумма текста, но в некоторых случаях это может быть интересно.
pd.DataFrame({ 'age':[10, 45, 13], 'name': ['George', 'Damien', 'Ingrid'], 'gender': ['male', 'male', 'female'] }).min()
Возврат
.min () возвращает минимальное значение для чисел, но также возвращает минимальное значение для строк в алфавитном порядке! Это потому, что вы можете сравнивать текст в Python:
'Damien' > 'George'
сводная_таблица
Нет необходимости вводить это, если вы пользователь Excel. Сводная таблица просто объединяет данные таким образом, чтобы их было легко читать.
pd.DataFrame({ 'age':[10, 45, 13], 'name': ['George', 'Damien', 'Ingrid'], 'gender': ['male', 'male', 'female'] }).pivot_table(index='gender', aggfunc='min')
Возврат
Как и раньше, оператор min работает как для числовых, так и для строковых столбцов.
Пользовательские функции
Чтобы масштабировать столбцы набора данных от 0 до 1, можно написать следующее:
for column in df.columns: df[column] = \ (df[column] — df[column].min()) / \ (df[column].max() — df[column].min())
Помните, что обратная косая черта предназначена для разрывов строк.
Более продвинутый способ записать это - использовать метод .apply (). Как следует из названия, он применяет функцию ко всем столбцам или всем строкам одновременно.
df = df.apply( lambda column: (column-column.min()) / (column.max()-column.min()) )
Чтобы выполнить пользовательские функции в одном конкретном столбце, используйте метод .map ().
df['column_1_squared'] = df['column_1'].map( lambda x: x * x )
Заключение
Практикуйте их как можно больше. Они будут супер-полезными.
Упражнения
Создание фреймов данных
Создайте DataFrames, которые выглядят как следующие изображения. Да, и найдите умный способ их создать, а не просто кодировать значения в словаре:
1)
2)
3)
Объединение DataFrames
1)
customers1 = pd.DataFrame({ 'age':[10, 45, 13], 'name': ['George', 'Damien', 'Ingrid'], 'gender': ['male', 'male', 'female'] })customers2 = pd.DataFrame({ 'age':[12, 23, 25], 'name': ['Albert', 'Jane', 'Angela'], 'gender': ['male', 'female', 'female'] })
Как записать в одну строку таблицу, объединяющую две таблицы клиентов?
2) сложно
Представьте, что на вашем жестком диске есть файлы в папке с именем cust_transactions. Каждый файл содержит следующую информацию о некоторых транзакциях клиентов:
file_482.csv содержит 4 столбца ниже:
Как вы можете прочитать все файлы в одном фрейме данных с именем «транзакции»?
Последний
очень сложно;)
У вас есть 5 моделей sklearn для двоичной классификации с именами model_1, model_2,…, model_5. Вы хотите измерить AUC, LogLoss, точность и показатель f1 всех этих 5 моделей как на поезде, так и на тестовых наборах с именами X_train и X_test. Фактические значения для цели - y_train и y_test соответственно.
Каждая строка представляет производительность модели.
Можете ли вы написать чистый код для создания следующей таблицы?
Напоминание:
Это 4 меры точности:
from sklearn.metrics import log_loss, roc_auc_score, accuracy_score, f1_score
log_loss и roc_auc_score принимают прогнозируемую вероятность в качестве входных данных, precision_score и f1_score принимают предсказал класс в качестве входных данных.
Например, если m - это имя модели:
log_loss(y_true=y_train, y_pred=m.predict_proba(X_train)[:,1]) roc_auc_score(y_true=y_train, y_score=m.predict_proba(X_train)[:,1])
Обратите внимание, что один использует y_pred, другой - y_score.
Исправления
Создание фреймов данных
1)
pd.DataFrame({ 'n': range(3,11), 'n_squared': [n*n for n in range(3,11)] })
2)
pd.DataFrame({'number_'+str(n):[n] for n in range(10)})
Не забудьте [] рядом с n.
3)
pd.DataFrame({'column_'+str(n):[n*m for m in range(10)] for n in range(10)})
Два списочных понимания переплелись.
Объединение DataFrames
1)
customers1.append(customers2, ignore_index=True)
Обратите внимание, что ignore_index = True не является обязательным, это хорошо, чтобы получить новый чистый индекс.
2)
import ostransactions = pd.concat([ pd.read_csv(f) for f in os.listdir('cust_transactions') if f.endswith('.csv') ])
«Import os» необходим для вызова «os.listdir (« cust_transactions »)», который перечисляет все файлы в папке «cust_transactions». Я добавил «if f.endswith (‘. Csv ’)’ на случай, если в папке есть другие типы файлов.
Использование нескольких .append () здесь тоже выглядит хорошим выбором. Однако при одновременном чтении тысяч или миллионов файлов это будет очень медленным. Использование pd.concat ([]) с pd.read_csv () будет самым быстрым вариантом.
Финальный
models = [model_1, model_2, model_3, model_4, model_5]pd.concat( [ pd.DataFrame({ sample+'_log_loss': [log_loss(y_true=y, y_pred=m.predict_proba(X)[:,1]) for m in models], sample+'_AUC': [roc_auc_score(y_true=y, y_score=m.predict_proba(X)[:,1]) for m in models], sample+'_accuracy': [accuracy_score(y_true=y, y_pred=m.predict(X)) for m in models], sample+'_f1score': [f1_score(y_true=y, y_pred=m.predict(X)) for m in models] }) for (sample,X,y) in zip(['train', 'test'], [X_train, X_test], [y_train, y_test]) ], axis=1 )