Занятие 3
Лекция 3 и лабораторная 3¶
1. Pandas¶
Pandas — это библиотека(пакет) для работы с табличными данными в Python, который имеет огромный функционал.
Цели Pandas:
- Импортировать наборы данных из баз данных, электронных таблиц, CSV-файлов.
- Очищать наборы данных, например, устраняя пропущенные значения, или же заменять пропущенные значения.
- Агрегировать данные, вычислять среднее значение столбцов и строк, корреляцию между ними и т.д.
- Визуализировать данные.
Для считывания данных используется функция pd.read_csv. У этой функции много аргументов, которые можно посмотреть в документации. Нам же пока нужен только один: название считываемого файла.
import pandas as pd # импортируем библиотеку
data = pd.read_csv("Housing.csv")
data
2.1 Просмотр таблицы¶
Для просмотра таблиц могут быть полезны следующие функции:
- head(n) - первые n строк
- tail(n) - последние n строк
- describe, info - описание данных
- shape - размер таблицы
- columns - название колонок
data.head(10)
data.tail(10)
data.shape
data.columns
data.describe()
В Pandas существует два основных варианта синтаксиса для просмотра содержимого столбца:
data.area
data['area']
Стоит заметить, что таблица и столбцы имеют разный тип:
type(data), type(data.area), type(data['area'])
Серия pandas — это одномерный массив, содержащий данные любого типа, включая целые числа, числа с плавающей точкой, строки, булевы значения, объекты Python и т.д. DataFrame состоит из множества серий, которые выступают в качестве столбцов.
Тем не менее, мы можем сделать именно датафрейм из одного столбца следующим образом:
type(data[['area']])
2.2 Нарезка и извлечение данных в pandas¶
До этого мы получили датафрейм на основе одного столбца. Для получения более одного столбца можно также указать список имен столбцов внутри квадратных скобок.
data[['area', 'parking', 'guestroom']]
Конечно же можно извлекать не только столбцы, но и строки. С помощью loc[] и iloc[] («местоположение» и «целочисленное местоположение»). Важно чётко понимать разницу между loc[] и iloc[].
- loc[] работает с метками столбцов и строк
- iloc[] работает с целочисленными позициями нужных элементов
# выведем строки с 5 по 15
data.loc[5:15]
# выведем строки с 5 по 15
data.iloc[5:15]
2.3 Нарезка данных по условию¶
До этого момента мы с вами выбирали строки и столбцы определённых номеров. А что если нам будет нужно выбрать строки по какому-то условию?
Здесь нам и поможет .loc.
Выведим строки, содержащие квартиры площадью более 5000.
data.loc[data['area'] > 5000]
Теперь выведем строки, содержащие квартиры не только с площадью более 5000, но и имеющих три спальни.
data.loc[(data['area'] > 5000) | (data['bedrooms'] == 3)]
Обратите внимание, что мы используем логическое и (&), а не and !
2.4 Агрегация данных с помощью .groupby()¶
Pandas позволяет агрегировать значения, группируя их по определенным значениям столбцов. Это можно сделать, сочетая метод .groupby() с выбранным вами методом.
Сгруппируем квартиры по числу спален и посчитаем среднее для каждой из групп.
data
data.groupby('bedrooms')['price'].min()
Функция .groupby() позволяет группировать данные более чем по одному столбцу, передавая список имен столбцов, как показано ниже.
data.groupby(['mainroad', 'guestroom']).mean()
Вместе с .groupby() можно использовать не только mean, но и:
- min()
- max()
- median()
- sum()
- var()
2.5 Создание датафрейма и добавление столбцов¶
Создать датафрейм можно с помощью pd.DataFrame.
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}, index = ["first", "second", "third"])
df
Можем изменить значение конкретного элемента.
df.iloc[0, 0] = -10
df
df.loc["second", "B"] = -20
df
Добавим к таблице новую строку с индексом "next" и заполненную нулями.
df.loc["B"] = 0
df
Добавим к таблице новый столбец и заполним его символом "a".
df["C"] = 'a'
df
Мы также можем создавать столбец на основе других столбцов. Добавим в таблицу о квартирах новый столбец, содержащий цену квадратного метра квартиры.
data['price_per_area'] = data['price']/data['area']
data.head(10)
2.6 value_counts()¶
Иногда приходится работать с категориальными значениями, и возникает необходимость подсчитать количество наблюдений в столбце для каждой категории. Здесь нам может понадобиться метод .value_counts().
data['price'].value_counts()
Как видим, квартир без гостевой комнаты намного больше, чем квартир с ней.
Добавление аргумента normalize возвращает проценты вместо абсолютных значений.
data['guestroom'].value_counts(normalize = True)
2.7 сортировка¶
Ну и конечно же мы можем сортировать наши данные по определённому значению.
Отсортируем квартиры по возрастанию цены.
data.sort_values(by=['price'])
2.8 Матрица корреляции¶
Создадим матрицу корреляции:
data.corr().round(3)
Можем создать "тепловую" матрицу корреляции.
corr = data.corr()
corr.style.background_gradient()
На основе построенной матрицы, мы можем говорить о некоторой зависимости(именно линейной) признаков нашей таблицы.
2.9 задачи на Pandas¶
Вам дан датасет telecom_churn. Решите следующие задачи:
Задача 3. Найдите среднее количество звонков Total day calls для всего датафрейма.
Задача 4. Найдите среднее количество звонков Total day calls для любого выбранного вами штата.
Задача 5. Создайте датафрейм, в котором будет среднее количество звонков Total day calls для каждого штата.
Задача 6. Оставьте в созданном датафрейме строки только с теми штатами, где количество звонков Total day calls больше среднего по исходному датафрейму.
Задача 7. Создайте датафрейм, в котором будует средние количества звонков Total day calls и Total eve calls для каждого штата.
Задача 8. Создайте датафрейм, в котором будует средние количества звонков Total day calls и Total eve calls для каждого штата, а также столбец со значениями True и False - ответом на вопрос, больше ли дневных звонков, чем вечерних.
Задача 9. Найти долю клиентов (отношение их числа к общему количеству клиентов) с international plan и voice mail plan.
Задача 10. Найти число уникальных значений Area code.
Задача 11. Вывести DataFrame из 2 столбцов: число звонков в поддержку; число клиентов, звонивших столько раз. Подсказка: используйте функцию агрегации count.
Задача 12. Вывести DataFrame из 2 столбцов: число звонков в поддержку; доля оттока (Churn). Построить график.
Задача 13. Найти среднюю длительность международного (intl) звонка.
Задача 14. Какие звонки дольше - дневные, вечерние или ночные? Ответ привести в формате DataFrame $3*3$: строки - число минут, число звонков, среднее время звонка. Столбцы - день, вечер, ночь
Задача 15. Сравнить Total day charge для оставшихся и ушедших клиентов.
Задача 16. Отсортриуйте штаты по Total day charge (по возрастанию).
Задача 17. Сделайте агрегацию по средним показателям для каждой Area code.
Задача 18. Выведите датафрейм размера $3*2$: столбцы State, Churn для 100, 102 и 104 строк исходного датафрейма.
Задача 19. Создайте датафрейм из 2 столбцов, заполненных произвольными числами. Добавьте третий столбец, равный их сумме квадратов.
Задача 20. Добавьте к созданному датафрейму четвертый столбец, равный среднему значению первых трех, используя функцию mean.