diff --git a/Lesson2/Task3.ipynb b/Lesson2/Task3.ipynb new file mode 100644 index 0000000..b07bcc3 --- /dev/null +++ b/Lesson2/Task3.ipynb @@ -0,0 +1,734 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a29a5a6c", + "metadata": {}, + "source": [ + "## Вычисления с помощью Numpy" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "5540cd2a", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "markdown", + "id": "989e9b52", + "metadata": {}, + "source": [ + "### Задание 1\n", + "Создайте массив Numpy под названием a размером 5x2, то есть состоящий из 5 строк\n", + "и 2 столбцов. Первый столбец должен содержать числа 1, 2, 3, 3, 1, а второй - числа 6,\n", + "8, 11, 10, 7. Будем считать, что каждый столбец - это признак, а строка - наблюдение.\n", + "Затем найдите среднее значение по каждому признаку, используя метод mean массива\n", + "Numpy. Результат запишите в массив mean_a, в нем должно быть 2 элемента." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "5297f2b9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[2. 8.4]\n" + ] + } + ], + "source": [ + "a = np.array([[1, 6], \n", + " [2, 8], \n", + " [3, 11],\n", + " [3, 10],\n", + " [1, 7]])\n", + "\n", + "mean_a = a.mean(axis=0)\n", + "\n", + "print(mean_a)" + ] + }, + { + "cell_type": "markdown", + "id": "d1d4dec2", + "metadata": {}, + "source": [ + "### Задание 2\n", + "Вычислите массив a_centered, отняв от значений массива “а” средние значения\n", + "соответствующих признаков, содержащиеся в массиве mean_a. Вычисление должно\n", + "производиться в одно действие. Получившийся массив должен иметь размер 5x2." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "6941d9be", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[-1. -2.4]\n", + " [ 0. -0.4]\n", + " [ 1. 2.6]\n", + " [ 1. 1.6]\n", + " [-1. -1.4]]\n", + "размер a_centered = (5, 2)\n" + ] + } + ], + "source": [ + "a_centered = a - mean_a\n", + "\n", + "print(a_centered)\n", + "\n", + "print(f\"размер a_centered = {a_centered.shape}\")" + ] + }, + { + "cell_type": "markdown", + "id": "da150013", + "metadata": {}, + "source": [ + "### Задание 3\n", + "Найдите скалярное произведение столбцов массива a_centered. В результате должна\n", + "получиться величина a_centered_spa. Затем поделите a_centered_sp на N-1, где N - число\n", + "наблюдений." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "f5bf6a6d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ковариация несмещенная 2.0<=>2.0\n" + ] + } + ], + "source": [ + "a_centered_spa = a_centered[:, 0].dot(a_centered[:, 1])\n", + "a_centered_cov = a_centered_spa / (a_centered.shape[0] - 1)\n", + "\n", + "print(f\"ковариация несмещенная {a_centered_cov}<=>{np.cov(a.T)[0, 1]}\")" + ] + }, + { + "cell_type": "markdown", + "id": "0f8958b9", + "metadata": {}, + "source": [ + "## Тема “Работа с данными в Pandas”" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "df1f7fce", + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "markdown", + "id": "121ad442", + "metadata": {}, + "source": [ + "### Задание 1\n", + "Импортируйте библиотеку Pandas и дайте ей псевдоним pd. Создайте датафрейм authors со\n", + "столбцами author_id и author_name, в которых соответственно содержатся данные: [1, 2, 3] и\n", + "['Тургенев', 'Чехов', 'Островский'].\n", + "Затем создайте датафрейм book cо столбцами author_id, book_title и price, в которых соответственно\n", + "содержатся данные:\n", + "[1, 1, 1, 2, 2, 3, 3],\n", + "['Отцы и дети', 'Рудин', 'Дворянское гнездо', 'Толстый и тонкий', 'Дама с собачкой', 'Гроза', 'Таланты и\n", + "поклонники']\n", + "Нужны prices!\n", + "[500, 400, 300, 350, 450, 600, 200]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "bc25aa3e", + "metadata": {}, + "outputs": [], + "source": [ + "authors = pd.DataFrame({\n", + " \"author_id\": [1, 2, 3],\n", + " \"author_name\": ['Тургенев', 'Чехов', 'Островский']\n", + "})\n", + "\n", + "books = pd.DataFrame({\n", + " \"author_id\":[1, 1, 1, 2, 2, 3, 3],\n", + " \"book_title\":['Отцы и дети', 'Рудин', 'Дворянское гнездо', 'Толстый и тонкий', 'Дама с собачкой', 'Гроза', \n", + " 'Таланты и поклонники'],\n", + " \"price\":[500, 400, 300, 350, 450, 600, 200]\n", + "})" + ] + }, + { + "cell_type": "markdown", + "id": "b8921adc", + "metadata": {}, + "source": [ + "### Задание 2\n", + "Получите датафрейм authors_price, соединив дата фреймы authors и books по полю author_id." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "055b608b", + "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ТургеневОтцы и дети500
11ТургеневРудин400
21ТургеневДворянское гнездо300
32ЧеховТолстый и тонкий350
42ЧеховДама с собачкой450
53ОстровскийГроза600
63ОстровскийТаланты и поклонники200
\n", + "
" + ], + "text/plain": [ + " author_id author_name book_title price\n", + "0 1 Тургенев Отцы и дети 500\n", + "1 1 Тургенев Рудин 400\n", + "2 1 Тургенев Дворянское гнездо 300\n", + "3 2 Чехов Толстый и тонкий 350\n", + "4 2 Чехов Дама с собачкой 450\n", + "5 3 Островский Гроза 600\n", + "6 3 Островский Таланты и поклонники 200" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "authors_price = pd.merge(authors, books, on='author_id', how='inner')\n", + "authors_price" + ] + }, + { + "cell_type": "markdown", + "id": "e5b969c6", + "metadata": {}, + "source": [ + "### Задание 3\n", + "Создайте датафрейм top5, в котором содержатся строки из authors_price с пятью самыми дорогими\n", + "книгами." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "3a8c545d", + "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
53ОстровскийГроза600
01ТургеневОтцы и дети500
42ЧеховДама с собачкой450
11ТургеневРудин400
32ЧеховТолстый и тонкий350
\n", + "
" + ], + "text/plain": [ + " author_id author_name book_title price\n", + "5 3 Островский Гроза 600\n", + "0 1 Тургенев Отцы и дети 500\n", + "4 2 Чехов Дама с собачкой 450\n", + "1 1 Тургенев Рудин 400\n", + "3 2 Чехов Толстый и тонкий 350" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "top5 = authors_price.sort_values(by=\"price\", ascending=False, inplace=False).head(5)\n", + "top5" + ] + }, + { + "cell_type": "markdown", + "id": "d4665003", + "metadata": {}, + "source": [ + "### Задание 4\n", + "Создайте датафрейм authors_stat на основе информации из authors_price. В датафрейме authors_stat\n", + "должны быть четыре столбца:\n", + "author_name, min_price, max_price и mean_price,\n", + "в которых должны содержаться соответственно имя автора, минимальная, максимальная и средняя\n", + "цена на книги этого автора." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "865c8fb1", + "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", + "
price
maxminmean
author_name
Островский600200400
Тургенев500300400
Чехов450350400
\n", + "
" + ], + "text/plain": [ + " price \n", + " max min mean\n", + "author_name \n", + "Островский 600 200 400\n", + "Тургенев 500 300 400\n", + "Чехов 450 350 400" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "authors_stat = authors_price.groupby(\"author_name\").agg({\"price\": [\"max\", \"min\", \"mean\"]})\n", + "authors_stat" + ] + }, + { + "cell_type": "markdown", + "id": "ea69f20e", + "metadata": {}, + "source": [ + "### Задание 5**\n", + "Создайте новый столбец в датафрейме authors_price под названием cover, в нем будут располагаться\n", + "данные о том, какая обложка у данной книги - твердая или мягкая. В этот столбец поместите данные\n", + "из следующего списка:\n", + "['твердая', 'мягкая', 'мягкая', 'твердая', 'твердая', 'мягкая', 'мягкая'].\n", + "Просмотрите документацию по функции pd.pivot table с помощью вопросительного знака.\n", + "Для каждого автора посчитайте суммарную стоимость книг в твердой и мягкой обложке. Используйте\n", + "для этого функцию pd.pivot_table. При этом столбцы должны называться \"твердая\" и \"мягкая\", а\n", + "индексами должны быть фамилии авторов. Пропущенные значения стоимостей заполните нулями,\n", + "при необходимости загрузите библиотеку Numpy.\n", + "Назовите полученный датасет book_info и сохраните его в формат pickle под названием\n", + "\"book_info.pkl\". Затем загрузите из этого файла датафрейм и назовите его book_info2. Удостоверьтесь,\n", + "что датафреймы book_info и book_info2 идентичны." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "30443e0e", + "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ТургеневОтцы и дети500твердая
11ТургеневРудин400мягкая
21ТургеневДворянское гнездо300мягкая
32ЧеховТолстый и тонкий350твердая
42ЧеховДама с собачкой450твердая
53ОстровскийГроза600мягкая
63ОстровскийТаланты и поклонники200мягкая
\n", + "
" + ], + "text/plain": [ + " author_id author_name book_title price cover\n", + "0 1 Тургенев Отцы и дети 500 твердая\n", + "1 1 Тургенев Рудин 400 мягкая\n", + "2 1 Тургенев Дворянское гнездо 300 мягкая\n", + "3 2 Чехов Толстый и тонкий 350 твердая\n", + "4 2 Чехов Дама с собачкой 450 твердая\n", + "5 3 Островский Гроза 600 мягкая\n", + "6 3 Островский Таланты и поклонники 200 мягкая" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "authors_price[\"cover\"] = ['твердая', 'мягкая', 'мягкая', 'твердая', 'твердая', 'мягкая', 'мягкая']\n", + "authors_price" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "30648b97", + "metadata": {}, + "outputs": [], + "source": [ + "?pd.pivot_table" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "1d3cf0a5", + "metadata": {}, + "outputs": [], + "source": [ + "book_info = pd.pivot_table(authors_price, values=\"price\", index=\"author_name\", columns=\"cover\", aggfunc=\"sum\")\n", + "book_info.fillna(0, inplace = True)\n", + "book_info.to_pickle(\"book_info.pkl\")" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "c318cc60", + "metadata": {}, + "outputs": [], + "source": [ + "book_info2 = pd.read_pickle(\"book_info.pkl\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "d541b4d0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(cover мягкая твердая\n", + " author_name \n", + " Островский 800.0 0.0\n", + " Тургенев 700.0 500.0\n", + " Чехов 0.0 800.0,\n", + " cover мягкая твердая\n", + " author_name \n", + " Островский 800.0 0.0\n", + " Тургенев 700.0 500.0\n", + " Чехов 0.0 800.0)" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "book_info, book_info2" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "17c5d95f", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}