Изучение панд

панды и 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
)