{ "cells": [ { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-03-26T16:43:22.742690Z", "start_time": "2020-03-26T16:43:22.737509Z" } }, "source": [ "# Python для анализа данных\n", "\n", "## Библиотека pandas\n", "\n", "
\n", "\n", "\n", "Pandas — пакет для статистической обработки данных, по функциональности близкий к SQL и R. Включает в себя функциональность работы с базами данных и таблицами Excel." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.354398Z", "start_time": "2020-04-12T07:12:09.734672Z" } }, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import scipy.stats as sps\n", "\n", "import warnings\n", "warnings.simplefilter(\"ignore\", FutureWarning)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Тип данных `Series`\n", "\n", "Одномерный набор данных. Отсутствующий данные записываются как `np.nan`. Например, в этот день термометр сломался или метеоролог был пьян. При вычислении среднего и других операций соответствующие функции не учитывают отсутствующие значения." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.367466Z", "start_time": "2020-04-12T07:12:10.356124Z" } }, "outputs": [ { "data": { "text/plain": [ "0 1.0\n", "1 3.0\n", "2 5.0\n", "3 NaN\n", "4 6.0\n", "5 8.0\n", "dtype: float64" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "l = [1, 3, 5, np.nan, 6, 8]\n", "s = pd.Series(l)\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Полезно знать:** Для поиска пропусков есть специальный метод `.isna()`. Он эквивалентен конструкции `s != s`" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.395928Z", "start_time": "2020-04-12T07:12:10.382607Z" } }, "outputs": [ { "data": { "text/plain": [ "0 False\n", "1 False\n", "2 False\n", "3 True\n", "4 False\n", "5 False\n", "dtype: bool" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.isna()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Основная информация о наборе данных: количество записей, среднее, стандартное отклонение, минимум, нижний квартиль, медиана, верхний квартиль, максимум, а так же тип данных." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.408067Z", "start_time": "2020-04-12T07:12:10.399295Z" } }, "outputs": [ { "data": { "text/plain": [ "count 5.000000\n", "mean 4.600000\n", "std 2.701851\n", "min 1.000000\n", "25% 3.000000\n", "50% 5.000000\n", "75% 6.000000\n", "max 8.000000\n", "dtype: float64" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В данном примере обычная индексация." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.415416Z", "start_time": "2020-04-12T07:12:10.410924Z" } }, "outputs": [ { "data": { "text/plain": [ "5.0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[2]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.422330Z", "start_time": "2020-04-12T07:12:10.417779Z" } }, "outputs": [ { "data": { "text/plain": [ "0 1.0\n", "1 3.0\n", "2 7.0\n", "3 NaN\n", "4 6.0\n", "5 8.0\n", "dtype: float64" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[2] = 7\n", "s" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.429337Z", "start_time": "2020-04-12T07:12:10.424646Z" } }, "outputs": [ { "data": { "text/plain": [ "2 7.0\n", "3 NaN\n", "4 6.0\n", "dtype: float64" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[2:5]" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.435434Z", "start_time": "2020-04-12T07:12:10.431461Z" } }, "outputs": [ { "data": { "text/plain": [ "1 3.0\n", "2 7.0\n", "3 NaN\n", "4 6.0\n", "5 8.0\n", "dtype: float64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s1 = s[1:]\n", "s1" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.442420Z", "start_time": "2020-04-12T07:12:10.437278Z" } }, "outputs": [ { "data": { "text/plain": [ "0 1.0\n", "1 3.0\n", "2 7.0\n", "3 NaN\n", "4 6.0\n", "dtype: float64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s2 = s[:-1]\n", "s2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В сумме `s1+s2` складываются данные **с одинаковыми индексами**. Поскольку в `s1` нет данного и индексом 0, а в `s2` — с индексом 5, в `s1+s2` в соответствующих позициях будет `NaN`." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.449849Z", "start_time": "2020-04-12T07:12:10.443763Z" } }, "outputs": [ { "data": { "text/plain": [ "0 NaN\n", "1 6.0\n", "2 14.0\n", "3 NaN\n", "4 12.0\n", "5 NaN\n", "dtype: float64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s1 + s2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "К наборам данных можно применять функции из `numpy`." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.454657Z", "start_time": "2020-04-12T07:12:10.451305Z" } }, "outputs": [ { "data": { "text/plain": [ "0 2.718282\n", "1 20.085537\n", "2 1096.633158\n", "3 NaN\n", "4 403.428793\n", "5 2980.957987\n", "dtype: float64" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.exp(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "При создании набора данных `s` мы не указали, что будет играть роль индекса. По умолчанию это последовательность неотрицательных целых чисел 0, 1, 2, ..." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.458910Z", "start_time": "2020-04-12T07:12:10.456114Z" } }, "outputs": [ { "data": { "text/plain": [ "RangeIndex(start=0, stop=6, step=1)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Но можно создавать наборы данных с индексом, заданным списком." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.462935Z", "start_time": "2020-04-12T07:12:10.460165Z" } }, "outputs": [ { "data": { "text/plain": [ "['a', 'b', 'c', 'd', 'e', 'f']" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "i = list('abcdef')\n", "i" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.468983Z", "start_time": "2020-04-12T07:12:10.464352Z" } }, "outputs": [ { "data": { "text/plain": [ "a 1.0\n", "b 3.0\n", "c 5.0\n", "d NaN\n", "e 6.0\n", "f 8.0\n", "dtype: float64" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series(l, index=i)\n", "s" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.474029Z", "start_time": "2020-04-12T07:12:10.470502Z" } }, "outputs": [ { "data": { "text/plain": [ "5.0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s['c']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если индекс — строка, то вместо `s['c']` можно писать `s.c`." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.478087Z", "start_time": "2020-04-12T07:12:10.475370Z" } }, "outputs": [ { "data": { "text/plain": [ "5.0" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.c" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Набор данных можно создать из словаря." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.483812Z", "start_time": "2020-04-12T07:12:10.479470Z" } }, "outputs": [ { "data": { "text/plain": [ "a 1\n", "b 2\n", "c 0\n", "dtype: int64" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series({'a':1, 'b':2, 'c':0})\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Можно отсортировать набор данных." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.494830Z", "start_time": "2020-04-12T07:12:10.487720Z" } }, "outputs": [ { "data": { "text/plain": [ "c 0\n", "a 1\n", "b 2\n", "dtype: int64" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.sort_values()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Роль индекса может играть, скажем, последовательность дат или времён измерения и т.д.." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.508887Z", "start_time": "2020-04-12T07:12:10.499875Z" } }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2016-01-01', '2016-01-02', '2016-01-03', '2016-01-04',\n", " '2016-01-05', '2016-01-06', '2016-01-07', '2016-01-08',\n", " '2016-01-09', '2016-01-10'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d = pd.date_range('20160101', periods=10)\n", "d" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.518757Z", "start_time": "2020-04-12T07:12:10.511503Z" } }, "outputs": [ { "data": { "text/plain": [ "2016-01-01 -0.563028\n", "2016-01-02 2.015834\n", "2016-01-03 -2.008353\n", "2016-01-04 1.203577\n", "2016-01-05 1.216309\n", "2016-01-06 2.288571\n", "2016-01-07 -1.443840\n", "2016-01-08 1.250447\n", "2016-01-09 -0.209155\n", "2016-01-10 -0.551679\n", "Freq: D, dtype: float64" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series(sps.norm.rvs(size=10), index=d)\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Операции сравнения возвращают наборы булевых данных." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.529747Z", "start_time": "2020-04-12T07:12:10.522360Z" } }, "outputs": [ { "data": { "text/plain": [ "2016-01-01 False\n", "2016-01-02 True\n", "2016-01-03 False\n", "2016-01-04 True\n", "2016-01-05 True\n", "2016-01-06 True\n", "2016-01-07 False\n", "2016-01-08 True\n", "2016-01-09 False\n", "2016-01-10 False\n", "Freq: D, dtype: bool" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s > 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если такой булев набор использовать для индексации, получится поднабор только из тех данных, для которых условие есть `True`." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.536569Z", "start_time": "2020-04-12T07:12:10.531641Z" } }, "outputs": [ { "data": { "text/plain": [ "2016-01-02 2.015834\n", "2016-01-04 1.203577\n", "2016-01-05 1.216309\n", "2016-01-06 2.288571\n", "2016-01-08 1.250447\n", "dtype: float64" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[s > 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Кумулятивные максимумы — от первого элемента до текущего. Первое значение кумулятивного максимума совпадает с первым значением исходного массива. Далее значение $k$-го элемента есть максимум среди элементов до $k$-го включительно." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.545853Z", "start_time": "2020-04-12T07:12:10.540933Z" } }, "outputs": [ { "data": { "text/plain": [ "2016-01-01 -0.563028\n", "2016-01-02 2.015834\n", "2016-01-03 2.015834\n", "2016-01-04 2.015834\n", "2016-01-05 2.015834\n", "2016-01-06 2.288571\n", "2016-01-07 2.288571\n", "2016-01-08 2.288571\n", "2016-01-09 2.288571\n", "2016-01-10 2.288571\n", "Freq: D, dtype: float64" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.cummax()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Кумулятивные суммы. Первое значение кумулятивной суммы совпадает с первым значением исходного массива. Далее значение $k$-го элемента есть сумма элементов до $k$-го включительно." ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.553299Z", "start_time": "2020-04-12T07:12:10.548537Z" } }, "outputs": [ { "data": { "text/plain": [ "2016-01-01 -0.563028\n", "2016-01-02 1.452807\n", "2016-01-03 -0.555546\n", "2016-01-04 0.648032\n", "2016-01-05 1.864341\n", "2016-01-06 4.152912\n", "2016-01-07 2.709072\n", "2016-01-08 3.959519\n", "2016-01-09 3.750364\n", "2016-01-10 3.198685\n", "Freq: D, dtype: float64" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.cumsum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Произвольные функции кумулятивным способом можно считать с помощью конструкции `expanding`. Например, так можно посчитать кумулятивные медианы. Будет не быстрее, чем вручную, но аккуратнее." ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.562075Z", "start_time": "2020-04-12T07:12:10.555342Z" } }, "outputs": [ { "data": { "text/plain": [ "2016-01-01 -0.563028\n", "2016-01-02 0.726403\n", "2016-01-03 -0.563028\n", "2016-01-04 0.320275\n", "2016-01-05 1.203577\n", "2016-01-06 1.209943\n", "2016-01-07 1.203577\n", "2016-01-08 1.209943\n", "2016-01-09 1.203577\n", "2016-01-10 0.497211\n", "Freq: D, dtype: float64" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.expanding().apply(np.median, raw=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если вы хотите посчитать разности соседних элементов, воспользуйтесь методом `diff`. Ключевое слово `periods` отвечает за то, с каким шагом будут считаться разности." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.568506Z", "start_time": "2020-04-12T07:12:10.563937Z" } }, "outputs": [ { "data": { "text/plain": [ "2016-01-01 NaN\n", "2016-01-02 2.578862\n", "2016-01-03 -4.024187\n", "2016-01-04 3.211930\n", "2016-01-05 0.012732\n", "2016-01-06 1.072262\n", "2016-01-07 -3.732411\n", "2016-01-08 2.694287\n", "2016-01-09 -1.459602\n", "2016-01-10 -0.342524\n", "Freq: D, dtype: float64" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.diff()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Результат будет иметь тот же размер, но в начале появятся пропущенные значения. От них можно избавиться при помощи метода `dropna`." ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.576465Z", "start_time": "2020-04-12T07:12:10.570484Z" } }, "outputs": [ { "data": { "text/plain": [ "2016-01-02 2.578862\n", "2016-01-03 -4.024187\n", "2016-01-04 3.211930\n", "2016-01-05 0.012732\n", "2016-01-06 1.072262\n", "2016-01-07 -3.732411\n", "2016-01-08 2.694287\n", "2016-01-09 -1.459602\n", "2016-01-10 -0.342524\n", "Freq: D, dtype: float64" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.diff().dropna()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Упражнение** \n", "Посчитайте кумулятивное среднее квадратов разностей соседних элементов набора `s`." ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.584415Z", "start_time": "2020-04-12T07:12:10.578275Z" } }, "outputs": [ { "data": { "text/plain": [ "2016-01-02 6.650530\n", "2016-01-03 11.422306\n", "2016-01-04 11.053702\n", "2016-01-05 8.290317\n", "2016-01-06 6.862203\n", "2016-01-07 8.040317\n", "2016-01-08 7.928727\n", "2016-01-09 7.203941\n", "2016-01-10 6.416539\n", "Freq: D, dtype: float64" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ВАШ КОД\n", "s.diff().dropna().expanding().apply(lambda x: np.mean(x**2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Наконец, построим график." ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:10.687410Z", "start_time": "2020-04-12T07:12:10.586839Z" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "# Нужно для новых версий библиотек для преобразования дат\n", "from pandas.plotting import register_matplotlib_converters\n", "register_matplotlib_converters()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.027596Z", "start_time": "2020-04-12T07:12:10.688942Z" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(15, 4))\n", "plt.plot(s)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Более подробно ознакомиться с методами можно [в официальной документации](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.html). " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Тип данных `DataFrame`\n", "\n", "Двумерная таблица данных. Имеет индекс и набор столбцов (возможно, имеющих разные типы). Таблицу можно построить, например, из словаря, значениями в котором являются одномерные наборы данных." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.046984Z", "start_time": "2020-04-12T07:12:11.032851Z" }, "scrolled": false }, "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", "
onetwothree
a0.00-1.496178
b1.010.562452
c2.020.520759
d3.03-0.461771
e4.040.426069
f5.05-0.534984
gNaN6-0.364495
\n", "
" ], "text/plain": [ " one two three\n", "a 0.0 0 -1.496178\n", "b 1.0 1 0.562452\n", "c 2.0 2 0.520759\n", "d 3.0 3 -0.461771\n", "e 4.0 4 0.426069\n", "f 5.0 5 -0.534984\n", "g NaN 6 -0.364495" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d = {'one': pd.Series(range(6), index=list('abcdef')),\n", " 'two': pd.Series(range(7), index=list('abcdefg')),\n", " 'three': pd.Series(sps.norm.rvs(size=7), index=list('abcdefg'))}\n", "df = pd.DataFrame(d)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Таблица с несколькими разными типами данных" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.066802Z", "start_time": "2020-04-12T07:12:11.048830Z" } }, "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", "
ABCDEF
01.02013-01-021.03testfoo
11.02013-01-021.03trainfoo
21.02013-01-021.03testfoo
31.02013-01-021.03trainfoo
\n", "
" ], "text/plain": [ " A B C D E F\n", "0 1.0 2013-01-02 1.0 3 test foo\n", "1 1.0 2013-01-02 1.0 3 train foo\n", "2 1.0 2013-01-02 1.0 3 test foo\n", "3 1.0 2013-01-02 1.0 3 train foo" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = pd.DataFrame({ 'A': 1.,\n", " 'B': pd.Timestamp('20130102'),\n", " 'C': pd.Series(1, index=list(range(4)),\n", " dtype='float32'),\n", " 'D': np.array([3] * 4, \n", " dtype='int32'),\n", " 'E': pd.Categorical([\"test\", \"train\",\n", " \"test\", \"train\"]),\n", " 'F': 'foo' })\n", "df2" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.082072Z", "start_time": "2020-04-12T07:12:11.069042Z" } }, "outputs": [ { "data": { "text/plain": [ "A float64\n", "B datetime64[ns]\n", "C float32\n", "D int32\n", "E category\n", "F object\n", "dtype: object" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.dtypes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.1 Данные\n", "\n", "Вернемся к первой таблице и посмотрим на ее начало и конец" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.100916Z", "start_time": "2020-04-12T07:12:11.086335Z" } }, "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", "
onetwothree
a0.00-1.496178
b1.010.562452
c2.020.520759
d3.03-0.461771
e4.040.426069
\n", "
" ], "text/plain": [ " one two three\n", "a 0.0 0 -1.496178\n", "b 1.0 1 0.562452\n", "c 2.0 2 0.520759\n", "d 3.0 3 -0.461771\n", "e 4.0 4 0.426069" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.112867Z", "start_time": "2020-04-12T07:12:11.103370Z" } }, "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", "
onetwothree
e4.040.426069
f5.05-0.534984
gNaN6-0.364495
\n", "
" ], "text/plain": [ " one two three\n", "e 4.0 4 0.426069\n", "f 5.0 5 -0.534984\n", "g NaN 6 -0.364495" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Индексы" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.124604Z", "start_time": "2020-04-12T07:12:11.115881Z" } }, "outputs": [ { "data": { "text/plain": [ "Index(['a', 'b', 'c', 'd', 'e', 'f', 'g'], dtype='object')" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Названия колонок" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.133347Z", "start_time": "2020-04-12T07:12:11.128428Z" } }, "outputs": [ { "data": { "text/plain": [ "Index(['one', 'two', 'three'], dtype='object')" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Получение обычной матрицы данных" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.140266Z", "start_time": "2020-04-12T07:12:11.135743Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[ 0. , 0. , -1.4961779 ],\n", " [ 1. , 1. , 0.56245248],\n", " [ 2. , 2. , 0.52075873],\n", " [ 3. , 3. , -0.46177052],\n", " [ 4. , 4. , 0.4260685 ],\n", " [ 5. , 5. , -0.53498361],\n", " [ nan, 6. , -0.36449528]])" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Описательные статистики" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.188640Z", "start_time": "2020-04-12T07:12:11.144159Z" } }, "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", "
onetwothree
count6.0000007.0000007.000000
mean2.5000003.000000-0.192593
std1.8708292.1602470.750586
min0.0000000.000000-1.496178
25%1.2500001.500000-0.498377
50%2.5000003.000000-0.364495
75%3.7500004.5000000.473414
max5.0000006.0000000.562452
\n", "
" ], "text/plain": [ " one two three\n", "count 6.000000 7.000000 7.000000\n", "mean 2.500000 3.000000 -0.192593\n", "std 1.870829 2.160247 0.750586\n", "min 0.000000 0.000000 -1.496178\n", "25% 1.250000 1.500000 -0.498377\n", "50% 2.500000 3.000000 -0.364495\n", "75% 3.750000 4.500000 0.473414\n", "max 5.000000 6.000000 0.562452" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Транспонирование данных" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.211519Z", "start_time": "2020-04-12T07:12:11.191002Z" } }, "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", "
abcdefg
one0.0000001.0000002.0000003.0000004.0000005.000000NaN
two0.0000001.0000002.0000003.0000004.0000005.0000006.000000
three-1.4961780.5624520.520759-0.4617710.426069-0.534984-0.364495
\n", "
" ], "text/plain": [ " a b c d e f g\n", "one 0.000000 1.000000 2.000000 3.000000 4.000000 5.000000 NaN\n", "two 0.000000 1.000000 2.000000 3.000000 4.000000 5.000000 6.000000\n", "three -1.496178 0.562452 0.520759 -0.461771 0.426069 -0.534984 -0.364495" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сортировка по столбцу" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.236986Z", "start_time": "2020-04-12T07:12:11.216990Z" } }, "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", "
onetwothree
b1.010.562452
c2.020.520759
e4.040.426069
gNaN6-0.364495
d3.03-0.461771
f5.05-0.534984
a0.00-1.496178
\n", "
" ], "text/plain": [ " one two three\n", "b 1.0 1 0.562452\n", "c 2.0 2 0.520759\n", "e 4.0 4 0.426069\n", "g NaN 6 -0.364495\n", "d 3.0 3 -0.461771\n", "f 5.0 5 -0.534984\n", "a 0.0 0 -1.496178" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by='three', ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Упражнение:** Сгенерируйте массив точек в 3D, создайте по нему датафрейм и отсортируйте строки лексикографически." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.265066Z", "start_time": "2020-04-12T07:12:11.239555Z" } }, "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
xyz
11-2.4535540.0708651.270085
0-1.6453650.6809960.755448
17-1.6203651.704682-0.238129
60-1.523821-0.625632-0.641644
32-1.517200-0.7564610.003390
80-1.398230-0.060793-1.175577
75-1.324837-1.609736-1.506753
62-1.313305-1.7552540.164605
72-1.3022901.187174-1.943044
70-1.2479560.1839471.391994
78-1.135145-1.8858700.963771
23-1.0903020.138006-1.988282
25-1.024776-0.6704452.099342
22-1.013627-0.676556-0.195575
14-0.981960-0.0568890.335150
63-0.938201-0.279104-0.302362
20-0.937994-1.968142-1.255503
35-0.911286-1.0882441.087172
53-0.8832870.113176-1.088797
47-0.8654732.0250991.124176
65-0.8642170.3120161.537469
58-0.8546350.079393-0.787223
27-0.8512881.317678-0.037738
16-0.7882370.021794-0.100366
18-0.7836620.6718471.025736
1-0.7446070.4585592.413493
12-0.685703-1.3035890.146562
82-0.6552970.0504570.842924
79-0.6310540.9362220.523676
57-0.6292910.8724251.142377
............
20.651573-0.221656-1.396755
240.684697-0.469834-1.055235
900.7015180.8713491.309766
660.712471-1.323101-0.719519
40.745422-1.2964700.752359
260.766701-0.9972510.310131
340.813565-0.1102110.305231
190.8783180.5053281.205696
640.878949-0.533732-0.671754
290.8864851.685864-0.703312
90.915882-0.931523-1.096249
540.9404931.5950400.121120
560.9509620.435919-0.687967
761.022134-0.3312060.315905
861.051156-0.304207-0.283757
61.0642110.224760-1.017922
411.0872171.4463440.155127
461.1044731.4835160.222925
101.1282201.176469-0.182456
281.129427-1.066361-1.730470
151.1445201.6104510.963700
741.1791380.4440200.641559
591.384312-0.423372-0.853989
991.4567341.3455550.800017
971.518513-0.2361131.678095
451.520634-1.2636860.761155
381.592373-1.157783-0.578329
501.657409-1.0655160.007514
512.0754670.194988-0.474311
332.3016870.583367-1.070727
\n", "

100 rows × 3 columns

\n", "
" ], "text/plain": [ " x y z\n", "11 -2.453554 0.070865 1.270085\n", "0 -1.645365 0.680996 0.755448\n", "17 -1.620365 1.704682 -0.238129\n", "60 -1.523821 -0.625632 -0.641644\n", "32 -1.517200 -0.756461 0.003390\n", ".. ... ... ...\n", "45 1.520634 -1.263686 0.761155\n", "38 1.592373 -1.157783 -0.578329\n", "50 1.657409 -1.065516 0.007514\n", "51 2.075467 0.194988 -0.474311\n", "33 2.301687 0.583367 -1.070727\n", "\n", "[100 rows x 3 columns]" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ВАШ КОД\n", "pd.DataFrame(\n", " sps.norm.rvs(size=(100, 3)),\n", " columns=['x', 'y', 'z']\n", ").sort_values(by=['x', 'y', 'z'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.2 Индексация\n", "\n", "В отличии от обычной системы индексации в Python и Numpy, в Pandas принята иная система индексации, которая является несколько нелогичной, однако, на практике часто оказывается удобной при обработке сильно неоднородных данных.\n", "Для написания продуктивного кода при обработке большого объема данных стоит использовать атрибуты `.at`, `.iat`, `.loc`, `.iloc`, `.ix`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если в качестве индекса указать имя столбца, получится одномерный набор данных типа `Series`." ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.275636Z", "start_time": "2020-04-12T07:12:11.270774Z" } }, "outputs": [ { "data": { "text/plain": [ "a 0.0\n", "b 1.0\n", "c 2.0\n", "d 3.0\n", "e 4.0\n", "f 5.0\n", "g NaN\n", "Name: one, dtype: float64" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['one']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "К столбцу можно обращаться как к полю объекта, если имя столбца позволяет это сделать." ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.280831Z", "start_time": "2020-04-12T07:12:11.277309Z" } }, "outputs": [ { "data": { "text/plain": [ "a 0.0\n", "b 1.0\n", "c 2.0\n", "d 3.0\n", "e 4.0\n", "f 5.0\n", "g NaN\n", "Name: one, dtype: float64" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.one" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Индексы полученного одномерного набора данных." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.285167Z", "start_time": "2020-04-12T07:12:11.282230Z" } }, "outputs": [ { "data": { "text/plain": [ "Index(['a', 'b', 'c', 'd', 'e', 'f', 'g'], dtype='object')" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['one'].index" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "У данного столбца есть имя, его можно получить следующим образом." ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.289917Z", "start_time": "2020-04-12T07:12:11.286481Z" } }, "outputs": [ { "data": { "text/plain": [ "'one'" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['one'].name" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Получение элемента массива" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.299798Z", "start_time": "2020-04-12T07:12:11.294359Z" } }, "outputs": [ { "data": { "text/plain": [ "2.0" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['one']['c']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Правила индексации в pandas несколько отличаются от общепринятых. Если указать диапазон индексов, то это означает диапазон строк. Причём последняя строка включается в таблицу." ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.308600Z", "start_time": "2020-04-12T07:12:11.301701Z" } }, "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", "
onetwothree
b1.010.562452
c2.020.520759
d3.03-0.461771
\n", "
" ], "text/plain": [ " one two three\n", "b 1.0 1 0.562452\n", "c 2.0 2 0.520759\n", "d 3.0 3 -0.461771" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['b':'d']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Диапазон целых чисел даёт диапазон строк с такими номерами, не включая последнюю строку (как обычно при индексировании списков). Всё это кажется довольно нелогичным, хотя и удобно на практике." ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.329195Z", "start_time": "2020-04-12T07:12:11.310035Z" } }, "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", "
onetwothree
b1.010.562452
c2.020.520759
\n", "
" ], "text/plain": [ " one two three\n", "b 1.0 1 0.562452\n", "c 2.0 2 0.520759" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[1:3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Логичнее работает атрибут `loc`: первая позиция — всегда индекс строки, а вторая — столбца." ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.342189Z", "start_time": "2020-04-12T07:12:11.333955Z" } }, "outputs": [ { "data": { "text/plain": [ "one 1.000000\n", "two 1.000000\n", "three 0.562452\n", "Name: b, dtype: float64" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['b']" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.348626Z", "start_time": "2020-04-12T07:12:11.344475Z" } }, "outputs": [ { "data": { "text/plain": [ "1.0" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['b', 'one']" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.357880Z", "start_time": "2020-04-12T07:12:11.350997Z" } }, "outputs": [ { "data": { "text/plain": [ "a 0.0\n", "b 1.0\n", "Name: one, dtype: float64" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['a':'b', 'one']" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.367860Z", "start_time": "2020-04-12T07:12:11.359862Z" } }, "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", "
onetwothree
a0.00-1.496178
b1.010.562452
\n", "
" ], "text/plain": [ " one two three\n", "a 0.0 0 -1.496178\n", "b 1.0 1 0.562452" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['a':'b', :]" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.373226Z", "start_time": "2020-04-12T07:12:11.369563Z" } }, "outputs": [ { "data": { "text/plain": [ "a 0.0\n", "b 1.0\n", "c 2.0\n", "d 3.0\n", "e 4.0\n", "f 5.0\n", "g NaN\n", "Name: one, dtype: float64" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[:, 'one']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Атрибут `iloc` подобен `loc`: первый индекс — номер строки, второй — номер столбца. Это целые числа, конец диапазона не включается как обычно в питоне." ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.378247Z", "start_time": "2020-04-12T07:12:11.374651Z" } }, "outputs": [ { "data": { "text/plain": [ "one 2.000000\n", "two 2.000000\n", "three 0.520759\n", "Name: c, dtype: float64" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[2]" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.385340Z", "start_time": "2020-04-12T07:12:11.379714Z" } }, "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", "
onetwothree
b1.010.562452
c2.020.520759
\n", "
" ], "text/plain": [ " one two three\n", "b 1.0 1 0.562452\n", "c 2.0 2 0.520759" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[1:3]" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.397655Z", "start_time": "2020-04-12T07:12:11.386813Z" } }, "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", "
onetwo
b1.01
c2.02
\n", "
" ], "text/plain": [ " one two\n", "b 1.0 1\n", "c 2.0 2" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[1:3, 0:2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Булевская индексация — выбор строк с заданным условием" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.406464Z", "start_time": "2020-04-12T07:12:11.399800Z" } }, "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", "
onetwothree
b1.010.562452
c2.020.520759
e4.040.426069
\n", "
" ], "text/plain": [ " one two three\n", "b 1.0 1 0.562452\n", "c 2.0 2 0.520759\n", "e 4.0 4 0.426069" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df.three > 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Упражнение** \n", "Сгенерируйте случайную целочисленную матрицу $n \\times m$, где $n=20, m=10$. Создайте из неё датафрейм, пронумеровав столбцы случайной перестановкой чисел из $\\{1, \\ldots, m\\}$. Выберите столбцы с чётными номерами и строки, в которых чётных элементов больше, чем нечётных. " ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.421654Z", "start_time": "2020-04-12T07:12:11.408110Z" } }, "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", "
268410
16418-309494
43473-74-20-48
5-6739-35196
6-3417-87-8096
8-816860-1774
10-87-97-294612
11-74-14361854
14-4094-34562
17-909656-68-83
1964149416-81
\n", "
" ], "text/plain": [ " 2 6 8 4 10\n", "1 64 18 -30 94 94\n", "4 34 73 -74 -20 -48\n", "5 -67 39 -35 19 6\n", "6 -34 17 -87 -80 96\n", "8 -81 68 60 -17 74\n", "10 -87 -97 -29 46 12\n", "11 -74 -14 36 18 54\n", "14 -40 94 -34 56 2\n", "17 -90 96 56 -68 -83\n", "19 64 14 94 16 -81" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# ВАШ КОД\n", "\n", "# создаем матрицу\n", "n, m = 20, 10\n", "data = sps.randint(low=-100, high=100).rvs(size=(n, m))\n", "cols = np.arange(1, m + 1)\n", "np.random.shuffle(cols)\n", "\n", "# создаем таблицу\n", "task_df = pd.DataFrame(data, columns=cols)\n", "\n", "# задаем условия для строк и столбцов\n", "col_mask = (cols % 2) == 0\n", "row_mask = np.sum(data % 2, axis=1) < (m / 2)\n", "\n", "# извлекаем данные по условию\n", "task_df.loc[row_mask, col_mask]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.3 Изменение таблиц" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "К таблице можно добавлять новые столбцы." ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.432794Z", "start_time": "2020-04-12T07:12:11.423277Z" } }, "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", "
onetwothree4thflag
a0.00-1.4961780.0False
b1.010.5624521.0False
c2.020.5207594.0False
d3.03-0.4617719.0True
e4.040.42606916.0True
f5.05-0.53498425.0True
gNaN6-0.364495NaNTrue
\n", "
" ], "text/plain": [ " one two three 4th flag\n", "a 0.0 0 -1.496178 0.0 False\n", "b 1.0 1 0.562452 1.0 False\n", "c 2.0 2 0.520759 4.0 False\n", "d 3.0 3 -0.461771 9.0 True\n", "e 4.0 4 0.426069 16.0 True\n", "f 5.0 5 -0.534984 25.0 True\n", "g NaN 6 -0.364495 NaN True" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['4th'] = df['one'] * df['two']\n", "df['flag'] = df['two'] > 2\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "И удалять имеющиеся." ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.450566Z", "start_time": "2020-04-12T07:12:11.434846Z" } }, "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", "
onethree4thflagfoo
a0.0-1.4961780.0False0
b1.00.5624521.0False0
c2.00.5207594.0False0
d3.0-0.4617719.0True0
e4.00.42606916.0True0
f5.0-0.53498425.0True0
gNaN-0.364495NaNTrue0
\n", "
" ], "text/plain": [ " one three 4th flag foo\n", "a 0.0 -1.496178 0.0 False 0\n", "b 1.0 0.562452 1.0 False 0\n", "c 2.0 0.520759 4.0 False 0\n", "d 3.0 -0.461771 9.0 True 0\n", "e 4.0 0.426069 16.0 True 0\n", "f 5.0 -0.534984 25.0 True 0\n", "g NaN -0.364495 NaN True 0" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "del df['two']\n", "df['foo'] = 0\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Изменение элемента" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.474486Z", "start_time": "2020-04-12T07:12:11.456031Z" } }, "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", "
onethree4thflagfoo
a0.0-1.4961780.0False0
b-1.00.5624521.0False0
c2.00.5207594.0False0
d3.0-0.4617719.0True0
e4.00.42606916.0True0
f5.0-0.53498425.0True0
gNaN-0.364495NaNTrue0
\n", "
" ], "text/plain": [ " one three 4th flag foo\n", "a 0.0 -1.496178 0.0 False 0\n", "b -1.0 0.562452 1.0 False 0\n", "c 2.0 0.520759 4.0 False 0\n", "d 3.0 -0.461771 9.0 True 0\n", "e 4.0 0.426069 16.0 True 0\n", "f 5.0 -0.534984 25.0 True 0\n", "g NaN -0.364495 NaN True 0" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iat[1, 0] = -1\n", "\n", "# Эквивалентные формы:\n", "# df['one']['b'] = -1 <-- SettingWithCopyWarning\n", "# df.at['b', 'one'] = -1\n", "\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Добавим копию столбца `one`, в которую входят только строки до третьей." ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.490524Z", "start_time": "2020-04-12T07:12:11.477202Z" } }, "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", "
onethree4thflagfooone_tr
a0.0-1.4961780.0False00.0
b-1.00.5624521.0False0-1.0
c2.00.5207594.0False02.0
d3.0-0.4617719.0True0NaN
e4.00.42606916.0True0NaN
f5.0-0.53498425.0True0NaN
gNaN-0.364495NaNTrue0NaN
\n", "
" ], "text/plain": [ " one three 4th flag foo one_tr\n", "a 0.0 -1.496178 0.0 False 0 0.0\n", "b -1.0 0.562452 1.0 False 0 -1.0\n", "c 2.0 0.520759 4.0 False 0 2.0\n", "d 3.0 -0.461771 9.0 True 0 NaN\n", "e 4.0 0.426069 16.0 True 0 NaN\n", "f 5.0 -0.534984 25.0 True 0 NaN\n", "g NaN -0.364495 NaN True 0 NaN" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['one_tr'] = df['one'][:3]\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.4 Пропуски" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Удаление всех строк с пропусками" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.504622Z", "start_time": "2020-04-12T07:12:11.493162Z" } }, "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", "
onethree4thflagfooone_tr
a0.0-1.4961780.0False00.0
b-1.00.5624521.0False0-1.0
c2.00.5207594.0False02.0
\n", "
" ], "text/plain": [ " one three 4th flag foo one_tr\n", "a 0.0 -1.496178 0.0 False 0 0.0\n", "b -1.0 0.562452 1.0 False 0 -1.0\n", "c 2.0 0.520759 4.0 False 0 2.0" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.dropna(how='any')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Замена всех пропусков на значение" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.514137Z", "start_time": "2020-04-12T07:12:11.505903Z" }, "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", "
onethree4thflagfooone_tr
a0.0-1.4961780.0False00.0
b-1.00.5624521.0False0-1.0
c2.00.5207594.0False02.0
d3.0-0.4617719.0True0666.0
e4.00.42606916.0True0666.0
f5.0-0.53498425.0True0666.0
g666.0-0.364495666.0True0666.0
\n", "
" ], "text/plain": [ " one three 4th flag foo one_tr\n", "a 0.0 -1.496178 0.0 False 0 0.0\n", "b -1.0 0.562452 1.0 False 0 -1.0\n", "c 2.0 0.520759 4.0 False 0 2.0\n", "d 3.0 -0.461771 9.0 True 0 666.0\n", "e 4.0 0.426069 16.0 True 0 666.0\n", "f 5.0 -0.534984 25.0 True 0 666.0\n", "g 666.0 -0.364495 666.0 True 0 666.0" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.fillna(value=666)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Замена всех пропусков на среднее по столбцу" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.524938Z", "start_time": "2020-04-12T07:12:11.515630Z" } }, "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", "
onethree4thflagfooone_tr
a0.000000-1.4961780.000000False00.000000
b-1.0000000.5624521.000000False0-1.000000
c2.0000000.5207594.000000False02.000000
d3.000000-0.4617719.000000True00.333333
e4.0000000.42606916.000000True00.333333
f5.000000-0.53498425.000000True00.333333
g2.166667-0.3644959.166667True00.333333
\n", "
" ], "text/plain": [ " one three 4th flag foo one_tr\n", "a 0.000000 -1.496178 0.000000 False 0 0.000000\n", "b -1.000000 0.562452 1.000000 False 0 -1.000000\n", "c 2.000000 0.520759 4.000000 False 0 2.000000\n", "d 3.000000 -0.461771 9.000000 True 0 0.333333\n", "e 4.000000 0.426069 16.000000 True 0 0.333333\n", "f 5.000000 -0.534984 25.000000 True 0 0.333333\n", "g 2.166667 -0.364495 9.166667 True 0 0.333333" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.fillna(value=df.mean())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Булевская маска пропущенных значений" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.537620Z", "start_time": "2020-04-12T07:12:11.526498Z" } }, "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", "
onethree4thflagfooone_tr
aFalseFalseFalseFalseFalseFalse
bFalseFalseFalseFalseFalseFalse
cFalseFalseFalseFalseFalseFalse
dFalseFalseFalseFalseFalseTrue
eFalseFalseFalseFalseFalseTrue
fFalseFalseFalseFalseFalseTrue
gTrueFalseTrueFalseFalseTrue
\n", "
" ], "text/plain": [ " one three 4th flag foo one_tr\n", "a False False False False False False\n", "b False False False False False False\n", "c False False False False False False\n", "d False False False False False True\n", "e False False False False False True\n", "f False False False False False True\n", "g True False True False False True" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isnull()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.5 Простые операции" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Создадим таблицу из массива случайных чисел." ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.550922Z", "start_time": "2020-04-12T07:12:11.541403Z" } }, "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", "
ABCD
00.2508770.7547340.2761250.720824
10.5754030.9004510.8777260.269396
20.0492690.3335010.2664010.631570
30.0704020.0184520.7656240.105073
40.2773310.2476290.8191900.020735
50.9502930.0047970.3899220.409014
60.6464760.7721340.6811040.856197
70.2301660.7660940.2326420.384684
80.3703900.9675630.4823470.979930
90.7404470.5461330.4759370.277485
\n", "
" ], "text/plain": [ " A B C D\n", "0 0.250877 0.754734 0.276125 0.720824\n", "1 0.575403 0.900451 0.877726 0.269396\n", "2 0.049269 0.333501 0.266401 0.631570\n", "3 0.070402 0.018452 0.765624 0.105073\n", "4 0.277331 0.247629 0.819190 0.020735\n", "5 0.950293 0.004797 0.389922 0.409014\n", "6 0.646476 0.772134 0.681104 0.856197\n", "7 0.230166 0.766094 0.232642 0.384684\n", "8 0.370390 0.967563 0.482347 0.979930\n", "9 0.740447 0.546133 0.475937 0.277485" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1 = pd.DataFrame(sps.uniform.rvs(size=(10, 4)),\n", " columns=['A', 'B', 'C', 'D'])\n", "df1" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.573327Z", "start_time": "2020-04-12T07:12:11.552682Z" } }, "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", "
ABC
00.7888110.8867280.754926
10.6495720.9119630.183802
20.6628060.5553760.101021
30.2821030.0263280.829280
40.4769160.0639740.021611
50.7518390.7578850.367958
60.1581580.7290360.280558
\n", "
" ], "text/plain": [ " A B C\n", "0 0.788811 0.886728 0.754926\n", "1 0.649572 0.911963 0.183802\n", "2 0.662806 0.555376 0.101021\n", "3 0.282103 0.026328 0.829280\n", "4 0.476916 0.063974 0.021611\n", "5 0.751839 0.757885 0.367958\n", "6 0.158158 0.729036 0.280558" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = pd.DataFrame(sps.uniform.rvs(size=(7, 3)),\n", " columns=['A', 'B', 'C'])\n", "df2" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.596473Z", "start_time": "2020-04-12T07:12:11.577445Z" } }, "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", "
ABCD
01.0396891.6414631.031051NaN
11.2249761.8124141.061528NaN
20.7120750.8888770.367423NaN
30.3525060.0447801.594904NaN
40.7542460.3116030.840801NaN
51.7021320.7626820.757880NaN
60.8046341.5011700.961662NaN
7NaNNaNNaNNaN
8NaNNaNNaNNaN
9NaNNaNNaNNaN
\n", "
" ], "text/plain": [ " A B C D\n", "0 1.039689 1.641463 1.031051 NaN\n", "1 1.224976 1.812414 1.061528 NaN\n", "2 0.712075 0.888877 0.367423 NaN\n", "3 0.352506 0.044780 1.594904 NaN\n", "4 0.754246 0.311603 0.840801 NaN\n", "5 1.702132 0.762682 0.757880 NaN\n", "6 0.804634 1.501170 0.961662 NaN\n", "7 NaN NaN NaN NaN\n", "8 NaN NaN NaN NaN\n", "9 NaN NaN NaN NaN" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1 + df2" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.610425Z", "start_time": "2020-04-12T07:12:11.599476Z" } }, "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", "
ABCD
03.5017544.5094683.5522504.441647
14.1508074.8009014.7554523.538793
23.0985383.6670023.5328024.263140
33.1408053.0369054.5312493.210146
43.5546613.4952594.6383803.041469
54.9005863.0095943.7798443.818029
64.2929524.5442674.3622074.712395
73.4603334.5321883.4652843.769367
83.7407794.9351253.9646944.959860
94.4808944.0922673.9518733.554971
\n", "
" ], "text/plain": [ " A B C D\n", "0 3.501754 4.509468 3.552250 4.441647\n", "1 4.150807 4.800901 4.755452 3.538793\n", "2 3.098538 3.667002 3.532802 4.263140\n", "3 3.140805 3.036905 4.531249 3.210146\n", "4 3.554661 3.495259 4.638380 3.041469\n", "5 4.900586 3.009594 3.779844 3.818029\n", "6 4.292952 4.544267 4.362207 4.712395\n", "7 3.460333 4.532188 3.465284 3.769367\n", "8 3.740779 4.935125 3.964694 4.959860\n", "9 4.480894 4.092267 3.951873 3.554971" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 * df1 + 3" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.623968Z", "start_time": "2020-04-12T07:12:11.612296Z" } }, "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", "
ABCD
00.2482540.6850950.2726290.660004
10.5441730.7836070.7692880.266150
20.0492490.3273530.2632610.590412
30.0703440.0184510.6929870.104880
40.2737890.2451060.7305930.020733
50.8135860.0047970.3801160.397705
60.6023770.6976650.6296510.755356
70.2281390.6933260.2305490.375266
80.3619790.8235050.4638600.830458
90.6746180.5193870.4581710.273938
\n", "
" ], "text/plain": [ " A B C D\n", "0 0.248254 0.685095 0.272629 0.660004\n", "1 0.544173 0.783607 0.769288 0.266150\n", "2 0.049249 0.327353 0.263261 0.590412\n", "3 0.070344 0.018451 0.692987 0.104880\n", "4 0.273789 0.245106 0.730593 0.020733\n", "5 0.813586 0.004797 0.380116 0.397705\n", "6 0.602377 0.697665 0.629651 0.755356\n", "7 0.228139 0.693326 0.230549 0.375266\n", "8 0.361979 0.823505 0.463860 0.830458\n", "9 0.674618 0.519387 0.458171 0.273938" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.sin(df1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Построим графики кумулятивных сумм" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.645479Z", "start_time": "2020-04-12T07:12:11.629998Z" } }, "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", "
ABCD
00.2508770.7547340.2761250.720824
10.8262811.6551851.1538510.990220
20.8755501.9886861.4202521.621790
30.9459522.0071382.1858761.726863
41.2232832.2547683.0050661.747598
52.1735762.2595653.3949882.156612
62.8200523.0316984.0760923.012809
73.0502183.7977924.3087343.397493
83.4206084.7653554.7910814.377423
94.1610555.3114885.2670174.654908
\n", "
" ], "text/plain": [ " A B C D\n", "0 0.250877 0.754734 0.276125 0.720824\n", "1 0.826281 1.655185 1.153851 0.990220\n", "2 0.875550 1.988686 1.420252 1.621790\n", "3 0.945952 2.007138 2.185876 1.726863\n", "4 1.223283 2.254768 3.005066 1.747598\n", "5 2.173576 2.259565 3.394988 2.156612\n", "6 2.820052 3.031698 4.076092 3.012809\n", "7 3.050218 3.797792 4.308734 3.397493\n", "8 3.420608 4.765355 4.791081 4.377423\n", "9 4.161055 5.311488 5.267017 4.654908" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "cs = df1.cumsum()\n", "cs" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:11.929930Z", "start_time": "2020-04-12T07:12:11.648356Z" }, "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "cs.plot()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Упражнение** \n", "Сгенерируйте случайную выборку $X_1, \\ldots, X_n$ для $n = 100$ из стандартного нормального распределения, соберите из неё `pd.DataFrame`, замените случайные 10% элементов на пропуски (`np.nan`), а затем добавьте по столбцу для оценок первых 4 моментов кумулятивно — $$\\frac{1}{m} \\sum\\limits_{i=1}^{m} X_i^{k}, \\; i \\in \\overline{1, m}, \\; m \\in \\overline{1, n}, \\; k \\in \\overline{1, 4}$$ \n", "Ваша функция должна корректно обрабатывать пропуски. В конце постройте график." ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.311677Z", "start_time": "2020-04-12T07:12:11.932157Z" } }, "outputs": [ { "data": { "image/png": "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A2DBggXcdNNNALz00ks89NBDuLi4tHu+5ozUV199xW9/+1s2b94MwLJly7jzzjt5/fXXWbp0qWNKEezTiperuaVQe99faObMmXzyySfExsZis9nQaDQtXnv55ZcBWk1Xfv311/j7+zN79mzefvvtVud99913SU1NJTg4+KJjvemmm3j00Ue5+eabOXny5CXfG8D06dOZN28eqqqybt06nn/+ecAevK1atYqpU6e22D89PZ2UlBTHNOfy5cuprq7u0LWuhNMyUi5uOnlqTwghRLegqioPPPAAMTEx/J//838c28PCwsjIyCAjI4MFCxYAUFFRwaZNm5g/f36Hzu3t7d2qxgjA39+fhoaGFtuSkpJ47733AHu9VEpKCgBjxoxpczvAP/7xD2w2G1lZWZw8eZIhQ4aQkpLC+vXrATh+/DhnzpxhyJAheHh48K9//YvDhw/z+eefd/T2APYAzc/Pr9WYbTYbK1eu7NATe/fffz87d+50ZMsAhgwZQnZ2NidOnADg7bff5sYbb3S87uLiwujRo7nhhhtaBK5Tp07l1VdfxWKxON5nTU3NZb2nzuC8jJS7Tp7aE0II0S18++23vP322wwfPtxRgPyXv/yFW265pdW+OTk5LF++HJ3u4h+hK1as4J133qGxsdFR4A3w9NNPs3LlSurr63nttdcchegAL7/8Mg888ADLli0jMDCQNWvWALBq1SrmzZvHsmXLCAgIYO3atY5jwsPDSU5OprKykr/97W+4urqycOFCHnnkEYYPH45Op2PdunUYDIYrvj9paWloNBo8PT159tln+fLLLx2v1dXVcccdd+Dj43PJ8wQGBnLkyJEW21xdXVm7di133XUXjY2NJCUlOYLWZs888wxAi4D0wQcfJDs7m4SEBFRVJSAgwFE3di0pnVF0piiKD/A6EAuowHxVVXe1t39iYqK64vcbOLYzj4dW3tjebkIIIXqJY8eOERMT4+xh9Dhz584lLS2NO++809lDuW609bOoKMo+VVUT29q/szJSLwFfqqp6p6IoLoD7pQ4wuOmwmK3YbKqj07kQQgghRE9y1YGUoihGYDwwF0BV1Qag4WLHABjc9YC9u7mrh/5qhyGEEEL0Os19mITzdEaxeSRQBKxVFGW/oiivK4ri8fOdFEV5SFGUvYqi7C0qKsLFzR7DScG5EEIIIXqqzgikdEAC8Kqq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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# YOUR CODE\n", "\n", "# генерируем выборку\n", "n = 100\n", "sample = sps.norm.rvs(size=n)\n", "\n", "# создаем пропуски\n", "index = np.random.choice(np.arange(n), int(0.1 * n), replace=True)\n", "sample[index] = np.nan\n", "\n", "# заводим dataframe\n", "sample_df = pd.DataFrame(sample, columns=['Выборка'])\n", "\n", "\n", "for k in range(1, 5):\n", " sample_df['{}-й выборочный момент'.format(k)] = (\n", " sample_df['Выборка'] ** k\n", " ).expanding().apply(np.nanmean)\n", " \n", "sample_df.plot(figsize=(10, 5));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. Чтение и запись данных\n", "\n", "**Загрузка текстовых файлов табличного вида** производится с помощью функции `pd.read_csv`. Основные аргументы следующие:\n", "* `filepath_or_buffer` — пусть к файлу;\n", "* `sep` — разделитель колонок в строке (запятая, табуляция и т.д.);\n", "* `header` — номер строки или список номеров строк, используемых в качестве имен колонок;\n", "* `names` — список имен, которые будут использованы в качестве имен колонок;\n", "* `index_col` — колонка, используемая в качестве индекса;\n", "* `usecols` — список имен колонок, которые будут загружены;\n", "* `nrows` — сколько строк прочитать;\n", "* `skiprows` — номера строк с начала, которые нужно пропустить;\n", "* `skipfooter` — сколько строк в конце пропустить;\n", "* `na_values` — список значений, которые распознавать как пропуски;\n", "* `parse_dates` — распознавать ли даты, можно передать номера строк;\n", "* `date_parser` — парсер дат;\n", "* `dayfirst` — день записывается перед месяцем или после;\n", "* `thousands` — разделитель тысяч;\n", "* `decimal` — разделитель целой и дробной частей;\n", "* `comment` — символ начала комментария.\n", "\n", "Полный список параметров:\n", "\n", "`pd.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer', names=None, index_col=None, usecols=None, squeeze=False, prefix=None, mangle_dupe_cols=True, dtype=None, engine=None, converters=None, true_values=None, false_values=None, skipinitialspace=False, skiprows=None, nrows=None, na_values=None, keep_default_na=True, na_filter=True, verbose=False, skip_blank_lines=True, parse_dates=False, infer_datetime_format=False, keep_date_col=False, date_parser=None, dayfirst=False, iterator=False, chunksize=None, compression='infer', thousands=None, decimal=b'.', lineterminator=None, quotechar='\"', quoting=0, escapechar=None, comment=None, encoding=None, dialect=None, tupleize_cols=False, error_bad_lines=True, warn_bad_lines=True, skipfooter=0, skip_footer=0, doublequote=True, delim_whitespace=False, as_recarray=False, compact_ints=False, use_unsigned=False, low_memory=True, buffer_lines=None, memory_map=False, float_precision=None)`\n", "\n", "**Загрузка таблиц формата Excel** производится с помощью функции `pd.read_excel`. Основные аргументы следующие:\n", "* `io` — пусть к файлу;\n", "* `sheetname` — какие листы таблицы загрузить;\n", "* Остальные параметры аналогично.\n", "\n", "`pd.read_excel(io, sheetname=0, header=0, skiprows=None, skip_footer=0, index_col=None, names=None, parse_cols=None, parse_dates=False, date_parser=None, na_values=None, thousands=None, convert_float=True, has_index_names=None, converters=None, dtype=None, true_values=None, false_values=None, engine=None, squeeze=False, **kwds)`\n", "\n", "**Запись таблицы в текстовый файл** производится с помощью функции `df.to_csv`. Основные аргументы следующие:\n", "* `df` — DataFrame, который нужно записать;\n", "* `path_or_buf` — путь, куда записать;\n", "* `sep` — разделитель колонок в строке (запятая, табуляция и т.д.);\n", "* `na_rep` — как записать пропуски;\n", "* `float_format` — формат записи дробных чисел;\n", "* `columns` — какие колонки записать;\n", "* `header` — как назвать колонки при записи;\n", "* `index` — записывать ли индексы в файл;\n", "* `index_label` — имена индексов, которые записать в файл.\n", "\n", "Полный список параметров:\n", "\n", "`df.to_csv(path_or_buf=None, sep=',', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, mode='w', encoding=None, compression=None, quoting=None, quotechar='\"', line_terminator='\\n', chunksize=None, tupleize_cols=False, date_format=None, doublequote=True, escapechar=None, decimal='.')`\n", "\n", "**Запись таблицы в формат Excel** производится с помощью функции `df.to_excel`. Основные аргументы аналогичные. Полный список параметров:\n", "\n", "`df.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None, inf_rep='inf', verbose=True, freeze_panes=None)`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4. Примеры чтения данных и работы с датами\n", "\n", "Прочитаем файл, который содержит два столбца — дата и число. Столбцы разделяются табуляцией." ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.357905Z", "start_time": "2020-04-12T07:12:12.313187Z" } }, "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", "
TimeValue
02019-01-0966
12019-02-0934
22019-03-0918
32019-04-0932
42019-05-0984
\n", "
" ], "text/plain": [ " Time Value\n", "0 2019-01-09 66\n", "1 2019-02-09 34\n", "2 2019-03-09 18\n", "3 2019-04-09 32\n", "4 2019-05-09 84" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('./example.csv', sep='\\t', parse_dates=[0])\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В информации о таблице видим, что дата определилась, т.к. формат колонки `Time` обозначен как `datetime64[ns]`." ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.363319Z", "start_time": "2020-04-12T07:12:12.359131Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 18 entries, 0 to 17\n", "Data columns (total 2 columns):\n", "Time 18 non-null datetime64[ns]\n", "Value 18 non-null int64\n", "dtypes: datetime64[ns](1), int64(1)\n", "memory usage: 416.0 bytes\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Но при печати понимаем, что часть дат распозналась неправильно. Если число месяца меньше 13, то pandas путает день и месяц. В одном и том же столбце. Кошмар..." ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.368233Z", "start_time": "2020-04-12T07:12:12.364741Z" }, "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "0 2019-01-09\n", "1 2019-02-09\n", "2 2019-03-09\n", "3 2019-04-09\n", "4 2019-05-09\n", "5 2019-06-09\n", "6 2019-07-09\n", "7 2019-08-09\n", "8 2019-09-09\n", "9 2019-10-09\n", "10 2019-11-09\n", "11 2019-12-09\n", "12 2019-09-13\n", "13 2019-09-14\n", "14 2019-09-15\n", "15 2019-09-16\n", "16 2019-09-17\n", "17 2019-09-18\n", "Name: Time, dtype: datetime64[ns]" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Time']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Укажем, что день всегда следует первым. Теперь все правильно" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.377001Z", "start_time": "2020-04-12T07:12:12.369464Z" } }, "outputs": [ { "data": { "text/plain": [ "0 2019-09-01\n", "1 2019-09-02\n", "2 2019-09-03\n", "3 2019-09-04\n", "4 2019-09-05\n", "5 2019-09-06\n", "6 2019-09-07\n", "7 2019-09-08\n", "8 2019-09-09\n", "9 2019-09-10\n", "10 2019-09-11\n", "11 2019-09-12\n", "12 2019-09-13\n", "13 2019-09-14\n", "14 2019-09-15\n", "15 2019-09-16\n", "16 2019-09-17\n", "17 2019-09-18\n", "Name: Time, dtype: datetime64[ns]" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.read_csv('./example.csv', sep='\\t', parse_dates=[0],\n", " dayfirst=True)\n", "df['Time']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Панды довольно ленивые, и если не попросить pandas распознать дату, то ничего делать не будет — оставит ее как `object`." ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.385083Z", "start_time": "2020-04-12T07:12:12.378301Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 18 entries, 0 to 17\n", "Data columns (total 2 columns):\n", "Time 18 non-null object\n", "Value 18 non-null int64\n", "dtypes: int64(1), object(1)\n", "memory usage: 416.0+ bytes\n" ] } ], "source": [ "df = pd.read_csv('./example.csv', sep='\\t')\n", "df.info()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Тогда можно воспользоваться функцией `pd.to_datetime`" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.393256Z", "start_time": "2020-04-12T07:12:12.388601Z" } }, "outputs": [ { "data": { "text/plain": [ "0 2019-09-01\n", "1 2019-09-02\n", "2 2019-09-03\n", "3 2019-09-04\n", "4 2019-09-05\n", "5 2019-09-06\n", "6 2019-09-07\n", "7 2019-09-08\n", "8 2019-09-09\n", "9 2019-09-10\n", "10 2019-09-11\n", "11 2019-09-12\n", "12 2019-09-13\n", "13 2019-09-14\n", "14 2019-09-15\n", "15 2019-09-16\n", "16 2019-09-17\n", "17 2019-09-18\n", "Name: Time, dtype: datetime64[ns]" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Time'] = pd.to_datetime(df['Time'], dayfirst=True)\n", "df['Time']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Установим дату как индекс, получив временной ряд." ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.403311Z", "start_time": "2020-04-12T07:12:12.394944Z" } }, "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", "
Value
Time
2019-09-0166
2019-09-0234
2019-09-0318
2019-09-0432
2019-09-0584
2019-09-0627
2019-09-0745
2019-09-0884
2019-09-0942
2019-09-1065
2019-09-1165
2019-09-1273
2019-09-1324
2019-09-1462
2019-09-1544
2019-09-1625
2019-09-1775
2019-09-1823
\n", "
" ], "text/plain": [ " Value\n", "Time \n", "2019-09-01 66\n", "2019-09-02 34\n", "2019-09-03 18\n", "2019-09-04 32\n", "2019-09-05 84\n", "2019-09-06 27\n", "2019-09-07 45\n", "2019-09-08 84\n", "2019-09-09 42\n", "2019-09-10 65\n", "2019-09-11 65\n", "2019-09-12 73\n", "2019-09-13 24\n", "2019-09-14 62\n", "2019-09-15 44\n", "2019-09-16 25\n", "2019-09-17 75\n", "2019-09-18 23" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = df.set_index('Time')\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Его можно нарисовать" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.692193Z", "start_time": "2020-04-12T07:12:12.405196Z" }, "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "df.plot();" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Усреднение данных по трем дням" ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.712166Z", "start_time": "2020-04-12T07:12:12.694142Z" } }, "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", "
Value
Time
2019-09-0139.333333
2019-09-0447.666667
2019-09-0757.000000
2019-09-1067.666667
2019-09-1343.333333
2019-09-1641.000000
\n", "
" ], "text/plain": [ " Value\n", "Time \n", "2019-09-01 39.333333\n", "2019-09-04 47.666667\n", "2019-09-07 57.000000\n", "2019-09-10 67.666667\n", "2019-09-13 43.333333\n", "2019-09-16 41.000000" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.resample('3D').mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5. Интервалы времени\n", "\n", "Интервал времени задается объектом `pd.Timedelta`\n", "\n", "Возможные обозначения интервалов: `'Y', 'M', 'W', 'D', 'days', 'day', 'hours', hour', 'hr', 'h', 'm', 'minute', 'min', 'minutes', 'T', 'S', 'seconds', 'sec', 'second', 'ms', 'milliseconds', 'millisecond', 'milli', 'millis', 'L', 'us', 'microseconds', 'microsecond', 'micro', 'micros', 'U', 'ns', 'nanoseconds', 'nano', 'nanos', 'nanosecond', 'N'`\n", "\n", "Например, интервал времени в 5 недель 6 дней 5 часов 37 минут 23 секунды 12 милисекунд:" ] }, { "cell_type": "code", "execution_count": 85, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.719255Z", "start_time": "2020-04-12T07:12:12.713944Z" } }, "outputs": [ { "data": { "text/plain": [ "Timedelta('41 days 05:37:23.012000')" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.Timedelta('5W 6 days 5hr 37min 23sec 12ms')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Поробуем понять что такое `Y` и `M`." ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.726586Z", "start_time": "2020-04-12T07:12:12.721676Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "(Timedelta('365 days 05:49:12'), Timedelta('0 days 00:01:00'))" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.Timedelta('1Y'), pd.Timedelta('1M')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Символ `Y` обозначает год. Он сделан таким из-за високосных годов. Поскольку месяцы разной длины, то их вообще нельзя здесь задать. Поэтому `M` обозначает минуты.\n", "\n", "Интервал можно добавить к какой-нибудь дате, или вычесть из нее." ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.745273Z", "start_time": "2020-04-12T07:12:12.728687Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "Timestamp('2019-09-19 03:07:23.012000')" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.to_datetime('2019.09.18 18:30') \\\n", " + pd.Timedelta('8hr 37min 23sec 12ms')" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.757304Z", "start_time": "2020-04-12T07:12:12.749791Z" } }, "outputs": [ { "data": { "text/plain": [ "Timestamp('2019-09-17 21:39:36.988000')" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.to_datetime('2019.09.18 18:30') \\\n", " - pd.Timedelta('20hr 50min 23sec 12ms')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сделать регулярный список дат позволяет функция `pd.timedelta_range`, которая реализует функционал `range` для дат. Ей нужно передать **ровно три аргумента** из следующих четырех:\n", "* `start` — интервал начала отчета;\n", "* `end` — интервал окончания отчета;\n", "* `periods` — количество интервалов;\n", "* `freq` — частота отсчета.\n", "\n", "**Пример** \n", " \n", "Врач на протяжении дня измеряет пациенту температуру каждые 3 часа в течение 2 недель. Также пациенту необходимо спать с 11 вечера до 7 утра. Каждый день измерения температуры начинаются в 8 часов. Первое измерение 22 марта 2020 года. Определите моменты времени, когда нужно измерить пациенту температуру." ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.768410Z", "start_time": "2020-04-12T07:12:12.760265Z" } }, "outputs": [ { "data": { "text/plain": [ "TimedeltaIndex(['08:00:00', '11:00:00', '14:00:00', '17:00:00', '20:00:00',\n", " '23:00:00'],\n", " dtype='timedelta64[ns]', freq='3H')" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Периоды измерения температуры днем\n", "periods = pd.timedelta_range(start='8H', freq='3H', end='23H')\n", "periods" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.778278Z", "start_time": "2020-04-12T07:12:12.770773Z" } }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2020-03-22', '2020-03-23', '2020-03-24', '2020-03-25',\n", " '2020-03-26', '2020-03-27', '2020-03-28', '2020-03-29',\n", " '2020-03-30', '2020-03-31', '2020-04-01', '2020-04-02',\n", " '2020-04-03', '2020-04-04', '2020-04-05'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Даты измерний температуры\n", "dates = pd.to_datetime('2020.03.22') \\\n", " + pd.timedelta_range(start=0, freq='1D', end='2W')\n", "dates" ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "ExecuteTime": { "end_time": "2020-04-12T07:12:12.789523Z", "start_time": "2020-04-12T07:12:12.781834Z" } }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2020-03-22 08:00:00', '2020-03-22 11:00:00',\n", " '2020-03-22 14:00:00', '2020-03-22 17:00:00',\n", " '2020-03-22 20:00:00', '2020-03-22 23:00:00',\n", " '2020-03-23 08:00:00', '2020-03-23 11:00:00',\n", " '2020-03-23 14:00:00', '2020-03-23 17:00:00',\n", " '2020-03-23 20:00:00', '2020-03-23 23:00:00',\n", " '2020-03-24 08:00:00', '2020-03-24 11:00:00',\n", " '2020-03-24 14:00:00', '2020-03-24 17:00:00',\n", " '2020-03-24 20:00:00', '2020-03-24 23:00:00',\n", " '2020-03-25 08:00:00', '2020-03-25 11:00:00',\n", " '2020-03-25 14:00:00', '2020-03-25 17:00:00',\n", " '2020-03-25 20:00:00', '2020-03-25 23:00:00',\n", " '2020-03-26 08:00:00', '2020-03-26 11:00:00',\n", " '2020-03-26 14:00:00', '2020-03-26 17:00:00',\n", " '2020-03-26 20:00:00', '2020-03-26 23:00:00',\n", " '2020-03-27 08:00:00', '2020-03-27 11:00:00',\n", " '2020-03-27 14:00:00', '2020-03-27 17:00:00',\n", " '2020-03-27 20:00:00', '2020-03-27 23:00:00',\n", " '2020-03-28 08:00:00', '2020-03-28 11:00:00',\n", " '2020-03-28 14:00:00', '2020-03-28 17:00:00',\n", " '2020-03-28 20:00:00', '2020-03-28 23:00:00',\n", " '2020-03-29 08:00:00', '2020-03-29 11:00:00',\n", " '2020-03-29 14:00:00', '2020-03-29 17:00:00',\n", " '2020-03-29 20:00:00', '2020-03-29 23:00:00',\n", " '2020-03-30 08:00:00', '2020-03-30 11:00:00',\n", " '2020-03-30 14:00:00', '2020-03-30 17:00:00',\n", " '2020-03-30 20:00:00', '2020-03-30 23:00:00',\n", " '2020-03-31 08:00:00', '2020-03-31 11:00:00',\n", " '2020-03-31 14:00:00', '2020-03-31 17:00:00',\n", " '2020-03-31 20:00:00', '2020-03-31 23:00:00',\n", " '2020-04-01 08:00:00', '2020-04-01 11:00:00',\n", " '2020-04-01 14:00:00', '2020-04-01 17:00:00',\n", " '2020-04-01 20:00:00', '2020-04-01 23:00:00',\n", " '2020-04-02 08:00:00', '2020-04-02 11:00:00',\n", " '2020-04-02 14:00:00', '2020-04-02 17:00:00',\n", " '2020-04-02 20:00:00', '2020-04-02 23:00:00',\n", " '2020-04-03 08:00:00', '2020-04-03 11:00:00',\n", " '2020-04-03 14:00:00', '2020-04-03 17:00:00',\n", " '2020-04-03 20:00:00', '2020-04-03 23:00:00',\n", " '2020-04-04 08:00:00', '2020-04-04 11:00:00',\n", " '2020-04-04 14:00:00', '2020-04-04 17:00:00',\n", " '2020-04-04 20:00:00', '2020-04-04 23:00:00',\n", " '2020-04-05 08:00:00', '2020-04-05 11:00:00',\n", " '2020-04-05 14:00:00', '2020-04-05 17:00:00',\n", " '2020-04-05 20:00:00', '2020-04-05 23:00:00'],\n", " dtype='datetime64[ns]', freq=None)" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Время измерния температуры\n", "n, m = len(dates), len(periods)\n", "dates_new = dates.repeat(m)\n", "periods_new = pd.to_timedelta(np.tile(periods, n))\n", "time = dates_new + periods_new\n", "time" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "При подготовке использованы материалы https://inp.nsk.su/~grozin/python/ и http://pandas.pydata.org/pandas-docs/stable/10min.html" ] } ], "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": 1 }