Описание библиотеки Requests

Python обладает широким набором библиотек для работы с протоколом HTTP. Одной из таких библиотек является Requests. Данная библиотека предоставляет набор функций, позволяющих выполнять HTTP запросы. В примере ниже показаны варианты использования библиотеки Requests:

Метод get принимает строку, содержащую URL ресурса.

import requests

# Выполнение GET-запроса с помощью метода get
url = 'https://dt.miet.ru/it/api/1/1/1/1'
response = requests.get(url)

Объект response принадлежит классу Response и имеет ряд методов и свойств:

  • status_code - возвращает код состояния.
  • json() - JSON декодер, возвращает ответ от сервера преобразованный в словарь или список;
  • text - возвращает ответ от сервера в формате строки;
print(response.status_code)
200
print(response.json())
{'data': {'temperature': 14}, 'day': 236}
print(response.text)
'{"data":{"temperature":15},"day":235}'

Более подробное описание Requests можно получить из официальной документации.

Работа с базой данных sqlite

В языке Python есть достаточно большое количество библиотек для работы с базами данных. Одна из таких библиотек - sqlite3. Данная библиотека предназначена для работы со встраиваемой базой SQLite. Эта база встраивается в программы в виде библиотеки, предоставляющей набор функций для управления базой, а сами данные при этом хранятся в бинарном файле.

SQLite относится к реляционным базам данных. Для данного типа баз характерно табличное представление данных: каждая таблица (отношение) описывает коллекцию определенных объектов (данных объекта) или коллекцию связи между объектами. Строка таблицы (кортеж) описывает определенный объект коллекции. Столбцы таблицы (атрибуты) отражают какую-то характеристику объекта. Каждый столбец строго типизирован, то есть значения записанные в данных столбцах должны быть одного и того же типа. SQLite предоставляет следующие типы данных: - NULL – значения данного типа - NULL (аналог None в Python); - INTEGER – значения представляют собой целые числа со знаком; - REAL – значения с плавающей запятой; - TEXT – значения представляют собой текст; - BLOB – значения представляют собой блок данных в бинарном виде.

Для примера рассмотрим таблицу описывающую хранения данных об учениках школы:

first_name
TEXT
middle_name
TEXT
last_name
TEXT
age
INT
class
TEXT
Иван Иванович Иванов 15 10А
Николай Михайлович Степанов 16 11В
Александр Сергеевич Семенов 17 11А
Елена Сергеевна Крылова 15 10A
Фома Кузьмич Усович 6

Атрибуты first_name, middle_name, last_name и class имеют тип TEXT. Это значит, что значения данных атрибутов могут быть только строками. Атрибут age имеет тип INT. Это значит, что значения данного атрибута могут быть только числом. Каждая строка таблицы описывает данные ученика школы.

Введение в язык SQL

Для управления данными применяется специализированный язык запросов SQL (структурированный язык запросов). Конструкции (операторы) языка SQL можно разделить на три группы: 1. Описания данных – конструкции языка используются для создания, изменения и удаления объектов базы: таблиц, индексов, представлений и т. д.:

1.1. Оператор CREATE оператор используется для создания объектов базы.

1.2. Оператор ALTER изменят объекты базы.

1.3. Оператор DROP удаляет объекты базы.
  1. Управления (манипулирования) данными – конструкции языка используются для выборки, вставки и удаления дынных:

    2.1. Оператор SELECT осуществляет выборку данных из таблицы.

    2.2. Оператор INSERT осуществляет вставку данных в таблицу.

    2.3. Оператор DELETE осуществляет удаление данных их таблицы.
  2. Административные операции – конструкции языка используются для управления правами доступа к объектам базы: GRANT и REVOKE.

Пример использования sqlite3

Чтобы начать работу с БД необходимо открыть соединение:

import sqlite3

# В качестве аргумента передается строка указывающая путь к файлу с БД
con = sqlite3.connect("database.db")


# после использования БД, необходимо закрыть соединение
con.close()

После открытия базы, метод connect вернет объект соединения. С его помощью можно выполнять SQL запросы. В качестве примера создадим таблицу описанную выше. Текст SQL запроса будет иметь следующий вид:

CREATE TABLE pupil(
  first_name TEXT,
  middle_name TEXT,
  last_name TEXT,
  age INT,
  class TEXT
);

Затем, используя данный запрос, выполним его с помощью объекта con:

import sqlite3

SQL = """\
CREATE TABLE pupil(
  first_name TEXT,
  middle_name TEXT,
  last_name TEXT,
  age INT,
  class TEXT
);
"""

con = sqlite3.connect("database.db")

con.executescript(SQL)

con.close()

Теперь в нашей базе появилась пустая таблица. Давайте добавим в нее записи. Наш SQL запрос будет иметь следующий вид:

-- Обычная вставка строки в таблицу
INSERT INTO pupil
  VALUES('Иван', 'Иванович', 'Иванов', 15, '10А');

-- Если мы хотим поменять порядок следования значений, то мы можем указать их явно в круглых скобках после названия таблицы
INSERT INTO pupil(age, first_name, middle_name, last_name, class)
    VALUES(16, 'Николай', 'Михайлович', 'Степанов', '11В');

