diff --git a/ml/lb1/Plohuta/Plohuta_lab1.ipynb b/ml/lb1/Plohuta/Plohuta_lab1.ipynb new file mode 100644 index 00000000..22a9105a --- /dev/null +++ b/ml/lb1/Plohuta/Plohuta_lab1.ipynb @@ -0,0 +1,5082 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "NumPy — библиотека языка Python, позволяющая [удобно] работать с многомерными массивами и\n", + "матрицами, содержащая математические функции. Кроме того, NumPy позволяет векторизовать\n", + "многие вычисления, имеющие место в машинном обучении." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vec = np.array ( [1,2,3])\n", + "vec.ndim # количество осей" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mat = np.array([[1, 2, 3], [4, 5, 6]])\n", + "mat.ndim\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(3,)" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vec.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'int32'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mat.dtype.name\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mat.itemsize" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Создание массивов.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1, 2, 3])" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = np.array([1, 2, 3])\n", + "A" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([1., 2., 3.])" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = np.array([1, 2, 3], dtype = float)\n", + "A" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1, 2, 3],\n", + " [4, 5, 6]])" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "B = np.array([(1, 2, 3), (4, 5, 6)])\n", + "B" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1., 1., 1., 1.],\n", + " [1., 1., 1., 1.],\n", + " [1., 1., 1., 1.]])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.ones((3, 4))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1., 0., 0.],\n", + " [0., 1., 0.],\n", + " [0., 0., 1.]])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.identity(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[4.24399158e-314, 0.00000000e+000, 0.00000000e+000,\n", + " 0.00000000e+000, 0.00000000e+000],\n", + " [0.00000000e+000, 0.00000000e+000, 0.00000000e+000,\n", + " 0.00000000e+000, 0.00000000e+000]])" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.empty((2, 5))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 2, 5, 8, 11, 14, 17])" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.arange(2, 20, 3) # аналогично стандартной функции range python, правая граница не включается" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([2.5, 3.4, 4.3, 5.2, 6.1, 7. , 7.9])" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.arange(2.5, 8.7, 0.9) # но может работать и с вещественными числами " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 2. , 3.23076923, 4.46153846, 5.69230769, 6.92307692,\n", + " 8.15384615, 9.38461538, 10.61538462, 11.84615385, 13.07692308,\n", + " 14.30769231, 15.53846154, 16.76923077, 18. ])" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.linspace(2, 18, 14) # правая граница включается (по умолчанию)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0, 1, 2],\n", + " [3, 4, 5],\n", + " [6, 7, 8]])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.arange(9).reshape(3, 3)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0, 1, 2, 3],\n", + " [4, 5, 6, 7]])" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.arange(8).reshape(2, -1)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0, 1, 2],\n", + " [3, 4, 5]])" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "C = np.arange(6).reshape(2, -1)\n", + "C" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0, 3],\n", + " [1, 4],\n", + " [2, 5]])" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "C.T" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, 1, 2, 0, 1, 4],\n", + " [ 3, 4, 5, 9, 16, 25]])" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = np.arange(6).reshape(2, -1)\n", + "np.hstack((A, A**2))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, 1, 2],\n", + " [ 3, 4, 5],\n", + " [ 0, 1, 4],\n", + " [ 9, 16, 25]])" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.vstack((A, A**2))" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, 1, 2, 0, 1, 4],\n", + " [ 3, 4, 5, 9, 16, 25]])" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.concatenate((A, A**2), axis = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0, 1, 2, 0, 1, 2],\n", + " [0, 1, 2, 0, 1, 2]])" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = np.arange(3)\n", + "np.tile(a, (2, 2))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0, 1, 2],\n", + " [0, 1, 2],\n", + " [0, 1, 2],\n", + " [0, 1, 2]])" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.tile(a, (4, 1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Базовые операции." + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "A = np.arange(9).reshape(3, 3)\n", + "B = np.arange(1, 10).reshape(3, 3)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0 1 2]\n", + " [3 4 5]\n", + " [6 7 8]]\n", + "[[1 2 3]\n", + " [4 5 6]\n", + " [7 8 9]]\n" + ] + } + ], + "source": [ + "print (A)\n", + "print (B)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 1, 3, 5],\n", + " [ 7, 9, 11],\n", + " [13, 15, 17]])" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(A) + (B)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0. , 0.5 , 0.66666667],\n", + " [0.75 , 0.8 , 0.83333333],\n", + " [0.85714286, 0.875 , 0.88888889]])" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(A) * 1.0 / B" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1, 2, 3],\n", + " [4, 5, 6],\n", + " [7, 8, 9]])" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(A) + 1" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, 3, 6],\n", + " [ 9, 12, 15],\n", + " [18, 21, 24]])" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "3 * (A)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, 1, 4],\n", + " [ 9, 16, 25],\n", + " [36, 49, 64]], dtype=int32)" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(A) ** 2" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, 2, 6],\n", + " [12, 20, 30],\n", + " [42, 56, 72]])" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(A) * (B)" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 18, 21, 24],\n", + " [ 54, 66, 78],\n", + " [ 90, 111, 132]])" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A.dot(B)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, 1, 2],\n", + " [10, 11, 12],\n", + " [20, 21, 22],\n", + " [30, 31, 32]])" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.tile(np.arange(0, 40, 10), (3,1)). T + np.array ([0,1,2])" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[1.00000000e+00, 2.71828183e+00, 7.38905610e+00],\n", + " [2.00855369e+01, 5.45981500e+01, 1.48413159e+02],\n", + " [4.03428793e+02, 1.09663316e+03, 2.98095799e+03]])" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.exp(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0, 1, 2],\n", + " [3, 4, 5],\n", + " [6, 7, 8]])" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(A)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A.min()" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([6, 7, 8])" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A.max(axis = 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 3, 12, 21])" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A.sum(axis=1)" + ] + }, + { + "cell_type": "raw", + "metadata": {}, + "source": [ + "Индексация" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a = np.arange(10)\n", + "a" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([2, 3, 4])" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a[2:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([3, 5, 7])" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "a[3:8:2]" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8],\n", + " [ 9, 10, 11, 12, 13, 14, 15, 16, 17],\n", + " [18, 19, 20, 21, 22, 23, 24, 25, 26],\n", + " [27, 28, 29, 30, 31, 32, 33, 34, 35],\n", + " [36, 37, 38, 39, 40, 41, 42, 43, 44],\n", + " [45, 46, 47, 48, 49, 50, 51, 52, 53],\n", + " [54, 55, 56, 57, 58, 59, 60, 61, 62],\n", + " [63, 64, 65, 66, 67, 68, 69, 70, 71],\n", + " [72, 73, 74, 75, 76, 77, 78, 79, 80]])" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = np.arange(81).reshape(9, -1)\n", + "A" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[18, 19, 20, 21, 22, 23, 24, 25, 26],\n", + " [27, 28, 29, 30, 31, 32, 33, 34, 35]])" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A[2:4]" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 2, 3],\n", + " [11, 12],\n", + " [20, 21],\n", + " [29, 30],\n", + " [38, 39],\n", + " [47, 48],\n", + " [56, 57],\n", + " [65, 66],\n", + " [74, 75]])" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A[:, 2:4]" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[20, 21],\n", + " [29, 30]])" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A[2:4, 2:4]" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([72, 73, 74, 75, 76, 77, 78, 79, 80])" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A[-1]" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8],\n", + " [ 9, 10, 11, 12, 13, 14, 15, 16, 17],\n", + " [18, 19, 20, 21, 22, 23, 24, 25, 26],\n", + " [27, 28, 29, 30, 31, 32, 33, 34, 35],\n", + " [36, 37, 38, 39, 40, 41, 42, 43, 44],\n", + " [45, 46, 47, 48, 49, 50, 51, 52, 53],\n", + " [54, 55, 56, 57, 58, 59, 60, 61, 62],\n", + " [63, 64, 65, 66, 67, 68, 69, 70, 71],\n", + " [72, 73, 74, 75, 76, 77, 78, 79, 80]])" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = np.arange(81).reshape(9, -1)\n", + "A" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([18, 37, 48])" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A[[2, 4, 5], [0, 1, 3]]" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A = np.arange(11)\n", + "A" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0, 1, 2, 4, 5, 6, 7, 9, 10])" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A[A % 5 != 3]" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0, 1, 2, 4, 5, 6, 9, 10])" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "A[np.logical_and((A) != 7, (A) % 5 != 3)] # также можно использовать логические операции" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "import numpy as np\n", + "\n", + "A_quick_arr = np.random.normal(size = (1000000,))\n", + "B_quick_arr = np.random.normal(size = (1000000,))\n", + "\n", + "A_slow_list, B_slow_list = list(A_quick_arr), list(B_quick_arr)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.5279569625854492\n" + ] + } + ], + "source": [ + "start = time.time()\n", + "ans = 0\n", + "for i in range(len(A_slow_list)):\n", + " ans += A_slow_list[i] * B_slow_list[i]\n", + "print(time.time() - start) # Время выполнения в секундах" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.296875\n" + ] + } + ], + "source": [ + "start = time.process_time()\n", + "ans = sum([A_slow_list[i] * B_slow_list[i] for i in range(1000000)])\n", + "print(time.process_time() - start)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.03125\n" + ] + } + ], + "source": [ + "start = time.process_time()\n", + "ans = np.sum(A_quick_arr * B_quick_arr)\n", + "print(time.process_time() - start)" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.0625\n" + ] + } + ], + "source": [ + "start = time.process_time()\n", + "ans = A_quick_arr.dot(B_quick_arr)\n", + "print(time.process_time() - start)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pandas." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Series." + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 5\n", + "1 6\n", + "2 7\n", + "3 8\n", + "4 9\n", + "5 10\n", + "dtype: int64" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "my_series = pd.Series([5,6,7,8,9,10])\n", + "my_series" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RangeIndex(start=0, stop=6, step=1)" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_series.index" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'my_series' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mmy_series\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mNameError\u001b[0m: name 'my_series' is not defined" + ] + } + ], + "source": [ + "my_series.values" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'my_series' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mmy_series\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;31mNameError\u001b[0m: name 'my_series' is not defined" + ] + } + ], + "source": [ + "my_series[4]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Индексы можно задавать явно:" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "10" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_series2 = pd.Series([5,6,7,8,9,10], index=['a','b','c','d','e','f'])\n", + "my_series2['f']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Делать выборку по нескольким индексам и осуществлять групповое присваивание:" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "a 5\n", + "b 6\n", + "f 10\n", + "dtype: int64" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_series2[['a','b','f']]" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "a 0\n", + "b 0\n", + "c 7\n", + "d 8\n", + "e 9\n", + "f 0\n", + "dtype: int64" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_series2[['a','b','f']] = 0\n", + "my_series2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Фильтрация series, мат.операции и т.д." + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "c 7\n", + "d 8\n", + "e 9\n", + "dtype: int64" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_series2[my_series2 > 0]" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "c 14\n", + "d 16\n", + "e 18\n", + "dtype: int64" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_series2[my_series2 > 0] * 2" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "a 5\n", + "b 6\n", + "c 7\n", + "d 8\n", + "dtype: int64" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_series3 = pd.Series({'a':5,'b':6,'c':7,'d':8})\n", + "my_series3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "У оъекта series и его индекса есть атрибут name, задающий имя объекту и индексу соотвественно." + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "letters\n", + "a 5\n", + "b 6\n", + "c 7\n", + "d 8\n", + "Name: numbers, dtype: int64" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_series3.name = 'numbers'\n", + "my_series3.index.name = 'letters'\n", + "my_series3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Индекс можно менять, присвоив список атрибуту index объекта series" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "A 5\n", + "B 6\n", + "C 7\n", + "D 8\n", + "Name: numbers, dtype: int64" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_series3.index = ['A','B','C','D']\n", + "my_series3" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "DataFrame" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "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", + "
countrypopulationsquare
0Kazakhstan17.042724902
1Russia143.5017125191
2Belarus9.50207600
3Ukraine45.50603628
\n", + "
" + ], + "text/plain": [ + " country population square\n", + "0 Kazakhstan 17.04 2724902\n", + "1 Russia 143.50 17125191\n", + "2 Belarus 9.50 207600\n", + "3 Ukraine 45.50 603628" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame({\n", + "... 'country':['Kazakhstan','Russia','Belarus','Ukraine'],\n", + "... 'population':[17.04, 143.5, 9.5, 45.5], \n", + "... 'square':[2724902, 17125191, 207600, 603628] \n", + "... })\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Чтобы убедиться, что столбец в DataFrame это series, извлекаем любой:" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 Kazakhstan\n", + "1 Russia\n", + "2 Belarus\n", + "3 Ukraine\n", + "Name: country, dtype: object" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['country']" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['country', 'population', 'square'], dtype='object')" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RangeIndex(start=0, stop=4, step=1)" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.index" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "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", + "
countrypopulationsquare
KZKazakhstan17.042724902
RURussia143.5017125191
BYBelarus9.50207600
UAUkraine45.50603628
\n", + "
" + ], + "text/plain": [ + " country population square\n", + "KZ Kazakhstan 17.04 2724902\n", + "RU Russia 143.50 17125191\n", + "BY Belarus 9.50 207600\n", + "UA Ukraine 45.50 603628" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame({\n", + "... 'country':['Kazakhstan','Russia','Belarus','Ukraine'],\n", + "... 'population':[17.04, 143.5, 9.5, 45.5], \n", + "... 'square':[2724902, 17125191, 207600, 603628] \n", + "... }, index=['KZ','RU','BY','UA'])\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "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", + "
countrypopulationsquare
Country Code
KZKazakhstan17.042724902
RURussia143.5017125191
BYBelarus9.50207600
UAUkraine45.50603628
\n", + "
" + ], + "text/plain": [ + " country population square\n", + "Country Code \n", + "KZ Kazakhstan 17.04 2724902\n", + "RU Russia 143.50 17125191\n", + "BY Belarus 9.50 207600\n", + "UA Ukraine 45.50 603628" + ] + }, + "execution_count": 80, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.index=['KZ','RU','BY','UA']\n", + "df.index.name = 'Country Code'\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Country Code\n", + "KZ Kazakhstan\n", + "RU Russia\n", + "BY Belarus\n", + "UA Ukraine\n", + "Name: country, dtype: object" + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['country']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Доступ к строкам по индексу возможен несколькими способами:\n", + ".loc-используется для доступа по строковой метке\n", + ".iloc-используется для доступа по числовому значению" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "country Kazakhstan\n", + "population 17.04\n", + "square 2724902\n", + "Name: KZ, dtype: object" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc['KZ']" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "country Kazakhstan\n", + "population 17.04\n", + "square 2724902\n", + "Name: KZ, dtype: object" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.iloc[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Можно делать выбоку по индексу и интересующим колонкам:" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Country Code\n", + "KZ 17.04\n", + "RU 143.50\n", + "Name: population, dtype: float64" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[['KZ','RU'], 'population']" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "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", + "
countrypopulationsquare
Country Code
KZKazakhstan17.042724902
RURussia143.5017125191
BYBelarus9.50207600
\n", + "
" + ], + "text/plain": [ + " country population square\n", + "Country Code \n", + "KZ Kazakhstan 17.04 2724902\n", + "RU Russia 143.50 17125191\n", + "BY Belarus 9.50 207600" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc['KZ':'BY',:]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Филтровать DataFrame с помощью т.н. булевых массивов:" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "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", + "
countrysquare
Country Code
KZKazakhstan2724902
RURussia17125191
UAUkraine603628
\n", + "
" + ], + "text/plain": [ + " country square\n", + "Country Code \n", + "KZ Kazakhstan 2724902\n", + "RU Russia 17125191\n", + "UA Ukraine 603628" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[df.population > 10][['country','square']]" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "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", + "
Country Codecountrypopulationsquare
0KZKazakhstan17.042724902
1RURussia143.5017125191
2BYBelarus9.50207600
3UAUkraine45.50603628
\n", + "
" + ], + "text/plain": [ + " Country Code country population square\n", + "0 KZ Kazakhstan 17.04 2724902\n", + "1 RU Russia 143.50 17125191\n", + "2 BY Belarus 9.50 207600\n", + "3 UA Ukraine 45.50 603628" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.reset_index()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Pandas при операциях над DataFrame, возвращает новый объект DataFrame\n", + "Добавим новый столбец, в котором население поделим на площадь страны, получив тем самым плотность:" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "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", + "
countrypopulationsquaredensity
Country Code
KZKazakhstan17.0427249026.253436
RURussia143.50171251918.379469
BYBelarus9.5020760045.761079
UAUkraine45.5060362875.377550
\n", + "
" + ], + "text/plain": [ + " country population square density\n", + "Country Code \n", + "KZ Kazakhstan 17.04 2724902 6.253436\n", + "RU Russia 143.50 17125191 8.379469\n", + "BY Belarus 9.50 207600 45.761079\n", + "UA Ukraine 45.50 603628 75.377550" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df['density'] = df['population']/df['square']*1000000\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "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", + "
countrypopulationsquare
Country Code
KZKazakhstan17.042724902
RURussia143.5017125191
BYBelarus9.50207600
UAUkraine45.50603628
\n", + "
" + ], + "text/plain": [ + " country population square\n", + "Country Code \n", + "KZ Kazakhstan 17.04 2724902\n", + "RU Russia 143.50 17125191\n", + "BY Belarus 9.50 207600\n", + "UA Ukraine 45.50 603628" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.drop(['density'], axis='columns')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Переименовывать столбцы нужно через метод rename:" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "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", + "
countrypopulationsquaredensity
Country Code
KZKazakhstan17.0427249026.253436
RURussia143.50171251918.379469
BYBelarus9.5020760045.761079
UAUkraine45.5060362875.377550
\n", + "
" + ], + "text/plain": [ + " country population square density\n", + "Country Code \n", + "KZ Kazakhstan 17.04 2724902 6.253436\n", + "RU Russia 143.50 17125191 8.379469\n", + "BY Belarus 9.50 207600 45.761079\n", + "UA Ukraine 45.50 603628 75.377550" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df=df.rename(columns={'Country Code': 'country_code'})\n", + "df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Группировка и агрегирование в pandas" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " PassengerId Survived Pclass \\\n", + "0 1 0 3 \n", + "1 2 1 1 \n", + "2 3 1 3 \n", + "3 4 1 1 \n", + "4 5 0 3 \n", + "\n", + " Name Sex Age SibSp \\\n", + "0 Braund, Mr. Owen Harris male 22.0 1 \n", + "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", + "2 Heikkinen, Miss. Laina female 26.0 0 \n", + "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", + "4 Allen, Mr. William Henry male 35.0 0 \n", + "\n", + " Parch Ticket Fare Cabin Embarked \n", + "0 0 A/5 21171 7.2500 NaN S \n", + "1 0 PC 17599 71.2833 C85 C \n", + "2 0 STON/O2. 3101282 7.9250 NaN S \n", + "3 0 113803 53.1000 C123 S \n", + "4 0 373450 8.0500 NaN S \n" + ] + } + ], + "source": [ + "titanic_df = pd.read_csv('titanic.csv')\n", + "print(titanic_df.head())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Необходимо подсчитать, сколько женщин и мужчин выжило, а сколько нет. В этом нам помжет метод .groupby." + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sex Survived\n", + "female 0 81\n", + " 1 233\n", + "male 0 468\n", + " 1 109\n", + "Name: PassengerId, dtype: int64\n" + ] + } + ], + "source": [ + "print(titanic_df.groupby(['Sex', 'Survived'])['PassengerId'].count())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "А теперь проанализируем в разрезе класса каюты:" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Pclass Survived\n", + "1 0 80\n", + " 1 136\n", + "2 0 97\n", + " 1 87\n", + "3 0 372\n", + " 1 119\n", + "Name: PassengerId, dtype: int64\n" + ] + } + ], + "source": [ + "print(titanic_df.groupby(['Pclass', 'Survived'])['PassengerId'].count())" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
.......................................
88688702Montvila, Rev. Juozasmale27.00021153613.0000NaNS
88788811Graham, Miss. Margaret Edithfemale19.00011205330.0000B42S
88888903Johnston, Miss. Catherine Helen \"Carrie\"femaleNaN12W./C. 660723.4500NaNS
88989011Behr, Mr. Karl Howellmale26.00011136930.0000C148C
89089103Dooley, Mr. Patrickmale32.0003703767.7500NaNQ
\n", + "

891 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " PassengerId Survived Pclass \\\n", + "0 1 0 3 \n", + "1 2 1 1 \n", + "2 3 1 3 \n", + "3 4 1 1 \n", + "4 5 0 3 \n", + ".. ... ... ... \n", + "886 887 0 2 \n", + "887 888 1 1 \n", + "888 889 0 3 \n", + "889 890 1 1 \n", + "890 891 0 3 \n", + "\n", + " Name Sex Age SibSp \\\n", + "0 Braund, Mr. Owen Harris male 22.0 1 \n", + "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", + "2 Heikkinen, Miss. Laina female 26.0 0 \n", + "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", + "4 Allen, Mr. William Henry male 35.0 0 \n", + ".. ... ... ... ... \n", + "886 Montvila, Rev. Juozas male 27.0 0 \n", + "887 Graham, Miss. Margaret Edith female 19.0 0 \n", + "888 Johnston, Miss. Catherine Helen \"Carrie\" female NaN 1 \n", + "889 Behr, Mr. Karl Howell male 26.0 0 \n", + "890 Dooley, Mr. Patrick male 32.0 0 \n", + "\n", + " Parch Ticket Fare Cabin Embarked \n", + "0 0 A/5 21171 7.2500 NaN S \n", + "1 0 PC 17599 71.2833 C85 C \n", + "2 0 STON/O2. 3101282 7.9250 NaN S \n", + "3 0 113803 53.1000 C123 S \n", + "4 0 373450 8.0500 NaN S \n", + ".. ... ... ... ... ... \n", + "886 0 211536 13.0000 NaN S \n", + "887 0 112053 30.0000 B42 S \n", + "888 2 W./C. 6607 23.4500 NaN S \n", + "889 0 111369 30.0000 C148 C \n", + "890 0 370376 7.7500 NaN Q \n", + "\n", + "[891 rows x 12 columns]" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data = pd.read_csv('titanic.csv')\n", + "pass_data" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "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", + "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
\n", + "
" + ], + "text/plain": [ + " PassengerId Survived Pclass \\\n", + "0 1 0 3 \n", + "1 2 1 1 \n", + "2 3 1 3 \n", + "\n", + " Name Sex Age SibSp \\\n", + "0 Braund, Mr. Owen Harris male 22.0 1 \n", + "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", + "2 Heikkinen, Miss. Laina female 26.0 0 \n", + "\n", + " Parch Ticket Fare Cabin Embarked \n", + "0 0 A/5 21171 7.2500 NaN S \n", + "1 0 PC 17599 71.2833 C85 C \n", + "2 0 STON/O2. 3101282 7.9250 NaN S " + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.head(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',\n", + " 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],\n", + " dtype='object')" + ] + }, + "execution_count": 98, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "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", + "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.925NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.100C123S
4503Allen, Mr. William Henrymale35.0003734508.050NaNS
\n", + "
" + ], + "text/plain": [ + " PassengerId Survived Pclass \\\n", + "2 3 1 3 \n", + "3 4 1 1 \n", + "4 5 0 3 \n", + "\n", + " Name Sex Age SibSp Parch \\\n", + "2 Heikkinen, Miss. Laina female 26.0 0 0 \n", + "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 \n", + "4 Allen, Mr. William Henry male 35.0 0 0 \n", + "\n", + " Ticket Fare Cabin Embarked \n", + "2 STON/O2. 3101282 7.925 NaN S \n", + "3 113803 53.100 C123 S \n", + "4 373450 8.050 NaN S " + ] + }, + "execution_count": 99, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data[2:5]" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "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", + "
SurvivedName
11Cumings, Mrs. John Bradley (Florence Briggs Th...
21Heikkinen, Miss. Laina
31Futrelle, Mrs. Jacques Heath (Lily May Peel)
40Allen, Mr. William Henry
\n", + "
" + ], + "text/plain": [ + " Survived Name\n", + "1 1 Cumings, Mrs. John Bradley (Florence Briggs Th...\n", + "2 1 Heikkinen, Miss. Laina\n", + "3 1 Futrelle, Mrs. Jacques Heath (Lily May Peel)\n", + "4 0 Allen, Mr. William Henry" + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.iloc[1:5,[1,3]]" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 Braund, Mr. Owen Harris\n", + "1 Cumings, Mrs. John Bradley (Florence Briggs Th...\n", + "2 Heikkinen, Miss. Laina\n", + "3 Futrelle, Mrs. Jacques Heath (Lily May Peel)\n", + "4 Allen, Mr. William Henry\n", + "Name: Name, dtype: object" + ] + }, + "execution_count": 101, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data['Name'].head()" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "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", + "
NameSexParch
0Braund, Mr. Owen Harrismale0
1Cumings, Mrs. John Bradley (Florence Briggs Th...female0
2Heikkinen, Miss. Lainafemale0
3Futrelle, Mrs. Jacques Heath (Lily May Peel)female0
4Allen, Mr. William Henrymale0
\n", + "
" + ], + "text/plain": [ + " Name Sex Parch\n", + "0 Braund, Mr. Owen Harris male 0\n", + "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 0\n", + "2 Heikkinen, Miss. Laina female 0\n", + "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 0\n", + "4 Allen, Mr. William Henry male 0" + ] + }, + "execution_count": 102, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data[['Name', 'Sex', 'Parch']].head()" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
8913Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)female27.00234774211.1333NaNS
91012Nasser, Mrs. Nicholas (Adele Achem)female14.01023773630.0708NaNC
\n", + "
" + ], + "text/plain": [ + " PassengerId Survived Pclass \\\n", + "1 2 1 1 \n", + "2 3 1 3 \n", + "3 4 1 1 \n", + "8 9 1 3 \n", + "9 10 1 2 \n", + "\n", + " Name Sex Age SibSp \\\n", + "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", + "2 Heikkinen, Miss. Laina female 26.0 0 \n", + "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", + "8 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female 27.0 0 \n", + "9 Nasser, Mrs. Nicholas (Adele Achem) female 14.0 1 \n", + "\n", + " Parch Ticket Fare Cabin Embarked \n", + "1 0 PC 17599 71.2833 C85 C \n", + "2 0 STON/O2. 3101282 7.9250 NaN S \n", + "3 0 113803 53.1000 C123 S \n", + "8 2 347742 11.1333 NaN S \n", + "9 0 237736 30.0708 NaN C " + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data[pass_data['Sex'] == 'female'].head() # Женщины на борту" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
5603Moran, Mr. JamesmaleNaN003308778.4583NaNQ
6701McCarthy, Mr. Timothy Jmale54.0001746351.8625E46S
7803Palsson, Master. Gosta Leonardmale2.03134990921.0750NaNS
\n", + "
" + ], + "text/plain": [ + " PassengerId Survived Pclass Name Sex Age \\\n", + "0 1 0 3 Braund, Mr. Owen Harris male 22.0 \n", + "4 5 0 3 Allen, Mr. William Henry male 35.0 \n", + "5 6 0 3 Moran, Mr. James male NaN \n", + "6 7 0 1 McCarthy, Mr. Timothy J male 54.0 \n", + "7 8 0 3 Palsson, Master. Gosta Leonard male 2.0 \n", + "\n", + " SibSp Parch Ticket Fare Cabin Embarked \n", + "0 1 0 A/5 21171 7.2500 NaN S \n", + "4 0 0 373450 8.0500 NaN S \n", + "5 0 0 330877 8.4583 NaN Q \n", + "6 0 0 17463 51.8625 E46 S \n", + "7 3 1 349909 21.0750 NaN S " + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data[(pass_data['Sex'] == 'female') & (pass_data['Age'] >= 60) | (pass_data['Sex'] == 'male')].head()" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(25, 12)" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data[\n", + " (pass_data.Sex == 'female') &\n", + " (pass_data.Age > 18) &\n", + " (pass_data.Age < 25) &\n", + " (pass_data.SibSp == 0) &\n", + " (pass_data.Parch == 0)].shape" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "pass_data.Age.hist(bins=30)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Редактрование DataFrame переименование признаков" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
PassengerIdSurvivedPclassNamesexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
.......................................
88688702Montvila, Rev. Juozasmale27.00021153613.0000NaNS
88788811Graham, Miss. Margaret Edithfemale19.00011205330.0000B42S
88888903Johnston, Miss. Catherine Helen \"Carrie\"femaleNaN12W./C. 660723.4500NaNS
88989011Behr, Mr. Karl Howellmale26.00011136930.0000C148C
89089103Dooley, Mr. Patrickmale32.0003703767.7500NaNQ
\n", + "

891 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " PassengerId Survived Pclass \\\n", + "0 1 0 3 \n", + "1 2 1 1 \n", + "2 3 1 3 \n", + "3 4 1 1 \n", + "4 5 0 3 \n", + ".. ... ... ... \n", + "886 887 0 2 \n", + "887 888 1 1 \n", + "888 889 0 3 \n", + "889 890 1 1 \n", + "890 891 0 3 \n", + "\n", + " Name sex Age SibSp \\\n", + "0 Braund, Mr. Owen Harris male 22.0 1 \n", + "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", + "2 Heikkinen, Miss. Laina female 26.0 0 \n", + "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", + "4 Allen, Mr. William Henry male 35.0 0 \n", + ".. ... ... ... ... \n", + "886 Montvila, Rev. Juozas male 27.0 0 \n", + "887 Graham, Miss. Margaret Edith female 19.0 0 \n", + "888 Johnston, Miss. Catherine Helen \"Carrie\" female NaN 1 \n", + "889 Behr, Mr. Karl Howell male 26.0 0 \n", + "890 Dooley, Mr. Patrick male 32.0 0 \n", + "\n", + " Parch Ticket Fare Cabin Embarked \n", + "0 0 A/5 21171 7.2500 NaN S \n", + "1 0 PC 17599 71.2833 C85 C \n", + "2 0 STON/O2. 3101282 7.9250 NaN S \n", + "3 0 113803 53.1000 C123 S \n", + "4 0 373450 8.0500 NaN S \n", + ".. ... ... ... ... ... \n", + "886 0 211536 13.0000 NaN S \n", + "887 0 112053 30.0000 B42 S \n", + "888 2 W./C. 6607 23.4500 NaN S \n", + "889 0 111369 30.0000 C148 C \n", + "890 0 370376 7.7500 NaN Q \n", + "\n", + "[891 rows x 12 columns]" + ] + }, + "execution_count": 108, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.rename(columns={'Sex': 'sex'}, inplace=True)\n", + "pass_data" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 Braund\n", + "1 Cumings\n", + "2 Heikkinen\n", + "3 Futrelle\n", + "4 Allen\n", + "Name: name, dtype: object" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.columns = [i.lower() for i in pass_data.columns]\n", + "def get_last_name(name: str = ''):\n", + " return name.split(',')[0].strip()\n", + "\n", + "last_names = pass_data['name'].apply(get_last_name)\n", + "last_names.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Добавление признака" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
passengeridsurvivedpclassnamesexagesibspparchticketfarecabinembarkedlast_name
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNSBraund
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85CCumings
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNSHeikkinen
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123SFutrelle
4503Allen, Mr. William Henrymale35.0003734508.0500NaNSAllen
\n", + "
" + ], + "text/plain": [ + " passengerid survived pclass \\\n", + "0 1 0 3 \n", + "1 2 1 1 \n", + "2 3 1 3 \n", + "3 4 1 1 \n", + "4 5 0 3 \n", + "\n", + " name sex age sibsp \\\n", + "0 Braund, Mr. Owen Harris male 22.0 1 \n", + "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", + "2 Heikkinen, Miss. Laina female 26.0 0 \n", + "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", + "4 Allen, Mr. William Henry male 35.0 0 \n", + "\n", + " parch ticket fare cabin embarked last_name \n", + "0 0 A/5 21171 7.2500 NaN S Braund \n", + "1 0 PC 17599 71.2833 C85 C Cumings \n", + "2 0 STON/O2. 3101282 7.9250 NaN S Heikkinen \n", + "3 0 113803 53.1000 C123 S Futrelle \n", + "4 0 373450 8.0500 NaN S Allen " + ] + }, + "execution_count": 110, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data['last_name'] = last_names\n", + "pass_data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Удаление признака:" + ] + }, + { + "cell_type": "code", + "execution_count": 111, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
passengeridsurvivedpclassnamesexagesibspparchticketfarecabinembarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", + "
" + ], + "text/plain": [ + " passengerid survived pclass \\\n", + "0 1 0 3 \n", + "1 2 1 1 \n", + "2 3 1 3 \n", + "3 4 1 1 \n", + "4 5 0 3 \n", + "\n", + " name sex age sibsp \\\n", + "0 Braund, Mr. Owen Harris male 22.0 1 \n", + "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", + "2 Heikkinen, Miss. Laina female 26.0 0 \n", + "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", + "4 Allen, Mr. William Henry male 35.0 0 \n", + "\n", + " parch ticket fare cabin embarked \n", + "0 0 A/5 21171 7.2500 NaN S \n", + "1 0 PC 17599 71.2833 C85 C \n", + "2 0 STON/O2. 3101282 7.9250 NaN S \n", + "3 0 113803 53.1000 C123 S \n", + "4 0 373450 8.0500 NaN S " + ] + }, + "execution_count": 111, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.drop('last_name', axis=1, inplace=True)\n", + "pass_data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
passengeridsurvivedpclassnamesexagesibspparchticketfarecabinembarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS
\n", + "
" + ], + "text/plain": [ + " passengerid survived pclass \\\n", + "0 1 0 3 \n", + "1 2 1 1 \n", + "2 3 1 3 \n", + "3 4 1 1 \n", + "4 5 0 3 \n", + "\n", + " name sex age sibsp \\\n", + "0 Braund, Mr. Owen Harris male 22.0 1 \n", + "1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 \n", + "2 Heikkinen, Miss. Laina female 26.0 0 \n", + "3 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 \n", + "4 Allen, Mr. William Henry male 35.0 0 \n", + "\n", + " parch ticket fare cabin embarked \n", + "0 0 A/5 21171 7.2500 NaN S \n", + "1 0 PC 17599 71.2833 C85 C \n", + "2 0 STON/O2. 3101282 7.9250 NaN S \n", + "3 0 113803 53.1000 C123 S \n", + "4 0 373450 8.0500 NaN S " + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data[pass_data['sibsp'].notnull()].head()" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
passengeridsurvivedpclassnamesexagesibspparchticketfarecabinembarked
26326401Harrison, Mr. Williammale40.0001120590.0B94S
63363401Parr, Mr. William Henry MarshmaleNaN001120520.0NaNS
80680701Andrews, Mr. Thomas Jrmale39.0001120500.0A36S
81581601Fry, Mr. RichardmaleNaN001120580.0B102S
82282301Reuchlin, Jonkheer. John Georgemale38.000199720.0NaNS
\n", + "
" + ], + "text/plain": [ + " passengerid survived pclass name sex \\\n", + "263 264 0 1 Harrison, Mr. William male \n", + "633 634 0 1 Parr, Mr. William Henry Marsh male \n", + "806 807 0 1 Andrews, Mr. Thomas Jr male \n", + "815 816 0 1 Fry, Mr. Richard male \n", + "822 823 0 1 Reuchlin, Jonkheer. John George male \n", + "\n", + " age sibsp parch ticket fare cabin embarked \n", + "263 40.0 0 0 112059 0.0 B94 S \n", + "633 NaN 0 0 112052 0.0 NaN S \n", + "806 39.0 0 0 112050 0.0 A36 S \n", + "815 NaN 0 0 112058 0.0 B102 S \n", + "822 38.0 0 0 19972 0.0 NaN S " + ] + }, + "execution_count": 113, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.sort_values(by=['pclass', 'fare'], ascending=True).head()" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
passengeridsurvivedpclassnamesexagesibspparchticketfarecabinembarked
25825911Ward, Miss. Annafemale35.000PC 17755512.3292NaNC
67968011Cardeza, Mr. Thomas Drake Martinezmale36.001PC 17755512.3292B51 B53 B55C
73773811Lesurer, Mr. Gustave Jmale35.000PC 17755512.3292B101C
272801Fortune, Mr. Charles Alexandermale19.03219950263.0000C23 C25 C27S
888911Fortune, Miss. Mabel Helenfemale23.03219950263.0000C23 C25 C27S
\n", + "
" + ], + "text/plain": [ + " passengerid survived pclass name \\\n", + "258 259 1 1 Ward, Miss. Anna \n", + "679 680 1 1 Cardeza, Mr. Thomas Drake Martinez \n", + "737 738 1 1 Lesurer, Mr. Gustave J \n", + "27 28 0 1 Fortune, Mr. Charles Alexander \n", + "88 89 1 1 Fortune, Miss. Mabel Helen \n", + "\n", + " sex age sibsp parch ticket fare cabin embarked \n", + "258 female 35.0 0 0 PC 17755 512.3292 NaN C \n", + "679 male 36.0 0 1 PC 17755 512.3292 B51 B53 B55 C \n", + "737 male 35.0 0 0 PC 17755 512.3292 B101 C \n", + "27 male 19.0 3 2 19950 263.0000 C23 C25 C27 S \n", + "88 female 23.0 3 2 19950 263.0000 C23 C25 C27 S " + ] + }, + "execution_count": 114, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.sort_values(by=['pclass', 'fare'], ascending=[True, False]).head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Группировка данных" + ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 115, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.groupby('sex')" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "sex pclass\n", + "female 3 144\n", + " 1 94\n", + " 2 76\n", + "male 3 347\n", + " 1 122\n", + " 2 108\n", + "Name: pclass, dtype: int64" + ] + }, + "execution_count": 116, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.groupby('sex')['pclass'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "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", + "
countmeanstdmin25%50%75%max
pclass
1216.084.15468778.3803730.030.9239560.287593.5512.3292
2184.020.66218313.4173990.013.0000014.250026.073.5000
3491.013.67555011.7781420.07.750008.050015.569.5500
\n", + "
" + ], + "text/plain": [ + " count mean std min 25% 50% 75% max\n", + "pclass \n", + "1 216.0 84.154687 78.380373 0.0 30.92395 60.2875 93.5 512.3292\n", + "2 184.0 20.662183 13.417399 0.0 13.00000 14.2500 26.0 73.5000\n", + "3 491.0 13.675550 11.778142 0.0 7.75000 8.0500 15.5 69.5500" + ] + }, + "execution_count": 117, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.groupby('pclass')['fare'].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "sex\n", + "female 27.915709\n", + "male 30.726645\n", + "Name: age, dtype: float64" + ] + }, + "execution_count": 118, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.groupby('sex')['age'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "sex\n", + "female 0.742038\n", + "male 0.188908\n", + "Name: survived, dtype: float64" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.groupby('sex')['survived'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pclass\n", + "1 0.629630\n", + "2 0.472826\n", + "3 0.242363\n", + "Name: survived, dtype: float64" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.groupby('pclass')['survived'].mean()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "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", + "
sexsurvived
0female0.742038
1male0.188908
\n", + "
" + ], + "text/plain": [ + " sex survived\n", + "0 female 0.742038\n", + "1 male 0.188908" + ] + }, + "execution_count": 121, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pass_data.groupby('sex', as_index=False)['survived'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/ml/lb2/Plohuta/Plohuta_lab2.ipynb b/ml/lb2/Plohuta/Plohuta_lab2.ipynb new file mode 100644 index 00000000..2a47b426 --- /dev/null +++ b/ml/lb2/Plohuta/Plohuta_lab2.ipynb @@ -0,0 +1,2331 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "scrolled": true + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Peak Brightness Date/Time (UT)Latitude (deg.)Longitude (deg.)Altitude (km)Velocity (km/s)vxvyvzTotal Radiated Energy (J)Calculated Total Impact Energy (kt)
02017-07-31 22:01:3524.7N118.5WNaNNaNNaNNaNNaN5.800000e+100.19
12017-07-23 06:12:386.6S69.7W38.017.2-0.48.7-14.83.500000e+100.12
22017-07-13 09:30:3623.1N60.7E35.013.7-10.0-6.5-6.87.300000e+100.23
32017-06-30 14:26:4534.3S134.5E20.015.210.9-9.74.29.400000e+100.29
42017-06-23 20:21:5557.0N143.7E35.124.317.713.1-10.31.840000e+110.52
\n", + "
" + ], + "text/plain": [ + " Peak Brightness Date/Time (UT) Latitude (deg.) Longitude (deg.) \\\n", + "0 2017-07-31 22:01:35 24.7N 118.5W \n", + "1 2017-07-23 06:12:38 6.6S 69.7W \n", + "2 2017-07-13 09:30:36 23.1N 60.7E \n", + "3 2017-06-30 14:26:45 34.3S 134.5E \n", + "4 2017-06-23 20:21:55 57.0N 143.7E \n", + "\n", + " Altitude (km) Velocity (km/s) vx vy vz \\\n", + "0 NaN NaN NaN NaN NaN \n", + "1 38.0 17.2 -0.4 8.7 -14.8 \n", + "2 35.0 13.7 -10.0 -6.5 -6.8 \n", + "3 20.0 15.2 10.9 -9.7 4.2 \n", + "4 35.1 24.3 17.7 13.1 -10.3 \n", + "\n", + " Total Radiated Energy (J) Calculated Total Impact Energy (kt) \n", + "0 5.800000e+10 0.19 \n", + "1 3.500000e+10 0.12 \n", + "2 7.300000e+10 0.23 \n", + "3 9.400000e+10 0.29 \n", + "4 1.840000e+11 0.52 " + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "fireballs = pd.read_csv('cneos_fireball_data.csv')\n", + "fireballs.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "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", + "
Latitude (deg.)Longitude (deg.)Altitude (km)Calculated Total Impact Energy (kt)
14654.8N61.1E23.3440.0
\n", + "
" + ], + "text/plain": [ + " Latitude (deg.) Longitude (deg.) Altitude (km) \\\n", + "146 54.8N 61.1E 23.3 \n", + "\n", + " Calculated Total Impact Energy (kt) \n", + "146 440.0 " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 1.Определите местоположение появления метеорита с наибольшим количеством высвободившейся энергии\n", + "\n", + "fireballs[['Latitude (deg.)','Longitude (deg.)', 'Altitude (km)','Calculated Total Impact Energy (kt)']].sort_values(by=['Calculated Total Impact Energy (kt)'], ascending=False)[:1]" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "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", + "
Peak Brightness Date/Time (UT)Latitude (deg.)Longitude (deg.)Altitude (km)Velocity (km/s)vxvyvzTotal Radiated Energy (J)Calculated Total Impact Energy (kt)
3002008-07-01 17:40:1937.1N115.7W36.19.82.81.7-9.23.600000e+100.12
\n", + "
" + ], + "text/plain": [ + " Peak Brightness Date/Time (UT) Latitude (deg.) Longitude (deg.) \\\n", + "300 2008-07-01 17:40:19 37.1N 115.7W \n", + "\n", + " Altitude (km) Velocity (km/s) vx vy vz Total Radiated Energy (J) \\\n", + "300 36.1 9.8 2.8 1.7 -9.2 3.600000e+10 \n", + "\n", + " Calculated Total Impact Energy (kt) \n", + "300 0.12 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 2. Определите метеорит с максимальной и минимальной скоростью.\n", + "fireballs.sort_values(by=['Velocity (km/s)'], ascending=True)[:1] # минимальная скорость" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "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", + "
Peak Brightness Date/Time (UT)Latitude (deg.)Longitude (deg.)Altitude (km)Velocity (km/s)vxvyvzTotal Radiated Energy (J)Calculated Total Impact Energy (kt)
672015-07-04 01:40:1138.6N103.1E46.349.00.9-40.4-27.75.600000e+100.18
\n", + "
" + ], + "text/plain": [ + " Peak Brightness Date/Time (UT) Latitude (deg.) Longitude (deg.) \\\n", + "67 2015-07-04 01:40:11 38.6N 103.1E \n", + "\n", + " Altitude (km) Velocity (km/s) vx vy vz \\\n", + "67 46.3 49.0 0.9 -40.4 -27.7 \n", + "\n", + " Total Radiated Energy (J) Calculated Total Impact Energy (kt) \n", + "67 5.600000e+10 0.18 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fireballs.sort_values(by=['Velocity (km/s)'], ascending=False)[:1] # максимальная скорость" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
Make this Notebook Trusted to load map: File -> Trust Notebook
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 3. Определите место максимальной концентрации метеоритов\n", + "fireballs_new = pd.read_csv('cneos_fireball_data.csv')\n", + "fireballs_new = fireballs_new[fireballs_new['Latitude (deg.)'].notnull()]\n", + "fireballs_new = fireballs_new[fireballs_new['Longitude (deg.)'].notnull()]\n", + "def get_latitude(name):\n", + " if 'N' in name:\n", + " return float(name.split('.')[0].strip())\n", + " if 'S' in name:\n", + " return -float(name.split('.')[0].strip())\n", + "def get_longitude(name):\n", + " if 'W' in name:\n", + " return float(name.split('.')[0].strip())\n", + " if 'E' in name:\n", + " return -float(name.split('.')[0].strip()) \n", + "import folium\n", + "fireballs_new['Latitude (deg.)'] = fireballs_new['Latitude (deg.)'].apply(get_latitude)\n", + "fireballs_new['Longitude (deg.)'] = fireballs_new['Longitude (deg.)'].apply(get_longitude)\n", + "latitude = fireballs_new['Latitude (deg.)']\n", + "longitude = fireballs_new['Longitude (deg.)']\n", + "altitude = fireballs_new['Altitude (km)']\n", + "map = folium.Map(location=[0,0], zoom_start = 2)\n", + "for latitude, longitude, altitude in zip(latitude, longitude, altitude):\n", + " folium.CircleMarker(location=[latitude, longitude],radius = 3, popup=str(altitude)+\" km\", fill_color = 'red', color = 'red', fill_opacity = 0.9).add_to(map)\n", + "map " + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Peak Brightness Date/Time (UT)Latitude (deg.)Longitude (deg.)Altitude (km)Velocity (km/s)vxvyvzTotal Radiated Energy (J)Calculated Total Impact Energy (kt)
02017-07-31 22:01:3524.7N118.5WNaNNaNNaNNaNNaN5.800000e+100.19
12017-07-23 06:12:386.6S69.7W38.017.2-0.48.7-14.83.500000e+100.12
22017-07-13 09:30:3623.1N60.7E35.013.7-10.0-6.5-6.87.300000e+100.23
32017-06-30 14:26:4534.3S134.5E20.015.210.9-9.74.29.400000e+100.29
42017-06-23 20:21:5557.0N143.7E35.124.317.713.1-10.31.840000e+110.52
\n", + "
" + ], + "text/plain": [ + " Peak Brightness Date/Time (UT) Latitude (deg.) Longitude (deg.) \\\n", + "0 2017-07-31 22:01:35 24.7N 118.5W \n", + "1 2017-07-23 06:12:38 6.6S 69.7W \n", + "2 2017-07-13 09:30:36 23.1N 60.7E \n", + "3 2017-06-30 14:26:45 34.3S 134.5E \n", + "4 2017-06-23 20:21:55 57.0N 143.7E \n", + "\n", + " Altitude (km) Velocity (km/s) vx vy vz \\\n", + "0 NaN NaN NaN NaN NaN \n", + "1 38.0 17.2 -0.4 8.7 -14.8 \n", + "2 35.0 13.7 -10.0 -6.5 -6.8 \n", + "3 20.0 15.2 10.9 -9.7 4.2 \n", + "4 35.1 24.3 17.7 13.1 -10.3 \n", + "\n", + " Total Radiated Energy (J) Calculated Total Impact Energy (kt) \n", + "0 5.800000e+10 0.19 \n", + "1 3.500000e+10 0.12 \n", + "2 7.300000e+10 0.23 \n", + "3 9.400000e+10 0.29 \n", + "4 1.840000e+11 0.52 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fireballs.head() " + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Peak Brightness Date/Time (UT)Latitude (deg.)Longitude (deg.)Altitude (km)Velocity (km/s)vxvyvzTotal Radiated Energy (J)Calculated Total Impact Energy (kt)Season
02017-07-31 22:01:3524.7N118.5WNaNNaNNaNNaNNaN5.800000e+100.19summer
12017-07-23 06:12:386.6S69.7W38.017.2-0.48.7-14.83.500000e+100.12summer
22017-07-13 09:30:3623.1N60.7E35.013.7-10.0-6.5-6.87.300000e+100.23summer
32017-06-30 14:26:4534.3S134.5E20.015.210.9-9.74.29.400000e+100.29summer
42017-06-23 20:21:5557.0N143.7E35.124.317.713.1-10.31.840000e+110.52summer
\n", + "
" + ], + "text/plain": [ + " Peak Brightness Date/Time (UT) Latitude (deg.) Longitude (deg.) \\\n", + "0 2017-07-31 22:01:35 24.7N 118.5W \n", + "1 2017-07-23 06:12:38 6.6S 69.7W \n", + "2 2017-07-13 09:30:36 23.1N 60.7E \n", + "3 2017-06-30 14:26:45 34.3S 134.5E \n", + "4 2017-06-23 20:21:55 57.0N 143.7E \n", + "\n", + " Altitude (km) Velocity (km/s) vx vy vz \\\n", + "0 NaN NaN NaN NaN NaN \n", + "1 38.0 17.2 -0.4 8.7 -14.8 \n", + "2 35.0 13.7 -10.0 -6.5 -6.8 \n", + "3 20.0 15.2 10.9 -9.7 4.2 \n", + "4 35.1 24.3 17.7 13.1 -10.3 \n", + "\n", + " Total Radiated Energy (J) Calculated Total Impact Energy (kt) Season \n", + "0 5.800000e+10 0.19 summer \n", + "1 3.500000e+10 0.12 summer \n", + "2 7.300000e+10 0.23 summer \n", + "3 9.400000e+10 0.29 summer \n", + "4 1.840000e+11 0.52 summer " + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 4. Определите время года, в которое вероятность появления метеоритов максимальна. Постройте график.\n", + "def get_month(name):\n", + " return name.split('-')[1].strip()\n", + "def get_season(listOfMonth):\n", + " if (listOfMonth == '12') or (listOfMonth == '01') or (listOfMonth == '02'):\n", + " listOfMonth = 'winter'\n", + " if (listOfMonth == '03') or (listOfMonth == '04') or (listOfMonth == '05'):\n", + " listOfMonth = 'spring'\n", + " if (listOfMonth == '06') or (listOfMonth == '07') or (listOfMonth == '08'):\n", + " listOfMonth = 'summer'\n", + " if (listOfMonth == '09') or (listOfMonth == '10') or (listOfMonth == '11'):\n", + " listOfMonth = 'autumn'\n", + " return listOfMonth\n", + "fireballs['Season'] = fireballs['Peak Brightness Date/Time (UT)'].apply(get_month)\n", + "fireballs['Season'] = fireballs['Season'].apply(get_season)\n", + "fireballs.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'autumn'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fireballs['Season'].value_counts().index[0] # определим, в каком сезоне чаще появлялись метеориты" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Populating the interactive namespace from numpy and matplotlib\n" + ] + } + ], + "source": [ + "# нарисуем график\n", + "from __future__ import (absolute_import, division, print_function, unicode_literals)\n", + "import warnings\n", + "warnings.simplefilter('ignore')\n", + "%pylab inline\n", + "from pylab import rcParams\n", + "rcParams['figure.figsize'] = 8, 5\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fireballs.groupby(['Season'])['Season'].count().plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Peak Brightness Date/Time (UT)Latitude (deg.)Longitude (deg.)Altitude (km)Velocity (km/s)vxvyvzTotal Radiated Energy (J)Calculated Total Impact Energy (kt)
02017-07-31 22:01:3524.7N118.5WNaNNaNNaNNaNNaN5.800000e+100.190
12017-07-23 06:12:386.6S69.7W38.017.2-0.48.7-14.83.500000e+100.120
22017-07-13 09:30:3623.1N60.7E35.013.7-10.0-6.5-6.87.300000e+100.230
32017-06-30 14:26:4534.3S134.5E20.015.210.9-9.74.29.400000e+100.290
42017-06-23 20:21:5557.0N143.7E35.124.317.713.1-10.31.840000e+110.520
.................................
7141993-11-29 17:48:4126.5N78.3ENaNNaNNaNNaNNaN2.600000e+100.092
7151993-10-31 03:39:2751.3N100.9WNaNNaNNaNNaNNaN4.000000e+100.130
7161991-10-04 09:22:4778.7N6.3ENaNNaNNaNNaNNaN5.500000e+111.400
7171990-10-01 03:51:477.5N142.8ENaNNaNNaNNaNNaN2.500000e+125.200
7181988-04-15 03:03:104.1S124.3ENaNNaNNaNNaNNaN7.580000e+1214.000
\n", + "

719 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " Peak Brightness Date/Time (UT) Latitude (deg.) Longitude (deg.) \\\n", + "0 2017-07-31 22:01:35 24.7N 118.5W \n", + "1 2017-07-23 06:12:38 6.6S 69.7W \n", + "2 2017-07-13 09:30:36 23.1N 60.7E \n", + "3 2017-06-30 14:26:45 34.3S 134.5E \n", + "4 2017-06-23 20:21:55 57.0N 143.7E \n", + ".. ... ... ... \n", + "714 1993-11-29 17:48:41 26.5N 78.3E \n", + "715 1993-10-31 03:39:27 51.3N 100.9W \n", + "716 1991-10-04 09:22:47 78.7N 6.3E \n", + "717 1990-10-01 03:51:47 7.5N 142.8E \n", + "718 1988-04-15 03:03:10 4.1S 124.3E \n", + "\n", + " Altitude (km) Velocity (km/s) vx vy vz \\\n", + "0 NaN NaN NaN NaN NaN \n", + "1 38.0 17.2 -0.4 8.7 -14.8 \n", + "2 35.0 13.7 -10.0 -6.5 -6.8 \n", + "3 20.0 15.2 10.9 -9.7 4.2 \n", + "4 35.1 24.3 17.7 13.1 -10.3 \n", + ".. ... ... ... ... ... \n", + "714 NaN NaN NaN NaN NaN \n", + "715 NaN NaN NaN NaN NaN \n", + "716 NaN NaN NaN NaN NaN \n", + "717 NaN NaN NaN NaN NaN \n", + "718 NaN NaN NaN NaN NaN \n", + "\n", + " Total Radiated Energy (J) Calculated Total Impact Energy (kt) \n", + "0 5.800000e+10 0.190 \n", + "1 3.500000e+10 0.120 \n", + "2 7.300000e+10 0.230 \n", + "3 9.400000e+10 0.290 \n", + "4 1.840000e+11 0.520 \n", + ".. ... ... \n", + "714 2.600000e+10 0.092 \n", + "715 4.000000e+10 0.130 \n", + "716 5.500000e+11 1.400 \n", + "717 2.500000e+12 5.200 \n", + "718 7.580000e+12 14.000 \n", + "\n", + "[719 rows x 10 columns]" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 5. Удалите строки данных, в которых для метеоритов не указана скорость. Выведите размер набора данных до и после удаления.\n", + "fireballs = pd.read_csv('cneos_fireball_data.csv')\n", + "fireballs # размер набора данных внизу таблицы" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Peak Brightness Date/Time (UT)Latitude (deg.)Longitude (deg.)Altitude (km)Velocity (km/s)vxvyvzTotal Radiated Energy (J)Calculated Total Impact Energy (kt)
12017-07-23 06:12:386.6S69.7W38.017.2-0.48.7-14.83.500000e+100.12
22017-07-13 09:30:3623.1N60.7E35.013.7-10.0-6.5-6.87.300000e+100.23
32017-06-30 14:26:4534.3S134.5E20.015.210.9-9.74.29.400000e+100.29
42017-06-23 20:21:5557.0N143.7E35.124.317.713.1-10.31.840000e+110.52
52017-06-20 13:41:3254.2S133.0E33.313.68.7-5.78.86.360000e+111.60
.................................
4502004-04-22 04:21:4944.3S83.3E29.616.38.5-12.1-6.86.240000e+111.50
4512004-04-06 03:24:4912.0S162.8E35.025.610.5-23.2-2.94.330000e+111.10
4622003-11-10 13:54:0664.5S136.2E23.020.114.8-8.710.45.180000e+111.30
4672003-09-27 12:59:0221.0N86.6E26.018.2-1.0-5.4-17.32.150000e+124.60
6261998-01-04 23:00:2735.1S33.4E30.017.16.0-10.612.07.400000e+100.23
\n", + "

157 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " Peak Brightness Date/Time (UT) Latitude (deg.) Longitude (deg.) \\\n", + "1 2017-07-23 06:12:38 6.6S 69.7W \n", + "2 2017-07-13 09:30:36 23.1N 60.7E \n", + "3 2017-06-30 14:26:45 34.3S 134.5E \n", + "4 2017-06-23 20:21:55 57.0N 143.7E \n", + "5 2017-06-20 13:41:32 54.2S 133.0E \n", + ".. ... ... ... \n", + "450 2004-04-22 04:21:49 44.3S 83.3E \n", + "451 2004-04-06 03:24:49 12.0S 162.8E \n", + "462 2003-11-10 13:54:06 64.5S 136.2E \n", + "467 2003-09-27 12:59:02 21.0N 86.6E \n", + "626 1998-01-04 23:00:27 35.1S 33.4E \n", + "\n", + " Altitude (km) Velocity (km/s) vx vy vz \\\n", + "1 38.0 17.2 -0.4 8.7 -14.8 \n", + "2 35.0 13.7 -10.0 -6.5 -6.8 \n", + "3 20.0 15.2 10.9 -9.7 4.2 \n", + "4 35.1 24.3 17.7 13.1 -10.3 \n", + "5 33.3 13.6 8.7 -5.7 8.8 \n", + ".. ... ... ... ... ... \n", + "450 29.6 16.3 8.5 -12.1 -6.8 \n", + "451 35.0 25.6 10.5 -23.2 -2.9 \n", + "462 23.0 20.1 14.8 -8.7 10.4 \n", + "467 26.0 18.2 -1.0 -5.4 -17.3 \n", + "626 30.0 17.1 6.0 -10.6 12.0 \n", + "\n", + " Total Radiated Energy (J) Calculated Total Impact Energy (kt) \n", + "1 3.500000e+10 0.12 \n", + "2 7.300000e+10 0.23 \n", + "3 9.400000e+10 0.29 \n", + "4 1.840000e+11 0.52 \n", + "5 6.360000e+11 1.60 \n", + ".. ... ... \n", + "450 6.240000e+11 1.50 \n", + "451 4.330000e+11 1.10 \n", + "462 5.180000e+11 1.30 \n", + "467 2.150000e+12 4.60 \n", + "626 7.400000e+10 0.23 \n", + "\n", + "[157 rows x 10 columns]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fireballs = fireballs[fireballs['Velocity (km/s)'].notnull()]\n", + "# новый размер набора данных внизу таблицы\n", + "fireballs" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Peak Brightness Date/Time (UT)Latitude (deg.)Longitude (deg.)Altitude (km)Velocity (km/s)vxvyvzTotal Radiated Energy (J)Calculated Total Impact Energy (kt)Hour
12017-07-23 06:12:386.6S69.7W38.017.2-0.48.7-14.83.500000e+100.126
22017-07-13 09:30:3623.1N60.7E35.013.7-10.0-6.5-6.87.300000e+100.239
32017-06-30 14:26:4534.3S134.5E20.015.210.9-9.74.29.400000e+100.2914
42017-06-23 20:21:5557.0N143.7E35.124.317.713.1-10.31.840000e+110.5220
52017-06-20 13:41:3254.2S133.0E33.313.68.7-5.78.86.360000e+111.6013
....................................
4502004-04-22 04:21:4944.3S83.3E29.616.38.5-12.1-6.86.240000e+111.504
4512004-04-06 03:24:4912.0S162.8E35.025.610.5-23.2-2.94.330000e+111.103
4622003-11-10 13:54:0664.5S136.2E23.020.114.8-8.710.45.180000e+111.3013
4672003-09-27 12:59:0221.0N86.6E26.018.2-1.0-5.4-17.32.150000e+124.6012
6261998-01-04 23:00:2735.1S33.4E30.017.16.0-10.612.07.400000e+100.2323
\n", + "

157 rows × 11 columns

\n", + "
" + ], + "text/plain": [ + " Peak Brightness Date/Time (UT) Latitude (deg.) Longitude (deg.) \\\n", + "1 2017-07-23 06:12:38 6.6S 69.7W \n", + "2 2017-07-13 09:30:36 23.1N 60.7E \n", + "3 2017-06-30 14:26:45 34.3S 134.5E \n", + "4 2017-06-23 20:21:55 57.0N 143.7E \n", + "5 2017-06-20 13:41:32 54.2S 133.0E \n", + ".. ... ... ... \n", + "450 2004-04-22 04:21:49 44.3S 83.3E \n", + "451 2004-04-06 03:24:49 12.0S 162.8E \n", + "462 2003-11-10 13:54:06 64.5S 136.2E \n", + "467 2003-09-27 12:59:02 21.0N 86.6E \n", + "626 1998-01-04 23:00:27 35.1S 33.4E \n", + "\n", + " Altitude (km) Velocity (km/s) vx vy vz \\\n", + "1 38.0 17.2 -0.4 8.7 -14.8 \n", + "2 35.0 13.7 -10.0 -6.5 -6.8 \n", + "3 20.0 15.2 10.9 -9.7 4.2 \n", + "4 35.1 24.3 17.7 13.1 -10.3 \n", + "5 33.3 13.6 8.7 -5.7 8.8 \n", + ".. ... ... ... ... ... \n", + "450 29.6 16.3 8.5 -12.1 -6.8 \n", + "451 35.0 25.6 10.5 -23.2 -2.9 \n", + "462 23.0 20.1 14.8 -8.7 10.4 \n", + "467 26.0 18.2 -1.0 -5.4 -17.3 \n", + "626 30.0 17.1 6.0 -10.6 12.0 \n", + "\n", + " Total Radiated Energy (J) Calculated Total Impact Energy (kt) Hour \n", + "1 3.500000e+10 0.12 6 \n", + "2 7.300000e+10 0.23 9 \n", + "3 9.400000e+10 0.29 14 \n", + "4 1.840000e+11 0.52 20 \n", + "5 6.360000e+11 1.60 13 \n", + ".. ... ... ... \n", + "450 6.240000e+11 1.50 4 \n", + "451 4.330000e+11 1.10 3 \n", + "462 5.180000e+11 1.30 13 \n", + "467 2.150000e+12 4.60 12 \n", + "626 7.400000e+10 0.23 23 \n", + "\n", + "[157 rows x 11 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 6. Построить график, на котором по оси ОХ отложено время суток, по OY – частота появления метеоритов.\n", + "def get_time(name):\n", + " return name.split(' ')[1].strip()\n", + "def get_hour(name):\n", + " return int(name.split(':')[0].strip())\n", + "fireballs['Hour'] = fireballs['Peak Brightness Date/Time (UT)'].apply(get_time)\n", + "fireballs['Hour'] = fireballs['Hour'].apply(get_hour)\n", + "fireballs # определим, в какие часы падали метеориты" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# построим график, где по оси ОХ отложены часы появления метеоритов, по OY – частота их появления \n", + "fireballs.groupby(['Hour'])['Hour'].count().plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Peak Brightness Date/Time (UT)Latitude (deg.)Longitude (deg.)Altitude (km)Velocity (km/s)vxvyvzTotal Radiated Energy (J)Calculated Total Impact Energy (kt)
02017-07-31 22:01:3524.7N118.5WNaN35.307771NaNNaNNaN5.800000e+100.190
12017-07-23 06:12:386.6S69.7W38.017.200000-0.48.7-14.83.500000e+100.120
22017-07-13 09:30:3623.1N60.7E35.013.700000-10.0-6.5-6.87.300000e+100.230
32017-06-30 14:26:4534.3S134.5E20.015.20000010.9-9.74.29.400000e+100.290
42017-06-23 20:21:5557.0N143.7E35.124.30000017.713.1-10.31.840000e+110.520
.................................
7141993-11-29 17:48:4126.5N78.3ENaN28.736402NaNNaNNaN2.600000e+100.092
7151993-10-31 03:39:2751.3N100.9WNaN47.795836NaNNaNNaN4.000000e+100.130
7161991-10-04 09:22:4778.7N6.3ENaN12.072226NaNNaNNaN5.500000e+111.400
7171990-10-01 03:51:477.5N142.8ENaN29.456382NaNNaNNaN2.500000e+125.200
7181988-04-15 03:03:104.1S124.3ENaN17.710489NaNNaNNaN7.580000e+1214.000
\n", + "

719 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " Peak Brightness Date/Time (UT) Latitude (deg.) Longitude (deg.) \\\n", + "0 2017-07-31 22:01:35 24.7N 118.5W \n", + "1 2017-07-23 06:12:38 6.6S 69.7W \n", + "2 2017-07-13 09:30:36 23.1N 60.7E \n", + "3 2017-06-30 14:26:45 34.3S 134.5E \n", + "4 2017-06-23 20:21:55 57.0N 143.7E \n", + ".. ... ... ... \n", + "714 1993-11-29 17:48:41 26.5N 78.3E \n", + "715 1993-10-31 03:39:27 51.3N 100.9W \n", + "716 1991-10-04 09:22:47 78.7N 6.3E \n", + "717 1990-10-01 03:51:47 7.5N 142.8E \n", + "718 1988-04-15 03:03:10 4.1S 124.3E \n", + "\n", + " Altitude (km) Velocity (km/s) vx vy vz \\\n", + "0 NaN 35.307771 NaN NaN NaN \n", + "1 38.0 17.200000 -0.4 8.7 -14.8 \n", + "2 35.0 13.700000 -10.0 -6.5 -6.8 \n", + "3 20.0 15.200000 10.9 -9.7 4.2 \n", + "4 35.1 24.300000 17.7 13.1 -10.3 \n", + ".. ... ... ... ... ... \n", + "714 NaN 28.736402 NaN NaN NaN \n", + "715 NaN 47.795836 NaN NaN NaN \n", + "716 NaN 12.072226 NaN NaN NaN \n", + "717 NaN 29.456382 NaN NaN NaN \n", + "718 NaN 17.710489 NaN NaN NaN \n", + "\n", + " Total Radiated Energy (J) Calculated Total Impact Energy (kt) \n", + "0 5.800000e+10 0.190 \n", + "1 3.500000e+10 0.120 \n", + "2 7.300000e+10 0.230 \n", + "3 9.400000e+10 0.290 \n", + "4 1.840000e+11 0.520 \n", + ".. ... ... \n", + "714 2.600000e+10 0.092 \n", + "715 4.000000e+10 0.130 \n", + "716 5.500000e+11 1.400 \n", + "717 2.500000e+12 5.200 \n", + "718 7.580000e+12 14.000 \n", + "\n", + "[719 rows x 10 columns]" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 7. Заполните строки в которых для метеоритов не указана скорость.\n", + "fireballs = pd.read_csv('cneos_fireball_data.csv')\n", + "import random\n", + "import time\n", + "def fill_velocity(name):\n", + " name = random.uniform(fireballs.iloc[300]['Velocity (km/s)'],fireballs.iloc[67]['Velocity (km/s)'])\n", + " time.sleep(0.001)\n", + " return name\n", + "fireballs.loc[fireballs['Velocity (km/s)'].isnull(), 'Velocity (km/s)'] = fireballs['Velocity (km/s)'].apply(fill_velocity)\n", + "fireballs" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Peak Brightness Date/Time (UT)Latitude (deg.)Longitude (deg.)Altitude (km)Velocity (km/s)vxvyvzTotal Radiated Energy (J)Calculated Total Impact Energy (kt)Month
02017-07-31 22:01:3524.7N118.5WNaN35.307771NaNNaNNaN5.800000e+100.197
12017-07-23 06:12:386.6S69.7W38.017.200000-0.48.7-14.83.500000e+100.127
22017-07-13 09:30:3623.1N60.7E35.013.700000-10.0-6.5-6.87.300000e+100.237
32017-06-30 14:26:4534.3S134.5E20.015.20000010.9-9.74.29.400000e+100.296
42017-06-23 20:21:5557.0N143.7E35.124.30000017.713.1-10.31.840000e+110.526
\n", + "
" + ], + "text/plain": [ + " Peak Brightness Date/Time (UT) Latitude (deg.) Longitude (deg.) \\\n", + "0 2017-07-31 22:01:35 24.7N 118.5W \n", + "1 2017-07-23 06:12:38 6.6S 69.7W \n", + "2 2017-07-13 09:30:36 23.1N 60.7E \n", + "3 2017-06-30 14:26:45 34.3S 134.5E \n", + "4 2017-06-23 20:21:55 57.0N 143.7E \n", + "\n", + " Altitude (km) Velocity (km/s) vx vy vz \\\n", + "0 NaN 35.307771 NaN NaN NaN \n", + "1 38.0 17.200000 -0.4 8.7 -14.8 \n", + "2 35.0 13.700000 -10.0 -6.5 -6.8 \n", + "3 20.0 15.200000 10.9 -9.7 4.2 \n", + "4 35.1 24.300000 17.7 13.1 -10.3 \n", + "\n", + " Total Radiated Energy (J) Calculated Total Impact Energy (kt) Month \n", + "0 5.800000e+10 0.19 7 \n", + "1 3.500000e+10 0.12 7 \n", + "2 7.300000e+10 0.23 7 \n", + "3 9.400000e+10 0.29 6 \n", + "4 1.840000e+11 0.52 6 " + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 8. Определите месяц года, для которого появление метеоритов наиболее вероятно (постройте необходимые графики).\n", + "def get_month(name):\n", + " return int(name.split('-')[1].strip())\n", + "fireballs['Month'] = fireballs['Peak Brightness Date/Time (UT)'].apply(get_month)\n", + "fireballs.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fireballs.groupby(['Month'])['Month'].count().plot()" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "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", + "
Altitude (km)Total Radiated Energy (J)
Altitude (km)1.000000-0.085787
Total Radiated Energy (J)-0.0857871.000000
\n", + "
" + ], + "text/plain": [ + " Altitude (km) Total Radiated Energy (J)\n", + "Altitude (km) 1.000000 -0.085787\n", + "Total Radiated Energy (J) -0.085787 1.000000" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# 9. Вычислите корреляцию Пирсона и Спирмена между признаками Altitude и Total Radiated Energy. \n", + "# Сравните полученные величины корреляции. Постройте гистограммы для указанных признаков. Оцените значение p-value.\n", + "fireballs[['Altitude (km)','Total Radiated Energy (J)']].corr() # кореляция Пирсона" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.08578656525823583" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pearson = fireballs[['Altitude (km)','Total Radiated Energy (J)']].corr().iloc[0]['Total Radiated Energy (J)']\n", + "pearson # Коэффициент корреляции Пирсона" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "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", + "
Altitude (km)Total Radiated Energy (J)
Altitude (km)1.00000-0.12671
Total Radiated Energy (J)-0.126711.00000
\n", + "
" + ], + "text/plain": [ + " Altitude (km) Total Radiated Energy (J)\n", + "Altitude (km) 1.00000 -0.12671\n", + "Total Radiated Energy (J) -0.12671 1.00000" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fireballs[['Altitude (km)','Total Radiated Energy (J)']].corr(method='spearman') # кореляция Спирмена" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "-0.12671041939219077" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "spearman = fireballs[['Altitude (km)','Total Radiated Energy (J)']].corr(method='spearman').iloc[0]['Total Radiated Energy (J)']\n", + "spearman" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fireballs['Altitude (km)'].plot.hist(bins = 30)" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fireballs['Total Radiated Energy (J)'].plot.hist()" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "p-value is good\n" + ] + } + ], + "source": [ + "if (spearman<0.05):\n", + " print(\"p-value is good\")\n", + "else:\n", + " print(\"p-value is not good\")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Collecting folium\n", + " Downloading folium-0.12.1-py2.py3-none-any.whl (94 kB)\n", + "Requirement already satisfied: numpy in c:\\users\\acer\\anaconda3\\lib\\site-packages (from folium) (1.19.2)\n", + "Collecting branca>=0.3.0\n", + " Downloading branca-0.4.2-py3-none-any.whl (24 kB)\n", + "Requirement already satisfied: jinja2>=2.9 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from folium) (2.11.2)\n", + "Requirement already satisfied: requests in c:\\users\\acer\\anaconda3\\lib\\site-packages (from folium) (2.24.0)\n", + "Requirement already satisfied: MarkupSafe>=0.23 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from jinja2>=2.9->folium) (1.1.1)\n", + "Requirement already satisfied: certifi>=2017.4.17 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from requests->folium) (2020.6.20)\n", + "Requirement already satisfied: idna<3,>=2.5 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from requests->folium) (2.10)\n", + "Requirement already satisfied: chardet<4,>=3.0.2 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from requests->folium) (3.0.4)\n", + "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:\\users\\acer\\anaconda3\\lib\\site-packages (from requests->folium) (1.25.11)\n", + "Installing collected packages: branca, folium\n", + "Successfully installed branca-0.4.2 folium-0.12.1\n" + ] + } + ], + "source": [ + "!pip install folium" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/ml/lb3/Plohuta/Plohuta_lab3.ipynb b/ml/lb3/Plohuta/Plohuta_lab3.ipynb new file mode 100644 index 00000000..1cb7fdcb --- /dev/null +++ b/ml/lb3/Plohuta/Plohuta_lab3.ipynb @@ -0,0 +1,556 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Лабораторная работа №3. Методы классификации данных.\n", + "\n", + "#### Выполнила:\n", + "Плохута Д.Г. \n", + "#### Группа: \n", + "19-ИВТ-3 \n", + "#### Вариант:\n", + "№6 \n", + "#### Набор данных:\n", + "6 (occupancy)\n", + "#### Классификаторы: \n", + "2 - классификатор K ближайших соседей (задаётся радиус для выбора ближайших объектов); \n", + "4 - логический классификатор (бинарное решающее дерево). \n", + "\n", + "### 1.\tИзучить набор данных. Создать описание набора данных на русском языке. Описать признаки, используемые в наборе данных (включить полученные описания в отчёт).\n", + "\n", + "1. date - дата и время замера\n", + "2. Temperature - температура в градусах Цельсия \n", + "3. Humidity - влажность воздуха, %\n", + "4. Light - освещенность офиса, Люкс\n", + "5. CO2 - уровень углекислого газа CO2, ppm (пропромилле)\n", + "6. Humidity Ratio - удельная влажность, производное количество от температуры и относительной влажности, в кг водяного пара/кг воздуха\n", + "7. Occupancy - заполненность, 0 или 1: 0 для незанятого, 1 для занятого состояния\n", + "\n", + "### 2.\tУдалите дубликаты строк в наборе данных; приведите размер набора данных до и после данной операции.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "import pandas as pd\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#occupancy_DF = pd.read_csv('C:\\\\Users\\\\Acer\\\\Desktop\\\\уник\\\\мо\\\\лб2_классификация\\\\6_occupancy\\\\read.txt')\n", + "#occupancy_DF" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "unexpected EOF while parsing (, line 4)", + "output_type": "error", + "traceback": [ + "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m4\u001b[0m\n\u001b[1;33m print(\"Удалено дубликатов: \" , init_len - finit_len)\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m unexpected EOF while parsing\n" + ] + } + ], + "source": [ + "init_len= len(#occupancy_DF)\n", + "#occupancy_DF.drop_duplicates(keep= False,inplace=True)\n", + "finit_len = len(#occupancy_DF)\n", + "print(\"Удалено дубликатов: \" , init_len - finit_len)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#occupancy_DF" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.\tОцените сбалансированность данных по классам (постройте гистограмму). Используйте полученную информацию при выборе метрики оценки качества классификации (PR или ROC кривая)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "occupancy_DF['Occupancy'].value_counts().plot(kind='bar', label='Occupancy')\n", + "plt.legend()\n", + "plt.title(\"Занятось офиса\");" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Как видно из гистограммы, классы несбалансированны, преобладает первый класс (0).\n", + "\n", + "### 4.\tВыполните масштабирование количественных признаков; Постройте диаграммы BoxPlot для признаков до и после масштабирования. Выберите способ масштабирования (например, нормализацию или стандартизацию)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "before_scaling = [\"Temperature\", \"Humidity\", \"Light\", \"CO2\", \"HumidityRatio\"]\n", + "sns.boxplot(data = occupancy_DF[before_scaling])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Нормализация" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import sklearn as skl\n", + "from sklearn.preprocessing import MinMaxScaler" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "occupancy_DF[before_scaling] = MinMaxScaler().fit_transform(occupancy_DF[before_scaling])\n", + "sns.boxplot(data = occupancy_DF[before_scaling])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.\tВыполните замену категориальных признаков; выберите и обоснуйте способ замены." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "categorical = [c for c in occupancy_DF.columns if occupancy_DF[c].dtype.name == 'object']\n", + "print(\"Категориальные признаки: \", categorical)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "occupancy_DF[categorical].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "occupancy_DF['date'].unique()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Все значения уникальны (указано в сопровождающем документе, измерения проводились каждую минуту), замена не имеет смысла" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6.\tОцените корреляцию между признаков и удалите те признаки, которые коррелируют с наибольшим числом других (удалять признаки нужно только для линейных методов классификации)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "corr_matrix = occupancy_DF.corr()\n", + "sns.heatmap(corr_matrix)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Признаки коррелируют равномерно" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 7.\tЗаполните пропущенные значения в данных." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "occupancy_DF.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Пропущенных значений нет" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 8.\tРешите поставленную задачу классификации в соответствии с заданием. \n", + "#### При подборе параметров классификатора используйте метод GridSearchCV и перекрёстную проверку (изучите возможные для изменения параметры классификации). Определите схему построения многоклассового классификатора, используемую по умолчанию (опишите используемую схему кодирования, обоснуйте свой выбор). Постройте, если это возможно, многоклассовую классификацию на основе схем «один-против-всех» и «все-против-всех». Оцените точность классификации для каждой их схем. Постройте кривые PR и ROC (для каждого из классов должны быть построены отдельные кривые, а также кривые для микро и макроусреднения метрик качества). Для линейного классификатора используйте регуляризацию. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) Классификатор K ближайших соседей (задаётся радиус для выбора ближайших объектов):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.neighbors import RadiusNeighborsClassifier\n", + "from sklearn.neighbors import KNeighborsClassifier\n", + "from sklearn.model_selection import train_test_split\n", + "from sklearn.model_selection import GridSearchCV\n", + "from sklearn.metrics import accuracy_score\n", + "X = occupancy_DF.drop(('date'), axis=1)\n", + "Y = occupancy_DF.Occupancy\n", + "X.columns " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size = 0.3, random_state = 0)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "radius_classif = RadiusNeighborsClassifier()\n", + "radius_classif.get_params()\n", + "params = {'radius': [2, 3, 4],\n", + " 'weights': ['uniform', 'distance']}\n", + "radius_classif_grid = GridSearchCV(radius_classif, params)\n", + "radius_classif_grid.fit(x_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "#r = radius_classif_grid.best_estimator_.radius_neighbors\n", + "radius_classif = RadiusNeighborsClassifier(4)\n", + "radius_classif.fit(x_train, y_train)\n", + "\n", + "rad_classif_predict = radius_classif.predict(x_test)\n", + "\n", + "print('Accuracy: ', accuracy_score(y_test, rad_classif_predict ))\n", + "print('Best: ', radius_classif_grid.best_score_)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) Логический классификатор (бинарное решающее дерево):" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.tree import DecisionTreeClassifier\n", + "decision_tree = DecisionTreeClassifier()\n", + "\n", + "parametrs = {'max_depth': list(range(1, 7)), 'max_features': list(range(1, 7))}\n", + "decision_tree_grid = GridSearchCV(decision_tree, parametrs)\n", + "decision_tree_grid.fit(x_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "best_features = decision_tree_grid.best_estimator_.max_features\n", + "best_depth = decision_tree_grid.best_estimator_.max_depth\n", + "best_score = decision_tree_grid.best_score_\n", + "print('best train score:', best_score, \n", + " 'features number:', best_features,\n", + " 'depth:', best_depth)\n", + "\n", + "decision_tree = DecisionTreeClassifier(max_depth=best_depth, max_features=best_features)\n", + "decision_tree.fit(x_train, y_train)\n", + "best_score = np.mean(y_test == decision_tree.predict(x_test))\n", + "print('test score: ', best_score)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 9.\tСравните кривые для классификаторов, указанных в задании, сделайте выводы." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "proba_radius_classif = radius_classif.predict_proba(x_test)\n", + "proba_decision_tree = decision_tree.predict_proba(x_test)\n", + "\n", + "inversion = [1-y for y in y_test]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### PR-графики" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def PRPlot(prob, occupancy, label, test):\n", + " precision, recall, _ = precision_recall_curve(test, prob[:, occupancy])\n", + " aps = average_precision_score(test, prob[:, occupancy])\n", + " plt.plot(recall, precision, label='%s PR (area = %f)' % (label, aps))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "from sklearn.metrics import precision_recall_curve, average_precision_score\n", + "plt.figure(figsize=(10,8))\n", + "\n", + "PRPlot(proba_radius_classif, 0, 'KRadiusNeighbors',inversion)\n", + "PRPlot(proba_decision_tree, 0, 'DecisionTree', inversion)\n", + "\n", + "plt.xlabel('Recall')\n", + "plt.ylabel('Precision')\n", + "plt.xlim([0.0, 1.0])\n", + "plt.ylim([0.0, 1.05])\n", + "plt.title('Occupancy = 0')\n", + "plt.legend(loc=4, fontsize='medium')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(10,8))\n", + "\n", + "PRPlot(proba_radius_classif, 1, 'KRadiusNeighbors', y_test)\n", + "PRPlot(proba_decision_tree, 1, 'DecisionTree', y_test)\n", + "\n", + "plt.xlabel('Recall')\n", + "plt.ylabel('Precision')\n", + "plt.xlim([0.0, 1.0])\n", + "plt.ylim([0.0, 1.05])\n", + "plt.title('Occupancy = 1')\n", + "plt.legend(loc=4, fontsize='medium')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "##### ROC - графики" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def ROCPlot0(prob, label, test):\n", + " tpr, fpr, _ = roc_curve(test, prob[:, 0])\n", + " roc_auc = auc(fpr, tpr)\n", + " plt.plot(fpr, tpr, label='%s ROC (area = %f)' % (label, roc_auc)) \n", + "\n", + "def ROCPlot1(prob, label, test):\n", + " fpr, tpr, _ = roc_curve(test, prob[:, 1])\n", + " roc_auc = auc(fpr, tpr)\n", + " plt.plot(fpr, tpr, label='%s ROC (area = %f)' % (label, roc_auc))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'ROCPlot0' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mROCPlot0\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mproba_radius_classif\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'KRadiusNeighbors'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_test\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[0mROCPlot0\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mproba_decision_tree\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'DecisionTree'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_test\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mNameError\u001b[0m: name 'ROCPlot0' is not defined" + ] + }, + { + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from sklearn.metrics import roc_curve, auc\n", + "plt.figure(figsize=(10,8))\n", + "\n", + "ROCPlot0(proba_radius_classif, 'KRadiusNeighbors', y_test)\n", + "ROCPlot0(proba_decision_tree, 'DecisionTree', y_test)\n", + "\n", + "plt.plot([0, 1], [0, 1], 'k--')\n", + "plt.xlim([-0.05, 1.0])\n", + "plt.ylim([0.0, 1.05])\n", + "plt.xlabel('False Positive Rate')\n", + "plt.ylabel('True Positive Rate')\n", + "plt.legend(loc=4, fontsize='medium')\n", + "plt.title('Occupancy = 0')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "plt.figure(figsize=(10,8))\n", + "\n", + "ROCPlot1(proba_radius_classif, 'KRadiusNeighbors', y_test)\n", + "ROCPlot1(proba_decision_tree, 'DecisionTree', y_test)\n", + "\n", + "plt.plot([0, 1], [0, 1], 'k--')\n", + "plt.xlim([-0.05, 1.0])\n", + "plt.ylim([0.0, 1.05])\n", + "plt.xlabel('False Positive Rate')\n", + "plt.ylabel('True Positive Rate')\n", + "plt.legend(loc=4, fontsize='medium')\n", + "plt.title('Occupancy = 1')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/ml/lb4/Plohuta/Plohuta_lab4.ipynb b/ml/lb4/Plohuta/Plohuta_lab4.ipynb new file mode 100644 index 00000000..01e62347 --- /dev/null +++ b/ml/lb4/Plohuta/Plohuta_lab4.ipynb @@ -0,0 +1,1661 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Лабораторная работа №4. Регрессионный анализ данных.\n", + "\n", + "#### Выполнила:\n", + "Плохута Д.Г.\n", + "#### Группа: \n", + "19-ИВТ-3 \n", + "#### Вариант:\n", + "№6 \n", + "#### Набор данных:\n", + "3 (air_quality)\n", + "#### Классификаторы: \n", + "1 – линейная регрессия без использования регуляризаторов; \n", + "2 – линейная регрессия, LASSO регуляризатор.\n", + "### 1.\tИзучить набор данных. Создать описание набора данных на русском языке. Описать признаки, используемые в наборе данных (включить полученные описания в отчёт).\n", + "0. Date - дата (ДД/ММ/ГГГГ)\n", + "1. Time - время (ЧЧ.ММ.СС)\n", + "2. CO(GT) - Истинная часовая усредненная концентрация CO в мг / м^3 (эталонный анализатор)\n", + "3. PT08.S1(CO) - PT08.S1 (оксид олова) часовой усредненный отклик датчика (номинально CO-таргетированный)\n", + "4. NMHC(GT) - Истинная почасовая усредненная общая концентрация неметаллических углеводородов в мкг / м^3 (эталонный анализатор)\n", + "5. C6H6(GT) - Истинная почасовая усредненная концентрация бензола в мкг / м^3 (эталонный анализатор)\n", + "6. PT08.S2(NMHC) - PT08.S2 (диоксид титана) часовой усредненный отклик датчика (номинально для nmhc)\n", + "7. NOx(GT) - Истинная почасовая усредненная концентрация NOx в ppb (эталонный анализатор)\n", + "8. PT08.S3(NOx)\t - PT08.S3 (оксид вольфрама) среднечасовой отклик датчика (номинально на NOx)\n", + "9. NO2(GT) - Истинная среднечасовая концентрация NO2 в мкг/м^3 (эталонный анализатор)\n", + "10. PT08.S4(NO2) - PT08.S4 (оксид вольфрама) среднечасовой отклик датчика (номинально на NО2)\n", + "11. PT08.S5(O3)\t - PT08.S5 (оксид индия) среднечасовой отклик датчика (номинально на O3)\n", + "12. T\t - Температура в °C\n", + "13. RH - Относительная влажность (%)\n", + "14. AH - Абсолютная влажность\n", + "\n", + "### 2.\tУдалите дубликаты строк в наборе данных; приведите размер набора данных до и после данной операции" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "import pandas as pd\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
DateTimeCO(GT)PT08.S1(CO)NMHC(GT)C6H6(GT)PT08.S2(NMHC)NOx(GT)PT08.S3(NOx)NO2(GT)PT08.S4(NO2)PT08.S5(O3)TRHAH
010/3/200418.00.002.61360150.011.91046166105611316921268.013.648.90.7578
110/3/200419.00.002.01292112.09.49551031174921559972.013.347.70.7255
210/3/200420.00.002.2140288.09.0939131114011415551074.011.954.00.7502
310/3/200421.00.002.2137680.09.2948172109212215841203.011.060.00.7867
410/3/200422.00.001.6127251.06.5836131120511614901110.011.259.60.7888
................................................
93524/4/200510.00.003.11314-200.013.5110147253919013741729.021.929.30.7568
93534/4/200511.00.002.41163-200.011.4102735360417912641269.024.323.70.7119
93544/4/200512.00.002.41142-200.012.4106329360317512411092.026.918.30.6406
93554/4/200513.00.002.11003-200.09.59612357021561041770.028.313.50.5139
93564/4/200514.00.002.21071-200.011.910472656541681129816.028.513.10.5028
\n", + "

9357 rows × 15 columns

\n", + "
" + ], + "text/plain": [ + " Date Time CO(GT) PT08.S1(CO) NMHC(GT) C6H6(GT) \\\n", + "0 10/3/2004 18.00.00 2.6 1360 150.0 11.9 \n", + "1 10/3/2004 19.00.00 2.0 1292 112.0 9.4 \n", + "2 10/3/2004 20.00.00 2.2 1402 88.0 9.0 \n", + "3 10/3/2004 21.00.00 2.2 1376 80.0 9.2 \n", + "4 10/3/2004 22.00.00 1.6 1272 51.0 6.5 \n", + "... ... ... ... ... ... ... \n", + "9352 4/4/2005 10.00.00 3.1 1314 -200.0 13.5 \n", + "9353 4/4/2005 11.00.00 2.4 1163 -200.0 11.4 \n", + "9354 4/4/2005 12.00.00 2.4 1142 -200.0 12.4 \n", + "9355 4/4/2005 13.00.00 2.1 1003 -200.0 9.5 \n", + "9356 4/4/2005 14.00.00 2.2 1071 -200.0 11.9 \n", + "\n", + " PT08.S2(NMHC) NOx(GT) PT08.S3(NOx) NO2(GT) PT08.S4(NO2) \\\n", + "0 1046 166 1056 113 1692 \n", + "1 955 103 1174 92 1559 \n", + "2 939 131 1140 114 1555 \n", + "3 948 172 1092 122 1584 \n", + "4 836 131 1205 116 1490 \n", + "... ... ... ... ... ... \n", + "9352 1101 472 539 190 1374 \n", + "9353 1027 353 604 179 1264 \n", + "9354 1063 293 603 175 1241 \n", + "9355 961 235 702 156 1041 \n", + "9356 1047 265 654 168 1129 \n", + "\n", + " PT08.S5(O3) T RH AH \n", + "0 1268.0 13.6 48.9 0.7578 \n", + "1 972.0 13.3 47.7 0.7255 \n", + "2 1074.0 11.9 54.0 0.7502 \n", + "3 1203.0 11.0 60.0 0.7867 \n", + "4 1110.0 11.2 59.6 0.7888 \n", + "... ... ... ... ... \n", + "9352 1729.0 21.9 29.3 0.7568 \n", + "9353 1269.0 24.3 23.7 0.7119 \n", + "9354 1092.0 26.9 18.3 0.6406 \n", + "9355 770.0 28.3 13.5 0.5139 \n", + "9356 816.0 28.5 13.1 0.5028 \n", + "\n", + "[9357 rows x 15 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "air_df = pd.read_csv('C:\\\\Users\\\\Acer\\\\Desktop\\\\уник\\\\мо\\\\AirQualityUCI.csv')\n", + "air_df" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Удалено дубликатов: 0\n" + ] + } + ], + "source": [ + "init_len= len(air_df)\n", + "air_df.drop_duplicates(keep= False,inplace=True)\n", + "finit_len = len(air_df)\n", + "print(\"Удалено дубликатов: \" , init_len - finit_len)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
DateTimeCO(GT)PT08.S1(CO)NMHC(GT)C6H6(GT)PT08.S2(NMHC)NOx(GT)PT08.S3(NOx)NO2(GT)PT08.S4(NO2)PT08.S5(O3)TRHAH
010/3/200418.00.002.61360150.011.91046166105611316921268.013.648.90.7578
110/3/200419.00.002.01292112.09.49551031174921559972.013.347.70.7255
210/3/200420.00.002.2140288.09.0939131114011415551074.011.954.00.7502
310/3/200421.00.002.2137680.09.2948172109212215841203.011.060.00.7867
410/3/200422.00.001.6127251.06.5836131120511614901110.011.259.60.7888
................................................
93524/4/200510.00.003.11314-200.013.5110147253919013741729.021.929.30.7568
93534/4/200511.00.002.41163-200.011.4102735360417912641269.024.323.70.7119
93544/4/200512.00.002.41142-200.012.4106329360317512411092.026.918.30.6406
93554/4/200513.00.002.11003-200.09.59612357021561041770.028.313.50.5139
93564/4/200514.00.002.21071-200.011.910472656541681129816.028.513.10.5028
\n", + "

9357 rows × 15 columns

\n", + "
" + ], + "text/plain": [ + " Date Time CO(GT) PT08.S1(CO) NMHC(GT) C6H6(GT) \\\n", + "0 10/3/2004 18.00.00 2.6 1360 150.0 11.9 \n", + "1 10/3/2004 19.00.00 2.0 1292 112.0 9.4 \n", + "2 10/3/2004 20.00.00 2.2 1402 88.0 9.0 \n", + "3 10/3/2004 21.00.00 2.2 1376 80.0 9.2 \n", + "4 10/3/2004 22.00.00 1.6 1272 51.0 6.5 \n", + "... ... ... ... ... ... ... \n", + "9352 4/4/2005 10.00.00 3.1 1314 -200.0 13.5 \n", + "9353 4/4/2005 11.00.00 2.4 1163 -200.0 11.4 \n", + "9354 4/4/2005 12.00.00 2.4 1142 -200.0 12.4 \n", + "9355 4/4/2005 13.00.00 2.1 1003 -200.0 9.5 \n", + "9356 4/4/2005 14.00.00 2.2 1071 -200.0 11.9 \n", + "\n", + " PT08.S2(NMHC) NOx(GT) PT08.S3(NOx) NO2(GT) PT08.S4(NO2) \\\n", + "0 1046 166 1056 113 1692 \n", + "1 955 103 1174 92 1559 \n", + "2 939 131 1140 114 1555 \n", + "3 948 172 1092 122 1584 \n", + "4 836 131 1205 116 1490 \n", + "... ... ... ... ... ... \n", + "9352 1101 472 539 190 1374 \n", + "9353 1027 353 604 179 1264 \n", + "9354 1063 293 603 175 1241 \n", + "9355 961 235 702 156 1041 \n", + "9356 1047 265 654 168 1129 \n", + "\n", + " PT08.S5(O3) T RH AH \n", + "0 1268.0 13.6 48.9 0.7578 \n", + "1 972.0 13.3 47.7 0.7255 \n", + "2 1074.0 11.9 54.0 0.7502 \n", + "3 1203.0 11.0 60.0 0.7867 \n", + "4 1110.0 11.2 59.6 0.7888 \n", + "... ... ... ... ... \n", + "9352 1729.0 21.9 29.3 0.7568 \n", + "9353 1269.0 24.3 23.7 0.7119 \n", + "9354 1092.0 26.9 18.3 0.6406 \n", + "9355 770.0 28.3 13.5 0.5139 \n", + "9356 816.0 28.5 13.1 0.5028 \n", + "\n", + "[9357 rows x 15 columns]" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "air_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.\tВыполните масштабирование количественных признаков; Постройте диаграммы BoxPlot для признаков до и после масштабирования. Выберите способ масштабирования (например, нормализацию или стандартизацию)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Количественные признаки: ['CO(GT)', 'PT08.S1(CO)', 'NMHC(GT)', 'C6H6(GT)', 'PT08.S2(NMHC)', 'NOx(GT)', 'PT08.S3(NOx)', 'NO2(GT)', 'PT08.S4(NO2)', 'PT08.S5(O3)', 'T', 'RH', 'AH']\n" + ] + } + ], + "source": [ + "# удалим две последние колонки\n", + "#air_df = air_df.drop(columns='Unnamed: 15')\n", + "#air_df = air_df.drop(columns='Unnamed: 16')\n", + "numerical = [c for c in air_df.columns if air_df[c].dtype.name != 'object']\n", + "print(\"Количественные признаки: \", numerical)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import seaborn as sns\n", + "before_scaling = numerical\n", + "sns.boxplot(data = air_df[before_scaling])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Нормализация" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "import sklearn as skl\n", + "from sklearn.preprocessing import MinMaxScaler" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "air_df[before_scaling] = MinMaxScaler().fit_transform(air_df[before_scaling])\n", + "sns.boxplot(data = air_df[before_scaling])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 4.\tВыполните замену категориальных признаков; выберите и обоснуйте способ замены" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Категориальные признаки: ['Date', 'Time']\n" + ] + } + ], + "source": [ + "categorical = [c for c in air_df.columns if air_df[c].dtype.name == 'object']\n", + "print(\"Категориальные признаки: \", categorical)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
DateTimeCO(GT)PT08.S1(CO)NMHC(GT)C6H6(GT)PT08.S2(NMHC)NOx(GT)PT08.S3(NOx)NO2(GT)PT08.S4(NO2)PT08.S5(O3)TRHAH
01819266661371196231637001089869781463811896
118202059810294532100818878536821433691727
218212270879905161287841098497841294321853
318222268271925251697361178789131204922056
418231657842654131288481117848201224882066
................................................
93523251131620013567846818318566814222291851889
9353325122446901146043502481745589792531291658
935432513244480124640290247170535802279751358
9355325142130909553823234615133648029328897
93563251522377011962426229816342352629524859
\n", + "

9357 rows × 15 columns

\n", + "
" + ], + "text/plain": [ + " Date Time CO(GT) PT08.S1(CO) NMHC(GT) C6H6(GT) PT08.S2(NMHC) \\\n", + "0 18 19 26 666 137 119 623 \n", + "1 18 20 20 598 102 94 532 \n", + "2 18 21 22 708 79 90 516 \n", + "3 18 22 22 682 71 92 525 \n", + "4 18 23 16 578 42 65 413 \n", + "... ... ... ... ... ... ... ... \n", + "9352 325 11 31 620 0 135 678 \n", + "9353 325 12 24 469 0 114 604 \n", + "9354 325 13 24 448 0 124 640 \n", + "9355 325 14 21 309 0 95 538 \n", + "9356 325 15 22 377 0 119 624 \n", + "\n", + " NOx(GT) PT08.S3(NOx) NO2(GT) PT08.S4(NO2) PT08.S5(O3) T RH \\\n", + "0 163 700 108 986 978 146 381 \n", + "1 100 818 87 853 682 143 369 \n", + "2 128 784 109 849 784 129 432 \n", + "3 169 736 117 878 913 120 492 \n", + "4 128 848 111 784 820 122 488 \n", + "... ... ... ... ... ... ... ... \n", + "9352 468 183 185 668 1422 229 185 \n", + "9353 350 248 174 558 979 253 129 \n", + "9354 290 247 170 535 802 279 75 \n", + "9355 232 346 151 336 480 293 28 \n", + "9356 262 298 163 423 526 295 24 \n", + "\n", + " AH \n", + "0 1896 \n", + "1 1727 \n", + "2 1853 \n", + "3 2056 \n", + "4 2066 \n", + "... ... \n", + "9352 1889 \n", + "9353 1658 \n", + "9354 1358 \n", + "9355 897 \n", + "9356 859 \n", + "\n", + "[9357 rows x 15 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.preprocessing import LabelEncoder\n", + "label_encoder = LabelEncoder()\n", + "for column in list(air_df):\n", + " air_df[column] = pd.Series(label_encoder.fit_transform(air_df[column])) \n", + "air_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 5.\tОцените корреляцию между признаков и удалите те признаки, которые коррелируют с наибольшим числом других" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "corr_matrix = air_df.corr()\n", + "sns.heatmap(corr_matrix)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 6.\tЗаполните пропущенные значения в данных" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Date 9357\n", + "Time 9357\n", + "CO(GT) 9357\n", + "PT08.S1(CO) 9357\n", + "NMHC(GT) 9357\n", + "C6H6(GT) 9357\n", + "PT08.S2(NMHC) 9357\n", + "NOx(GT) 9357\n", + "PT08.S3(NOx) 9357\n", + "NO2(GT) 9357\n", + "PT08.S4(NO2) 9357\n", + "PT08.S5(O3) 9357\n", + "T 9357\n", + "RH 9357\n", + "AH 9357\n", + "dtype: int64" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "air_df.count()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Пропущенных значений нет" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 7.\tРешите поставленную задачу регрессии в соответствии с заданием. \n", + "#### При подборе параметров метода принятия решения (метода регрессии) используйте перекрёстную проверку (изучите возможные для изменения параметры метода регрессии). Вычислите точность решения задачи, вычислив разницу между реальным значением и предсказанным. Вычислите коэффициент корреляции (Пирсона, Спирмена) между реальным значением и предсказанным с учётом p-value. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
DateTimeCO(GT)PT08.S1(CO)NMHC(GT)C6H6(GT)PT08.S2(NMHC)NOx(GT)PT08.S3(NOx)NO2(GT)PT08.S4(NO2)PT08.S5(O3)TRHAH
01819266661371196231637001089869781463811896
118202059810294532100818878536821433691727
218212270879905161287841098497841294321853
318222268271925251697361178789131204922056
418231657842654131288481117848201224882066
................................................
93523251131620013567846818318566814222291851889
9353325122446901146043502481745589792531291658
935432513244480124640290247170535802279751358
9355325142130909553823234615133648029328897
93563251522377011962426229816342352629524859
\n", + "

9357 rows × 15 columns

\n", + "
" + ], + "text/plain": [ + " Date Time CO(GT) PT08.S1(CO) NMHC(GT) C6H6(GT) PT08.S2(NMHC) \\\n", + "0 18 19 26 666 137 119 623 \n", + "1 18 20 20 598 102 94 532 \n", + "2 18 21 22 708 79 90 516 \n", + "3 18 22 22 682 71 92 525 \n", + "4 18 23 16 578 42 65 413 \n", + "... ... ... ... ... ... ... ... \n", + "9352 325 11 31 620 0 135 678 \n", + "9353 325 12 24 469 0 114 604 \n", + "9354 325 13 24 448 0 124 640 \n", + "9355 325 14 21 309 0 95 538 \n", + "9356 325 15 22 377 0 119 624 \n", + "\n", + " NOx(GT) PT08.S3(NOx) NO2(GT) PT08.S4(NO2) PT08.S5(O3) T RH \\\n", + "0 163 700 108 986 978 146 381 \n", + "1 100 818 87 853 682 143 369 \n", + "2 128 784 109 849 784 129 432 \n", + "3 169 736 117 878 913 120 492 \n", + "4 128 848 111 784 820 122 488 \n", + "... ... ... ... ... ... ... ... \n", + "9352 468 183 185 668 1422 229 185 \n", + "9353 350 248 174 558 979 253 129 \n", + "9354 290 247 170 535 802 279 75 \n", + "9355 232 346 151 336 480 293 28 \n", + "9356 262 298 163 423 526 295 24 \n", + "\n", + " AH \n", + "0 1896 \n", + "1 1727 \n", + "2 1853 \n", + "3 2056 \n", + "4 2066 \n", + "... ... \n", + "9352 1889 \n", + "9353 1658 \n", + "9354 1358 \n", + "9355 897 \n", + "9356 859 \n", + "\n", + "[9357 rows x 15 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from sklearn.linear_model import LinearRegression\n", + "from sklearn.svm import LinearSVC\n", + "air_df" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "X_data, Y_data = air_df.drop(columns='CO(GT)', axis=1).values, air_df['CO(GT)']\n", + "x_train, x_test, y_train, y_test = train_test_split(X_data, Y_data, test_size=0.3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) Линейная регрессия без использования регуляризаторов" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "regulate = LinearRegression()\n", + "regulate.fit(x_train,y_train)\n", + "predict_regulate = regulate.predict(x_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Кореляция Пирсона: 0.891445753148259\n", + "Корреляция Спирмена: 0.8566055577054338\n", + "p-value (Пирсон): 0.0\n", + "p-value (Спирмен) : 0.0\n" + ] + } + ], + "source": [ + "from scipy.stats import pearsonr, spearmanr\n", + "pearson, p_value_Pearson = pearsonr(predict_regulate, y_test)\n", + "print(\"Кореляция Пирсона: \", pearson)\n", + "spearmen, p_value_Spearmen = spearmanr(predict_regulate, y_test)\n", + "print(\"Корреляция Спирмена: \", spearmen)\n", + "print(\"p-value (Пирсон):\", p_value_Pearson)\n", + "print(\"p-value (Спирмен) :\", p_value_Spearmen)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) Линейная регрессия, LASSO регуляризатор" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.linear_model import Lasso\n", + "from sklearn.model_selection import GridSearchCV" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Лучшее alpha: 0.049999999999999996\n" + ] + } + ], + "source": [ + "lasso = Lasso()\n", + "params = {'alpha': np.arange(0.01, 1, 0.005)}\n", + "grid_search = GridSearchCV(lasso, params)\n", + "grid_search.fit(x_train, y_train)\n", + "best = grid_search.best_estimator_.alpha\n", + "print('Лучшее alpha:', best)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Кореляция Пирсона: 0.8914481729978327\n", + "Корреляция Спирмена: 0.8566587568651319\n", + "p-value (Пирсон): 0.0\n", + "p-value (Спирмен) : 0.0\n" + ] + } + ], + "source": [ + "lasso = Lasso(alpha=best)\n", + "lasso.fit(x_train,y_train)\n", + "predict_regulate = lasso.predict(x_test)\n", + "pearson, p_value_Pearson = pearsonr(predict_regulate, y_test)\n", + "print(\"Кореляция Пирсона: \", pearson)\n", + "spearmen, p_value_Spearmen = spearmanr(predict_regulate, y_test)\n", + "print(\"Корреляция Спирмена: \", spearmen)\n", + "print(\"p-value (Пирсон):\", p_value_Pearson)\n", + "print(\"p-value (Спирмен) :\", p_value_Spearmen)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}