Занятие 5
Лабораторная работа 5¶
Matplotlib — это Python-библиотека предназначенная для визуализации данных. С её помощью можно создавать различные диаграммы и гистограммы.
1. Matplotlib¶
1.1 Графики в matplotlib¶
# импортируем библиотеку
import matplotlib.pyplot as plt
Построим первый простой график.
Создадим два списка, которые будут содержать координаты точек по оси x и по оси y.
x = [2, 5, 10, 20, 30]
y = [4, 10, 20, 40, 60]
plt.plot(x, y)
plt.show()
Сейчас мы использовали две стандартные функции:
- plt.plot() — функция, строящая график со значениями, которые мы передали ей
- plt.show() — функция, выводящая данные на экран
Давайте немного улучшим график, добавив подписи осей, название графика и сетку.
plt.plot(x, y)
plt.xlabel('х') # Подпись оси х
plt.ylabel('y') # Подпись оси y
plt.grid() # Добавим сетку
plt.title('Просто график') # Название графика
plt.show()
До данного момента мы с вами детально не рассматривали аргументы функции plt.plot(). Теперь давайте сделаем это!
- color - цвет графика
- marker - метки точек графика
- linestyle - линии графика
# Построим график со следующим аргуметами(параметрами):
plt.plot(x, y, color = 'red', marker='o', linestyle='--')
plt.xlabel('х') # Подпись оси х
plt.ylabel('y') # Подпись оси y
plt.grid() # Добавим сетку
plt.title('Просто график') # Название графика
plt.show()
О данных трёх параметрах и о том, какие значения они могут принимать, можно подробно узнать в документации.
Теперь рассмотрим построение нескольких графиков в одной системе координат. Построим параболу и линейный функцию.
import numpy as np
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # значения x
y_lin = 2 * x # линейная функция
y_par = x ** 2 # парабола
# Построим график со следующим аргуметами(параметрами):
plt.figure(figsize=(6, 3)) # размеры графика
plt.plot(x, y_lin, color = 'red', marker='o', linestyle='--')
plt.plot(x, y_par, color = 'blue', marker='^')
plt.xlabel('х') # Подпись оси х
plt.ylabel('y') # Подпись оси y
plt.grid() # Добавим сетку
plt.title('Просто график') # Название графика
plt.legend(["y = 2x", "y = x**2"], loc="center right") # можем добавить легенду
plt.show()
Мы также можем отобразить два или более различных поля, на которых будет отображено по одному или более графику с помощью plt.subplot.
plt.subplot() принимает на вход три аргумента:
- число строк
- число столбцов
- номер элемента
Можете рассматривать "такое поведение" как матрицу элементами которой являются графики.
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # значения x
y1 = np.cos(x)
y2 = 0.5 * x
y3 = x ** 0.5
y4 = x ** 2
plt.figure(figsize=(10, 6)) # размеры графика
plt.subplot(2, 2, 1)
plt.plot(x, y1, color = 'blue', marker='^')
plt.xlabel('х') # Подпись оси х
plt.ylabel("y1") # Подпись оси y
plt.grid() # Добавим сетку
plt.subplot(2, 2, 2)
plt.plot(x, y2, color = 'green', marker='1')
plt.xlabel('х') # Подпись оси х
plt.ylabel("y2") # Подпись оси y
plt.grid() # Добавим сетку
plt.subplot(2, 2, 3)
plt.plot(x, y3, color = 'red', marker='H')
plt.xlabel('х') # Подпись оси х
plt.ylabel("y3") # Подпись оси y
plt.grid() # Добавим сетку
plt.subplot(2, 2, 4)
plt.plot(x, y4, color = 'yellow', marker='*')
plt.xlabel('х') # Подпись оси х
plt.ylabel("y4") # Подпись оси y
plt.grid() # Добавим сетку
Задача 1¶
Постройте 4 графика на одной картинке, используя subplot.
Первый график:
- y = ax + b, где a и b любые не равные 0.
- цвет: красный
- число точек: 10
- наличие сетки: да
- метки: треугольники
Второй график:
- y = a * x^(0.5) + b, где a и b любые не равные 0.
- цвет: зелёный
- число точек: 10
- наличие сетки: да
- метки: точки
Третий график:
- y = a * sinx + b, где a и b любые не равные 0.
- цвет: синий
- число точек: 10
- наличие сетки: да
- метки: знак +
Четвёртый график:
- y = a * sinx + b, где a и b любые не равные 0.
- цвет: синий
- число точек: 10
- наличие сетки: да
- метки: звездочка
У каждого графика должна быть легенда - вид функции.
Читайте документацию: https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.plot.html
1.2 Столбчатые диаграммы¶
Доля использования операционных систем на 2015 год:
- Android / Linux - 54.16%
- iOS/macOS - 12.37%
- Windows - 11.79%
- Другое - 21.66%
Построим столбчатую диаграмму распределения операционных систем среди пользователей.
x = ['Android / Linux', 'iOS/macOS', 'Windows', 'Другое']
y = [54.16, 12.37, 11.79, 21.66]
plt.bar(x, y, label='Доля использования операционных')
plt.xlabel('Операционная система')
plt.ylabel('Доля пользователей')
plt.title('Распределение операционных систем')
plt.legend()
plt.show()
1.3 Круговые диаграммы¶
label = ['Android / Linux', 'iOS/macOS', 'Windows', 'Другое']
value = [54.16, 12.37, 11.79, 21.66]
plt.pie(value, labels=label, autopct='%1.1f%%')
plt.title('Распределение операционных систем')
plt.show()
Задача 2¶
Вам дан файл browsers.txt . В нём в каждой строке содержится браузер, которым пользуется случайный пользователь.
Постройте:
- Столбчатую диаграмму распределения браузеров среди пользователей данной выборки.
- Круговую диаграмму распределения браузеров среди пользователей данной выборки.
lines = [line.rstrip() for line in lines]
lines
with open('browsers.txt', 'r') as file:
lines = file.readlines()
lines
1.4 Построение 3-d графиков¶
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D # специальный модуль для работы с 3-D графиками
Линейные графики¶
Рассмотрим построение 3-d синуса.
x = np.linspace(-np.pi, np.pi, 100)
y = x
z = np.sin(x)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(x, y, z)
Построение поверхностей¶
u, v = np.mgrid[0:2*np.pi:20j, 0:np.pi:10j]
x = np.cos(u)*np.sin(v)
y = np.sin(u)*np.sin(v)
z = np.cos(v)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_surface(x, y, z)
ax.legend()
2. Pandas¶
Pandas — это библиотека(пакет) для работы с табличными данными в Python, который имеет огромный функционал.
Цели Pandas:
- Импортировать наборы данных из баз данных, электронных таблиц, CSV-файлов.
- Очищать наборы данных, например, устраняя пропущенные значения, или же заменять пропущенные значения.
- Агрегировать данные, вычислять среднее значение столбцов и строк, корреляцию между ними и т.д.
- Визуализировать данные.
Для считывания данных используется функция pd.read_csv
. У этой функции много аргументов, которые можно посмотреть в документации. Нам же пока нужен только один: название считываемого файла.
import pandas as pd # импортируем библиотеку
data = pd.read_csv("Housing.csv")
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'].mean()
Функция .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['guestroom'].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(cmap='bwr')
На основе построенной матрицы, мы можем говорить о некоторой зависимости(именно линейной) признаков нашей таблицы.
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
.