-- Также можно вставлять в таблицу множество значений
INSERT INTO pupil(first_name, middle_name, last_name, age, class)
  VALUES ('Александр', 'Сергеевич', 'Семенов', 17, '11А'),
    ('Елена', 'Сергеевна', 'Крылова', 15, '10А'),
    ('Фома', 'Кузьмич', 'Усович', 6, '1Г');

Выполним SQL запрос в Python

import sqlite3

SQL = """\
-- Обычная вставка строки в таблицу
INSERT INTO pupil
  VALUES('Иван', 'Иванович', 'Иванов', 15, '10А');

-- Если мы хотим поменять порядок следования значений, то мы можем указать их явно в круглых скобках после названия таблицы
INSERT INTO pupil(age, first_name, middle_name, last_name, class)
    VALUES(16, 'Николай', 'Михайлович', 'Степанов', '11В');

-- Также можно вставлять в таблицу множество значений
INSERT INTO pupil(first_name, middle_name, last_name, age, class)
  VALUES ('Александр', 'Сергеевич', 'Семенов', 17, '11А'),
    ('Елена', 'Сергеевна', 'Крылова', 15, '10А'),
    ('Фома', 'Кузьмич', 'Усович', 6, '1Г');
"""

con = sqlite3.connect("database.db")

con.executescript(SQL)

con.close()

Добавление данных выполнено. Теперь давайте выведем содержимое таблицы с помощью SQL оператора SELECT:

-- вывести все записи со всеми атрибутами объектов из таблицы pupil
SELECT * FROM pupil;

-- вывести только атрибут last_name для каждой записи из таблицы pupil
SELECT last_name FROM pupil;

-- вывести два атрибута last_name и class для каждой записи из таблицы pupil
SELECT last_name, class FROM pupil;

Выполним SQL запросы в Python:

import sqlite3

con = sqlite3.connect("./database.db")

SQL1 = "SELECT * FROM pupil;"
SQL2 = "SELECT last_name FROM pupil;"
SQL3 = "SELECT last_name, class FROM pupil;"

for sql in (SQL1, SQL2, SQL3):
    print(list(con.execute(sql)))
    print("="*30)

con.close()

При выполнении запросов можно задать дополнительные условия выборки (фильтрация данных). Условия выборки задаются после оператора WHERE:

SELECT * FROM {название таблицы} WHERE {условие};

Несколько условий можно объединять с помощью операторов AND и OR:

SELECT * FROM {название таблицы}
  WHERE {условие1} AND {условие2} OR {условие3};

Попробуем вывести всех учеников, которые учатся в 11А:

SELECT * FROM pupil WHERE class = '10А';

Код на Python:

import sqlite3

con = sqlite3.connect("./database.db")

SQL = "SELECT * FROM pupil WHERE class = '10А';"

print(list(con.execute(SQL)))
con.close()

Если требуется обновить запись таблицы, то мы можем воспользоваться оператором UPDATE:

  UPDATE {название таблицы}
    -- установка новых значений
    SET {атрибут1} = {значение1}, {атрибут2} = {значение2}
    -- можно задать условия (опционально)
    WHERE {условие}

Давайте переведем Елену Сергеевну Крылову из 10А в 11А:

UPDATE pupil SET class = '11А'
  WHERE last_name = 'Крылова' AND  = '10А';

Код Python:

import sqlite3

con = sqlite3.connect("./database.db")

SQL = """\
UPDATE pupil SET class = '11А'
  WHERE last_name = 'Крылова' AND class = '10А';
"""

con.executescript(SQL)

SQL = """\
SELECT * FROM pupil
  WHERE last_name = 'Крылова' AND class = '11А';
"""
print(list(con.execute(SQL)))
con.close()

Для удаления данных используется оператор DELETE:

DELETE FROM {название таблицы}
  -- если условия отсутствует, то будет удалены все строки
  WHERE {условие};

В связи с переводом ученика 1Г Усовича в школу для особо одаренных детей, давайте удалим данные этого ученика из базы:

DELETE FROM pupil
  WHERE last_name = 'Усович' AND class = '1Г';
import sqlite3

con = sqlite3.connect("./database.db")

SQL =  """
DELETE FROM pupil
  WHERE last_name = 'Усович' AND class = '1Г';
"""
con.execute(SQL)

SQL = """\
SELECT * FROM pupil;
"""
print(list(con.execute(SQL)))
con.close()

Работа с matplotlib

Перед тем как углубиться в дебри библиотеки Matplotlib, для того, чтобы появилось интуитивное понимание принципов работы с этим инструментом, рассмотрим несколько примеров, изучив которые вы уже сможете использовать библиотеку для решения своих задач.

Если вы работаете в Jupyter Notebook для того, чтобы получать графики рядом с ячейками с кодом необходимо выполнить специальную magic команду после того, как импортируете matplotlib:

import matplotlib.pyplot as plt
%matplotlib inline

Результат работы выглядеть будет так, как показано ниже.

import matplotlib.pyplot as plt
%matplotlib inline
plt.plot([1, 2, 3, 4], [1, 2, 3, 4])
img_1

