{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Python для анализа данных\n",
"\n",
"## Библиотека pandas\n",
"\n",
"
\n",
"\n",
"\n",
"Pandas — пакет для статистической обработки данных, по функциональности близкий к SQL и R. Включает в себя функциональность работы с базами данных и таблицами Excel."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"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": {},
"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": {},
"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": {},
"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": {},
"outputs": [
{
"data": {
"text/plain": [
"5.0"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"s[2]"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"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": {},
"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": {},
"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": {},
"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": {},
"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": {},
"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": {},
"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": {},
"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": {},
"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": {},
"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": {},
"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": {},
"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": {},
"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": {},
"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": {},
"outputs": [
{
"data": {
"text/plain": [
"2016-01-01 -1.100690\n",
"2016-01-02 -0.607138\n",
"2016-01-03 1.268569\n",
"2016-01-04 1.023828\n",
"2016-01-05 -1.283569\n",
"2016-01-06 0.878799\n",
"2016-01-07 0.994709\n",
"2016-01-08 -0.841616\n",
"2016-01-09 -1.059865\n",
"2016-01-10 1.209186\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": {},
"outputs": [
{
"data": {
"text/plain": [
"2016-01-01 False\n",
"2016-01-02 False\n",
"2016-01-03 True\n",
"2016-01-04 True\n",
"2016-01-05 False\n",
"2016-01-06 True\n",
"2016-01-07 True\n",
"2016-01-08 False\n",
"2016-01-09 False\n",
"2016-01-10 True\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": {},
"outputs": [
{
"data": {
"text/plain": [
"2016-01-03 1.268569\n",
"2016-01-04 1.023828\n",
"2016-01-06 0.878799\n",
"2016-01-07 0.994709\n",
"2016-01-10 1.209186\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": {},
"outputs": [
{
"data": {
"text/plain": [
"2016-01-01 -1.100690\n",
"2016-01-02 -0.607138\n",
"2016-01-03 1.268569\n",
"2016-01-04 1.268569\n",
"2016-01-05 1.268569\n",
"2016-01-06 1.268569\n",
"2016-01-07 1.268569\n",
"2016-01-08 1.268569\n",
"2016-01-09 1.268569\n",
"2016-01-10 1.268569\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": {},
"outputs": [
{
"data": {
"text/plain": [
"2016-01-01 -1.100690\n",
"2016-01-02 -1.707829\n",
"2016-01-03 -0.439260\n",
"2016-01-04 0.584568\n",
"2016-01-05 -0.699001\n",
"2016-01-06 0.179798\n",
"2016-01-07 1.174507\n",
"2016-01-08 0.332890\n",
"2016-01-09 -0.726975\n",
"2016-01-10 0.482211\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": {},
"outputs": [
{
"data": {
"text/plain": [
"2016-01-01 -1.100690\n",
"2016-01-02 -0.853914\n",
"2016-01-03 -0.607138\n",
"2016-01-04 0.208345\n",
"2016-01-05 -0.607138\n",
"2016-01-06 0.135830\n",
"2016-01-07 0.878799\n",
"2016-01-08 0.135830\n",
"2016-01-09 -0.607138\n",
"2016-01-10 0.135830\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": {},
"outputs": [
{
"data": {
"text/plain": [
"2016-01-01 NaN\n",
"2016-01-02 0.493552\n",
"2016-01-03 1.875707\n",
"2016-01-04 -0.244741\n",
"2016-01-05 -2.307397\n",
"2016-01-06 2.162367\n",
"2016-01-07 0.115911\n",
"2016-01-08 -1.836326\n",
"2016-01-09 -0.218249\n",
"2016-01-10 2.269051\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": {},
"outputs": [
{
"data": {
"text/plain": [
"2016-01-02 0.493552\n",
"2016-01-03 1.875707\n",
"2016-01-04 -0.244741\n",
"2016-01-05 -2.307397\n",
"2016-01-06 2.162367\n",
"2016-01-07 0.115911\n",
"2016-01-08 -1.836326\n",
"2016-01-09 -0.218249\n",
"2016-01-10 2.269051\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": {},
"outputs": [
{
"data": {
"text/plain": [
"2016-01-02 0.243593\n",
"2016-01-03 1.880935\n",
"2016-01-04 1.273923\n",
"2016-01-05 2.286462\n",
"2016-01-06 2.764336\n",
"2016-01-07 2.305853\n",
"2016-01-08 2.458173\n",
"2016-01-09 2.156855\n",
"2016-01-10 2.489270\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": {},
"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": {},
"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": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" two | \n",
" three | \n",
"
\n",
" \n",
" \n",
" \n",
" a | \n",
" 0.0 | \n",
" 0 | \n",
" -0.542906 | \n",
"
\n",
" \n",
" b | \n",
" 1.0 | \n",
" 1 | \n",
" -0.406389 | \n",
"
\n",
" \n",
" c | \n",
" 2.0 | \n",
" 2 | \n",
" -0.372887 | \n",
"
\n",
" \n",
" d | \n",
" 3.0 | \n",
" 3 | \n",
" -0.047911 | \n",
"
\n",
" \n",
" e | \n",
" 4.0 | \n",
" 4 | \n",
" 0.525983 | \n",
"
\n",
" \n",
" f | \n",
" 5.0 | \n",
" 5 | \n",
" 0.316435 | \n",
"
\n",
" \n",
" g | \n",
" NaN | \n",
" 6 | \n",
" -0.253895 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two three\n",
"a 0.0 0 -0.542906\n",
"b 1.0 1 -0.406389\n",
"c 2.0 2 -0.372887\n",
"d 3.0 3 -0.047911\n",
"e 4.0 4 0.525983\n",
"f 5.0 5 0.316435\n",
"g NaN 6 -0.253895"
]
},
"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": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
" E | \n",
" F | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1.0 | \n",
" 2013-01-02 | \n",
" 1.0 | \n",
" 3 | \n",
" test | \n",
" foo | \n",
"
\n",
" \n",
" 1 | \n",
" 1.0 | \n",
" 2013-01-02 | \n",
" 1.0 | \n",
" 3 | \n",
" train | \n",
" foo | \n",
"
\n",
" \n",
" 2 | \n",
" 1.0 | \n",
" 2013-01-02 | \n",
" 1.0 | \n",
" 3 | \n",
" test | \n",
" foo | \n",
"
\n",
" \n",
" 3 | \n",
" 1.0 | \n",
" 2013-01-02 | \n",
" 1.0 | \n",
" 3 | \n",
" train | \n",
" foo | \n",
"
\n",
" \n",
"
\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": {},
"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": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" two | \n",
" three | \n",
"
\n",
" \n",
" \n",
" \n",
" a | \n",
" 0.0 | \n",
" 0 | \n",
" -0.542906 | \n",
"
\n",
" \n",
" b | \n",
" 1.0 | \n",
" 1 | \n",
" -0.406389 | \n",
"
\n",
" \n",
" c | \n",
" 2.0 | \n",
" 2 | \n",
" -0.372887 | \n",
"
\n",
" \n",
" d | \n",
" 3.0 | \n",
" 3 | \n",
" -0.047911 | \n",
"
\n",
" \n",
" e | \n",
" 4.0 | \n",
" 4 | \n",
" 0.525983 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two three\n",
"a 0.0 0 -0.542906\n",
"b 1.0 1 -0.406389\n",
"c 2.0 2 -0.372887\n",
"d 3.0 3 -0.047911\n",
"e 4.0 4 0.525983"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" two | \n",
" three | \n",
"
\n",
" \n",
" \n",
" \n",
" e | \n",
" 4.0 | \n",
" 4 | \n",
" 0.525983 | \n",
"
\n",
" \n",
" f | \n",
" 5.0 | \n",
" 5 | \n",
" 0.316435 | \n",
"
\n",
" \n",
" g | \n",
" NaN | \n",
" 6 | \n",
" -0.253895 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two three\n",
"e 4.0 4 0.525983\n",
"f 5.0 5 0.316435\n",
"g NaN 6 -0.253895"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.tail(3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Индексы"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"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": {},
"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": {},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 0. , 0. , -0.54290577],\n",
" [ 1. , 1. , -0.40638852],\n",
" [ 2. , 2. , -0.3728874 ],\n",
" [ 3. , 3. , -0.04791126],\n",
" [ 4. , 4. , 0.52598272],\n",
" [ 5. , 5. , 0.31643534],\n",
" [ nan, 6. , -0.2538949 ]])"
]
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.values"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Описательные статистики"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" two | \n",
" three | \n",
"
\n",
" \n",
" \n",
" \n",
" count | \n",
" 6.000000 | \n",
" 7.000000 | \n",
" 7.000000 | \n",
"
\n",
" \n",
" mean | \n",
" 2.500000 | \n",
" 3.000000 | \n",
" -0.111653 | \n",
"
\n",
" \n",
" std | \n",
" 1.870829 | \n",
" 2.160247 | \n",
" 0.399004 | \n",
"
\n",
" \n",
" min | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" -0.542906 | \n",
"
\n",
" \n",
" 25% | \n",
" 1.250000 | \n",
" 1.500000 | \n",
" -0.389638 | \n",
"
\n",
" \n",
" 50% | \n",
" 2.500000 | \n",
" 3.000000 | \n",
" -0.253895 | \n",
"
\n",
" \n",
" 75% | \n",
" 3.750000 | \n",
" 4.500000 | \n",
" 0.134262 | \n",
"
\n",
" \n",
" max | \n",
" 5.000000 | \n",
" 6.000000 | \n",
" 0.525983 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two three\n",
"count 6.000000 7.000000 7.000000\n",
"mean 2.500000 3.000000 -0.111653\n",
"std 1.870829 2.160247 0.399004\n",
"min 0.000000 0.000000 -0.542906\n",
"25% 1.250000 1.500000 -0.389638\n",
"50% 2.500000 3.000000 -0.253895\n",
"75% 3.750000 4.500000 0.134262\n",
"max 5.000000 6.000000 0.525983"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.describe()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Транспонирование данных"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" a | \n",
" b | \n",
" c | \n",
" d | \n",
" e | \n",
" f | \n",
" g | \n",
"
\n",
" \n",
" \n",
" \n",
" one | \n",
" 0.000000 | \n",
" 1.000000 | \n",
" 2.000000 | \n",
" 3.000000 | \n",
" 4.000000 | \n",
" 5.000000 | \n",
" NaN | \n",
"
\n",
" \n",
" two | \n",
" 0.000000 | \n",
" 1.000000 | \n",
" 2.000000 | \n",
" 3.000000 | \n",
" 4.000000 | \n",
" 5.000000 | \n",
" 6.000000 | \n",
"
\n",
" \n",
" three | \n",
" -0.542906 | \n",
" -0.406389 | \n",
" -0.372887 | \n",
" -0.047911 | \n",
" 0.525983 | \n",
" 0.316435 | \n",
" -0.253895 | \n",
"
\n",
" \n",
"
\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 -0.542906 -0.406389 -0.372887 -0.047911 0.525983 0.316435 -0.253895"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.T"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Сортировка по столбцу"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" two | \n",
" three | \n",
"
\n",
" \n",
" \n",
" \n",
" e | \n",
" 4.0 | \n",
" 4 | \n",
" 0.525983 | \n",
"
\n",
" \n",
" f | \n",
" 5.0 | \n",
" 5 | \n",
" 0.316435 | \n",
"
\n",
" \n",
" d | \n",
" 3.0 | \n",
" 3 | \n",
" -0.047911 | \n",
"
\n",
" \n",
" g | \n",
" NaN | \n",
" 6 | \n",
" -0.253895 | \n",
"
\n",
" \n",
" c | \n",
" 2.0 | \n",
" 2 | \n",
" -0.372887 | \n",
"
\n",
" \n",
" b | \n",
" 1.0 | \n",
" 1 | \n",
" -0.406389 | \n",
"
\n",
" \n",
" a | \n",
" 0.0 | \n",
" 0 | \n",
" -0.542906 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two three\n",
"e 4.0 4 0.525983\n",
"f 5.0 5 0.316435\n",
"d 3.0 3 -0.047911\n",
"g NaN 6 -0.253895\n",
"c 2.0 2 -0.372887\n",
"b 1.0 1 -0.406389\n",
"a 0.0 0 -0.542906"
]
},
"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": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" x | \n",
" y | \n",
" z | \n",
"
\n",
" \n",
" \n",
" \n",
" 52 | \n",
" -2.508773 | \n",
" 2.294870 | \n",
" -0.789170 | \n",
"
\n",
" \n",
" 15 | \n",
" -2.432334 | \n",
" 1.078085 | \n",
" 0.465474 | \n",
"
\n",
" \n",
" 74 | \n",
" -2.135262 | \n",
" -0.295836 | \n",
" 0.196208 | \n",
"
\n",
" \n",
" 34 | \n",
" -1.742211 | \n",
" -0.873274 | \n",
" -0.873176 | \n",
"
\n",
" \n",
" 20 | \n",
" -1.703534 | \n",
" 0.009649 | \n",
" 0.262730 | \n",
"
\n",
" \n",
" ... | \n",
" ... | \n",
" ... | \n",
" ... | \n",
"
\n",
" \n",
" 3 | \n",
" 1.790339 | \n",
" 1.276875 | \n",
" 2.392990 | \n",
"
\n",
" \n",
" 21 | \n",
" 1.866338 | \n",
" 0.070104 | \n",
" -1.508409 | \n",
"
\n",
" \n",
" 18 | \n",
" 1.983986 | \n",
" 0.372320 | \n",
" 0.009438 | \n",
"
\n",
" \n",
" 79 | \n",
" 2.004266 | \n",
" 0.536959 | \n",
" -1.322955 | \n",
"
\n",
" \n",
" 75 | \n",
" 2.421442 | \n",
" -0.623414 | \n",
" -0.557844 | \n",
"
\n",
" \n",
"
\n",
"
100 rows × 3 columns
\n",
"
"
],
"text/plain": [
" x y z\n",
"52 -2.508773 2.294870 -0.789170\n",
"15 -2.432334 1.078085 0.465474\n",
"74 -2.135262 -0.295836 0.196208\n",
"34 -1.742211 -0.873274 -0.873176\n",
"20 -1.703534 0.009649 0.262730\n",
".. ... ... ...\n",
"3 1.790339 1.276875 2.392990\n",
"21 1.866338 0.070104 -1.508409\n",
"18 1.983986 0.372320 0.009438\n",
"79 2.004266 0.536959 -1.322955\n",
"75 2.421442 -0.623414 -0.557844\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": {},
"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": {},
"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": {},
"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": {},
"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": {},
"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": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" two | \n",
" three | \n",
"
\n",
" \n",
" \n",
" \n",
" b | \n",
" 1.0 | \n",
" 1 | \n",
" -0.406389 | \n",
"
\n",
" \n",
" c | \n",
" 2.0 | \n",
" 2 | \n",
" -0.372887 | \n",
"
\n",
" \n",
" d | \n",
" 3.0 | \n",
" 3 | \n",
" -0.047911 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two three\n",
"b 1.0 1 -0.406389\n",
"c 2.0 2 -0.372887\n",
"d 3.0 3 -0.047911"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['b':'d']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Диапазон целых чисел даёт диапазон строк с такими номерами, не включая последнюю строку (как обычно при индексировании списков). Всё это кажется довольно нелогичным, хотя и удобно на практике."
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" two | \n",
" three | \n",
"
\n",
" \n",
" \n",
" \n",
" b | \n",
" 1.0 | \n",
" 1 | \n",
" -0.406389 | \n",
"
\n",
" \n",
" c | \n",
" 2.0 | \n",
" 2 | \n",
" -0.372887 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two three\n",
"b 1.0 1 -0.406389\n",
"c 2.0 2 -0.372887"
]
},
"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": {},
"outputs": [
{
"data": {
"text/plain": [
"one 1.000000\n",
"two 1.000000\n",
"three -0.406389\n",
"Name: b, dtype: float64"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.loc['b']"
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {},
"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": {},
"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": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" two | \n",
" three | \n",
"
\n",
" \n",
" \n",
" \n",
" a | \n",
" 0.0 | \n",
" 0 | \n",
" -0.542906 | \n",
"
\n",
" \n",
" b | \n",
" 1.0 | \n",
" 1 | \n",
" -0.406389 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two three\n",
"a 0.0 0 -0.542906\n",
"b 1.0 1 -0.406389"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.loc['a':'b', :]"
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {},
"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": {},
"outputs": [
{
"data": {
"text/plain": [
"one 2.000000\n",
"two 2.000000\n",
"three -0.372887\n",
"Name: c, dtype: float64"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.iloc[2]"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" two | \n",
" three | \n",
"
\n",
" \n",
" \n",
" \n",
" b | \n",
" 1.0 | \n",
" 1 | \n",
" -0.406389 | \n",
"
\n",
" \n",
" c | \n",
" 2.0 | \n",
" 2 | \n",
" -0.372887 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two three\n",
"b 1.0 1 -0.406389\n",
"c 2.0 2 -0.372887"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.iloc[1:3]"
]
},
{
"cell_type": "code",
"execution_count": 57,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" two | \n",
"
\n",
" \n",
" \n",
" \n",
" b | \n",
" 1.0 | \n",
" 1 | \n",
"
\n",
" \n",
" c | \n",
" 2.0 | \n",
" 2 | \n",
"
\n",
" \n",
"
\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": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" two | \n",
" three | \n",
"
\n",
" \n",
" \n",
" \n",
" e | \n",
" 4.0 | \n",
" 4 | \n",
" 0.525983 | \n",
"
\n",
" \n",
" f | \n",
" 5.0 | \n",
" 5 | \n",
" 0.316435 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two three\n",
"e 4.0 4 0.525983\n",
"f 5.0 5 0.316435"
]
},
"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": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" 8 | \n",
" 2 | \n",
" 10 | \n",
" 4 | \n",
" 6 | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" -44 | \n",
" 76 | \n",
" -74 | \n",
" 62 | \n",
" 43 | \n",
"
\n",
" \n",
" 1 | \n",
" -81 | \n",
" 9 | \n",
" -92 | \n",
" -78 | \n",
" -50 | \n",
"
\n",
" \n",
" 9 | \n",
" -39 | \n",
" 70 | \n",
" -100 | \n",
" 19 | \n",
" 54 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" 8 2 10 4 6 \n",
"0 -44 76 -74 62 43\n",
"1 -81 9 -92 -78 -50\n",
"9 -39 70 -100 19 54"
]
},
"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 Query\n",
"\n",
"Pandas предлагает множество способов выбора строк из фрейма данных. Кроме функции `loc` существует функция `query`"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C C | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 10 | \n",
" 10 | \n",
"
\n",
" \n",
" 1 | \n",
" 2 | \n",
" 8 | \n",
" 9 | \n",
"
\n",
" \n",
" 2 | \n",
" 3 | \n",
" 6 | \n",
" 8 | \n",
"
\n",
" \n",
" 3 | \n",
" 4 | \n",
" 4 | \n",
" 7 | \n",
"
\n",
" \n",
" 4 | \n",
" 5 | \n",
" 2 | \n",
" 6 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C C\n",
"0 1 10 10\n",
"1 2 8 9\n",
"2 3 6 8\n",
"3 4 4 7\n",
"4 5 2 6"
]
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data = pd.DataFrame({'A': range (1,6 ),\n",
" 'B': range (10,0 , -2),\n",
" 'C C': range(10,5 , -1)})\n",
"data"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C C | \n",
"
\n",
" \n",
" \n",
" \n",
" 4 | \n",
" 5 | \n",
" 2 | \n",
" 6 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C C\n",
"4 5 2 6"
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.query('A > B')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Предыдущее выражение эквивалентно"
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C C | \n",
"
\n",
" \n",
" \n",
" \n",
" 4 | \n",
" 5 | \n",
" 2 | \n",
" 6 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C C\n",
"4 5 2 6"
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data[data.A > data.B]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Для столбцов с пробелами в их названиях можно использовать кавычки с обратными метками."
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C C | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 10 | \n",
" 10 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C C\n",
"0 1 10 10"
]
},
"execution_count": 63,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.query('B == `C C`')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Предыдущее выражение эквивалентно"
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C C | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1 | \n",
" 10 | \n",
" 10 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C C\n",
"0 1 10 10"
]
},
"execution_count": 64,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data[data.B == data['C C']]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 2.4 Изменение таблиц"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"К таблице можно добавлять новые столбцы."
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" two | \n",
" three | \n",
" 4th | \n",
" flag | \n",
"
\n",
" \n",
" \n",
" \n",
" a | \n",
" 0.0 | \n",
" 0 | \n",
" -0.542906 | \n",
" 0.0 | \n",
" False | \n",
"
\n",
" \n",
" b | \n",
" 1.0 | \n",
" 1 | \n",
" -0.406389 | \n",
" 1.0 | \n",
" False | \n",
"
\n",
" \n",
" c | \n",
" 2.0 | \n",
" 2 | \n",
" -0.372887 | \n",
" 4.0 | \n",
" False | \n",
"
\n",
" \n",
" d | \n",
" 3.0 | \n",
" 3 | \n",
" -0.047911 | \n",
" 9.0 | \n",
" True | \n",
"
\n",
" \n",
" e | \n",
" 4.0 | \n",
" 4 | \n",
" 0.525983 | \n",
" 16.0 | \n",
" True | \n",
"
\n",
" \n",
" f | \n",
" 5.0 | \n",
" 5 | \n",
" 0.316435 | \n",
" 25.0 | \n",
" True | \n",
"
\n",
" \n",
" g | \n",
" NaN | \n",
" 6 | \n",
" -0.253895 | \n",
" NaN | \n",
" True | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one two three 4th flag\n",
"a 0.0 0 -0.542906 0.0 False\n",
"b 1.0 1 -0.406389 1.0 False\n",
"c 2.0 2 -0.372887 4.0 False\n",
"d 3.0 3 -0.047911 9.0 True\n",
"e 4.0 4 0.525983 16.0 True\n",
"f 5.0 5 0.316435 25.0 True\n",
"g NaN 6 -0.253895 NaN True"
]
},
"execution_count": 65,
"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": 66,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" three | \n",
" 4th | \n",
" flag | \n",
" foo | \n",
"
\n",
" \n",
" \n",
" \n",
" a | \n",
" 0.0 | \n",
" -0.542906 | \n",
" 0.0 | \n",
" False | \n",
" 0 | \n",
"
\n",
" \n",
" b | \n",
" 1.0 | \n",
" -0.406389 | \n",
" 1.0 | \n",
" False | \n",
" 0 | \n",
"
\n",
" \n",
" c | \n",
" 2.0 | \n",
" -0.372887 | \n",
" 4.0 | \n",
" False | \n",
" 0 | \n",
"
\n",
" \n",
" d | \n",
" 3.0 | \n",
" -0.047911 | \n",
" 9.0 | \n",
" True | \n",
" 0 | \n",
"
\n",
" \n",
" e | \n",
" 4.0 | \n",
" 0.525983 | \n",
" 16.0 | \n",
" True | \n",
" 0 | \n",
"
\n",
" \n",
" f | \n",
" 5.0 | \n",
" 0.316435 | \n",
" 25.0 | \n",
" True | \n",
" 0 | \n",
"
\n",
" \n",
" g | \n",
" NaN | \n",
" -0.253895 | \n",
" NaN | \n",
" True | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one three 4th flag foo\n",
"a 0.0 -0.542906 0.0 False 0\n",
"b 1.0 -0.406389 1.0 False 0\n",
"c 2.0 -0.372887 4.0 False 0\n",
"d 3.0 -0.047911 9.0 True 0\n",
"e 4.0 0.525983 16.0 True 0\n",
"f 5.0 0.316435 25.0 True 0\n",
"g NaN -0.253895 NaN True 0"
]
},
"execution_count": 66,
"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": 67,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" three | \n",
" 4th | \n",
" flag | \n",
" foo | \n",
"
\n",
" \n",
" \n",
" \n",
" a | \n",
" 0.0 | \n",
" -0.542906 | \n",
" 0.0 | \n",
" False | \n",
" 0 | \n",
"
\n",
" \n",
" b | \n",
" -1.0 | \n",
" -0.406389 | \n",
" 1.0 | \n",
" False | \n",
" 0 | \n",
"
\n",
" \n",
" c | \n",
" 2.0 | \n",
" -0.372887 | \n",
" 4.0 | \n",
" False | \n",
" 0 | \n",
"
\n",
" \n",
" d | \n",
" 3.0 | \n",
" -0.047911 | \n",
" 9.0 | \n",
" True | \n",
" 0 | \n",
"
\n",
" \n",
" e | \n",
" 4.0 | \n",
" 0.525983 | \n",
" 16.0 | \n",
" True | \n",
" 0 | \n",
"
\n",
" \n",
" f | \n",
" 5.0 | \n",
" 0.316435 | \n",
" 25.0 | \n",
" True | \n",
" 0 | \n",
"
\n",
" \n",
" g | \n",
" NaN | \n",
" -0.253895 | \n",
" NaN | \n",
" True | \n",
" 0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one three 4th flag foo\n",
"a 0.0 -0.542906 0.0 False 0\n",
"b -1.0 -0.406389 1.0 False 0\n",
"c 2.0 -0.372887 4.0 False 0\n",
"d 3.0 -0.047911 9.0 True 0\n",
"e 4.0 0.525983 16.0 True 0\n",
"f 5.0 0.316435 25.0 True 0\n",
"g NaN -0.253895 NaN True 0"
]
},
"execution_count": 67,
"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": 68,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" three | \n",
" 4th | \n",
" flag | \n",
" foo | \n",
" one_tr | \n",
"
\n",
" \n",
" \n",
" \n",
" a | \n",
" 0.0 | \n",
" -0.542906 | \n",
" 0.0 | \n",
" False | \n",
" 0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" b | \n",
" -1.0 | \n",
" -0.406389 | \n",
" 1.0 | \n",
" False | \n",
" 0 | \n",
" -1.0 | \n",
"
\n",
" \n",
" c | \n",
" 2.0 | \n",
" -0.372887 | \n",
" 4.0 | \n",
" False | \n",
" 0 | \n",
" 2.0 | \n",
"
\n",
" \n",
" d | \n",
" 3.0 | \n",
" -0.047911 | \n",
" 9.0 | \n",
" True | \n",
" 0 | \n",
" NaN | \n",
"
\n",
" \n",
" e | \n",
" 4.0 | \n",
" 0.525983 | \n",
" 16.0 | \n",
" True | \n",
" 0 | \n",
" NaN | \n",
"
\n",
" \n",
" f | \n",
" 5.0 | \n",
" 0.316435 | \n",
" 25.0 | \n",
" True | \n",
" 0 | \n",
" NaN | \n",
"
\n",
" \n",
" g | \n",
" NaN | \n",
" -0.253895 | \n",
" NaN | \n",
" True | \n",
" 0 | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one three 4th flag foo one_tr\n",
"a 0.0 -0.542906 0.0 False 0 0.0\n",
"b -1.0 -0.406389 1.0 False 0 -1.0\n",
"c 2.0 -0.372887 4.0 False 0 2.0\n",
"d 3.0 -0.047911 9.0 True 0 NaN\n",
"e 4.0 0.525983 16.0 True 0 NaN\n",
"f 5.0 0.316435 25.0 True 0 NaN\n",
"g NaN -0.253895 NaN True 0 NaN"
]
},
"execution_count": 68,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df['one_tr'] = df['one'][:3]\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 2.5 Пропуски"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Удаление всех строк с пропусками"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" three | \n",
" 4th | \n",
" flag | \n",
" foo | \n",
" one_tr | \n",
"
\n",
" \n",
" \n",
" \n",
" a | \n",
" 0.0 | \n",
" -0.542906 | \n",
" 0.0 | \n",
" False | \n",
" 0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" b | \n",
" -1.0 | \n",
" -0.406389 | \n",
" 1.0 | \n",
" False | \n",
" 0 | \n",
" -1.0 | \n",
"
\n",
" \n",
" c | \n",
" 2.0 | \n",
" -0.372887 | \n",
" 4.0 | \n",
" False | \n",
" 0 | \n",
" 2.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one three 4th flag foo one_tr\n",
"a 0.0 -0.542906 0.0 False 0 0.0\n",
"b -1.0 -0.406389 1.0 False 0 -1.0\n",
"c 2.0 -0.372887 4.0 False 0 2.0"
]
},
"execution_count": 69,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.dropna(how='any')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Замена всех пропусков на значение"
]
},
{
"cell_type": "code",
"execution_count": 70,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" three | \n",
" 4th | \n",
" flag | \n",
" foo | \n",
" one_tr | \n",
"
\n",
" \n",
" \n",
" \n",
" a | \n",
" 0.0 | \n",
" -0.542906 | \n",
" 0.0 | \n",
" False | \n",
" 0 | \n",
" 0.0 | \n",
"
\n",
" \n",
" b | \n",
" -1.0 | \n",
" -0.406389 | \n",
" 1.0 | \n",
" False | \n",
" 0 | \n",
" -1.0 | \n",
"
\n",
" \n",
" c | \n",
" 2.0 | \n",
" -0.372887 | \n",
" 4.0 | \n",
" False | \n",
" 0 | \n",
" 2.0 | \n",
"
\n",
" \n",
" d | \n",
" 3.0 | \n",
" -0.047911 | \n",
" 9.0 | \n",
" True | \n",
" 0 | \n",
" 666.0 | \n",
"
\n",
" \n",
" e | \n",
" 4.0 | \n",
" 0.525983 | \n",
" 16.0 | \n",
" True | \n",
" 0 | \n",
" 666.0 | \n",
"
\n",
" \n",
" f | \n",
" 5.0 | \n",
" 0.316435 | \n",
" 25.0 | \n",
" True | \n",
" 0 | \n",
" 666.0 | \n",
"
\n",
" \n",
" g | \n",
" 666.0 | \n",
" -0.253895 | \n",
" 666.0 | \n",
" True | \n",
" 0 | \n",
" 666.0 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one three 4th flag foo one_tr\n",
"a 0.0 -0.542906 0.0 False 0 0.0\n",
"b -1.0 -0.406389 1.0 False 0 -1.0\n",
"c 2.0 -0.372887 4.0 False 0 2.0\n",
"d 3.0 -0.047911 9.0 True 0 666.0\n",
"e 4.0 0.525983 16.0 True 0 666.0\n",
"f 5.0 0.316435 25.0 True 0 666.0\n",
"g 666.0 -0.253895 666.0 True 0 666.0"
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.fillna(value=666)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Замена всех пропусков на среднее по столбцу"
]
},
{
"cell_type": "code",
"execution_count": 71,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" three | \n",
" 4th | \n",
" flag | \n",
" foo | \n",
" one_tr | \n",
"
\n",
" \n",
" \n",
" \n",
" a | \n",
" 0.000000 | \n",
" -0.542906 | \n",
" 0.000000 | \n",
" False | \n",
" 0 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" b | \n",
" -1.000000 | \n",
" -0.406389 | \n",
" 1.000000 | \n",
" False | \n",
" 0 | \n",
" -1.000000 | \n",
"
\n",
" \n",
" c | \n",
" 2.000000 | \n",
" -0.372887 | \n",
" 4.000000 | \n",
" False | \n",
" 0 | \n",
" 2.000000 | \n",
"
\n",
" \n",
" d | \n",
" 3.000000 | \n",
" -0.047911 | \n",
" 9.000000 | \n",
" True | \n",
" 0 | \n",
" 0.333333 | \n",
"
\n",
" \n",
" e | \n",
" 4.000000 | \n",
" 0.525983 | \n",
" 16.000000 | \n",
" True | \n",
" 0 | \n",
" 0.333333 | \n",
"
\n",
" \n",
" f | \n",
" 5.000000 | \n",
" 0.316435 | \n",
" 25.000000 | \n",
" True | \n",
" 0 | \n",
" 0.333333 | \n",
"
\n",
" \n",
" g | \n",
" 2.166667 | \n",
" -0.253895 | \n",
" 9.166667 | \n",
" True | \n",
" 0 | \n",
" 0.333333 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" one three 4th flag foo one_tr\n",
"a 0.000000 -0.542906 0.000000 False 0 0.000000\n",
"b -1.000000 -0.406389 1.000000 False 0 -1.000000\n",
"c 2.000000 -0.372887 4.000000 False 0 2.000000\n",
"d 3.000000 -0.047911 9.000000 True 0 0.333333\n",
"e 4.000000 0.525983 16.000000 True 0 0.333333\n",
"f 5.000000 0.316435 25.000000 True 0 0.333333\n",
"g 2.166667 -0.253895 9.166667 True 0 0.333333"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.fillna(value=df.mean())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Булевская маска пропущенных значений"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" one | \n",
" three | \n",
" 4th | \n",
" flag | \n",
" foo | \n",
" one_tr | \n",
"
\n",
" \n",
" \n",
" \n",
" a | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
"
\n",
" \n",
" b | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
"
\n",
" \n",
" c | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
"
\n",
" \n",
" d | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" True | \n",
"
\n",
" \n",
" e | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" True | \n",
"
\n",
" \n",
" f | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" False | \n",
" True | \n",
"
\n",
" \n",
" g | \n",
" True | \n",
" False | \n",
" True | \n",
" False | \n",
" False | \n",
" True | \n",
"
\n",
" \n",
"
\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": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.isnull()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 2.6 Простые операции"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Создадим таблицу из массива случайных чисел."
]
},
{
"cell_type": "code",
"execution_count": 73,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.459822 | \n",
" 0.156361 | \n",
" 0.140080 | \n",
" 0.582276 | \n",
"
\n",
" \n",
" 1 | \n",
" 0.233602 | \n",
" 0.540536 | \n",
" 0.773553 | \n",
" 0.237599 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.126075 | \n",
" 0.212625 | \n",
" 0.715625 | \n",
" 0.522497 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.943916 | \n",
" 0.921324 | \n",
" 0.162516 | \n",
" 0.691716 | \n",
"
\n",
" \n",
" 4 | \n",
" 0.471539 | \n",
" 0.149148 | \n",
" 0.674082 | \n",
" 0.179191 | \n",
"
\n",
" \n",
" 5 | \n",
" 0.131999 | \n",
" 0.722460 | \n",
" 0.352341 | \n",
" 0.178990 | \n",
"
\n",
" \n",
" 6 | \n",
" 0.247497 | \n",
" 0.596999 | \n",
" 0.492316 | \n",
" 0.573033 | \n",
"
\n",
" \n",
" 7 | \n",
" 0.915275 | \n",
" 0.240915 | \n",
" 0.237264 | \n",
" 0.180931 | \n",
"
\n",
" \n",
" 8 | \n",
" 0.543690 | \n",
" 0.128554 | \n",
" 0.139226 | \n",
" 0.018398 | \n",
"
\n",
" \n",
" 9 | \n",
" 0.190750 | \n",
" 0.225518 | \n",
" 0.268433 | \n",
" 0.345286 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C D\n",
"0 0.459822 0.156361 0.140080 0.582276\n",
"1 0.233602 0.540536 0.773553 0.237599\n",
"2 0.126075 0.212625 0.715625 0.522497\n",
"3 0.943916 0.921324 0.162516 0.691716\n",
"4 0.471539 0.149148 0.674082 0.179191\n",
"5 0.131999 0.722460 0.352341 0.178990\n",
"6 0.247497 0.596999 0.492316 0.573033\n",
"7 0.915275 0.240915 0.237264 0.180931\n",
"8 0.543690 0.128554 0.139226 0.018398\n",
"9 0.190750 0.225518 0.268433 0.345286"
]
},
"execution_count": 73,
"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": 74,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.785366 | \n",
" 0.800206 | \n",
" 0.358125 | \n",
"
\n",
" \n",
" 1 | \n",
" 0.385376 | \n",
" 0.969908 | \n",
" 0.195000 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.638482 | \n",
" 0.502140 | \n",
" 0.956010 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.474895 | \n",
" 0.293395 | \n",
" 0.014651 | \n",
"
\n",
" \n",
" 4 | \n",
" 0.328143 | \n",
" 0.936700 | \n",
" 0.771902 | \n",
"
\n",
" \n",
" 5 | \n",
" 0.373467 | \n",
" 0.140538 | \n",
" 0.445425 | \n",
"
\n",
" \n",
" 6 | \n",
" 0.218142 | \n",
" 0.942851 | \n",
" 0.136191 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C\n",
"0 0.785366 0.800206 0.358125\n",
"1 0.385376 0.969908 0.195000\n",
"2 0.638482 0.502140 0.956010\n",
"3 0.474895 0.293395 0.014651\n",
"4 0.328143 0.936700 0.771902\n",
"5 0.373467 0.140538 0.445425\n",
"6 0.218142 0.942851 0.136191"
]
},
"execution_count": 74,
"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": 75,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 1.245187 | \n",
" 0.956567 | \n",
" 0.498205 | \n",
" NaN | \n",
"
\n",
" \n",
" 1 | \n",
" 0.618978 | \n",
" 1.510444 | \n",
" 0.968553 | \n",
" NaN | \n",
"
\n",
" \n",
" 2 | \n",
" 0.764557 | \n",
" 0.714765 | \n",
" 1.671636 | \n",
" NaN | \n",
"
\n",
" \n",
" 3 | \n",
" 1.418812 | \n",
" 1.214719 | \n",
" 0.177167 | \n",
" NaN | \n",
"
\n",
" \n",
" 4 | \n",
" 0.799683 | \n",
" 1.085848 | \n",
" 1.445983 | \n",
" NaN | \n",
"
\n",
" \n",
" 5 | \n",
" 0.505466 | \n",
" 0.862998 | \n",
" 0.797766 | \n",
" NaN | \n",
"
\n",
" \n",
" 6 | \n",
" 0.465639 | \n",
" 1.539850 | \n",
" 0.628507 | \n",
" NaN | \n",
"
\n",
" \n",
" 7 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 8 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
" 9 | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
" NaN | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C D\n",
"0 1.245187 0.956567 0.498205 NaN\n",
"1 0.618978 1.510444 0.968553 NaN\n",
"2 0.764557 0.714765 1.671636 NaN\n",
"3 1.418812 1.214719 0.177167 NaN\n",
"4 0.799683 1.085848 1.445983 NaN\n",
"5 0.505466 0.862998 0.797766 NaN\n",
"6 0.465639 1.539850 0.628507 NaN\n",
"7 NaN NaN NaN NaN\n",
"8 NaN NaN NaN NaN\n",
"9 NaN NaN NaN NaN"
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df1 + df2"
]
},
{
"cell_type": "code",
"execution_count": 76,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 3.919643 | \n",
" 3.312722 | \n",
" 3.280159 | \n",
" 4.164552 | \n",
"
\n",
" \n",
" 1 | \n",
" 3.467203 | \n",
" 4.081072 | \n",
" 4.547107 | \n",
" 3.475197 | \n",
"
\n",
" \n",
" 2 | \n",
" 3.252149 | \n",
" 3.425250 | \n",
" 4.431251 | \n",
" 4.044995 | \n",
"
\n",
" \n",
" 3 | \n",
" 4.887833 | \n",
" 4.842648 | \n",
" 3.325032 | \n",
" 4.383433 | \n",
"
\n",
" \n",
" 4 | \n",
" 3.943078 | \n",
" 3.298295 | \n",
" 4.348163 | \n",
" 3.358381 | \n",
"
\n",
" \n",
" 5 | \n",
" 3.263998 | \n",
" 4.444919 | \n",
" 3.704681 | \n",
" 3.357980 | \n",
"
\n",
" \n",
" 6 | \n",
" 3.494993 | \n",
" 4.193998 | \n",
" 3.984631 | \n",
" 4.146066 | \n",
"
\n",
" \n",
" 7 | \n",
" 4.830549 | \n",
" 3.481829 | \n",
" 3.474527 | \n",
" 3.361861 | \n",
"
\n",
" \n",
" 8 | \n",
" 4.087380 | \n",
" 3.257108 | \n",
" 3.278451 | \n",
" 3.036795 | \n",
"
\n",
" \n",
" 9 | \n",
" 3.381501 | \n",
" 3.451037 | \n",
" 3.536866 | \n",
" 3.690573 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C D\n",
"0 3.919643 3.312722 3.280159 4.164552\n",
"1 3.467203 4.081072 4.547107 3.475197\n",
"2 3.252149 3.425250 4.431251 4.044995\n",
"3 4.887833 4.842648 3.325032 4.383433\n",
"4 3.943078 3.298295 4.348163 3.358381\n",
"5 3.263998 4.444919 3.704681 3.357980\n",
"6 3.494993 4.193998 3.984631 4.146066\n",
"7 4.830549 3.481829 3.474527 3.361861\n",
"8 4.087380 3.257108 3.278451 3.036795\n",
"9 3.381501 3.451037 3.536866 3.690573"
]
},
"execution_count": 76,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"2 * df1 + 3"
]
},
{
"cell_type": "code",
"execution_count": 77,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.443788 | \n",
" 0.155724 | \n",
" 0.139622 | \n",
" 0.549926 | \n",
"
\n",
" \n",
" 1 | \n",
" 0.231483 | \n",
" 0.514596 | \n",
" 0.698682 | \n",
" 0.235369 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.125741 | \n",
" 0.211027 | \n",
" 0.656089 | \n",
" 0.499046 | \n",
"
\n",
" \n",
" 3 | \n",
" 0.809862 | \n",
" 0.796403 | \n",
" 0.161801 | \n",
" 0.637860 | \n",
"
\n",
" \n",
" 4 | \n",
" 0.454258 | \n",
" 0.148595 | \n",
" 0.624180 | \n",
" 0.178233 | \n",
"
\n",
" \n",
" 5 | \n",
" 0.131616 | \n",
" 0.661232 | \n",
" 0.345096 | \n",
" 0.178036 | \n",
"
\n",
" \n",
" 6 | \n",
" 0.244978 | \n",
" 0.562163 | \n",
" 0.472668 | \n",
" 0.542183 | \n",
"
\n",
" \n",
" 7 | \n",
" 0.792730 | \n",
" 0.238591 | \n",
" 0.235044 | \n",
" 0.179945 | \n",
"
\n",
" \n",
" 8 | \n",
" 0.517298 | \n",
" 0.128200 | \n",
" 0.138776 | \n",
" 0.018397 | \n",
"
\n",
" \n",
" 9 | \n",
" 0.189596 | \n",
" 0.223612 | \n",
" 0.265221 | \n",
" 0.338466 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C D\n",
"0 0.443788 0.155724 0.139622 0.549926\n",
"1 0.231483 0.514596 0.698682 0.235369\n",
"2 0.125741 0.211027 0.656089 0.499046\n",
"3 0.809862 0.796403 0.161801 0.637860\n",
"4 0.454258 0.148595 0.624180 0.178233\n",
"5 0.131616 0.661232 0.345096 0.178036\n",
"6 0.244978 0.562163 0.472668 0.542183\n",
"7 0.792730 0.238591 0.235044 0.179945\n",
"8 0.517298 0.128200 0.138776 0.018397\n",
"9 0.189596 0.223612 0.265221 0.338466"
]
},
"execution_count": 77,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"np.sin(df1)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Построим графики кумулятивных сумм"
]
},
{
"cell_type": "code",
"execution_count": 78,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" A | \n",
" B | \n",
" C | \n",
" D | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 0.459822 | \n",
" 0.156361 | \n",
" 0.140080 | \n",
" 0.582276 | \n",
"
\n",
" \n",
" 1 | \n",
" 0.693423 | \n",
" 0.696897 | \n",
" 0.913633 | \n",
" 0.819874 | \n",
"
\n",
" \n",
" 2 | \n",
" 0.819498 | \n",
" 0.909522 | \n",
" 1.629258 | \n",
" 1.342372 | \n",
"
\n",
" \n",
" 3 | \n",
" 1.763414 | \n",
" 1.830846 | \n",
" 1.791774 | \n",
" 2.034088 | \n",
"
\n",
" \n",
" 4 | \n",
" 2.234954 | \n",
" 1.979994 | \n",
" 2.465856 | \n",
" 2.213279 | \n",
"
\n",
" \n",
" 5 | \n",
" 2.366953 | \n",
" 2.702453 | \n",
" 2.818196 | \n",
" 2.392269 | \n",
"
\n",
" \n",
" 6 | \n",
" 2.614449 | \n",
" 3.299452 | \n",
" 3.310512 | \n",
" 2.965302 | \n",
"
\n",
" \n",
" 7 | \n",
" 3.529724 | \n",
" 3.540367 | \n",
" 3.547775 | \n",
" 3.146232 | \n",
"
\n",
" \n",
" 8 | \n",
" 4.073414 | \n",
" 3.668921 | \n",
" 3.687001 | \n",
" 3.164630 | \n",
"
\n",
" \n",
" 9 | \n",
" 4.264164 | \n",
" 3.894439 | \n",
" 3.955434 | \n",
" 3.509916 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" A B C D\n",
"0 0.459822 0.156361 0.140080 0.582276\n",
"1 0.693423 0.696897 0.913633 0.819874\n",
"2 0.819498 0.909522 1.629258 1.342372\n",
"3 1.763414 1.830846 1.791774 2.034088\n",
"4 2.234954 1.979994 2.465856 2.213279\n",
"5 2.366953 2.702453 2.818196 2.392269\n",
"6 2.614449 3.299452 3.310512 2.965302\n",
"7 3.529724 3.540367 3.547775 3.146232\n",
"8 4.073414 3.668921 3.687001 3.164630\n",
"9 4.264164 3.894439 3.955434 3.509916"
]
},
"execution_count": 78,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cs = df1.cumsum()\n",
"cs"
]
},
{
"cell_type": "code",
"execution_count": 79,
"metadata": {
"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": 80,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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z39ea56aQoPuwtNaFwKLgHO01vuD1Xsu4DVgWDPkr0lYpApPCCFEA+zduzdU1fPCCy+Epj/99NPcfPPN2O32Ope9++672bRpE++88w6/+c1vQtNnzZpFVlYWV199dajqrlLVQYrrSyl1zNdVXXnllVRUVJCWlsZ5551XY15lqcyVV15Zbd6iRYvIyspCKcWbb75ZY71vv/0248ePJyUl5Zh5Peecc7jjjjs499xzj/e2Qi688ELmz5/P/PnzueCCC0LTtdY888wzoTzv2rWLs88+GzhS2pSVlcXdd99d7201xnFLoJRSiYBHa12olHIAZwGPKaXaaa33q8AndjFQeyh+EjDbDDxuH1rrYx5gQgghWlETlhSdqI4dO1ar5snOzqaoqIgPPviA5cuX11naUlVUVFSNNkQA8fHxuN3uatOGDh3KO++8w7XXXsvcuXMZM2YMACNHjqx1OsB//vMfpk+fzq5du9i5cye9e/dmzJgxzJ07l4kTJ7J161b27NlD7969sdls/Pe//w29l9raK9VFKUVcXFyNPPv9fp566im++OKL41aJXXvttUyYMIGHHnqIBx8MVFb17t2b7Oxstm/fTo8ePXjzzTcZN25caBmr1cqIESNCf1eaPHkyzz//PBMnTsRisbB161Y6dOhQ7/fTVOpThdcOeF0pZSJQYvVvrfXHSqmFweBKAVnALc2XzRNjsZlAg8/jxxwcG08IIYSAQFXR4sWLycvLIzU1lQceeIAbb7yxRrqcnBwef/xxzOZjXzqffPJJ/vWvf+H1ekMNtwHuu+8+nnrqKVwuFy+++GKogTnAP//5T2688UZmzZpFUlJSqM3QM888ww033MCsWbNITEzktddeCy3TqVMnhg0bRnFxMS+88AJ2u53bbruNW2+9lQEDBmA2m5kzZw42W61NlOtlypQpGIZBREQEDz74IJ9//nloXkVFBZdeeikxMTHHXU9SUhIbN26sNs1ut/Paa69x+eWX4/V6GTp0KLfcUj2UeOCBBwCqBaI33XQT2dnZDB48GK01iYmJfPDBB41+j42lmqtRWW0yMzP16tWrW2x7ldYt2svSeduYMWs0jkjr8RcQQgjRIjZv3kzfvn1bOxunnOuvv54pU6Zw2WWXtXZWThu1HYtKqTVa68za0reJnsgttkCpk7SDEkIIIURTqNddeKe6ymo76cpACCHE6aCyHyXReqQESgghhBCigdpUACV9QQkhhBCiKbSpAMrjlvHwhBBCCHHi2kQAFWoD5fK2ck6EEEIIcTpoEwHUkSo8KYESQghxxN69e5kwYQL9+vWjf//+PP3003WmPXjwIJMmTWLo0KE8+eSTTZoPn8/H3/72N0aOHMngwYNrHTblZONyubjgggvIzMysNsRMW9Em7sKTRuRCCCFqYzab+fvf/87gwYMpKSlhyJAhnHXWWfTr169G2uTkZBYsWNAs+Zg5cyaGYbBgwQIcDkezbKOp2Ww2Pvroo9bORqtpGyVQVgmghBBC1NSuXTsGDx4MBMaj69u3L/v27auRLjs7m7S0NAA8Hg/dunXj9ttvr5Fu5syZdOjQgfT0dPr06RPqbfz6668PDX5b6fHHHw+NiTd37lyWLl3KsGHDmDRpEnv27Altd+LEiaSnp1ebfv3113PLLbeQmZlJr169+PjjjwFwOp3ccMMNDBgwgEGDBoUGM545c2aoV/Sq72XOnDnV3sftt98e6iKhS5cuNYaimTJlCosXLwYgIiIiNH3MmDG1Dg8zZ84clFJs2bIFCHRWqZQKbWPBggUMGjSIAQMGMGPGDFwuV2jbV111VWg9V111FV26dAECpXX33HMPQ4cOJT09nRdffBGAxYsXV8tD5f6tHGC4X79+OByO0BiHJ6pNBFCGWWEYSvqBEkIIUafs7Gx++OEHhg8ffsx0L730UrXg4Wh3330369at48YbbwwFNseza9cupk+fzvr167nmmmu48847AbjjjjuYPn0669atqza9Mr8rV67kk08+4ZZbbsHpdPLss8+ilGL9+vW8/fbbTJ8+HafTiWEYNNfII5988glFRUV1zh82bFhoaJrZs2eH9q/T6eT6669n3rx5rF+/Hq/Xy/PPPx9abv/+/Rw+fJiCggL2798fmv7qq68SHR3NqlWrWLVqFS+//DK7du2qc/uVAwx/+umndO/ePTTY8IlqE1V4SinMNpN0YyCEECexx1Y+xpaCLU26zj5xffj9sN8fN11paSmXXnopTz31FFFRUXWmKysr47XXXuO2225jw4YNtaZ58sknmT17NocOHQqVAAHcc889/PWvfyU+Pr5aoABgGAbTpk0DAgPvVrYp+vbbb3n//fdrTAe44oorMAyDnj170q1bN7Zs2cKyZcu44447Au+9Tx86d+7M1q1b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kydP5plnnuGZZ55BKcUPP/zAoEGD6v1+mkp97sJLBDzB4MkBnEWgAfki4DICd+JNBz5szoyeKLNVujEQQghR3f79+5k+fTo+nw+/388VV1wRamB9tC1btvDaa68dd5333HMPf/3rX1FKVauqu+mmm0JthebOncusWbNC8958801++ctf4vF46NGjB6+++ioAr7/+Orfccgvl5eV069at2vbtdjuDBg3C4/GEgpKZM2cyY8YM0tPTCQsL4/XXX2/4TgmqqKhg9OjReDweunTpwuTJk6s17M7JyeHxxx/HbD5+WUxGRkaNRvTt2rXj0UcfZcKECWitOf/887nooouqpancf1WXve+++7jrrrtIT0/H7/fTtWtXPv7440a/z8ZSx2tUppRKJ9BI3ESgyu/fWusHlVLdCARPccAPwM+01sccrTczM1MfvQNbSlmRizm//4ZxV/cibVxqq+RBCCFEdZs3bw5Vv4j6Gz9+PI8//niztvFpa2o7FpVSa7TWte7k44aNWut1QI2yMa31TgLtoU4JoX6gZDw8IYQQQpygNtOjZGUVnrSBEkIIcaqr7EdJtJ42M5SLYSjMFkPuwhNCCCHECWszARQEBhSWRuRCCCGEOFFtKoCyWE1ShSeEEEKIE9a2Aii7SarwhBBCCHHC2lQAZbZKFZ4QQoiafD4fgwYNqrMPKICNGzcyZswYhg0bFhpWpKlUVFRw7733MmLECDIyMppkrLbmdvDgQSZNmsTQoUN58sknWzs7La7N3IUHYLEZUoUnhBCihqeffpq+fftSXFxcZ5r+/fuzdOnSZtn+L37xC0aPHs2DDz6IxWJplm00teTk5FDv5m1RmyqBstjMUoUnhBCimpycHD755JMaY8RVtXjx4lDpVEFBATExMbUOh3L99dfTtWtX0tLSSE9PDw2wO378+Bo9cd9+++3MmTOH0tJSFi9ezOzZsxk8eDBTp07l8OHDAGRlZTFixAjS09OrTR8/fjy/+tWvyMjIIC0tjZUrV4bydvHFF5Oens6IESNYt25dKF/vvvtujfcyc+bMau9jypQpoS4SKntNryotLY3s7Gyys7NDAy57PB66devG7bffXiP9zJkzcTgcFBYWAvDZZ5+hlApt4+2332bAgAGkpaXx+9//PrScUqpar+cjRoxg/PjxQGAA4xkzZjBs2DAGDRrEhx8GBkKZM2dOtTxU7t958+aRkZFBjx49iI6OJiMjg/POO69GXhuqbQVQVunGQAghRHV33XUXf/vb3zCM+l0SH3nkETp16lTn/FmzZrFhwwbGjh3LwoULj7u+/Px89u7dy2OPPcb69esZMGAADzzwAADXXXcdjz32GOvWras2HaC8vJysrCyee+45ZsyYAcD999/PoEGDWLduHQ8//DDXXXcdAIZhcLyRRxrrpZdeqjXYqpSens5bb70FwBtvvBEaGPinn37i97//PQsXLiQrK4tVq1bxwQcfABAeHs6aNWvw+Xxs3Lix2voeeughJk6cyMqVK1m0aBH33HMPZWVldW6/coDhV155hTFjxpCVldUkVaRtqgpPujEQQoiT19J/byVvb2mTrjOhYwRjruhV5/yPP/6YpKQkhgwZUq/OKfft28d3333H1KlT60xzzz33cO+99+JyuVixYkVo+jXXXIPD4aBTp07VxsjTWtOxY8fQQMHTp0/n8ssvp6ioiMLCwhrTK1199dUAjB07luLiYgoLC1m2bBnvvfceABMnTiQ/P5/i4mJSU1P54Ycfqi1f6cknnwwNBrxr1y5++9vfAoF2WRkZGWitGTduHE899VSNZcvKynjttde47bbbQqVtR7vwwguZP38+V155JR6Ph5SUFABWrVrF+PHjSUxMDO2fJUuWcPHFFwOBQYM///xzFi1axA033BBqd/bFF18wf/78UMmZ0+lkz549QGCA5WXLlgGBz6o5h7ppWyVQNrkLTwghxBHffPMN8+fPp0uXLlx11VUsXLiQn/3sZ6xYsYKMjAwyMjKYP39+KP0DDzzAfffdh1KqznXOmjWLbdu28ec//5n7778/NH3u3LlkZWWRnp5eLRiJiopqVN6PzsOx8nTbbbexYsUK0tPTa1RV3n333WRlZZGVlcWYMWNC0x0OB1lZWaxZs4Z169bx1Vdf1Vjv008/zc0334zdbq9z2zabjZ49e3Lvvfcybdq0+r49rr32WmbPns3atWtDpVYQCDjfe++9UJ737NkTGsOusrQpKyuLK6+8st7baow2VQIV6AfKj9b6mAeaEEKIlneskqLm8sgjj/DII48AgbZBjz/+eKg0JisrK5Ru8eLF7NixA7fbzdlnn83y5cuPu+6oqCjy8vJqTI+Pj2ffvn2h13FxcdhsNpYuXcqYMWN48803GTduHNHR0cTGxtaY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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": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Time | \n",
" Value | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" 2019-01-09 | \n",
" 66 | \n",
"
\n",
" \n",
" 1 | \n",
" 2019-02-09 | \n",
" 34 | \n",
"
\n",
" \n",
" 2 | \n",
" 2019-03-09 | \n",
" 18 | \n",
"
\n",
" \n",
" 3 | \n",
" 2019-04-09 | \n",
" 32 | \n",
"
\n",
" \n",
" 4 | \n",
" 2019-05-09 | \n",
" 84 | \n",
"
\n",
" \n",
"
\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": {},
"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": {
"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": {},
"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": {},
"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": {},
"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": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Value | \n",
"
\n",
" \n",
" Time | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2019-09-01 | \n",
" 66 | \n",
"
\n",
" \n",
" 2019-09-02 | \n",
" 34 | \n",
"
\n",
" \n",
" 2019-09-03 | \n",
" 18 | \n",
"
\n",
" \n",
" 2019-09-04 | \n",
" 32 | \n",
"
\n",
" \n",
" 2019-09-05 | \n",
" 84 | \n",
"
\n",
" \n",
" 2019-09-06 | \n",
" 27 | \n",
"
\n",
" \n",
" 2019-09-07 | \n",
" 45 | \n",
"
\n",
" \n",
" 2019-09-08 | \n",
" 84 | \n",
"
\n",
" \n",
" 2019-09-09 | \n",
" 42 | \n",
"
\n",
" \n",
" 2019-09-10 | \n",
" 65 | \n",
"
\n",
" \n",
" 2019-09-11 | \n",
" 65 | \n",
"
\n",
" \n",
" 2019-09-12 | \n",
" 73 | \n",
"
\n",
" \n",
" 2019-09-13 | \n",
" 24 | \n",
"
\n",
" \n",
" 2019-09-14 | \n",
" 62 | \n",
"
\n",
" \n",
" 2019-09-15 | \n",
" 44 | \n",
"
\n",
" \n",
" 2019-09-16 | \n",
" 25 | \n",
"
\n",
" \n",
" 2019-09-17 | \n",
" 75 | \n",
"
\n",
" \n",
" 2019-09-18 | \n",
" 23 | \n",
"
\n",
" \n",
"
\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": {
"scrolled": true
},
"outputs": [
{
"data": {
"image/png": "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",
"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": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Value | \n",
"
\n",
" \n",
" Time | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2019-09-01 | \n",
" 39.333333 | \n",
"
\n",
" \n",
" 2019-09-04 | \n",
" 47.666667 | \n",
"
\n",
" \n",
" 2019-09-07 | \n",
" 57.000000 | \n",
"
\n",
" \n",
" 2019-09-10 | \n",
" 67.666667 | \n",
"
\n",
" \n",
" 2019-09-13 | \n",
" 43.333333 | \n",
"
\n",
" \n",
" 2019-09-16 | \n",
" 41.000000 | \n",
"
\n",
" \n",
"
\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": {},
"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": {
"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": {
"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": {},
"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": {},
"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": {},
"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": {},
"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\n",
"\n",
"Продолжение "
]
}
],
"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.10"
},
"vscode": {
"interpreter": {
"hash": "33e61429d47ea5072c304948017faf4b8066559ab931d76623e2d35f352f9359"
}
}
},
"nbformat": 4,
"nbformat_minor": 1
}