diff --git a/dz_les_2.ipynb b/dz_les_2.ipynb
new file mode 100644
index 0000000..ad88fc3
--- /dev/null
+++ b/dz_les_2.ipynb
@@ -0,0 +1,968 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "baa39400",
+ "metadata": {},
+ "source": [
+ "## Тема “Вычисления с помощью Numpy”"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "75a7d1fa",
+ "metadata": {},
+ "source": [
+ "###### Задание 1\n",
+ "Импортируйте библиотеку Numpy и дайте ей псевдоним np.\n",
+ "Создайте массив Numpy под названием a размером 5x2, то есть состоящий из 5 строк и 2 столбцов. Первый столбец должен содержать числа 1, 2, 3, 3, 1, а второй - числа 6, 8, 11, 10, 7. Будем считать, что каждый столбец - это признак, а строка - наблюдение. Затем найдите среднее значение по каждому признаку, используя метод mean массива Numpy. Результат запишите в массив mean_a, в нем должно быть 2 элемента.\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 249,
+ "id": "b3f3cb0c",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 250,
+ "id": "b65b9485",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[ 1, 6],\n",
+ " [ 2, 8],\n",
+ " [ 3, 11],\n",
+ " [ 3, 10],\n",
+ " [ 1, 7]])"
+ ]
+ },
+ "execution_count": 250,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a = np.array([[1, 2, 3, 3, 1],[ 6, 8, 11, 10, 7]]).T\n",
+ "a"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 251,
+ "id": "e1817a21",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([2. , 8.4])"
+ ]
+ },
+ "execution_count": 251,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "mean_a = np.mean(a, axis=0)\n",
+ "mean_a"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "271e69f8",
+ "metadata": {},
+ "source": [
+ "###### Задание 2\n",
+ "Вычислите массив a_centered, отняв от значений массива “а” средние значения соответствующих признаков, содержащиеся в массиве mean_a. Вычисление должно производиться в одно действие. Получившийся массив должен иметь размер 5x2"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 252,
+ "id": "1d09ae5f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "array([[-1. , -2.4],\n",
+ " [ 0. , -0.4],\n",
+ " [ 1. , 2.6],\n",
+ " [ 1. , 1.6],\n",
+ " [-1. , -1.4]])"
+ ]
+ },
+ "execution_count": 252,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a_centered = np.vstack((a[:,0]-mean_a[0], a[:,1]-mean_a[1])).T\n",
+ "a_centered"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 253,
+ "id": "cf26e417",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "(5, 2)"
+ ]
+ },
+ "execution_count": 253,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a_centered.shape"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "0bcbea7c",
+ "metadata": {},
+ "source": [
+ "###### Задание 3\n",
+ "Найдите скалярное произведение столбцов массива a_centered. В результате должна получиться величина a_centered_sp. Затем поделите a_centered_sp на N-1, где N - число наблюдений."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 254,
+ "id": "8b12bc90",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "8.0"
+ ]
+ },
+ "execution_count": 254,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a_centered_sp = a_centered[:,0] @ a_centered[:,1]\n",
+ "a_centered_sp"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 255,
+ "id": "953391c3",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2.0"
+ ]
+ },
+ "execution_count": 255,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "a_centered_sp / (a.shape[0] - 1)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "563f5e2a",
+ "metadata": {},
+ "source": [
+ "###### Задание 4**\n",
+ "Число, которое мы получили в конце задания 3 является ковариацией двух признаков, содержащихся в массиве “а”. В задании 4 мы делили сумму произведений центрированных признаков на N-1, а не на N, поэтому полученная нами величина является несмещенной оценкой ковариации."
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "90994e3c",
+ "metadata": {},
+ "source": [
+ "В этом задании проверьте получившееся число, вычислив ковариацию еще одним способом - с помощью функции np.cov. В качестве аргумента m функция np.cov должна принимать транспонированный массив “a”. В получившейся ковариационной матрице (массив Numpy размером 2x2) искомое значение ковариации будет равно элементу в строке с индексом 0 и столбце с индексом "
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 256,
+ "id": "924e4167",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "2.0"
+ ]
+ },
+ "execution_count": 256,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "np.cov(a.T)[0][1]"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "312dd388",
+ "metadata": {},
+ "source": [
+ "## Тема “Работа с данными в Pandas”"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "9425e353",
+ "metadata": {},
+ "source": [
+ "###### Задание 1\n",
+ "Импортируйте библиотеку Pandas и дайте ей псевдоним pd. Создайте датафрейм authors со столбцами author_id и author_name, в которых соответственно содержатся данные: [1, 2, 3] и ['Тургенев', 'Чехов', 'Островский'].\n",
+ "Затем создайте датафрейм book cо столбцами author_id, book_title и price, в которых соответственно содержатся данные: \n",
+ "[1, 1, 1, 2, 2, 3, 3],\n",
+ "['Отцы и дети', 'Рудин', 'Дворянское гнездо', 'Толстый и тонкий', 'Дама с собачкой', 'Гроза', 'Таланты и поклонники'],\n",
+ "[450, 300, 350, 500, 450, 370, 290]."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 257,
+ "id": "85849927",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 258,
+ "id": "8a7e4edf",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "authors = pd.DataFrame({\n",
+ " \"author_id\": [1, 2, 3],\n",
+ " \"author_name\": ['Тургенев', 'Чехов', 'Островский']\n",
+ "})\n",
+ "book = pd.DataFrame({\n",
+ " \"author_id\": [1, 1, 1, 2, 2, 3, 3],\n",
+ " \"book_title\": ['Отцы и дети', 'Рудин', 'Дворянское гнездо', 'Толстый и тонкий', 'Дама с собачкой', 'Гроза', 'Таланты и поклонники'],\n",
+ " \"price\": [450, 300, 350, 500, 450, 370, 290]\n",
+ "})"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "62a21149",
+ "metadata": {},
+ "source": [
+ "###### Задание 2\n",
+ "Получите датафрейм authors_price, соединив датафреймы authors и books по полю author_id."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 259,
+ "id": "8e657295",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " author_id | \n",
+ " author_name | \n",
+ " book_title | \n",
+ " price | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " Тургенев | \n",
+ " Отцы и дети | \n",
+ " 450 | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " Тургенев | \n",
+ " Рудин | \n",
+ " 300 | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1 | \n",
+ " Тургенев | \n",
+ " Дворянское гнездо | \n",
+ " 350 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 2 | \n",
+ " Чехов | \n",
+ " Толстый и тонкий | \n",
+ " 500 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 2 | \n",
+ " Чехов | \n",
+ " Дама с собачкой | \n",
+ " 450 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 3 | \n",
+ " Островский | \n",
+ " Гроза | \n",
+ " 370 | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 3 | \n",
+ " Островский | \n",
+ " Таланты и поклонники | \n",
+ " 290 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " author_id author_name book_title price\n",
+ "0 1 Тургенев Отцы и дети 450\n",
+ "1 1 Тургенев Рудин 300\n",
+ "2 1 Тургенев Дворянское гнездо 350\n",
+ "3 2 Чехов Толстый и тонкий 500\n",
+ "4 2 Чехов Дама с собачкой 450\n",
+ "5 3 Островский Гроза 370\n",
+ "6 3 Островский Таланты и поклонники 290"
+ ]
+ },
+ "execution_count": 259,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "authors_price = pd.merge(authors, book, on='author_id', how='inner')\n",
+ "authors_price"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "b15da2c2",
+ "metadata": {},
+ "source": [
+ "###### Задание 3\n",
+ "Создайте датафрейм top5, в котором содержатся строки из authors_price с пятью самыми дорогими книгами."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 260,
+ "id": "031356ce",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " author_id | \n",
+ " author_name | \n",
+ " book_title | \n",
+ " price | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 2 | \n",
+ " 1 | \n",
+ " Тургенев | \n",
+ " Дворянское гнездо | \n",
+ " 350 | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 3 | \n",
+ " Островский | \n",
+ " Гроза | \n",
+ " 370 | \n",
+ "
\n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " Тургенев | \n",
+ " Отцы и дети | \n",
+ " 450 | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 2 | \n",
+ " Чехов | \n",
+ " Дама с собачкой | \n",
+ " 450 | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 2 | \n",
+ " Чехов | \n",
+ " Толстый и тонкий | \n",
+ " 500 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " author_id author_name book_title price\n",
+ "2 1 Тургенев Дворянское гнездо 350\n",
+ "5 3 Островский Гроза 370\n",
+ "0 1 Тургенев Отцы и дети 450\n",
+ "4 2 Чехов Дама с собачкой 450\n",
+ "3 2 Чехов Толстый и тонкий 500"
+ ]
+ },
+ "execution_count": 260,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "top5 = (authors_price.sort_values('price')).tail(5)\n",
+ "top5"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "665695cd",
+ "metadata": {},
+ "source": [
+ "###### Задание 4\n",
+ "Создайте датафрейм authors_stat на основе информации из authors_price. В датафрейме authors_stat должны быть четыре столбца:\n",
+ "author_name, min_price, max_price и mean_price,\n",
+ "в которых должны содержаться соответственно имя автора, минимальная, максимальная и средняя цена на книги этого автора"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 261,
+ "id": "91b9e649",
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "authors_stat = authors_price.groupby(\"author_name\")\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 262,
+ "id": "fb2028b0",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " min_price | \n",
+ " max_price | \n",
+ " mean_price | \n",
+ "
\n",
+ " \n",
+ " | author_name | \n",
+ " | \n",
+ " | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | Островский | \n",
+ " 370 | \n",
+ " 290 | \n",
+ " 330.000000 | \n",
+ "
\n",
+ " \n",
+ " | Тургенев | \n",
+ " 450 | \n",
+ " 300 | \n",
+ " 366.666667 | \n",
+ "
\n",
+ " \n",
+ " | Чехов | \n",
+ " 500 | \n",
+ " 450 | \n",
+ " 475.000000 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " min_price max_price mean_price\n",
+ "author_name \n",
+ "Островский 370 290 330.000000\n",
+ "Тургенев 450 300 366.666667\n",
+ "Чехов 500 450 475.000000"
+ ]
+ },
+ "execution_count": 262,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "authors_stat_price = pd.concat([authors_stat.agg({\"price\": \"max\" }), authors_stat.agg({\"price\": \"min\" }), authors_stat.agg({\"price\": \"mean\" })], axis=1, ignore_index=True);\n",
+ "authors_stat_price.columns= [\"min_price\",\"max_price\",\"mean_price\"]\n",
+ "authors_stat_price"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e10a3e72",
+ "metadata": {},
+ "source": [
+ "###### Задание 5**\n",
+ "Создайте новый столбец в датафрейме authors_price под названием cover, в нем будут располагаться данные о том, какая обложка у данной книги - твердая или мягкая. В этот столбец поместите данные из следующего списка:\n",
+ "['твердая', 'мягкая', 'мягкая', 'твердая', 'твердая', 'мягкая', 'мягкая'].\n",
+ "Просмотрите документацию по функции pd.pivot_table с помощью вопросительного знака.\n",
+ "\n",
+ "Для каждого автора посчитайте суммарную стоимость книг в твердой и мягкой обложке. Используйте для этого функцию pd.pivot_table. При этом столбцы должны называться \"твердая\" и \"мягкая\", а индексами должны быть фамилии авторов. Пропущенные значения стоимостей заполните нулями, при необходимости загрузите библиотеку Numpy.\n",
+ "Назовите полученный датасет book_info и сохраните его в формат pickle под названием \"book_info.pkl\". Затем загрузите из этого файла датафрейм и назовите его book_info2. Удостоверьтесь, что датафреймы book_info и book_info2 идентичны."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 263,
+ "id": "d3ed614c",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " author_id | \n",
+ " author_name | \n",
+ " book_title | \n",
+ " price | \n",
+ " cover | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | 0 | \n",
+ " 1 | \n",
+ " Тургенев | \n",
+ " Отцы и дети | \n",
+ " 450 | \n",
+ " твердая | \n",
+ "
\n",
+ " \n",
+ " | 1 | \n",
+ " 1 | \n",
+ " Тургенев | \n",
+ " Рудин | \n",
+ " 300 | \n",
+ " мягкая | \n",
+ "
\n",
+ " \n",
+ " | 2 | \n",
+ " 1 | \n",
+ " Тургенев | \n",
+ " Дворянское гнездо | \n",
+ " 350 | \n",
+ " мягкая | \n",
+ "
\n",
+ " \n",
+ " | 3 | \n",
+ " 2 | \n",
+ " Чехов | \n",
+ " Толстый и тонкий | \n",
+ " 500 | \n",
+ " твердая | \n",
+ "
\n",
+ " \n",
+ " | 4 | \n",
+ " 2 | \n",
+ " Чехов | \n",
+ " Дама с собачкой | \n",
+ " 450 | \n",
+ " твердая | \n",
+ "
\n",
+ " \n",
+ " | 5 | \n",
+ " 3 | \n",
+ " Островский | \n",
+ " Гроза | \n",
+ " 370 | \n",
+ " мягкая | \n",
+ "
\n",
+ " \n",
+ " | 6 | \n",
+ " 3 | \n",
+ " Островский | \n",
+ " Таланты и поклонники | \n",
+ " 290 | \n",
+ " мягкая | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " author_id author_name book_title price cover\n",
+ "0 1 Тургенев Отцы и дети 450 твердая\n",
+ "1 1 Тургенев Рудин 300 мягкая\n",
+ "2 1 Тургенев Дворянское гнездо 350 мягкая\n",
+ "3 2 Чехов Толстый и тонкий 500 твердая\n",
+ "4 2 Чехов Дама с собачкой 450 твердая\n",
+ "5 3 Островский Гроза 370 мягкая\n",
+ "6 3 Островский Таланты и поклонники 290 мягкая"
+ ]
+ },
+ "execution_count": 263,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "authors_price[\"cover\"] = ['твердая', 'мягкая', 'мягкая', 'твердая', 'твердая', 'мягкая', 'мягкая']\n",
+ "authors_price"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 264,
+ "id": "18a7b7de",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " | \n",
+ " price | \n",
+ "
\n",
+ " \n",
+ " | author_name | \n",
+ " cover | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | Островский | \n",
+ " мягкая | \n",
+ " 660 | \n",
+ "
\n",
+ " \n",
+ " | Тургенев | \n",
+ " мягкая | \n",
+ " 650 | \n",
+ "
\n",
+ " \n",
+ " | твердая | \n",
+ " 450 | \n",
+ "
\n",
+ " \n",
+ " | Чехов | \n",
+ " твердая | \n",
+ " 950 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " price\n",
+ "author_name cover \n",
+ "Островский мягкая 660\n",
+ "Тургенев мягкая 650\n",
+ " твердая 450\n",
+ "Чехов твердая 950"
+ ]
+ },
+ "execution_count": 264,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "book_info = pd.pivot_table(authors_price, index = [\"author_name\",\"cover\"], values=[\"price\"], aggfunc=np.sum, fill_value=0)\n",
+ "book_info"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 273,
+ "id": "b414ad8f",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " | \n",
+ " price | \n",
+ "
\n",
+ " \n",
+ " | author_name | \n",
+ " cover | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " | Островский | \n",
+ " мягкая | \n",
+ " 660 | \n",
+ "
\n",
+ " \n",
+ " | Тургенев | \n",
+ " мягкая | \n",
+ " 650 | \n",
+ "
\n",
+ " \n",
+ " | твердая | \n",
+ " 450 | \n",
+ "
\n",
+ " \n",
+ " | Чехов | \n",
+ " твердая | \n",
+ " 950 | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " price\n",
+ "author_name cover \n",
+ "Островский мягкая 660\n",
+ "Тургенев мягкая 650\n",
+ " твердая 450\n",
+ "Чехов твердая 950"
+ ]
+ },
+ "execution_count": 273,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "book_info.to_pickle(\"book_info.pkl\")\n",
+ "book_info2 = pd.read_pickle(\"book_info.pkl\")\n",
+ "book_info2"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "86cff9fd",
+ "metadata": {},
+ "source": [
+ "Найдем различие"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 272,
+ "id": "ec9838fe",
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " | \n",
+ " price | \n",
+ "
\n",
+ " \n",
+ " | author_name | \n",
+ " cover | \n",
+ " | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ "Empty DataFrame\n",
+ "Columns: [price]\n",
+ "Index: []"
+ ]
+ },
+ "execution_count": 272,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "book_info2[ ~book_info2.isin(book_info)].dropna()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.12"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}