Если вы пишете код в .py файле, а потом запускаете его через вызов интерпретатора Python, то строка %matplotlib inline вам не нужна, используйте только импорт библиотеки.

Пример, аналогичный тому, что представлен на рисунке выше, для отдельного Python файла будет выглядеть так:

import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4, 5], [1, 2, 3, 4, 5])
plt.show()

Далее мы не будем останавливаться на особенностях использования magic команды, просто запомните, если вы используете Jupyter notebook при работе с Matplotlib вам обязательно нужно включить %matplotlib inline.

Теперь перейдем непосредственно к Matplotlib. Необходимо построить разные типы графиков, настроить их внешний вид и освоиться в работе с этим инструментом.

Построение графика

Для начал построим простую линейную зависимость, дадим нашему графику название, подпишем оси и отобразим сетку. Код программы, в результате получим следующий график:

import numpy as np
# Независимая (x) и зависимая (y) переменные
x = np.linspace(0, 10, 50)
y = x
# Построение графика
plt.title("Линейная зависимость y = x") # заголовок
plt.xlabel("x") # ось абсцисс
plt.ylabel("y") # ось ординат
plt.grid()      # включение отображение сетки
plt.plot(x, y)  # построение графика
img_2

Функция linspace() из модуля numpy возвращает одномерный массив из указанного количества элементов, значения которых равномерно распределенны внутри заданного интервала. т.е. np.linspace(0, 10, 50) возвращаёет:

[ 1.          1.18367347  1.36734694  1.55102041  1.73469388  1.91836735
  2.10204082  2.28571429  2.46938776  2.65306122  2.83673469  3.02040816
  3.20408163  3.3877551   3.57142857  3.75510204  3.93877551  4.12244898
  4.30612245  4.48979592  4.67346939  4.85714286  5.04081633  5.2244898
  5.40816327  5.59183673  5.7755102   5.95918367  6.14285714  6.32653061
  6.51020408  6.69387755  6.87755102  7.06122449  7.24489796  7.42857143
  7.6122449   7.79591837  7.97959184  8.16326531  8.34693878  8.53061224
  8.71428571  8.89795918  9.08163265  9.26530612  9.44897959  9.63265306
  9.81632653 10.        ]

Изменим тип линии и ее цвет, для этого в функцию plot(), в качестве третьего параметра передадим строку, сформированную определенным образом, в нашем случае это “r–”, где “r” означает красный цвет, а “–” – тип линии – пунктирная линия.

# Построение графика
plt.title("Линейная зависимость y = x") # заголовок
plt.xlabel("x") # ось абсцисс
plt.ylabel("y") # ось ординат
plt.grid()      # включение отображение сетки
plt.plot(x, y, "r--")  # построение графика
img_3

Несколько графиков на одном поле

Построим несколько графиков на одном поле, для этого добавим квадратичную зависимость:

# Линейная зависимость
x = np.linspace(0, 10, 50)
y1 = x
# Квадратичная зависимость
y2 = [i**2 for i in x]
# Построение графика
plt.title("Зависимости: y1 = x, y2 = x^2") # заголовок
plt.xlabel("x")         # ось абсцисс
plt.ylabel("y1, y2")    # ось ординат
plt.grid()              # включение отображение сетки
plt.plot(x, y1, x, y2)  # построение графика
img_4

В приведенном примере в функцию plot() последовательно передаются два массива для построения первого графика и два массива для построения второго, при этом, как вы можете заметить, для обоих графиков массив значений независимой переменной x один и то же. ### Несколько разделенных полей с графиками

Третья, довольно часто встречающаяся задача – это отобразить два или более различных поля, на которых будет отображено по одному или более графику.

Построим уже известные нам две зависимость на разных полях.

# Линейная зависимость
x = np.linspace(0, 10, 50)
y1 = x
# Квадратичная зависимость
y2 = [i**2 for i in x]
# Построение графиков
plt.figure(figsize=(9, 9))
plt.subplot(2, 1, 1)
plt.plot(x, y1)               # построение графика
plt.title("Зависимости: y1 = x, y2 = x^2") # заголовок
plt.ylabel("y1", fontsize=14) # ось ординат
plt.grid(True)                # включение отображение сетки
plt.subplot(2, 1, 2)
plt.plot(x, y2)               # построение графика
plt.xlabel("x", fontsize=14)  # ось абсцисс
plt.ylabel("y2", fontsize=14) # ось ординат
plt.grid(True)                # включение отображение сетки
img_5

Здесь мы воспользовались новыми функциями:

figure() – функция для задания глобальных параметров отображения графиков. В нее, в качестве аргумента, мы передаем кортеж, определяющий размер общего поля.

subplot() – функция для задания местоположения поля с графиком. Существует несколько способов задания областей для вывода через функцию subplot() мы воспользовались следующим: первый аргумент – количество строк, второй – столбцов в формируемом поле, третий – индекс (номер поля, считаем сверху вниз, слева направо).

Остальные функции уже вам знакомы, дополнительно мы использовали параметр fontsize для функций xlabel() и ylabel(), для задания размера шрифта.

Наверх