From 2fd9b9abc76373eb97ec74fdea811549d837c219 Mon Sep 17 00:00:00 2001 From: denis-on Date: Tue, 12 Jul 2022 13:56:08 +0300 Subject: [PATCH] DZ les 2 --- dz_les_2.ipynb | 968 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 968 insertions(+) create mode 100644 dz_les_2.ipynb 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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
author_idauthor_namebook_titleprice
01ТургеневОтцы и дети450
11ТургеневРудин300
21ТургеневДворянское гнездо350
32ЧеховТолстый и тонкий500
42ЧеховДама с собачкой450
53ОстровскийГроза370
63ОстровскийТаланты и поклонники290
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
author_idauthor_namebook_titleprice
21ТургеневДворянское гнездо350
53ОстровскийГроза370
01ТургеневОтцы и дети450
42ЧеховДама с собачкой450
32ЧеховТолстый и тонкий500
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
min_pricemax_pricemean_price
author_name
Островский370290330.000000
Тургенев450300366.666667
Чехов500450475.000000
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
author_idauthor_namebook_titlepricecover
01ТургеневОтцы и дети450твердая
11ТургеневРудин300мягкая
21ТургеневДворянское гнездо350мягкая
32ЧеховТолстый и тонкий500твердая
42ЧеховДама с собачкой450твердая
53ОстровскийГроза370мягкая
63ОстровскийТаланты и поклонники290мягкая
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
price
author_namecover
Островскиймягкая660
Тургеневмягкая650
твердая450
Чеховтвердая950
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
price
author_namecover
Островскиймягкая660
Тургеневмягкая650
твердая450
Чеховтвердая950
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
price
author_namecover
\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 +}