{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Python数据科学分享——2.数据处理\n", "\n", "> Python数据处理历史悠久,除了基础的Numpy、Scipy、pandas构建繁荣生态,还有谷歌推出的tensorflow、jax高性能工具\n", "\n", "- toc: true \n", "- badges: true\n", "- comments: true\n", "- categories: [jupyter,Python,Data Science]\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "![](2.data-elt/markmap.png)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:47:47.326565Z", "start_time": "2020-05-14T07:47:46.356241Z" }, "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "%load_ext autoreload\n", "%autoreload 2\n", "\n", "import matplotlib.pyplot as plt\n", "import seaborn\n", "\n", "seaborn.set()\n", "plt.rcParams[\"font.sans-serif\"] = [\"SimHei\"]\n", "import numpy as np\n", "import pandas as pd\n", "from scipy import sparse\n", "from tqdm.notebook import tqdm" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "
python数值计算历史
\n", "\n", "\n", "| 首发年份 | 名称 | 场景 |\n", "| :-: | :-: | :-: |\n", "| 1991 | Python | 编程语言 |\n", "| 2001 | ipython | 增强shell |\n", "| 2001 | SciPy | 算法库 |\n", "| 2006 | Numpy | 数组运算 |\n", "| 2007 | Cython | AOT静态编译 |\n", "| 2008 | Pandas | 标签数组运算 |\n", "| 2010 | scikit-learn | 机器学习 |\n", "| 2012 | ipython notebook | 计算环境 |\n", "| 2012 | anaconda | 管理工具 |\n", "| 2012 | Numba | llvm实现JIT编译器 |\n", "| 2012 | pyspark | 集群运算 |\n", "| 2015 | jupyter | 多语言支持 |\n", "| 2015 | TensorFlow | 深度学习 |\n", "| 2018 | jax | Numpy+autogrd+JIT+GPU+TPU |\n", "\n", "
With great power comes great complexity(越强大越复杂)
" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Numpy\n", "\n", "## 神经网络示例\n", "\n", "### 背景" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2020-06-06T02:09:19.601544Z", "start_time": "2020-06-06T02:09:19.597102Z" }, "scrolled": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "from IPython.display import Video\n", "\n", "# https://github.com/Sentdex/NNfSiX\n", "\n", "# Video(\"2.data-elt/cat_neural_network.mp4\", embed=True)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "| x1| x2| x3| Y |\n", "| :-:| :-:| :-:| :-: |\n", "| 0| 0| 1| 0 |\n", "| 0| 1| 1| 1 |\n", "| 1| 0| 1| 1 |\n", "| 1| 1| 1| 0 |" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T07:15:48.727978Z", "start_time": "2020-05-13T07:15:48.724005Z" } }, "outputs": [], "source": [ "X = np.array([[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]])\n", "y = np.array([[0], [1], [1], [0]])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 网络图" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 数学描述" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "公式1 $$ \\hat y = \\sigma(W_2\\sigma(W_1x+ b_1) + b_2) $$\n", "\n", "公式2(sigmoid) $$ \\sigma = \\frac {1} {1 + e^{-x}} $$\n", "\n", "公式3(sigmoid导数) $$ \\sigma' = \\sigma(x) \\times (1 - \\sigma(x)) $$\n", "\n", "![](2.data-elt/sigmoid.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 反向传播" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](2.data-elt/nn_flow.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "公式4 $$ Loss(Sum\\ of\\ Squares\\ Error) = \\sum_{i=1}^n(y-\\hat y)^2 $$" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### numpy实现" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T07:15:51.688758Z", "start_time": "2020-05-13T07:15:51.680129Z" } }, "outputs": [], "source": [ "def σ(x):\n", " return 1 / (1 + np.exp(-x))\n", "\n", "\n", "def σ_dvt(x):\n", " return σ(x) * (1 - σ(x))\n", "\n", "\n", "class NeuralNetwork(object):\n", " def __init__(self, x, y):\n", " self.x = x\n", " self.y = y\n", " self.w1 = np.random.rand(self.x.shape[1], 4)\n", " self.w2 = np.random.rand(4, 1)\n", " self.yhat = np.zeros(self.y.shape)\n", "\n", " def feedforward(self):\n", " self.layer1 = σ(self.x @ self.w1)\n", " self.yhat = σ(self.layer1 @ self.w2)\n", "\n", " def backprop(self):\n", " gd = 2 * (self.y - self.yhat) * σ_dvt(self.yhat)\n", " d_w2 = self.layer1.T @ gd\n", " d_w1 = self.x.T @ (gd @ (self.w2.T) * σ_dvt(self.layer1))\n", "\n", " self.w1 += d_w1\n", " self.w2 += d_w2" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T07:15:53.232665Z", "start_time": "2020-05-13T07:15:52.355294Z" }, "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "6000b283e8cd461fb82fc72b7d62a616", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, max=10000.0), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "[[0.00644673]\n", " [0.9909493 ]\n", " [0.99080728]\n", " [0.00803459]]\n" ] } ], "source": [ "nn = NeuralNetwork(X, y)\n", "\n", "train = []\n", "for i in tqdm(range(10000)):\n", " nn.feedforward()\n", " nn.backprop()\n", " loss = sum((_[0] - _[1])[0] ** 2 for _ in zip(nn.y, nn.yhat))\n", " train.append(loss)\n", "\n", "print(nn.yhat)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T07:15:54.149303Z", "start_time": "2020-05-13T07:15:53.835706Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "def show_plot(x, y):\n", " plt.figure(figsize=(15, 5))\n", " plt.plot(\n", " x,\n", " y,\n", " linewidth=3,\n", " linestyle=\":\",\n", " color=\"blue\",\n", " label=\"Sum of Squares Error\",\n", " )\n", " plt.xlabel(\"训练次数\")\n", " plt.ylabel(\"训练损失\")\n", " plt.title(\"训练损失随次数增加而递减\")\n", " plt.legend(loc=\"upper right\")\n", " plt.show()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T07:16:02.337476Z", "start_time": "2020-05-13T07:16:02.335242Z" }, "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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JEnC1q1bMfDS+WJEREREREQUsKBODU1KSkJSUhJGjx4NURSRlpaGJUuWIDExEUOHDq12OwCYNWsW5syZgwULFqBfv37o1atXMLtLRERERETUKAR1amh949RQamwYXxRMjC8KNsYYBRPji4IpFOOrXqeGEhERERERUehhIkhERERERNTIMBEkIiIiIiJqZJgIEhERERERNTJMBImIiIiIiBoZJoJERERERESNTFDrCNY3URTquwuVCtV+UcPA+KJgYnxRsDHGKJgYXxRMoRZfNfWnQdcRJCIiIiIiIl+cGkpERERERNTIMBEkIiIiIiJqZJgIEhERERERNTJMBImIiIiIiBoZJoJERERERESNDBNBIiIiIiKiRoaJIBERERERUSPDRJCIiIiIiKiRYSJIRERERETUyDARrENpaWkYNWoUxowZg19++aW+u0NhZvHixbjtttswZswYZGVl4dy5c7j77rsxevRoTJ06FXa7HQDwwQcfYNSoURg1ahQyMzMBoMptiSr6/fffkZSUhP379+Pw4cMYO3YsRo0ahRdffNG9TWXnsaq2JSq3ZcsWTJgwASNHjsT27dsZX1SrXnrpJdx5552YOHEiTpw4wfiiWvH+++9jw4YNAKqOk0BiKiTzAInqxM6dO6W77rpLcjqd0vbt26V77rmnvrtEYeTcuXPSsGHDJLvdLm3btk264447pKefflr6/PPPJUmSpJkzZ0pr1qyRzpw5I40YMUKyWCzSyZMnpeHDh0sul6vSbYkqcjgc0sSJE6UhQ4ZI+/btk+677z4pIyNDcrlc0sSJE6Uff/yxyvNYZdsSlbNYLNK4ceMkq9UqHTlyRPr4448ZX1Rrdu/eLT3wwAOSJElSenq69I9//IPxRVfsgQcekK699lpp/fr1kiRVHieBxFSo5gEcEawjGRkZSE1NhSiKSE5OxoEDB2Cz2eq7WxQmRFHEnDlzoFQqoVKpIAgCMjIyMGzYMADA0KFDkZmZiW3btuH666+HVqtFu3btoFKpcOrUqUq3Jaro3XffxQ033IDWrVtDkiTs27cPKSkpEAQBgwcPRmZmZpXnscq2JSq3e/duaLVaTJkyBdOnT0ePHj0YX1RrVCoVysrK4HA4UFpaCkEQGF90xT744APceOONAFBlnAQSU6GaBzARrCOFhYWIiYkBAAiCAIPBgOLi4nruFYULo9GI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y+UCAKxfvx4LFixwH3ft2rVo27at+56+ffv2AZCnmX744YdefVAqlSgsLES3bt3w+OOPY968eVAoFDCbzTAYDNBqtejVq1eNI5dERET+4F8TIiJq1EpKSpCTk4PHHnsMmZmZXvfs2e12OBwOOBwOmM1mzJ8/H3l5ebjlllugUqmwf/9+PPfcczhz5gyUSiUmT56MnTt3Yvfu3SguLsa8efPw97//HQBw5MgRzJw5EzNnzsSjjz6KVatW4Y033oDVanX3pWnTphg8eDAuXLiARx99FHv27MHBgwdx77334vrrr8dPP/2ExYsX11j0noiIqCaCJElSfXeCiIiovkiShB9++AGxsbF4+umn8eWXX7rrBgLAO++8g+joaNxzzz1e+61duxb9+/dHQUEB7rvvPsydOxe33HILCgoKEBcXBwA4ePAgunbtijfeeAPr1q3Da6+9hqSkJABy8fhp06bhzz//xNdff428vDw8+OCDGDBgAB599FE0bdoUhw8fxiOPPIJZs2Zh5MiROHPmDKZNm4ZnnnkGPXr0qLsniYiIGhwmgkRERBe5XK6gTL08ePAgWrRo4U4Qy0mShOPHj7uno9psNq8kFJBHJqtakZSIiOhyMREkIiIiIiJqZHiPIBERERERUSPDRJCIiIiIiKiRYSJIRERERETUyDARJCIiIiIiamSYCBIRERERETUy/w9yFql2I+DOOgAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_plot(range(len(train)), train)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T07:16:05.128134Z", "start_time": "2020-05-13T07:16:05.126050Z" }, "scrolled": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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SqJy5cqMHDkSgObNm7Nt2zZSUlKYNm0a06dPJywsjKysLG699VZeeOEFWrZs6b7vd999l8GDB1OqVCnatWvH1q1bCQ8P55ZbbmHQoEEsXryYc+fOUadOHeLj49m2bRuZmZls27YNq9VKcHCwe6rmmTNn3B1YyJmq+cUXX/D111/z/fff8/LLL/Poo49iNpsJDw+nT58+JCQksGvXLvdtvvzyS1599VWuueYajh07RtmyZdm0aRPDhg3juuuu4/jx48yaNYvatWuzb98+tm7dSlhYGEajkccee8yd24MHD9KpUycAunbt6r7/gQMHcs0112AwGPjkk0/45JNPMJvNNGrUCKvVyrBhw2jdujXNmze/YE5ERMSzVByKiMhV17hxYxo3bsz999+fZ33eP1WrVo0FCxYQExPDa6+9RkREBBUrVuSll17Cbre7p17+r99//50jR44wZMgQXn31Vc6fP8+aNWuIj4+nQoUKfPPNN/z+++/u8V26dCEwMBCDwQBAYmIiRqORzz//HACXy4XVauW///2v+zY1atRg69atzJ49m/j4eGbOnEnXrl257777OHTokHst5V9iY2M5ceIEdevWpWbNmsyfP59Dhw7xyiuvEBQURIsWLYCcjWImT55Mv379+Oijj6hVqxZnzpzhyy+/JDExkbS0NBISEtxTQqtWrUrVqlVZsGABTz31FEuXLuWdd96hfPny/PLLL6SmpuLv78/p06dzxZOYmMi1114L5Gw6A7if/z+ZzWbuu+8+Ro0aRUxMDEOGDOH8+fPMnz+fSZMm8eyzz7rzGBwczLXXXsvEiRNp37492dnZfPzxx2RkZLg7h/9Us2ZNLBYL2dnZPPHEEzzxxBMALFq0iGPHjnHgwAHq1q2bb2wiIlJ4VByKiIhHFdQx/IvL5aJnz56UK1eO2bNnc/PNNxMfH09cXBxpaWmcPHmSJ598kptvvplRo0axf/9+YmNjAXjjjTe4/fbb3fc1atQohg4dCuQuhL799lv35zabjfvvv5/IyEjmzJlTYAexU6dOPPbYYyxYsIAePXoQEBCAn58f5cqVIyUlJU9x+OWXXxIYGMiQIUMASEpKcq97HDt2bK5xu3fvZuvWrSQlJXHo0CFq1KjBzJkzee+991i5ciV79uyhVatW+cbVrl07brrpJjIzM3N9/7rrrsv19b59+2jVqhVOp7PA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2bp1K7Vr18ZisVzyuOjoaDZv3ozL5WLjxo00bdqUtWvXEhcXB8CePXvcG9PIpfv1VyMtWwbz/fdmJk70Y+tWk7dDEhERERERL/No5zA6Opro6GgeeeQRjEYjcXFxzJw5k8qVK9OyZcsLjgOIjY1l6NChjB8/nvr161OvXj1q1KjBhg0b6NixIwEBAYwZM8aTT6FEuukmJzVrOti82YzBALt3G2nQwOHtsERERERExIsMLh88SEXTSuGPPwz07BnIG29kcvvt3tleV4rmVAMpHMq971LufZdy77uUe99VFHN/oWml2orER5Uv72LNmnSdeSgiIiIiIoCH1xxK0abCUERERERE/qLiUNwyM+Gzz9RMFhERERHxRaoEBMjZlKZfvwDi400EBaVz333aoEZERERExJeocygAvP++H/HxOUdaxMYGkFq01s2KiIiIiIiHqTgUAEaOzCQy0klQkIu+fW0EBXk7IhERERERKUyaVioAlCkD77+fSYUKTm68sWgd8yEiIiIiIp6n4lDcGjfWOkMREREREV+laaUiIiIiIiKi4lAKlpwML73kz65depmIiIiIiJR0mlYq+dqyxcQzzwRw5oyRnTtNfPllOhaLt6MSERERERFPUUtI8lWunJPUVAMAP/9sYvVq/R1BRERERKQkU3Eo+apc2cWQIVmUK+dk1qwMHn7Y7u2QRERERETEg9QOkgL16pVN587ZlCrl7UhERERERMTT1DmUApnNqDAUEREREfERKg7lsrhckJbm7ShERERERORqU3Eol+zwYQOPPx5Iv34B3g5FRERERESuMq05lEty+rSBFi2CSU/P2cF05Uo7Dz2kTWpEREREREoKdQ7lkpQr56Jdu2wAjEYXBw7opSMiIiIiUpKocyiXbMSILI4fNzJ0aBZ16zq9HY6IiIiIiFxFKg7lkpUqBYsWZXg7DBERERER8QDNDRQREREREREVh3JlbDbYtMnk7TBEREREROQKqTiUf+2HH4zcfXcQHToEsnevXkoiIiIiIsWZ3tHLv+JywZgx/sTHm3A4DAwYEIBdJ1uIiIiIiBRbKg7lXzEYYPz4TPz8XAQFuWjfPhuDwdtRiYiIiIjIv6XdSuVfu/lmF1OnZhId7eCGG1zeDkdERERERK6AikO5Io88ormkIiIiIiIlgaaVioiIiIiIiIpDubqSk2HYMH8SErQAUURERESkONG0Urlq1q0z8cILASQkGDl3zsCMGZneDklERERERC6ROody1RiNkJCQ85JautTCzp16eYmIiIiIFBd69y5XTatWDtq3z+aaa5x8+GEGdeo4vR2SiIiIiIhcIk0rlatqzJhMjEYIC/N2JCIiIiIicjlUHMpVFR7u7QhEREREROTf0LRS8TiXC+w6DlFEREREpEhTcSgedfiwgfbtA3nrLT9vhyIiIiIiIhegaaXiMXv2GHnooSAyMgxs22aiTRs7t96qTWpERERERIoidQ7FY6pXd1K9ek4xaLfDd9+ZvByRiIiIiIgURNTy4ZUAACAASURBVMWheIzJBBMmZFKnjoM1a9Lp3j3b2yGJiIiIiEgBNK1UPKp6dSdr16ZjMHg7EhERERERuRCPdw7j4uJo06YNbdu2Zd++fZc1Lj4+nkcffZQ2bdowevToXOOPHDlCdHQ0e/bs8Wj8cuVUGIqIiIiIFH0eLQ63b9/Orl27WLZsGUOGDCEuLu6yxsXFxTFw4ECWL1/Or7/+yg8//ACAw+HglVdeIVyH6hVLmZmwZYvWH4qIiIiIFCUeLQ43bdpEq1atMBqNNGjQgL1792Kz2S553O7du2ncuDEGg4HmzZuzefNmAKZPn85dd91FhQoVPBm+eMDOnUbuvjuIJ54I5MABLXkVERERESkqPLrmMCkpyV3AGQwGQkJCSElJISoq6qLjkpOTCQkJwfDnnMRSpUpx9OhRdu/ezY4dO/jggw/4+uuv/1VcEREhV/CsPCcqKtTbIXiUywXDhsGvv+Z8/dJLwfz3v2D28ZWvJT3vUjDl3ncp975Lufddyr3vKk659+jb8oiICJKSkgBwuVxYrdZ8p4LmN6506dJYrVacTidGo5Hk5GTKlCnDmjVrSE5Oplu3buzfv58RI0Ywa9asy5pimphoxel0XZ0neZVERYWSkJDq7TA8bvx4I/feG4TFAo8/nsW5c9k+vSbRV/IueSn3vku5913Kve9S7n1XUcy90WgosFnm0Xl9zZo1Y/369TidTrZu3Urt2rWxWCyXPC46OprNmzfjcrnYuHEjTZs2JTY2liVLljBv3jyqVavGyJEjtfawGLntNidTpmSyYUMaTz3l24WhiIiIiEhR4tHOYXR0NNHR0TzyyCMYjUbi4uKYOXMmlStXpmXLlhccBxAbG8vQoUMZP3489evXp169ep4MVwpJu3Z2b4cgIiIiIiL/YHC5XEVrfmUh0LRSKSqUd9+l3Psu5d53Kfe+S7n3XUUx916bVipyKc6dg5iYALZt0/EWIiIiIiLe4uP7RIq3/fSTke7dAzl1ysiuXSbWr08jLMzbUYmIiIiI+B51DsWrypVzkZGRsyvN0aNGVq/W3ytERERERLxBxaF4VfnyLiZMyCQy0slHH6XzxBParEZERERExBvUphGve/hhOy1a2DWdVERERETEi9Q5lCJBhaGIiIiIiHepOJQiyeGArVu1e6mIiIiISGFRcShFzrFjBtq2DaRt20C+/14vURERERGRwqB33lLkvPxyANu2mXE6DfTuHcj5896OSERERESk5FNxKEVOXFwmpUq5MBpddOuWTUiItyMSERERESn5tFupFDkVKriYNi2DkBBo2NDh7XBERERERHyCikMpku65R0WhiIiIiEhh0rRSKVays70dgYiIiIhIyaTiUIqFzEwYPNifp58OwOXydjQiIiIiIiWPppVKkZeRAQ8+GMTevTnnHr7/voNevdRCFBERERG5mtQ5lCIvMDD3xjQ7d5rUPRQRERERucrUOZRiYfjwLHbvNtKunZ3u3bMxGLwdkYiIiIhIyaLiUIoFf39YtiwDo3rdIiIiIiIeobfaUmyoMBQRERER8Ry93ZZiy+WCDz6w8PnnaoCLiIiIiFwpvauWYik9HQYNCmDxYgtBQS5uvTWd6tWd3g5LRERERKTYUudQiiW7HX76Kedoi/R0A5Mn+3k5IhERERGR4k3FoRRLYWHw4YcZBAW56NzZxttvZ3o7JBERERGRYk3TSqXYqlrVyTffpHHjjTr0UERERETkSqlzKMWaCkMRERERkatDxaGUOF9/bWLrVpO3wxARERERKVZUHEqJ4XLB9OkWOncOpEePAI4eNXg7JBERERGRYkPFoZQY584ZmDLFD6fTQGKikZdfDvB2SCIiIiIixYaKQykxIiJczJqVicXi4o47HEyapB1MRUREREQulXYrlRKlQQMHixdnULeuA39/b0cjIiIiIlJ8qDiUEqdhQ4e3QxARERERKXY0rVR8wr59Rtau1Q6mIiIiIiIFUXEoJd6335po0yaIZ54J5Pvv9ZIXEREREcmP3ilLieZwwCuv+JOaaiAz00CfPoFkZ3s7KhERERGRokfFoZRoJhPMmZNBZKSTa691MmdOBhaLt6MSERERESl6rmhDGpfLhcGgg8alaKtUycWCBRlERbm47jqXt8MRERERESmSLto5PHr0qPvzJk2a5LrWu3dvdu/effWjErnKatd2qjAUEREREbmAixaHXbt2dX8eHBzs/vzgwYNs27aNihUreiQwEU9LSDDw+ut+2O3ejkRERERExPsuOq00KCjI/bnJlHMUgNPpZPTo0fTv35+wsDDPRSfiIceOGXj88SAOHjSSmGhg4sQsNENaRERERHzZRTuH/1xTmJWVxeDBg6lYsSI9evTwWGAinvTppxYOHsx5+S9YYGHHDu3NJCIiIiK+Ld/Ooc1mY8SIEZQuXZpz584xefJkgoKCOHfuHE899RSdOnXikUceKexYRa6al16ycfiwkaVLzbz7biZ16zq9HZKIiIiIiFfl2y6x2+3UrFmTihUrYjabiYyMJDs7G6fTSUJCArt27cJqtRZ2rCJXjcEAEydm8sUX6Tz4oBYdioiIiIjkWxwGBQXx5JNP0qFDB0JDQ+nSpQt9+/YlMjKS1atXExkZSYcOHTh16tRFHyAuLo42bdrQtm1b9u3bd1nj4uPjefTRR2nTpg2jR492j/2///s/nnjiCTp06EB8fPzlPmcRAMxmqFUrb8fQpU1NRURERMQHFbjQat26dYwZMwabzZbr+35+fvTp04fu3bvTp0+fPNf/1/bt29m1axfLli1jyJAhxMXFXda4uLg4Bg4cyPLly/n111/54YcfiI+PZ//+/XzyySc8+eSTfPDBB//meYvky2aDmJgAFi68oiNARURERESKnQKLw2rVqlGuXDmMRiOxsbEkJCTgdP7dZenQoQPXXXcdc+bMKfDON23aRKtWrTAajTRo0IC9e/fmW0wWNG737t00btwYg8FA8+bN2bx5M5UqVWLSpEkAnDlzhlKlSl3J8xdxy8qCmJhAVq608MILAXz6qQpEEREREfEdBb77LV++PDExMXTt2pWZM2eSmZlJRkZGrjG9evXil19+KfDOk5KSqFChApCz62lISAgpKSlERUVddFxycjIhISHu3VJLlSrF0aNH8ff3x9/fn0mTJrFgwQI+/vjjy37SEREhl32bwhAVFertEHxacjKcPp3zuctl4PDhQP7xUvUI5d13Kfe+S7n3Xcq971LufVdxyv1FWyN+fn707t0bgG+++SbXtVq1alGr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7u68s4y2bQN4vXDlldZw2a2bj0AgGALbtbOWN2xo0r69H4+n6q1gLhaGaZoX9zP4F+TmuggEatbTTkmpxcmTReeuKJcU9XvkUt9HLvV95FLfRy71feSqiX1vsxkkJ4dP6tpeU0RERERERBQORUREREREROFQREREREREUDgUERERERERFA5FREREREQEhUMRERERERFB4VBERERERERQOBQREREREREUDkVERERERASwX+gGXAg2m3GhmxBWTW2XVC/1e+RS30cu9X3kUt9HLvV95KppfX+29himaZo/Y1tERERERESkBtJtpSIiIiIiIqJwKCIiIiIiIgqHIiIiIiIigsKhiIiIiIiIoHAoIiIiIiIiKByKiIiIiIgICociIiIiIiKCwqGIiIiIiIigcCgiIiIiIiIoHP4sDh48SOfOndm+fTu7du3ijjvuIC0tjenTp5fXSU9PJy0tjYEDB7Jz506AKutKzVdaWkrnzp0ZMmQIQ4YMYdasWer7CPLpp58ybNgwbrvtNjZs2KC+jxCbNm0qf88PGDCAESNGqO8jxIwZM7j77rsZPnw4Bw4cUL9HiKKiIkaOHMmQIUN45JFHcLlcfP7556SlpZGWlsbChQsB8Pl8jB8/nttvv527776bI0eOAIStKzXfwoULWb16NVD1+/d83uvh6l5QplQrn89nDh8+3Ozdu7e5bds289577zXXr19vBgIBc/jw4eYXX3xhbt682Rw8eLDp9/vNDRs2mPfcc49pmmbYunJxOHr0qDlq1KiQx9T3kaGkpMQcNGiQ6fF4zN27d5tvvPGG+j4C/eUvfzFnzZqlvo8AWVlZ5siRI03TNM2MjAzz8ccfV79HiCVLlphPPfWUaZqm+cYbb5iLFi0y+/XrZ+7bt8/0eDxmv379zO+//95ctmyZOW7cONM0TfPdd981p0yZYpqmGbau1GwjR440O3XqZK5atco0zX//u11VdS8kjRxWs/nz53PTTTfRuHFjTNNk27ZtdO/eHcMw6NWrF5mZmaxfv54+ffpgs9m47rrr+Prrr/F6vWHrysWhoKCAQ4cOMWzYMH71q1+xefNm9X2EyMrKIjY2loceeojx48fToUMH9X0EWr16NX379lXfR4Do6GhKS0vx+XwUFxdjGIb6PUIYhoHb7QbAZrORlZVFVFQUqampOBwOrr/+ejZs2MD69eu56aabAOjTpw+fffYZBw8eDFtXarbXXnuNm2++GaDK9+/5vNerqnshKRxWo23btpGVlcW9994LBP8ncjqdGIYBQGJiIvn5+eTn51OnTh0g+IPG6XRSUFAQtq5cHBITExk1ahT/8z//w/jx43n55ZfV9xEiNzeX3NxcXnnlFcaNG8cf//hH9X2EOXHiBMePH6dhw4bq+wjQtm1bWrRoQb9+/UhPT2fChAnq9wgxcOBATNPk/vvvJzs7G7fbTWJiYnl57dq1LX1/+rG8vLywdeXiUdX793ze6+HqFhYWXpgn9AP7Bb36JW716tUUFBQwYsQIvvnmG2bOnInL5SIQCGCz2SgoKKBu3boYhlH+A8E0TVwuF0lJSWHrysXB6XSSlpYGQPPmzcnJyVHfR4hatWqRmppKdHQ0zZs358iRI+r7CPPxxx/Tt2/fKvtTfX9p+fDDDykrKyMjI4Ndu3bx0EMPqd8jhM/n48knnyQ5OZkVK1aQk5NTPp8QoLCwkMaNG5OcnExBQUH5Y3Xr1qVevXrlj1WsKxePn+JnfLi6p8PihaKRw2o0adIk3nvvPd544w1at27NtGnT6Ny5M5mZmZimydq1a7nhhhvo2bMnGRkZBAIBNm7cSMeOHYmOjg5bVy4Oa9asIT09HYDt27dz1VVXqe8jRJs2bdi1axcej4d9+/bRrFkz9X2EWb16NTfffHOV/am+v7QUFRURFxcHQGxsLC6XS/0eIb788ksmT54MwCeffEKfPn0A2LdvH16vl88//5zu3bvTs2dP/v73vwOQkZHBDTfcQJMmTcLWlYvHT/Ezvqq6F5JhmqZ5QVsQIe655x4mTZqEw+FgypQp+Hw+rr32Wp566ikAXnjhBTIzM7HZbKSnp9O6dWt2794dtq7UfB6Ph3HjxpGbm0tsbCwzZ86kqKhIfR8hlixZwvvvvw/Ac889h81mU99HiJMnT3LXXXfx6aefYhhGlf2pvr90FBcXM378ePLz8/F6vYwdO5aGDRuq3yNAIBDg8ccf58iRI7Rv356nnnqKL774gueeew7TNBkwYABjxozB5/MxefJkvv32W+Li4pg7dy6XX345GzdutNSVmm/KlCn07t2bW2655Sf5GR+u7oWkcCgiIiIiIiK6rVREREREREQUDkVERERERASFQxEREREREUHhUERERERERFA4FBERqVJOTk75330+31nrZmZmWurMmzePU6dOnfM6LpeLs60Pt2nTJg4cOMDkyZNZt24d69evp7CwkE8++YRXXnnlnOcXERH5MRQORUREwti/fz/Dhg2jsLAQgB49enDkyBFmzZqFx+Nh3rx5LFmyBIBTp04xadIkjh07Vn788ePHWblyJfHx8ZZzFxUVhfz7pZdeYvbs2VW25eTJkyxevJjo6Gj8fj/Tpk3D7/fz1VdfYbfbf4qnKyIionAoIiISTmpqKkOHDmXnzp0AOBwO6tevX76HocPhwOFwAPD+++8zePBgXC4X7777LnfeeSdDhgzB7/czcuRIhg4dyujRo8vPPXLkSNatWwcE90rLyMhg8ODBVbblxhtvZNSoUdhswY/tqVOnUrt2bbZs2UJZWRmffvopn3zyCdnZ2dX1coiISATQrxtFREQqcbvdFBUVcdttt1GvXj0AoqOjsdvt2Gy28j+GYXD8+HHeeecdFi9ezOTJk7n11ltZunQpgwcP5k9/+hMNGjSwnP+RRx7hhRdeoHv37mRmZuL1enn00UfLy3NycmjTpg2vvvoqAL/5zW9wuVzs37+frKws4uLi2LFjB3v27KFLly689957nDhxgieeeIImTZr8PC+SiIhcchQORUREKsnKymLevHns2LGDL774gpiYmPJRu8ry8vKw2+2MHj2aJk2a0Lt3b/r27YvX62XMmDE0atTIMi+wV69ebNq0icLCQl555RXmz59P7dq18Xg8XHnllYwdO5Ybb7yxvP6CBQuYOHEiiYmJ3HnnnWzcuJE6derQqlUrJkyYwNKlS8nLy6NTp07V+rqIiMilTbeVioiIVNK9e3fefPNNGjZsSHR09Fnrtm7dmrfeeov4+HimTp1KSkoKzZs3Z/78+UybNq3KOYGTJk2itLSUq6++mvbt25OZmck777wDQHx8PL179waCC+G89NJLPPzwwzRq1IgOHTqQmprKxx9/TG5uLsXFxZw8eZLLLrvsJ30NREQk8mjkUERE5CyqGjE8zTRNRo0aRYMGDVi8eDEtW7Zk165dpKenU1xczNGjRxk6dCgtW7bk2WefLT/u448/Ji4ujsmTJwOQn59fHiSff/75kHrbtm1j48aN5Ofnc+DAAdq1a8eiRYtYuHAhK1asYPv27fTp06canr2IiEQShUMREZGzyM7OJikpKeyqowCGYTBw4ECio6Np3rw5bdq04dZbb2XDhg0kJyfz2muvMXbsWMvI3rx585g2bVr5v7/++mtKSkos5+/Xrx99+vRh6NChLF26lMzMTI4fPw7Ar3/9a4YNGwZAq1atfqqnLCIiEUq3lYqIiFTBNE3Gjh3LypUrueKKK4Dg6qKmaZb/8Xq9tG/fHrvdzpo1a1i6dClz5sxh1apVBAIBAFatWsWsWbPKz7ts2TKaNm1aPkdw27ZtQPAW1ddffz2kDXa7nfz8fNq1a8cjjzzCzJkziYqKwu1243Q6iY2NpUuXLucc4RQRETkXfZKIiIiEUVRUxPHjx/nd735HZmZmyBzAsrIyfD4fPp8Pt9vNCy+8QE5ODv379yc6Oprt27fz9NNPc/jwYex2Ow888ACbN28mKyuLwsJCZs6cycMPPwzA7t27mThxIhMnTuTBBx9k6dKlzJ07F4/HU96W+vXr06tXL06dOsWDDz7IP//5T3bs2MGIESPo1q0bW7duZcGCBfh8vgvxUomIyCXCME3TvNCNEBERqWlM02TdunUkJSXxxBNP8P7775fvawjw8ssvk5iYyD333BNy3LJly7j++uvJy8vj3nvv5ZlnnqF///7k5eVRt25dAHbs2EHbtm2ZO3cuH374IbNnz6Zz585AcMP7cePGcfToUZYvX05OTg733XcfPXr04MEHH6R+/frs2rWL3/72t0yaNInbbruNw4cPM27cOJ588kk6dOjw871IIiJySVE4FBEROYdAIFAtt23u2LGDhg0blofG00zTZP/+/eW3snq93pBgCsERzKpWQhUREflXKByKiIiIiIiI5hyKiIiIiIiIwqGIiIiIiIigcCgiIiIiIiIoHIqIiIiIiAgKhyIiIiIiIgL8P4Ox+q6x4tQ3AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "show_plot(range(4000, len(train)), train[4000:])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 数据结构\n", "\n", "NumPy在C语言的基础上开发`ndarray`对象,其数据类型也是在C语言基础上进行扩充。\n", "\n", "CPython的整型对象是一个PyObject_HEAD是C语言结构体,包含引用计数、类型编码和数据大小等信息,相比C语言的整型增加了很多开销,Numpy进行了优化。\n", "\n", "![](2.data-elt/pyds_02in02.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 数组初始化" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T11:54:17.880781Z", "start_time": "2020-05-12T11:54:17.876806Z" } }, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 创建一个长度为10的数组,数组的值都是0\n", "np.zeros(10, dtype=int)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T11:54:18.708598Z", "start_time": "2020-05-12T11:54:18.704101Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[1., 1., 1., 1., 1.],\n", " [1., 1., 1., 1., 1.],\n", " [1., 1., 1., 1., 1.]])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 创建一个3x5的浮点型数组,数组的值都是1\n", "np.ones((3, 5), dtype=float)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T11:54:19.390780Z", "start_time": "2020-05-12T11:54:19.386194Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[3.14, 3.14, 3.14, 3.14, 3.14],\n", " [3.14, 3.14, 3.14, 3.14, 3.14],\n", " [3.14, 3.14, 3.14, 3.14, 3.14]])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 创建一个3x5的浮点型数组,数组的值都是3.14\n", "np.full((3, 5), 3.14)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T11:54:19.707671Z", "start_time": "2020-05-12T11:54:19.703113Z" }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 创建一个线性序列数组,从0开始,到20结束,步长为2(它和内置的range()函数类似)\n", "np.arange(0, 20, 2)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T11:54:19.972119Z", "start_time": "2020-05-12T11:54:19.967133Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "array([0. , 0.25, 0.5 , 0.75, 1. ])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 创建一个5个元素的数组,这5个数均匀地分配到0~1区间\n", "np.linspace(0, 1, 5)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T12:12:17.252564Z", "start_time": "2020-05-12T12:12:17.248135Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[0.64769123, 0.99691358, 0.51880326],\n", " [0.65811273, 0.59906347, 0.75306733],\n", " [0.13624713, 0.00411712, 0.14950888]])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# NumPy的随机数生成器设置一组种子值,以确保每次程序执行时都可以生成同样的随机数组:\n", "np.random.seed(1024)\n", "\n", "# 创建一个3x3的、0~1之间均匀分布的随机数组成的数组\n", "np.random.random((3, 3))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T11:54:20.470822Z", "start_time": "2020-05-12T11:54:20.458151Z" }, "scrolled": true, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "array([[ 0.7729004 , 1.64294992, -0.12721717],\n", " [ 0.91598327, 0.52267255, -0.22634267],\n", " [ 1.41873344, -0.16232799, 0.53831355]])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 创建一个3x3的、均值为0、标准差为1的正态分布的随机数数组\n", "np.random.normal(0, 1, (3, 3))" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T11:54:20.950123Z", "start_time": "2020-05-12T11:54:20.937917Z" }, "scrolled": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "array([[6, 4, 4],\n", " [1, 0, 1],\n", " [8, 7, 0]])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 创建一个3x3的、[0, 10)区间的随机整型数组\n", "np.random.randint(0, 10, (3, 3))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T11:54:21.435166Z", "start_time": "2020-05-12T11:54:21.430573Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[1., 0., 0.],\n", " [0., 1., 0.],\n", " [0., 0., 1.]])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 创建一个3x3的单位矩阵\n", "np.eye(3)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T11:54:23.829513Z", "start_time": "2020-05-12T11:54:23.825755Z" } }, "outputs": [ { "data": { "text/plain": [ "array([1., 1., 1.])" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 创建一个由3个整型数组成的未初始化的数组,数组的值是内存空间中的任意值\n", "np.empty(3)" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T11:44:59.830326Z", "start_time": "2020-05-12T11:44:59.826604Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "1. 属性:确定数组的大小、形状、存储大小、数据类型\n", "1. 读写:数组保存与加载文件\n", "1. 数学运算:加减乘除、指数与平方根、三角函数、聚合比较等基本运算\n", "1. 复制与排序:数组深浅copy、快速排序、归并排序和堆排序\n", "1. 索引:获取和设置数组各个元素的值\n", "1. 切分:在数组中获取或设置子数组\n", "1. 变形:改变给定数组的形状\n", "1. 连接和分裂:将多个数组合并为一个,或者将一个数组分裂成多个" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "![](2.data-elt/numpy.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 通用函数(universal functions, ufunc)\n", "\n", "NumPy实现一种静态类型、可编译程序接口(**ufunc**),实现**向量化(vectorize)**操作,避免for循环,提高效率,节约内存。\n", "\n", "通用函数有两种存在形式:\n", "\n", "1. **一元通用函数**(unary ufunc)对单个输入操作\n", "2. **二元通用函数**(binary ufunc)对两个输入操作\n", "\n", "### 数组的运算\n", "\n", "NumPy通用函数的使用方式非常自然,因为它用到了Python原生的算术运算符(加、减、乘、除)、绝对值、三角函数、指数与对数、布尔/位运算符。\n", "\n", "运算符 | 对应的通用函数 | 描述 \n", "---|---|--- \n", "`+` | `np.add` | 加法运算(即`1 + 1 = 2`) \n", "`-` | `np.subtract` | 减法运算(即`3 - 2 = 1`)\n", "`-` | `np.negative` | 负数运算 (即`-2`)\n", "`*` | `np.multiply` | 乘法运算 (即`2 * 3 = 6`)\n", "`/` | `np.divide` | 除法运算 (即`3 / 2 = 1.5`)\n", "`//` | `np.floor_divide` | 地板除法运算(floor division,即`3 // 2 = 1`)\n", "`**` | `np.power` | 指数运算 (即`2 ** 3 = 8`)\n", "`%` | `np.mod` | 模/余数 (即`9 % 4 = 1`)\n", "|`np.abs`|绝对值" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T13:21:58.528751Z", "start_time": "2020-05-13T13:21:58.487057Z" }, "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x = [0 1 2 3]\n", "x + 5 = [5 6 7 8]\n", "x - 5 = [-5 -4 -3 -2]\n", "x * 2 = [0 2 4 6]\n", "x / 2 = [0. 0.5 1. 1.5]\n", "x // 2 = [0 0 1 1]\n" ] } ], "source": [ "x = np.arange(4)\n", "print(\"x =\", x)\n", "print(\"x + 5 =\", x + 5)\n", "print(\"x - 5 =\", x - 5)\n", "print(\"x * 2 =\", x * 2)\n", "print(\"x / 2 =\", x / 2)\n", "print(\"x // 2 =\", x // 2) # 整除运算" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T13:22:00.763470Z", "start_time": "2020-05-13T13:22:00.720434Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x = [1, 2, 3]\n", "e^x = [ 2.71828183 7.3890561 20.08553692]\n", "2^x = [2. 4. 8.]\n", "3^x = [ 3 9 27]\n", "x = [1, 2, 3]\n", "ln(x) = [0. 0.69314718 1.09861229]\n", "log2(x) = [0. 1. 1.5849625]\n", "log10(x) = [0. 0.30103 0.47712125]\n" ] } ], "source": [ "x = [1, 2, 3]\n", "print(\"x =\", x)\n", "print(\"e^x =\", np.exp(x))\n", "print(\"2^x =\", np.exp2(x))\n", "print(\"3^x =\", np.power(3, x))\n", "print(\"x =\", x)\n", "print(\"ln(x) =\", np.log(x))\n", "print(\"log2(x) =\", np.log2(x))\n", "print(\"log10(x) =\", np.log10(x))" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 特殊ufunc\n", "\n", "`scipy.special`提供了大量统计学函数。例如,Γ函数和β函数" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T13:00:13.343174Z", "start_time": "2020-05-13T13:00:13.296591Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "gamma(x) = [1.0000e+00 2.4000e+01 3.6288e+05]\n", "ln|gamma(x)| = [ 0. 3.17805383 12.80182748]\n", "beta(x, 2) = [0.5 0.03333333 0.00909091]\n" ] } ], "source": [ "from scipy import special\n", "\n", "x = [1, 5, 10]\n", "print(\"gamma(x) =\", special.gamma(x))\n", "print(\"ln|gamma(x)| =\", special.gammaln(x))\n", "print(\"beta(x, 2) =\", special.beta(x, 2))" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-13T13:13:07.495781Z", "start_time": "2020-05-13T13:13:07.453659Z" }, "slideshow": { "slide_type": "slide" } }, "source": [ "### 高级特性\n", "\n", "### 累计\n", "\n", "二元通用函数的`reduce`方法可以对给定元素和操作重复执行,直至得到一个汇总结果。`accumulate`方法实现截至每一个元素的累积结果\n", "\n", "例如,对`add`通用函数调用`reduce`方法会返回数组中所有元素的和:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T13:18:35.055408Z", "start_time": "2020-05-13T13:18:35.011265Z" } }, "outputs": [ { "data": { "text/plain": [ "15" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(1, 6)\n", "np.add.reduce(x)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "同样,对`multiply`通用函数调用`reduce`方法会返回数组中所有元素的乘积:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T13:18:53.813222Z", "start_time": "2020-05-13T13:18:53.775789Z" } }, "outputs": [ { "data": { "text/plain": [ "120" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.multiply.reduce(x) " ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T13:19:24.745535Z", "start_time": "2020-05-13T13:19:24.704306Z" } }, "outputs": [ { "data": { "text/plain": [ "array([ 1, 3, 6, 10, 15])" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.add.accumulate(x) " ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T13:19:25.509192Z", "start_time": "2020-05-13T13:19:25.469292Z" } }, "outputs": [ { "data": { "text/plain": [ "array([ 1, 2, 6, 24, 120])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.multiply.accumulate(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> NumPy提供了专用的函数(`np.sum`、`np.prod`、`np.cumsum`、`np.cumprod` ),它们也可以实现`reduce`的功能\n" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "### 外积\n", "\n", "任何通用函数都可以用`outer`方法获得两个不同输入数组所有元素对的函数运算结果。用一行代码实现一个99乘法表:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T13:09:56.891345Z", "start_time": "2020-05-13T13:09:56.850311Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9],\n", " [ 2, 4, 6, 8, 10, 12, 14, 16, 18],\n", " [ 3, 6, 9, 12, 15, 18, 21, 24, 27],\n", " [ 4, 8, 12, 16, 20, 24, 28, 32, 36],\n", " [ 5, 10, 15, 20, 25, 30, 35, 40, 45],\n", " [ 6, 12, 18, 24, 30, 36, 42, 48, 54],\n", " [ 7, 14, 21, 28, 35, 42, 49, 56, 63],\n", " [ 8, 16, 24, 32, 40, 48, 56, 64, 72],\n", " [ 9, 18, 27, 36, 45, 54, 63, 72, 81]])" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(1, 10)\n", "np.multiply.outer(x, x)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 广播(Broadcasting)\n", "\n", "NumPy也可以通过广播实现向量化操作。广播可以用于不同大小数组的二元通用函数(加、减、乘等)的一组规则:\n", " * 规则1:如果两个数组的维度数不相同,那么小维度数组的形状将会在最左边补1。\n", " * 规则2:如果两个数组的形状在任何一个维度上都不匹配,那么数组的形状会沿着维度为1的维度扩展以匹配另外一个数组的形状。\n", " * 规则3:如果两个数组的形状在任何一个维度上都不匹配并且没有任何一个维度等于1,那么会引发异常。" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T13:32:31.139530Z", "start_time": "2020-05-13T13:32:31.100272Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array([5, 6, 7])" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "a = np.arange(3)\n", "a + 5" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T13:33:06.812348Z", "start_time": "2020-05-13T13:33:06.764430Z" }, "scrolled": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "array([[1., 2., 3.],\n", " [1., 2., 3.],\n", " [1., 2., 3.]])" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.ones((3, 3)) + a" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "根据规则1,数组`a`的维度数更小,所以在其左边补1:\n", "\n", "\n", " `b.shape -> (3, 3)`\n", " \n", " `a.shape -> (1, 3)`\n", "\n", "根据规则2,第一个维度不匹配,因此扩展这个维度以匹配数组:\n", "\n", "\n", " `b.shape -> (3, 3)`\n", " \n", " `a.shape -> (3, 3)`\n", "\n", "现在两个数组的形状匹配了,可以看到它们的最终形状都为`(3, 3)`:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T13:38:55.932186Z", "start_time": "2020-05-13T13:38:55.834237Z" }, "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "array([[0, 1, 2],\n", " [1, 2, 3],\n", " [2, 3, 4]])" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b = np.arange(3)[:, np.newaxis] \n", "\n", "b + a" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "根据规则1,数组`a`的维度数更小,所以在其左边补1:\n", "\n", "\n", " `b.shape -> (3, 1)`\n", " \n", " `a.shape -> (1, 3)`\n", "\n", "根据规则2,两个维度都不匹配,因此扩展这个维度以匹配数组:\n", "\n", "\n", " `b.shape -> (3, 3)`\n", " \n", " `a.shape -> (3, 3)`\n", "\n", "现在两个数组的形状匹配了,可以看到它们的最终形状都为`(3, 3)`:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "![](https://raw.githubusercontent.com/muxuezi/pdsh/master/images/pyds_02in04.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Scipy稀疏矩阵\n", "\n", "地球70多亿人的社交网络中,大部分人直接认识的人数不超过10000,因此这个矩阵中,大部分的值都是0(稀疏)\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:30:38.087158Z", "start_time": "2020-05-13T09:30:38.044893Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "array([[ 8, 0, 0, 0, 9, 0, 0, 0, 0, 3],\n", " [ 0, 0, 9, 0, 7, 0, 0, 0, 0, 4],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0, 8, 0],\n", " [ 0, 0, 0, 9, 0, 0, 0, 4, 0, 0],\n", " [ 0, 5, 0, 0, 0, 7, 0, 0, 0, 0],\n", " [ 0, 8, 8, 1, 0, 1, 4, 0, 0, 0],\n", " [ 0, 18, 0, 0, 0, 0, 0, 0, 0, 4],\n", " [ 0, 0, 4, 0, 0, 0, 5, 0, 0, 0],\n", " [ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 9, 0, 0, 4, 0, 0, 0]])" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "SN = np.random.poisson(0.2, (10, 10)) * np.random.randint(0, 10, (10, 10))\n", "SN" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:31:17.723679Z", "start_time": "2020-05-13T09:31:17.677783Z" }, "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "(array([0, 0, 0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5, 6, 6, 7, 7, 8, 9,\n", " 9]),\n", " array([0, 4, 9, 2, 4, 9, 8, 3, 7, 1, 5, 1, 2, 3, 5, 6, 1, 9, 2, 6, 4, 3,\n", " 6]),\n", " array([ 8, 9, 3, 9, 7, 4, 8, 9, 4, 5, 7, 8, 8, 1, 1, 4, 18,\n", " 4, 4, 5, 5, 9, 4]))" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rows, cols = np.nonzero(SN)\n", "vals = SN[rows, cols]\n", "rows, cols, vals" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 稀疏矩阵初始化" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:31:53.116175Z", "start_time": "2020-05-13T09:31:53.069486Z" } }, "outputs": [ { "data": { "text/plain": [ "<10x10 sparse matrix of type ''\n", "\twith 23 stored elements in COOrdinate format>" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = sparse.coo_matrix(SN)\n", "X" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:32:40.459859Z", "start_time": "2020-05-13T09:32:40.421301Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " (0, 0)\t8\n", " (0, 4)\t9\n", " (0, 9)\t3\n", " (1, 2)\t9\n", " (1, 4)\t7\n", " (1, 9)\t4\n", " (2, 8)\t8\n", " (3, 3)\t9\n", " (3, 7)\t4\n", " (4, 1)\t5\n", " (4, 5)\t7\n", " (5, 1)\t8\n", " (5, 2)\t8\n", " (5, 3)\t1\n", " (5, 5)\t1\n", " (5, 6)\t4\n", " (6, 1)\t18\n", " (6, 9)\t4\n", " (7, 2)\t4\n", " (7, 6)\t5\n", " (8, 4)\t5\n", " (9, 3)\t9\n", " (9, 6)\t4\n" ] } ], "source": [ "print(X)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 按坐标创建稀疏矩阵" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:35:20.728371Z", "start_time": "2020-05-13T09:35:20.637943Z" } }, "outputs": [], "source": [ "X2 = sparse.coo_matrix((vals, (rows, cols)))" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:35:21.770178Z", "start_time": "2020-05-13T09:35:21.727339Z" } }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 8, 0, 0, 0, 9, 0, 0, 0, 0, 3],\n", " [ 0, 0, 9, 0, 7, 0, 0, 0, 0, 4],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0, 8, 0],\n", " [ 0, 0, 0, 9, 0, 0, 0, 4, 0, 0],\n", " [ 0, 5, 0, 0, 0, 7, 0, 0, 0, 0],\n", " [ 0, 8, 8, 1, 0, 1, 4, 0, 0, 0],\n", " [ 0, 18, 0, 0, 0, 0, 0, 0, 0, 4],\n", " [ 0, 0, 4, 0, 0, 0, 5, 0, 0, 0],\n", " [ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 9, 0, 0, 4, 0, 0, 0]])" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X2.todense()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 数据压缩\n", "\n", "将稀疏矩阵保存为 CSR(Compressed Sparse Row)/CSC(Compressed Sparse Column) 格式" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:38:23.944867Z", "start_time": "2020-05-13T09:38:23.908650Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[0, 0, 0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 5, 5, 6, 6, 7, 7, 8, 9,\n", " 9],\n", " [0, 4, 9, 2, 4, 9, 8, 3, 7, 1, 5, 1, 2, 3, 5, 6, 1, 9, 2, 6, 4, 3,\n", " 6]])" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.vstack([rows, cols])" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:39:24.671216Z", "start_time": "2020-05-13T09:39:24.637712Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array([ 0, 3, 6, 7, 9, 11, 16, 18, 20, 21, 23])" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "indptr = np.r_[np.searchsorted(rows, np.unique(rows)), len(rows)]\n", "indptr" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:39:30.098922Z", "start_time": "2020-05-13T09:39:30.059621Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "<10x10 sparse matrix of type ''\n", "\twith 23 stored elements in Compressed Sparse Row format>" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X3 = sparse.csr_matrix((vals, cols, indptr))\n", "X3" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:39:31.004761Z", "start_time": "2020-05-13T09:39:30.965603Z" }, "scrolled": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " (0, 0)\t8\n", " (0, 4)\t9\n", " (0, 9)\t3\n", " (1, 2)\t9\n", " (1, 4)\t7\n", " (1, 9)\t4\n", " (2, 8)\t8\n", " (3, 3)\t9\n", " (3, 7)\t4\n", " (4, 1)\t5\n", " (4, 5)\t7\n", " (5, 1)\t8\n", " (5, 2)\t8\n", " (5, 3)\t1\n", " (5, 5)\t1\n", " (5, 6)\t4\n", " (6, 1)\t18\n", " (6, 9)\t4\n", " (7, 2)\t4\n", " (7, 6)\t5\n", " (8, 4)\t5\n", " (9, 3)\t9\n", " (9, 6)\t4\n" ] } ], "source": [ "print(X3)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:39:36.413978Z", "start_time": "2020-05-13T09:39:36.373704Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 8, 0, 0, 0, 9, 0, 0, 0, 0, 3],\n", " [ 0, 0, 9, 0, 7, 0, 0, 0, 0, 4],\n", " [ 0, 0, 0, 0, 0, 0, 0, 0, 8, 0],\n", " [ 0, 0, 0, 9, 0, 0, 0, 4, 0, 0],\n", " [ 0, 5, 0, 0, 0, 7, 0, 0, 0, 0],\n", " [ 0, 8, 8, 1, 0, 1, 4, 0, 0, 0],\n", " [ 0, 18, 0, 0, 0, 0, 0, 0, 0, 4],\n", " [ 0, 0, 4, 0, 0, 0, 5, 0, 0, 0],\n", " [ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0],\n", " [ 0, 0, 0, 9, 0, 0, 4, 0, 0, 0]])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X3.todense()" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:41:17.516924Z", "start_time": "2020-05-13T09:41:17.479833Z" } }, "outputs": [ { "data": { "text/plain": [ "<10x10 sparse matrix of type ''\n", "\twith 23 stored elements in Compressed Sparse Row format>" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X4 = X2.tocsr()\n", "\n", "X4" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:41:50.459810Z", "start_time": "2020-05-13T09:41:50.421301Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " (0, 0)\t8\n", " (0, 4)\t9\n", " (0, 9)\t3\n", " (1, 2)\t9\n", " (1, 4)\t7\n", " (1, 9)\t4\n", " (2, 8)\t8\n", " (3, 3)\t9\n", " (3, 7)\t4\n", " (4, 1)\t5\n", " (4, 5)\t7\n", " (5, 1)\t8\n", " (5, 2)\t8\n", " (5, 3)\t1\n", " (5, 5)\t1\n", " (5, 6)\t4\n", " (6, 1)\t18\n", " (6, 9)\t4\n", " (7, 2)\t4\n", " (7, 6)\t5\n", " (8, 4)\t5\n", " (9, 3)\t9\n", " (9, 6)\t4\n" ] } ], "source": [ "print(X4)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:41:30.719308Z", "start_time": "2020-05-13T09:41:30.679833Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "<10x10 sparse matrix of type ''\n", "\twith 23 stored elements in Compressed Sparse Column format>" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X5 = X2.tocsc()\n", "\n", "X5" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:41:40.027704Z", "start_time": "2020-05-13T09:41:39.989064Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " (0, 0)\t8\n", " (4, 1)\t5\n", " (5, 1)\t8\n", " (6, 1)\t18\n", " (1, 2)\t9\n", " (5, 2)\t8\n", " (7, 2)\t4\n", " (3, 3)\t9\n", " (5, 3)\t1\n", " (9, 3)\t9\n", " (0, 4)\t9\n", " (1, 4)\t7\n", " (8, 4)\t5\n", " (4, 5)\t7\n", " (5, 5)\t1\n", " (5, 6)\t4\n", " (7, 6)\t5\n", " (9, 6)\t4\n", " (3, 7)\t4\n", " (2, 8)\t8\n", " (0, 9)\t3\n", " (1, 9)\t4\n", " (6, 9)\t4\n" ] } ], "source": [ "print(X5)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## COO合计转换\n", "\n", "coo_matrix会默认将重复元素求和,适合构造多分类模型的混淆矩阵" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:44:19.061146Z", "start_time": "2020-05-13T09:44:19.024632Z" } }, "outputs": [], "source": [ "rows = np.repeat([0, 1], 4)\n", "cols = np.repeat([0, 1], 4)\n", "vals = np.arange(8)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:44:42.910186Z", "start_time": "2020-05-13T09:44:42.870740Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "(array([0, 0, 0, 0, 1, 1, 1, 1]),\n", " array([0, 0, 0, 0, 1, 1, 1, 1]),\n", " array([0, 1, 2, 3, 4, 5, 6, 7]))" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rows, cols, vals" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:44:59.178781Z", "start_time": "2020-05-13T09:44:59.135555Z" } }, "outputs": [ { "data": { "text/plain": [ "matrix([[ 6, 0],\n", " [ 0, 22]])" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X6 = sparse.coo_matrix((vals, (rows, cols)))\n", "\n", "X6.todense()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 2X2混淆矩阵" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:53:12.479470Z", "start_time": "2020-05-13T09:53:12.445305Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "(array([0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,\n", " 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1,\n", " 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1,\n", " 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1,\n", " 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1]),\n", " array([0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1,\n", " 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0,\n", " 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1,\n", " 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0,\n", " 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0]))" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_true = np.random.randint(0, 2, 100)\n", "y_pred = np.random.randint(0, 2, 100)\n", "vals = np.ones(100).astype(\"int\")\n", "\n", "y_true, y_pred" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:53:24.916511Z", "start_time": "2020-05-13T09:53:24.884256Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "((100,), (100,), (100,))" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vals.shape, y_true.shape, y_pred.shape" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:53:39.764064Z", "start_time": "2020-05-13T09:53:39.723723Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "matrix([[21, 23],\n", " [30, 26]])" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X7 = sparse.coo_matrix((vals, (y_true, y_pred)))\n", "\n", "X7.todense()" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:53:50.431200Z", "start_time": "2020-05-13T09:53:50.296426Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "array([[21, 23],\n", " [30, 26]])" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import confusion_matrix\n", "\n", "confusion_matrix(y_true, y_pred)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T09:54:53.824845Z", "start_time": "2020-05-13T09:54:53.776394Z" } }, "outputs": [ { "data": { "text/plain": [ "array([[2, 0, 0],\n", " [0, 0, 1],\n", " [1, 0, 2]])" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_true = [\"cat\", \"ant\", \"cat\", \"cat\", \"ant\", \"bird\"]\n", "y_pred = [\"ant\", \"ant\", \"cat\", \"cat\", \"ant\", \"cat\"]\n", "confusion_matrix(y_true, y_pred, labels=[\"ant\", \"bird\", \"cat\"])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# [Pandas](https://pandas.pydata.org/)\n", "\n", "## Series 与 Dataframe\n", "\n", "1. Series:键值对形成的二序序列,有标签的numpy一维数组\n", "1. Dataframe:行列值三元序列(类似excel表),有标签的numpy二维数组\n", "1. Input/output\n", "1. General functions\n", "1. Pandas arrays\n", "1. Index objects\n", "1. Date offsets\n", "1. Window\n", "1. GroupBy\n", "1. Resampling\n", "1. Style\n", "1. Plotting\n", "1. General utility functions\n", "1. Extensions" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "![](2.data-elt/pandas.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## [向量化字符串操作](https://pandas.pydata.org/docs/reference/series.html#string-handling)\n", "\n", "\n", "Pandas提供了一系列**向量化字符串操作**(vectorized string operation),极大地提高了字符串清洗效率。Pandas为包含字符串的`Series`和`Index`对象提供了`str`属性,既可以处理字符串,又可以处理缺失值。\n", "\n", "### 字符串方法\n", "\n", "所有Python内置的字符串方法都被复制到Pandas的向量化字符串方法中:\n", "\n", "\n", "`len()` | `lower()` | `translate()` | `islower()` \n", "`ljust()` | `upper()` | `startswith()` | `isupper()` \n", "`rjust()` | `find()` | `endswith()` | `isnumeric()` \n", "`center()` | `rfind()` | `isalnum()` | `isdecimal()` \n", "`zfill()` | `index()` | `isalpha()` | `split()` \n", "`strip()` | `rindex()` | `isdigit()` | `rsplit()` \n", "`rstrip()` | `capitalize()` | `isspace()` | `partition()` \n", "`lstrip()` | `swapcase()` | `istitle()` | `rpartition()` \n", " \n", "\n", "\n", "> 这些方法的返回值并不完全相同,例如`lower()`方法返回字符串,`len()`方法返回数值,`startswith('T')`返回布尔值,`split()`方法返回列表\n", "\n", " " ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:07:49.242847Z", "start_time": "2020-05-12T14:07:49.239668Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "monte = pd.Series(\n", " (\n", " \"Gerald R. Ford\",\n", " \"James Carter\",\n", " \"Ronald Reagan\",\n", " \"George H. W. Bush\",\n", " \"William J. Clinton\",\n", " \"George W. Bush\",\n", " \"Barack Obama\",\n", " \"Donald J. Trump\",\n", " )\n", ")" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:08:09.142762Z", "start_time": "2020-05-12T14:08:09.137505Z" } }, "outputs": [ { "data": { "text/plain": [ "0 14\n", "1 12\n", "2 13\n", "3 17\n", "4 18\n", "5 14\n", "6 12\n", "7 15\n", "dtype: int64" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "monte.str.len()" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:42:05.475579Z", "start_time": "2020-05-12T13:42:05.451838Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### 正则表达式\n", "\n", "\n", "有一些方法支持正则表达式处理字符串。下面是Pandas根据Python标准库的`re`模块函数实现的API:\n", "\n", "\n", "方法 | 描述 \n", "---|--- \n", "`match()` | 对每个元素调用`re.match()`,返回布尔类型值\n", "`extract()` | 对每个元素调用`re.match()`,返回匹配的字符串组(`groups`)\n", "`findall()` | 对每个元素调用`re.findall()`\n", "`replace()` | 用正则模式替换字符串\n", "`contains()` | 对每个元素调用`re.search()`,返回布尔类型值\n", "`count()` | 计算符合正则模式的字符串的数量\n", "`split()` | 等价于`str.split()`,支持正则表达式\n", "`rsplit()` | 等价于`str.rsplit()`,支持正则表达式" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:07:51.638930Z", "start_time": "2020-05-12T14:07:51.632058Z" }, "slideshow": { "slide_type": "subslide" } }, "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", "
0
0Gerald
1James
2Ronald
3George
4William
5George
6Barack
7Donald
\n", "
" ], "text/plain": [ " 0\n", "0 Gerald\n", "1 James\n", "2 Ronald\n", "3 George\n", "4 William\n", "5 George\n", "6 Barack\n", "7 Donald" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "monte.str.extract('([A-Za-z]+)')" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:42:05.475579Z", "start_time": "2020-05-12T13:42:05.451838Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "找出所有开头和结尾都是辅音字母的名字——这可以用正则表达式中的开始符号(`^`)与结尾符号(`$`)来实现:" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:08:21.519423Z", "start_time": "2020-05-12T14:08:21.512860Z" } }, "outputs": [ { "data": { "text/plain": [ "0 [Gerald R. Ford]\n", "1 [James Carter]\n", "2 [Ronald Reagan]\n", "3 [George H. W. Bush]\n", "4 [William J. Clinton]\n", "5 [George W. Bush]\n", "6 []\n", "7 [Donald J. Trump]\n", "dtype: object" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "monte.str.findall(r'^[^AEIOU].*[^aeiou]$')" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:42:05.475579Z", "start_time": "2020-05-12T13:42:05.451838Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### 其他字符串方法\n", "\n", "\n", "\n", "还有其他一些方法可以实现更方便的操作\n", "\n", "\n", "方法 | 描述 \n", "---|--- \n", "`get()` | 获取元素索引位置上的值,索引从0开始\n", "`slice()` | 对元素进行切片取值\n", "`slice_replace()` | 对元素进行切片替换\n", "`cat()` | 连接字符串(此功能比较复杂,建议阅读文档)\n", "`repeat()` | 重复元素\n", "`normalize()` | 将字符串转换为Unicode规范形式\n", "`pad()` | 在字符串的左边、右边或两边增加空格\n", "`wrap()` | 将字符串按照指定的宽度换行\n", "`join()` |用分隔符连接`Series`的每个元素\n", "`get_dummies()` | 按照分隔符提取每个元素的`dummy`变量,转换为独热(one-hot)编码的`DataFrame`\n", " " ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:42:05.475579Z", "start_time": "2020-05-12T13:42:05.451838Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### 向量化字符串的取值与切片操作\n", "\n", "`get()`与`slice()`操作可以从每个字符串数组中获取向量化元素。例如,我们可以通过`str.slice(0, 3)`获取每个字符串数组的前3个字符,`df.str.slice(0, 3)`=`df.str[0:3]`,`df.str.get(i)`=`df.str[i]`\n", " " ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:08:47.170726Z", "start_time": "2020-05-12T14:08:47.165424Z" } }, "outputs": [ { "data": { "text/plain": [ "0 Ger\n", "1 Jam\n", "2 Ron\n", "3 Geo\n", "4 Wil\n", "5 Geo\n", "6 Bar\n", "7 Don\n", "dtype: object" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "monte.str[0:3]" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:42:05.475579Z", "start_time": "2020-05-12T13:42:05.451838Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "`get()`与`slice()`操作还可以在`split()`操作之后使用。例如,要获取每个姓名的姓(last name),可以结合使用`split()`与`get()`:\n", " " ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:08:48.855168Z", "start_time": "2020-05-12T14:08:48.848790Z" } }, "outputs": [ { "data": { "text/plain": [ "0 Ford\n", "1 Carter\n", "2 Reagan\n", "3 Bush\n", "4 Clinton\n", "5 Bush\n", "6 Obama\n", "7 Trump\n", "dtype: object" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "monte.str.split().str.get(-1)" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:49:48.832386Z", "start_time": "2020-05-12T13:49:48.827574Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### 指标变量\n", "\n", "\n", "`get_dummies()`方法可以快速将指标变量分割成一个独热编码的`DataFrame`(每个元素都是0或1),如A=出生在美国、B=出生在英国、C=喜欢奶酪、D=喜欢午餐肉:" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:09:13.149587Z", "start_time": "2020-05-12T14:09:13.139868Z" } }, "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", "
nameinfo
0Gerald R. FordB|C|D
1James CarterB|D
2Ronald ReaganA|C
3George H. W. BushB|D
4William J. ClintonB|C
5George W. BushA|C
6Barack ObamaB|D
7Donald J. TrumpB|C|D
\n", "
" ], "text/plain": [ " name info\n", "0 Gerald R. Ford B|C|D\n", "1 James Carter B|D\n", "2 Ronald Reagan A|C\n", "3 George H. W. Bush B|D\n", "4 William J. Clinton B|C\n", "5 George W. Bush A|C\n", "6 Barack Obama B|D\n", "7 Donald J. Trump B|C|D" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "full_monte = pd.DataFrame(\n", " {\n", " \"name\": monte,\n", " \"info\": [\"B|C|D\", \"B|D\", \"A|C\", \"B|D\", \"B|C\", \"A|C\", \"B|D\", \"B|C|D\"],\n", " }\n", ")\n", "full_monte" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:09:14.275939Z", "start_time": "2020-05-12T14:09:14.265207Z" }, "slideshow": { "slide_type": "subslide" } }, "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", "
ABCD
00111
10101
21010
30101
40110
51010
60101
70111
\n", "
" ], "text/plain": [ " A B C D\n", "0 0 1 1 1\n", "1 0 1 0 1\n", "2 1 0 1 0\n", "3 0 1 0 1\n", "4 0 1 1 0\n", "5 1 0 1 0\n", "6 0 1 0 1\n", "7 0 1 1 1" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "full_monte['info'].str.get_dummies('|') " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 处理时间序列\n", "\n", "\n", "由于Pandas最初是为金融模型而创建的,因此日期时间数据处理功能非常强大\n", "\n", "### Pandas的日期与时间工具\n", "\n", "\n", "Pandas所有关于日期与时间的处理方法全部都是通过`Timestamp`对象实现的,可以作为`Series`或`DataFrame`的索引`DatetimeIndex`。例如,可以用Pandas的方式演示前面介绍的日期与时间功能。我们可以灵活处理不同格式的日期与时间字符串,获取某一天是星期几:" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:27:03.841964Z", "start_time": "2020-05-12T14:27:03.836962Z" } }, "outputs": [ { "data": { "text/plain": [ "Timestamp('2020-05-04 00:00:00')" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "date = pd.to_datetime(\"4th of May, 2020\")\n", "date" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:27:04.348039Z", "start_time": "2020-05-12T14:27:04.343605Z" } }, "outputs": [ { "data": { "text/plain": [ "'Monday'" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "date.strftime('%A')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "可以直接进行NumPy类型的向量化运算:\n", " " ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:27:26.576229Z", "start_time": "2020-05-12T14:27:26.565007Z" }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2020-05-04', '2020-05-05', '2020-05-06', '2020-05-07',\n", " '2020-05-08', '2020-05-09', '2020-05-10', '2020-05-11',\n", " '2020-05-12', '2020-05-13', '2020-05-14', '2020-05-15'],\n", " dtype='datetime64[ns]', freq=None)" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "date + pd.to_timedelta(np.arange(12), 'D')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Pandas时间序列:用时间作索引\n", "\n", "\n", "\n", "Pandas时间序列工具非常适合用来处理**带时间戳的索引数据**。\n", "\n", "通过一个时间索引数据创建一个`Series`对象:\n", " " ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:30:12.174033Z", "start_time": "2020-05-12T14:30:12.167380Z" } }, "outputs": [ { "data": { "text/plain": [ "2019-01-04 0\n", "2019-02-04 1\n", "2020-03-04 2\n", "2020-04-04 3\n", "dtype: int64" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "index = pd.DatetimeIndex([\"2019-01-04\", \"2019-02-04\", \"2020-03-04\", \"2020-04-04\"])\n", "data = pd.Series([0, 1, 2, 3], index=index)\n", "data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "直接用日期进行切片取值: " ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:30:29.831577Z", "start_time": "2020-05-12T14:30:29.825595Z" } }, "outputs": [ { "data": { "text/plain": [ "2020-03-04 2\n", "2020-04-04 3\n", "dtype: int64" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['2020-02-04':'2020-04-04']" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" } }, "source": [ "直接通过年份切片获取该年的数据:" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:30:49.905826Z", "start_time": "2020-05-12T14:30:49.900867Z" } }, "outputs": [ { "data": { "text/plain": [ "2020-03-04 2\n", "2020-04-04 3\n", "dtype: int64" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data['2020']\n", " " ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:34:19.172825Z", "start_time": "2020-05-12T14:34:19.166745Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### Pandas时间序列数据结构\n", "\n", "\n", "本节将介绍Pandas用来处理时间序列的基础数据类型。\n", "\n", "* **时间戳**,Pandas提供了`Timestamp`类型。本质上是Python的原生`datetime`类型的替代品,但是在性能更好的`numpy.datetime64`类型的基础上创建。对应的索引数据结构是`DatetimeIndex`。\n", "* **时间周期**,Pandas提供了`Period`类型。这是利用`numpy.datetime64`类型将固定频率的时间间隔进行编码。对应的索引数据结构是`PeriodIndex`。\n", "* **时间增量**或**持续时间**,Pandas提供了`Timedelta`类型。`Timedelta`是一种代替Python原生`datetime.timedelta`类型的高性能数据结构,同样是基于`numpy.timedelta64`类型。对应的索引数据结构是`TimedeltaIndex`。\n", "\n", "\n", "最基础的日期/时间对象是`Timestamp`和`DatetimeIndex`,对`pd.to_datetime()`传递一个日期会返回一个`Timestamp`类型,传递一个时间序列会返回一个`DatetimeIndex`类型:" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:35:53.956014Z", "start_time": "2020-05-12T14:35:53.953210Z" }, "slideshow": { "slide_type": "-" } }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2020-07-03', '2020-07-04', '2020-07-06', '2020-07-07',\n", " '2020-07-08'],\n", " dtype='datetime64[ns]', freq=None)" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from datetime import datetime\n", "\n", "dates = pd.to_datetime(\n", " [datetime(2020, 7, 3), \"4th of July, 2020\", \"2020-Jul-6\", \"07-07-2020\", \"20200708\"]\n", ")\n", "dates" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "任何`DatetimeIndex`类型都可以通过`to_period()`方法和一个频率代码转换成`PeriodIndex`类型。\n", "\n", "用`'D'`将数据转换成单日的时间序列:\n", " " ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:36:19.892500Z", "start_time": "2020-05-12T14:36:19.887873Z" } }, "outputs": [ { "data": { "text/plain": [ "PeriodIndex(['2020-07-03', '2020-07-04', '2020-07-06', '2020-07-07',\n", " '2020-07-08'],\n", " dtype='period[D]', freq='D')" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dates.to_period('D')" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "-" } }, "source": [ "当用一个日期减去另一个日期时,返回的结果是`TimedeltaIndex`类型:\n", " " ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:38:41.591621Z", "start_time": "2020-05-12T14:38:41.586224Z" } }, "outputs": [ { "data": { "text/plain": [ "TimedeltaIndex(['0 days', '1 days', '3 days', '4 days', '5 days'], dtype='timedelta64[ns]', freq=None)" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dates - dates[0]" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### 有规律的时间序列:`pd.date_range()`\n", "\n", "\n", "\n", "为了能更简便地创建有规律的时间序列,Pandas提供了一些方法:`pd.date_range()`可以处理时间戳、`pd.period_range()`可以处理周期、`pd.timedelta_range()`可以处理时间间隔。通过开始日期、结束日期和频率代码(同样是可选的)创建一个有规律的日期序列,默认的频率是天:\n", " " ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:39:29.979434Z", "start_time": "2020-05-12T14:39:29.974807Z" } }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2020-07-03', '2020-07-04', '2020-07-05', '2020-07-06',\n", " '2020-07-07', '2020-07-08', '2020-07-09', '2020-07-10'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ " pd.date_range('2020-07-03', '2020-07-10') " ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "日期范围不一定非是开始时间与结束时间,也可以是开始时间与周期数`periods`:\n", " " ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:40:02.113274Z", "start_time": "2020-05-12T14:40:02.102103Z" } }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2020-07-03', '2020-07-04', '2020-07-05', '2020-07-06',\n", " '2020-07-07', '2020-07-08', '2020-07-09', '2020-07-10'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.date_range('2020-07-03', periods=8)" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" } }, "source": [ "通过`freq`参数改变时间间隔,默认值是`D`。例如,可以创建一个按小时变化的时间戳:\n", " \n", " " ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:40:27.493361Z", "start_time": "2020-05-12T14:40:27.488040Z" } }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2020-07-03 00:00:00', '2020-07-03 01:00:00',\n", " '2020-07-03 02:00:00', '2020-07-03 03:00:00',\n", " '2020-07-03 04:00:00', '2020-07-03 05:00:00',\n", " '2020-07-03 06:00:00', '2020-07-03 07:00:00'],\n", " dtype='datetime64[ns]', freq='H')" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.date_range('2020-07-03', periods=8, freq='H') " ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "如果要创建一个有规律的周期或时间间隔序列,有类似的函数`pd.period_range()`和`pd.timedelta_range()`。下面是一个以月为周期的示例:" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:40:55.640962Z", "start_time": "2020-05-12T14:40:55.636777Z" } }, "outputs": [ { "data": { "text/plain": [ "PeriodIndex(['2020-07', '2020-08', '2020-09', '2020-10', '2020-11', '2020-12',\n", " '2021-01', '2021-02'],\n", " dtype='period[M]', freq='M')" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.period_range('2020-07', periods=8, freq='M')\n", " " ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" } }, "source": [ "以小时递增:\n", " " ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:41:13.920824Z", "start_time": "2020-05-12T14:41:13.914884Z" } }, "outputs": [ { "data": { "text/plain": [ "TimedeltaIndex(['00:00:00', '01:00:00', '02:00:00', '03:00:00', '04:00:00',\n", " '05:00:00', '06:00:00', '07:00:00', '08:00:00', '09:00:00'],\n", " dtype='timedelta64[ns]', freq='H')" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.timedelta_range(0, periods=10, freq='H')" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### 时间频率与偏移量\n", "\n", "\n", "\n", "\n", "Pandas时间序列工具的基础是时间频率或偏移量(offset)代码。就像之前见过的`D`(day)和`H`(hour)代码,可以设置任意需要的时间间隔\n", "\n", "代码 | 描述 | 代码 | 描述\n", "---|---|---|--- \n", "`D` | 天(calendar day,按日历算,含双休日) | `B` | 天(business day,仅含工作日)\n", "`W` | 周(weekly) | | \n", "`M` | 月末(month end) | `BM` | 月末(business month end,仅含工作日)\n", "`Q` | 季节末(quarter end) | `BQ` | 季节末(business quarter end,仅含工作日)\n", "`A` | 年末(year end) | `BA` | 年末(business year end,仅含工作日)\n", "`H` | 小时(hours) | `BH` | 小时(business hours,工作时间)\n", "`T` | 分钟(minutes) | | \n", "`S` | 秒(seconds) | | \n", "`L` | 毫秒(milliseonds) | | \n", "`U` | 微秒(microseconds) | | \n", "`N` | 纳秒(nanoseconds) | | \n", " \n", "\n", "\n", "月、季、年频率都是具体周期的结束时间(月末、季末、年末),而有一些以`S`(start,开始) 为后缀的代码表示日期开始。\n", "\n", "\n", "代码 | 频率 \n", "---|--- \n", "`MS` | 月初(month start)\n", "`BMS` | 月初(business month start,仅含工作日)\n", "`QS` | 季初(quarter start)\n", "`BQS` | 季初(business quarter start,仅含工作日)\n", "`AS` | 年初(year start)\n", "`BAS` | 年初(business year start,仅含工作日)\n", " " ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "另外,可以在频率代码后面加三位月份缩写字母来改变季、年频率的开始时间:\n", " \n", " * `Q-JAN`、`BQ-FEB`、`QS-MAR`、`BQS-APR`等\n", " * `A-JAN`、`BA-FEB`、`AS-MAR`、`BAS-APR`等\n", "\n", "也可以在后面加三位星期缩写字母来改变一周的开始时间:\n", "\n", " * `W-SUN`、`W-MON`、`W-TUE`、`W-WED`等\n", "\n", "还可以将频率组合起来创建的新的周期。例如,可以用小时(`H`)和分钟(`T`)的组合来实现2小时30分钟:\n", " " ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:42:57.381351Z", "start_time": "2020-05-12T14:42:57.374949Z" } }, "outputs": [ { "data": { "text/plain": [ "TimedeltaIndex(['00:00:00', '02:30:00', '05:00:00', '07:30:00', '10:00:00',\n", " '12:30:00', '15:00:00', '17:30:00', '20:00:00'],\n", " dtype='timedelta64[ns]', freq='150T')" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.timedelta_range(0, periods=9, freq=\"2H30T\")" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "所有这些频率代码都对应Pandas时间序列的偏移量,具体内容可以在`pd.tseries.offsets`模块中找到。例如,可以用下面的方法直接创建一个工作日偏移序列:\n", " " ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:43:29.496708Z", "start_time": "2020-05-12T14:43:29.490180Z" } }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2020-07-01', '2020-07-02', '2020-07-03', '2020-07-06',\n", " '2020-07-07'],\n", " dtype='datetime64[ns]', freq='B')" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from pandas.tseries.offsets import BDay\n", "pd.date_range('2020-07-01', periods=5, freq=BDay())" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### 重采样、时间迁移和窗口函数\n", "\n", "\n", "下面用贵州茅台的历史股票价格演示:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T12:42:42.213932Z", "start_time": "2020-05-14T12:42:42.206425Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing snowball.py\n" ] } ], "source": [ "%%file snowball.py\n", "from datetime import datetime\n", "import requests\n", "import pandas as pd\n", "\n", "\n", "def get_stock(code):\n", " response = requests.get(\n", " \"https://stock.xueqiu.com/v5/stock/chart/kline.json\",\n", " headers={\n", " \"User-Agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36\"\n", " },\n", " params=(\n", " (\"symbol\", code),\n", " (\"begin\", int(datetime.now().timestamp() * 1000)),\n", " (\"period\", \"day\"),\n", " (\"type\", \"before\"),\n", " (\"count\", \"-5000\"),\n", " (\"indicator\", \"kline\"),\n", " ),\n", " cookies={\"xq_a_token\": \"328f8bbf7903261db206d83de7b85c58e4486dda\",},\n", " )\n", "\n", " if response.ok:\n", " d = response.json()[\"data\"]\n", " data = pd.DataFrame(data=d[\"item\"], columns=d[\"column\"])\n", " data.index = data.timestamp.apply(\n", " lambda _: pd.Timestamp(_, unit=\"ms\", tz=\"Asia/Shanghai\")\n", " )\n", " return data\n", " else:\n", " print(\"stock error\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T12:47:55.667516Z", "start_time": "2020-05-14T12:47:55.332444Z" }, "slideshow": { "slide_type": "subslide" } }, "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", "
timestampvolumeopenhighlowclosechgpercentturnoverrateamountvolume_postamount_post
timestamp
2020-05-08 00:00:00+08:00158886720000029078681317.01338.001308.511314.612.610.200.233.839218e+09NoneNone
2020-05-11 00:00:00+08:00158912640000023671191320.01335.001313.671323.018.400.640.193.135991e+09NoneNone
2020-05-12 00:00:00+08:00158921280000019721811318.01334.991316.001333.009.990.760.162.621825e+09NoneNone
2020-05-13 00:00:00+08:00158929920000022014311333.01337.991322.881335.952.950.220.182.931465e+09NoneNone
2020-05-14 00:00:00+08:00158938560000018574921330.01334.881325.111326.59-9.36-0.700.152.467976e+09NoneNone
\n", "
" ], "text/plain": [ " timestamp volume open high low \\\n", "timestamp \n", "2020-05-08 00:00:00+08:00 1588867200000 2907868 1317.0 1338.00 1308.51 \n", "2020-05-11 00:00:00+08:00 1589126400000 2367119 1320.0 1335.00 1313.67 \n", "2020-05-12 00:00:00+08:00 1589212800000 1972181 1318.0 1334.99 1316.00 \n", "2020-05-13 00:00:00+08:00 1589299200000 2201431 1333.0 1337.99 1322.88 \n", "2020-05-14 00:00:00+08:00 1589385600000 1857492 1330.0 1334.88 1325.11 \n", "\n", " close chg percent turnoverrate amount \\\n", "timestamp \n", "2020-05-08 00:00:00+08:00 1314.61 2.61 0.20 0.23 3.839218e+09 \n", "2020-05-11 00:00:00+08:00 1323.01 8.40 0.64 0.19 3.135991e+09 \n", "2020-05-12 00:00:00+08:00 1333.00 9.99 0.76 0.16 2.621825e+09 \n", "2020-05-13 00:00:00+08:00 1335.95 2.95 0.22 0.18 2.931465e+09 \n", "2020-05-14 00:00:00+08:00 1326.59 -9.36 -0.70 0.15 2.467976e+09 \n", "\n", " volume_post amount_post \n", "timestamp \n", "2020-05-08 00:00:00+08:00 None None \n", "2020-05-11 00:00:00+08:00 None None \n", "2020-05-12 00:00:00+08:00 None None \n", "2020-05-13 00:00:00+08:00 None None \n", "2020-05-14 00:00:00+08:00 None None " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from snowball import get_stock\n", "\n", "data = get_stock(\"SH600519\") # 贵州茅台\n", "\n", "data.tail()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T12:43:12.158703Z", "start_time": "2020-05-14T12:43:11.688723Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "gzmt = data['close']" ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T15:20:12.190186Z", "start_time": "2020-05-12T15:20:11.862899Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3MAAAHQCAYAAAALXjMTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdeWDU9Z3/8ddcmYQMSUiIoJyieOCBEQsoIhVt3ar5AVXbYq1W1rVdrWuVVrBaW0u1sfRU8cAWr1q1HghWaz2ASlAQFEFERLlvQu7JNdf398dkvpnJnZlJZiZ5Pv7Z+Z7zng/sLi8/l8UwDEMAAAAAgJRiTXQBAAAAAICuI8wBAAAAQAoizAEAAABACiLMAQAAAEAKIswBAAAAQAoizAEAklJDQ4P8fn+iywAAIGkR5gAA3ebZZ5/Vgw8+2OZ1t9ut8ePHt3rtxhtv1Pvvv9/i/Msvv6zbb7/dPJ42bZq2bNnSbh0HDx7UggUL5Ha7O1l5133wwQf6wx/+0OF93//+9/Xpp59Kkt5++2399a9/7fCZw4cP67LLLlMgEGj3vrKyMr300kvmfRs3btQTTzzRcfEAgJRkT3QBAIDe5X//93/N0FRSUiKv16s1a9aY1x955BFlZmZKktLS0tSvXz/z2plnnqmPPvrIvOZwOCQFQ8mdd94pl8uliooKVVVV6Xvf+54kac+ePbrzzjuVkZGhuro63XTTTZoyZUpETb/61a+UkZEhp9Mpj8cjh8Mhi8UScY/b7dYVV1yhjIyMVn+XYRgaOXKk/vjHP7Z6vaGhQfv27euwfZxOp/n7V6xYoeHDh7d5r8fj0TXXXCO3263Dhw/ru9/9rnntsssu0+WXXx5x/7Jly/Taa6/psssukyT99a9/1erVq/W1r31NQ4YM6bA2AEBqIcwBAOLqk08+UXFxsaRgL9qRI0d0/fXXS5K+9rWvyWptGhRitVojjkMhp7lTTz1Vr7zyiqxWq95++2199tlnuummmyRJM2fO1C9/+UudeOKJrT77l7/8RYFAQL/97W9ls9l03333qaamRnfffXdEoMvIyNCRI0e0du1aSdK2bdv01ltv6Yc//KF5j2EY5ufa2loVFhbK5XKZx5WVlZo2bZqkYDh89dVXzbA6ZcoUvf3225Iki8WiQCCgFStW6MUXXzTf6fV6ZbVaZbPZJEkOh0Pl5eV644039OKLL2rUqFE688wz9fLLL+vw4cMtfuvzzz+vH/zgB5KktWvXasuWLbr33nv1k5/8RE888YScTmerbQQASE2EOQBAXI0ZM8bsNQv1zK1cuVKSlJ+fbw4BnD9/vs444wxJ0uOPP67CwkJZLBY98cQTuuiiiyLeGQp8P/vZz7R9+3Y5HA7zO2w2m26//XZdeOGFuuGGGyKee/HFF/XWW2/piSeeMAPSLbfcohtuuEHz5s3TXXfdZd5rs9kiwl19fb3efffdiDAXft1ms8kwDC1ZskSS9N5772np0qUqKiqSJE2dOlV2e9P/m01PTzd7GiVp5cqV8nq9uuGGG2QYhr788kuNHDlSt9xyi6ZOnSqfzxfx/IQJE/TMM8/ozDPPNNskFC4tFotWrVqljRs3avz48XK73brjjjt099136+yzz9a6det0ww036E9/+pP69+/f9h8eACClEOYAAHGxbds2bdmyRd/85jfNcx988IGqqqp04YUXmudWrFih448/Xh9//LHOP/98SdLOnTu1YcMGScH5Yf/5z39a/Y57771XkvS3v/1N55xzjkaNGqVf/OIX2rlzZ8T3SsFewTvuuEMFBQW64YYbVFdXJ8MwzED25ptvyul0as6cOeYzFotFL7/8sp5++mk1NDTo8OHDEe997LHHlJeXZ97bFc3vf+KJJ3TDDTfommuu0bZt23THHXfoueeekyT5/X5dccUVslgsOnz4sGbOnGk+N3PmTJWVlcnr9erf//632Ss5f/58uVwueTwe3X777brgggs0ceJEScF5en/4wx90ySWXaMGCBTrttNO6VDsAIDkR5gAAcWGz2ZSWlhbRmzR58uQW94V6nHbu3KlRo0bJYrHo5JNP1qZNmyRJZ511ll555ZUWz4XPdXO5XLruuus0fvx4VVRU6LHHHlNaWlrE/eecc47uv/9+jRo1Snl5ecrOzjZ75yRp//79OnLkSIv3T5s2TTNmzNBbb72ltWvX6o477pAkFRQURPRqeTweHT582BxW2XyY5eHDh+X1elvUJUlr1qzRgQMH9Oijj+qiiy7SF198oeOPPz6iLRcvXqzXX39d69at089+9jP96Ec/UmFhob7xjW/o73//u2pra83hq+vWrdNZZ50ln8+njz/+WAMGDNCUKVN0ySWX6PXXX9c999yj6dOn69JL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ezdLERERERERaXpK5kRERERERFogJXMiIiIiIiItkJI5ERERERGRFkjJnIiIiIiISAukZE5ERERERKQFUjInIiIiIiLSAimZExERERERaYGUzImIiIiIiLRASuZERERERERaICVzIiIiIiIiLZDV3wU4GbPZ5O8iNKnWdj3+oBg2DcXRd4qh7xTDpqE4+k4x9J1i2DQUR9+1phie7FpMhmEYZ6gsIiIiIiIi0kTUzVJERERERKQFUjInIiIiIiLSAimZExERERERaYGUzImIiIiIiLRASuZERERERERaICVzIiIiIiIiLZCSORERERERkRZIyZyIiIiIiEgLpGRORERERESkBVIyJ82a2+32dxFERKSVUd0iIq2F1d8FaG0++OADAMaNG0dUVJSfS9Myffnll+zbt4/f/OY3/i5KizZ9+nTsdjuTJ08mJCTE38VpkebMmUNwcDAjRozAbrf7uzgt0qxZswgMDGT06NEEBQX5uzgtkuqVpqG6xXeqV3yneqVpvPfee5jNZsaMGUN8fLy/i+NXlmefffZZfxeiNSgqKuKee+6hoKCAPXv2kJ6eTkpKij7sTlFZWRkvvfQSCxYsYMyYMUREROB0OjGb1YjcUOXl5fzxj3+ktLSUyMhIAgICiIuL83exWpS8vDzuuOMO8vPz2bhxI7m5uXTr1g2bzebvorUY+fn53HrrrRw+fJiMjAw2bdpETEwMMTExGIaByWTydxGbPdUrTUd1i29Ur/guPz9f9UoTqP5czMvLo6Kignnz5hEdHU1CQgJut/usrFv0KeYjwzAAcLlcBAYG8vvf/54777yTzMxMgoOD/Vy6lqE6hgAOh4MOHTqQlpbGyy+/DIDVqgbkhqiOY0BAAGFhYUyaNInNmzfzzTffsGvXLv8WroWojmFxcTEpKSlMmzaNW265hc2bNxMYGOjn0rUsJSUlJCYm8tJLL/H4448TERHBW2+9BXBWVraNUVFRQUhIiOoVH7ndbhwOBx07dlTd0kg2m42IiAjVKz4oLCykW7duqlcayel0AmCxWAgJCeHZZ5/liSeeoH///t739Nn644xa5hqprKyMP/zhD6xdu5aSkhKSkpLIyckhMTERh8PBZ599xoUXXojD4dAXl+OoGcOCggK6dOlCbm4uM2fO5G9/+xvvvPMOmzZtok2bNsTGxvq7uM1WzTgWFRWRnJzM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ME899RTVnVV++OEHxo4dy+DBg3nyyScxDIO5c+cyePBgVq1axZ133sngwYPJyMgAYPXq1UycOJGhQ4dy77334nQ6+fTTT7nmmmsYN24cjzzyCNdeey0TJ06ksrKSbt268fTTTzN06FDuueceSkpKzlToRESkFVEyJyIiLc6jjz7KsmXLAFi2bBnffvvtCbd3Op0888wzfPbZZ7z11lssWrSIiooKHnroIaZOncqPP/7I3r17mTdvHgB/+ctfeOKJJ1iwYAEul4s9e/ZwwQUXsGzZMvr378+rr77KsmXLSE5OBmDWrFk8+OCDLF68mOLiYhYtWgRAfn4+f/nLX5g9ezYvvPACubm55OTkANCpUycWLlwIwPvvv39a4iQiIq2bkjkREWn1UlNTCQ4OpmvXrsTFxWEYBjt37mT//v3cfvvtjB07lk2bNrF9+3YA0tLSePfdd/n888+5//77SUxMPOHxH3/8cbKzs3nkkUdYs2YNubm5APTu3ZuwsDDi4uLo0KEDgYGBuN1uAK688kosFgsXX3wxa9asOb0BEBGRVsnq7wKIiIicblartdZfAMMw6NixI19//TUApaWluFwuAJ555hnWrFnDsmXLuPzyy3n33Xe9rXDHcrvdXH311UyYMIHrr78es/no76T1nbfm+av3r7mPiIhIQ6n2EBGRFisiIoK9e/dSWVlJYWHhKe3buXNnSktLWbp0KS6Xi4ceeohPP/0UgHHjxhEREcGtt95Kp06d2LJli3e/yMhI9u3bB0BeXh6HDx9mz549XH/99QQGBnq7WJ7MRx99hMvl4quvviI1NfWUyi4iIgJK5kREpAV7+OGHmTJlCsOHDyc9Pf2U9rXb7bzyyis8//zzDB8+nKCgIK655hoA7rvvPm666SaGDh1KcHAwo0aN8u5366238uabbzJw4EA++eQToqKiuOyyyxg7dizPPPMMvXr1YteuXSc9f1ZWFsOHD8disXDttdeeUtlFRERA88yJiIiccf6YH09ERFoftcyJiIiIiIi0QGqZExERERERaYHUMiciIiIiItICKZkTERERERFpgZTMiYiIiIiItEBK5kRERERERFogJXMiIiIiIiItkJI5ERERERGRFuj/A1e2cg3kBt6KAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "gzmt.plot(figsize=(15,8));\n", "plt.title('贵州茅台历史收盘价');" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### 重采样与频率转换\n", "\n", "\n", "按照新的频率(更高频率、更低频率)对数据进行重采样,可以通过`resample()`方法、`asfreq()`方法。\n", "1. `resample()`方法是以**数据累计**(data aggregation)为基础\n", "2. `asfreq()`方法是以**数据选择**(data selection)为基础。\n", "\n", "用两种方法对数据进行下采样(down-sample,减少采样频率,从日到月)。用每年末(`'BA'`,最后一个工作日)对数据进行重采样:" ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T15:20:51.541347Z", "start_time": "2020-05-12T15:20:51.253127Z" }, "scrolled": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3MAAAHQCAYAAAALXjMTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdd3wUZf4H8M/MbEvvEHqIlIAoBDgCIuZEPGwcIFjwPNupp6g/D0EQERQVDWJFgwqK6J0VBQFFEAQUUJEeKRGkt5CQZJNssn3m98eyw27qbrKp+3n/Q3Z25plnN/O6y8fvUwRFURQQERERERFRsyI2dgeIiIiIiIjIfwxzREREREREzRDDHBERERERUTPEMEdERERERNQMMcwRERERERE1QwxzREREREREzRDDHBER1YrVaoXT6WzsblAjKikpUX8+e/ZsI/aEiCg4McwREQWxTz/9FG+99VaV75tMJgwYMKDS9x566CH88ssvFY4vWbIEU6dOVV+PHDkS2dnZ1fYjJycHmZmZMJlMPvbcf7/99hteffXVGs+76667sHfvXgDA2rVr8f7779d4TW5uLsaMGQNZlqs9r6CgAF999ZV6XlZWFhYtWlTtNYsXL8bHH39cYx/KW7RoEZ555hm/rnE6nThy5AhWrFiBzz//vML7mZmZePPNNwEAsizjxhtvhNlsxu7du3HPPff43UciIqobTWN3gIiIGtaDDz6ohqa8vDzY7XZs2bJFff+dd95BWFgYAECn0yE0NFR9r2/fvtixY4f6nlarBeAKJU899RTCw8NhNBpRXFyMf/7znwCAEydO4KmnnkJISAjMZjMeeeQRpKene/Xp2WefRUhICPR6PWw2G7RaLQRB8DrHZDLhpptuQkhISKWfS1EUJCUl4bXXXqv0favVilOnTtX4/ej1evXzb9iwAR07dqzyXJvNhjvvvBMmkwm5ubn4xz/+ob43ZswYjB071uv8devW4dtvv8WYMWMAAO+//z5+/fVXXH311WjXrl2F9u12O9599108//zzlb4HQP0dlBcREVHlewDw/fffY9OmTTAajTh37hwKCgqgKAri4+PRunVrxMbGwmw2e33fer0ekiQBAERRxJVXXom9e/di9erVuP3226u8FxER1Q+GOSKiIPP7779j06ZNAFxVtHPnzuH+++8HAFx99dUQxQuDNkRR9HrtDjnl9erVC19//TVEUcTatWuxf/9+PPLIIwCAcePG4ZlnnkH37t0rvfa9996DLMt46aWXIEkSZs+ejdLSUsycOdMr0IWEhODcuXPYunUrAODQoUNYs2YNHnjgAfUcRVHUn8vKyjBixAiEh4err4uKijBy5EgArnC4YsUKNaymp6dj7dq1AABBECDLMjZs2IAvv/xSbdNut0MURTXQaLVaFBYWYtWqVfjyyy+RnJyMvn37YsmSJcjNza3wWT///HP8+9//BgBs3boV2dnZeOGFFzBp0iQsWrQIer3e6/xPPvkETqcTmZmZyMzMxM6dO5GamgpFUWC32zFq1CiMGzcOAPDII4/g2LFj0Ghc/9duNBphsViwfft29bvp0KED5s6dCwDo2rUrBEFAQkIC2rdvj6ysLAwZMgRarRbbtm2DTqdTg5yiKFAUBYIgQBAEmM1mvPrqqzCZTFi6dCnWrl2LtLQ0bNu2DTNnzlS/cyIiql8Mc0REQaZnz55q1cxdmdu4cSMAICEhQR0COGfOHPTp0wcA8MEHH2DEiBEQBAGLFi3C8OHDvdp0B74nn3wShw8fhlarVe8hSRKmTp2KYcOGYfz48V7Xffnll1izZg0WLVqkBqQJEyZg/PjxeO655zBjxgz1XEmSvMKdxWLBTz/95BXmPN+XJAmKomDZsmUAgJ9//hnLly9HRkYGAGDo0KFq8AEAg8HgVcnauHEj7HY7xo8fD0VR8OeffyIpKQkTJkzA0KFD4XA4vK5PS0vDxx9/jL59+6rfiTtcCoKAzZs3IysrCwMGDIDJZMK0adMwc+ZMDBo0CNu2bcP48ePx+uuvIyIiAgBw8uRJzJs3D59++imSk5MBAFdccQX++9//VvZrVYc/ui1ZsgT79+/HtGnTKj2/c+fOWLhwIXr16oU+ffrg448/RkxMDHr37o1nn30WEydOVM/ds2cPZsyYgZycHFx11VX47rvv1O9l+fLliIqKwr333gug6sBPRESBxzBHRBQkDh06hOzsbNx4443qsd9++w3FxcUYNmyYemzDhg3o0qULdu3ahSuvvBIAcPToUezevRuAa37Yjz/+WOk9XnjhBQDA//73P1x22WVITk7G008/jaNHj3rdF3CFjWnTpiE1NRXjx4+H2WxWqz+AaxigXq/HlClT1GsEQcCSJUvw3//+F1arFbm5uV7tLliwAHFxceq5/ih//qJFizB+/HjceeedOHToEKZNm4bPPvsMgGtu2U033QRBEJCbm6tWxwBXJbKgoAB2ux2rV69Wq5Jz5sxBeHg4bDYbpk6diquuugoDBw4E4Jqn9+qrr+L6669HZmYmUlJS8Mgjj+DOO+9Ug5wnWZZht9srVPL8NXLkSMybNw+33HILHnnkEbRp0warVq1Chw4dvIbCXnLJJVi6dCmuueYadOnSBTfeeCOcTickSUJYWBhCQkIQGxtbp74QEZH/GOaIiIKEJEnQ6XRe1aQhQ4ZUOM9dcTp69CiSk5MhCAJ69OiBPXv2AAD69++Pr7/+usJ1nnPdwsPDce+992LAgAEwGo1YsGABdDqd1/mXXXYZ5s6di+TkZMTFxSEqKkqtzgHA6dOnce7cuQrtjxw5EqNHj8aaNWuwdetWtfKUmpqqVrXc5+fm5qrDKssPs8zNzYXdbq/QLwDYsmULzpw5g3fffRfDhw/HwYMH0aVLF6/vcunSpVi5ciW2bduGJ598Eg8//DBGjBiBa6+9Fp988gnKysrU4avbtm1D//794XA4sGvXLsTExCA9PR3XX389Vq5ciVmzZmHUqFG44YYbcPHFF0MURbz00ksoLCxEWloaunXrBsC1gMrtt98OWZYhSZJXle7w4cMYP3489Ho9LBYLTp48CUVR8NNPP0Gv16OwsBBffPEF2rRpA1mW4XA4kJqaivnz5wMAfvrpJyQmJuLmm29Wg5zD4YAgCJAkCb///juOHTuGr776Cm3atMHhw4fxzTffwGw2w2az4YcffkC7du2QmZlZ4fskIqL6wTBHRBQkkpKSkJSU5DUU0pPT6URUVBTefvttHDlyBDqdDhaLBZGRkejXrx+2bdsGAOjXrx9++OEHFBYWel172223QaPRqBWus2fPYunSpUhNTcWdd94Jq9WKnJwc/PTTT9BoNEhMTMTcuXOrXLCkf//+Xgt/GI1Gr8C3a9cudR6eey6bZzALDw/Hnj17cOLECXTo0AFLlizBiRMn8Oijj1Z6P/e8MIfDgQEDBmDYsGGYNWsWdu7cifXr1+Oqq67yOt9oNOKdd97Bm2++CY1Gg7lz5+KPP/7Al19+iQULFqjDOd2fpV+/fhgxYoTa9urVq5GYmAjgwkIz7kod4JrTlpWVhX79+mHevHkAXMMs//e//1Xa/+TkZKxatQoAMGnSJMTGxqKsrAwXXXRRhVU8Dxw4gIceeshrfp3RaIQkScjMzFTnyjmdTjz77LMYNGgQ3nnnHaSnp6Ndu3aYM2cOVq1ahQcffBCLFy9GTk6OOkeSiIgaDsMcEVGQKS0txdNPP40ePXrg66+/Rvv27dG/f3/k5eVhwoQJAFzBb+nSpcjKykKnTp3QtWtXdO3aFW+//TaioqIwa9Ysr/lvkiR5LRTy6aefIioqCocOHcKHH34IvV6PxYsXY8+ePV6Vwby8PMycORNpaWlefdyyZQs++OADr2NHjx5FfHw8AFd4W7NmDT799FMAropVVFRUhc/qdDrx6KOP4tZbb0V2drY6n628I0eO4MSJE7juuutgNBohCAJiY2MxevRovPHGGyguLlaHkLpFR0fDYDDgiSeeqNBe27ZtMXfuXFx66aXqHLLywziPHDmCzp07q68933c6nTXu4edeBKX8yp/vvfceTCYTxo4di+zsbJw9exbz5s3z+n2lpKTghx9+AADs27cPEydOxMCBA5GYmIhjx45h3rx5Xgvf/Pzzzzhz5gyuv/56SJKEN954AxaLxWulU6DiAjFERFS/GOaIiIKMw+FQf/7ss88wadIklJaWQhRFdQ6WIAiIjo7Gt99+61Ut8sUXX3yBxYsX48MPP/SazzZ27FiMGDHC61zPYFeeZ5gAXKs/pqSkAHAt9nHZZZep4S4vLw/R0dEV2pAkCfPmzcNdd92F/Pz8KqtynTp1wsKFCzFgwAA8+OCD6vF+/frhxIkTGDBgQKUBpaioCKtXr8bs2bPx17/+FYBrzuGUKVMwcuTIakPNpk2bKmxd4LZ9+3a8/PLL0Gg0kCRJXUymoKBA/VlRFNhsNrz11lto1aoVTCYTZs+ejaNHj2L+/Pn47rvvAAAvvvgiHnjgAezfvx+TJk1Cp06d1Pts3rwZU6dOxeuvv47vvvsO3bt3R2JiIu6//348//zzauUwJiYGkyZNwv79+9Xvddy4cdBqtTAajbDZbFi/fj0URcH//d//qXMtiYiofjHMEREFmcmTJ0Or1eLll19GZGQkDAYDRo8ejX79+mHSpEnqeUeOHMH69evx1FNPqcfce5sB3tsAAEB2djbmzZuH4uJifPjhh17z1wBXQDQYDF7HFEXBlClTKhy3WCzo0aOH1+uvvvoKM2bMwIwZM7Bz5051U+svvvgCn3/+Obp27Vrhs1qtVnUbhpSUFNxxxx24+eab0bt3b7Rt2xYGgwEGgwGiKFYIrYcPH8bjjz+OcePGYc+ePbjnnntw3333YeDAgWrQrGmRlfLvu7+/tWvX4sCBA+rCM+4hnm4DBgzAF198UaG9qlazzM/Px6hRo3DllVfi/fffh06nU9sLCwvDggULMGfOHNx999348ssv4XA48MwzzyA7OxuZmZm45JJLsHLlSgDA3XffjcjISIwaNQppaWmYOXOm+rvYu3cvRFFESkoKVqxYAQAcZklE1IgY5oiIgoTNZsPTTz+NQ4cOoaSkBGPHjkVmZia0Wi2+++47rF+/HtOmTcPll1+Oxx57DO+99x7uvfder1DmuSm2zWaDzWYD4AoTjz/+OK699lrcf//9sNvt+Pjjj9V5WFVxOByYPXt2pcMsFyxYoL4uKCjA8OHDMWTIEJw6dQoTJkxQh/hdfPHFuP3223H11Vd79W3ixInYunUr0tPT8e6776JTp07Yvn07vvnmG3zxxRc4ceIEwsPDsXLlSq990ex2O44dO4ZZs2bhkUcewQ033ACn04nPPvsMW7ZsQVpaGr755ht89NFHKCwsxD//+U/k5OSoG6+XlJRgz549yMnJwa233oo777wTo0aNAuBahKW4uBjz58/Hiy++qN7XbrerG7lXx2q1wmazVVi0JS4uTl3cxM1isahVWIPBgOnTp2PKlCnqtX//+9/xyiuvqPPj7Ha7+vscM2YMhg0bhu3bt3tVPG02W4UQ7/49EhFRwxOUyv5XmYiIWqSdO3ciPj4eHTp0qPR9p9OJgoICJCQkqH+gVzcU0pPntgKAa2+6iy++GAMGDKh7x2vhxIkTSEhIqFD185UsyxWGegZKfbbd0BwOB2RZrnRVUCIiql8+hbn58+ejY8eOuOaaa9Rj06dPR25uLt59910AQEZGBjZv3gxJkvDCCy+gZ8+eyM7OxtSpU9WVwaZPn15/n4SIiIiIiCiI1PifBe+55x68/fbbXsfWr1+PrVu3qq+3bduG3bt3Y9myZZgyZYq6HHNGRgYmTpyI5cuX48CBA17XEBERERERUe3VGOYWLlyI4cOHq68LCgqQmZnpNUl+48aNGDp0qDqBfM+ePbDZbMjKysLgwYMhCALS09PVSehERERERERUN34P2J8xYwYmTZrkNSG+sLBQnSAtCALCw8NhNBoRHh6uzp+Iiory2mCWiIiIiIiIas+v1SzPnj2LAwcOIDMzE8XFxcjJycEHH3yAuLg4NagpigKTyYSYmBiYTCZ1krfRaERsbKzfHSwsLIUsc42WYBYXF478/JpXeSMKFD5z1Bj43FFD4zNHDY3PnP9EUUBMTFiV7/sV5lq3bo3vv/8egGvZ6IULF+Luu+/Gzp07MXv2bNx7773YsmULevfuDa1Wi9TUVGzatAlDhgzBhg0b8Nhjj/n9AWRZYZgjPgPU4PjMUWPgc0cNjc8cNTQ+c4EVkH3mUlNTkZqaipEjR0IURXUBlMmTJ+OJJ57AnDlzkJaWhn79+gXidkREREREREGvye8zl59vYoIPcgkJEcjLK2nsblAQ4TNHjYHPHTU0PnPU0PjM+U8UBcTFhVf5fkAqcw3JNSevCGazCbLsbOzuNGsajQ4xMQmQpGb3GBARERERBb1m91d8YWEeBEFAbGxrSJJGXS2T/KMoCkpLi1FYmIf4+DaN3R0iIiIiIvKT31sTNDabzYLo6DhoNFoGuToQBAFhYZFwOGyN3RUiIiIiIqqFZhfmAAWC0Ay73QQxDBMRERERNV9MRURERERERM0QwxwREREREVEzxDAXIK+99hLy888FrL2DB//Ajh3bAtYeERERERG1LM1uNcvyjp8twfGzpnppu2PrcHRsHeHTuRMmTA7ovQ8ePIAzZ06jb9/+AW2XiIiIiIhahmYf5pqKhx++H9OmPYM2bdpi7NgRuPnmcfjhhzWw2ax47bV5+Oqrz7FnTxZsNhucTiemT38W7dq1x9ixI/DllysAALNmPYNrr70B3367HHv37oHNZsW2bb/h0UcnIiWlZyN/QiIiIiIiakqafZjr2DrC5+pZQ3I6Zbz77gd46aVZ2Lr1VwBAQkIrPPnk0/j++1WYP38eZs58odJrp09/FitXrsCZM6fxr3/9uyG7TUREREREzQTnzNWTkSNvBADExcXDbrcDAHr27AUASElJwenTJytcY7VaG66DRERERETUrDHM1ZPQ0NAKx/bsyQIA7N+/Dx06dAIAWCxmOJ1OmEwm7Ny5XT1Xr9ejrKwMAKAoSgP0mIiIiIio6TGarLDanY3djSap2Q+zbE6MxkI89NB96pw5ABg+/DrMmPEEYmJi0bVrd/XctLTLsGLF13jwwX8hLW0Q7rrr3sbqNhERERFRo9mw8xQiQnW4ql/7xu5KkyMoTbzsk59vgixf6GJOzjEkJnZqxB7Vzvvvv4s2bdriuutGNHZXvDSH7zMhIQJ5eSWN3Q0KInzmqDHwuaOGxmeOGlptnjmnLGPF5qMAgFFDkuuhV02bKAqIiwuv8n1W5hoIFzIhIiIiIvKP3SEDANrEhTVyT5omzpkjIiIiIqImyR3m2sYzzFWGYY6IiIiIiJqkMqsDABCilxq5J00TwxwRERERETVJpWZXmAszaBu5J00TwxwRERERETVJFpsDoiDAoGNlrjIMc0RERERE1CQ5nDI0GhGCIDR2V5okhrkWYtasZ7Bjx7bG7gYRERERUcDYHQo0EiNLVfjNEBERERFRk+RwytBKrMpVpUXsM1e24kVou10ObfchUGQHzN/OgTYlHdqul0FxWGH+7lVoew6F9qI0KLYymFe/AW2vq6Ht3B+ypQSWNW9Bd+k10HRKhVxmhOWHt6Hrcz00HS716f5jx47Af/7zOBYteg//+te/0apVa7z22kuw2WxISemBxx6bAgDIyHgOR44chsPhwAMPPIy//CUNO3Zsw9tvvwlJktCtW3c89tgUPPzw/YiPT8D+/XsxYMAg/PrrZjz//EuYNu1x9O7dB8ePH0PXrt0xefK0Kvt09mwOZs9+HmZzGeLjW+Hpp5+HRtMift1EREREFCTsDpmVuWrwr/sA2br1V7zzzkJoNBrcd9+dePjhCejduw8efXQ8fv99Nzp1SsLmzRuxdOlKGI1GHDp0EABw7tw5TJ/+LOLi4nDXXf9AYWEBAOD66/8OURTRrVt3RERE4PDhPwEAI0aMRp8+ffHYYw9jy5ZfkJY2qNL+ZGa+geHDr8Pw4dchI+M5rFu3Fn/72zUN82UQEREREQWA3eFEKFeyrFKLCHOhI6aqPwuixvu1Ru/9Whfq9Vo0RHi/Do32eu2r++8fr1a+jh49jAUL5gEASkqKkZt7Fpdc0hv33vsAnnpqMhRFwe233wUAkGUn5s59BZGRUQAUWCwWAED79h0gSRLatWuP3NyzUBQFANCzZy8AQLduKTh16mSV/Tl8+BByc89ixYqvUVZWik6dOvv9mYiIiIiIGpPNISNaw8pcVVpEmGsKwsLC1Z+TkjrjqadmIjGxDdatW4u2bdshJycHVqsFGRmvIitrF959NxNvvTUfr7/+MpYs+RayLOPuu2+r8T579mShb9/+yM7eh379/lLleZ07J2PMmJvRp09fbN36KwCONSYiIiKi5sXmkKHVMsxVhWGuHkye/BReeGEmLBYLoqNjMH36swgNDcWffx7EfffdAYfDgVtvvR0A8Le/XYMHHrgb8fGtEBYWjry83GrbXr16JebNm4uUlJ74y1/SqjzvoYf+gzlzXsA777wFrVaLadNmBvQzEhERERHVJ7tDhtMpQ6fhHnNVERT3+L0mKj/fBFm+0MWcnGNITOzUiD1qPGPHjsCXX64IaJvN4ftMSIhAXl5JY3eDggifOWoMfO6oofGZo4bm7zO3fucpFJms6N0lHp3bRNZjz5ouURQQFxde9fsN2Beqo0AHOSIiIiKipqrIZAUArmZZDX4zRERERETUZIlc+qFKDHNERERERNRkiUxzVWKYIyIiIiKiJkcQXCEuPsrQyD1puriaJRERERERNTlhBg2iw/XQcjXLKrEyR0RERERETY7dKXPxkxqwMtfAXn75Rfz550HodDrMnftOY3eHiIiIiKjJsTtkWG1O5BSUNXZXmjSGuQb288+bsGTJt43dDSIiIiKiJsvmcAIAosJ1jdyTpq1FhLnXd1SscPVtdSmuaH8ZbE4b5u1eWOH9tDb9MahNf5hspXhvz38rvD+k3UD0a92nxns7HA5kZDyHkydPQJZlTJr0BGw2G9544xWIoojExDaYMeM5rF+/Fl999QWMxkI8+OC/kJY2CHfddS9WrlyBw4cPobCwACZTCWbPfg0A8M47b2Hnzu2QZScef/xJdOuWgh9+WIMPP3wP0dExKCsrw/jx/4e+ffvX4hsjIiIiImq6FMX1b7v4sMbtSBPXIsJcYzIaC3HJJb0xbdozWLJkMZYv/xoajQZXX30Nbr55HH78cT3MZjOGDRuOYcOGY+zYEXj77fe92vj+++/wyitvomvXbgCAX37ZjP379+Hddz/A7t278Pbbb+Lll+fijTdexocffoawsDDcccetjfFxiYiIiIjqnXI+zYkCtyWoTosIc//p+0CV7+kkXbXvh+vCqn2/JhqNFrt27cDPP2+EVqtDSEgIbr/9AXzwwXxMmvR/6Nz5IgwePKTaNq6+erga5ADgyJFDOH36FB5++H4oigKHw4GiIiNCQ8MQExMDAOjevXut+0xERERE1JS5K3PMctXj8jB1tGrVN0hIaIXZs1/DpZe6hmVu3LgBd911L15+eS4OHvwDWVm7qm0jNNS7fNy5czJSU/virbfm44UX5iA9/UpER8fAbC5FYWEBbDYbsrP319tnIiIiIiKqix+2n8Tm38/U+np3ZU5gmqtWi6jMNab+/dPwzDPTkJW1C23atEVhYQGuvfYGzJjxBCRJg9DQUKSk9PCrzUGDLsfOndvx4IP/gsVixrhx/4QoipgwYTL+85/xiI6ORXR0TD19IiIiIiKi2jt0qgglZTaU1GEhSrtTBsDKXE0ExR17m6j8fBNk+UIXc3KOITGxUyP2qGmYNesZXHvtDXVeAKU5fJ8JCRHIyytp7G5QEOEzR42Bzx01ND5zVF9W/noMNrtrNcpRQ5LV4/48c19vPAwA+EtKK7RLCA98J5sJURQQF1f152dlrpmaNu2Zxu4CEREREVEFrWNCcCLXBL1OqnNbcpMuOzU+zpkjIiIiIqKAMehd9SKdpu5hjqMsq9cMw5wARZEbuxMtQhMfYUtEREREzZB7ipTMvzXrXbMLczqdAUbjOTgcdoaROlAUBaWlxdBodI3dFSIiIiJq5rb/kYsNO08BuBDmwD/V651Pc+bmz5+Pjh074pprrsHJkycxefJk2O12dOjQAXPmzIEkSVi4cCGWLl0KAJgyZQouv/xy5OTkYMKECSgrK0NSUhJefvllaLXaOnU4JiYBJlMRCgrOQpaddWor2Gk0OsTEJDR2N4iIiIiomTuRa1J/zjWaATDLNYQaw9w999yDnTt34sUXXwTgCnajR4/GTTfdhHHjxmHz5s3o0qULPv/8cyxbtgxnz57Ffffdh9WrV+PNN9/EqFGjcMstt2Dy5Mn49ttvMWrUqDp1WBAEREREIyIiuk7tEBERERFRYJmtDpSa7QA4pach1DjMcuHChRg+fLj6Oj09HX/9618BAFqtFoIgYPPmzRg0aBAMBgM6deoErVaL48ePY+PGjRg2bBgA4Morr8SmTZvq51MQEREREVGjO3qmWP05EFlOp212s8IalN9bE1x11VUAgI8//hihoaEYPHgwFixYgKioKPWcyMhIFBYWoqCgQD0eFRWFwsJCvztY3b4KFDwSEiIauwsUZPjMUWPgc0cNjc8cBUpYmB4AcLLArP5s0EkVnjFfn7mEuDDYHTJ6dm0FgTuHV6lW+8y98sorOH36NN58802Iooi4uDicPn1afb+oqAixsbGIj4+H0WhU/42NjfX7XuU3Dafgw01NqaHxmaPGwOeOGhqfOQqk0lKr1+uocD3yC8twJqcIGslVXfPnmSsutqBtfBjOnTPVfHILVtOm4X7XLT/55BMYjUavxUwuv/xy/PLLL7BYLDh69CicTic6duyIK664AmvWrAEArF+/HkOGDKnlxyAiIiIiouYiIdoAANj2Ry4AwCnL6lw6X9idshoCqWp+V+bmzZuH1q1b47bbbgMAjBkzBmPHjsW4ceMwduxYAMCMGTMAAA899BAeffRRfPbZZ0hKSsJ1110XwK4TEREREVFj2ne0APFtJhYAACAASURBVPFRhirfzyt0rWy5+8985JvOYGifNpDE6kOaoiiQZQWSyOGVNRGUJr7MDIdZEoeBUEPjM0eNgc8dNTQ+cxQIX288XOnxtJ6tsWXfWURH6PHXPu3w7S9HodNrMbhna4Qaqq8nOWUZKzYfRc+kWHTrENwr2Ad8mCUREREREVFVeibFok1cGACoVTt3cUbxYfc597kiK3M1YpgjIiIiIqKASUp0rVip1YiQZdcxpzvMVZLlZEVBcZlNfe0+l8Msa1ar1SyJiIiIiIgqo9NKAFwVtsOni3D4dJH6XmUzvPYfLcTBk0YM698B4SHaC5U5bklQI1bmiIiIiIgo4JyVrHtRWWWuoMQCALBYHa7Xxa5tDjjMsmYMc0RERERE5LfarKNY2RXuCtz5EZnqdgZcBLFmDHNEREREROQ3s9Xp9zXVBcAte3O8XrdLCPO7/WDDMEdERERERH7be7TA72sqy3LuypznsMxQvYabhvuA3xAREREREfnN4ZBrPqmcyipznuucyIoCQRDQoXVEXboWNLiaJRERERER+UVRFJwtLPM61iYuDImxoX63JXikOavNCUVRoNOy5uQLhjkiIiIiIvJZkcmK9TtPqa+vTeuEP08XoUfHmBpXoJRrqMxlHcoHAFhqMR8vGDHMERERERGRzzyDnFYjQq+TcHFSrG8XVzJnzrMyZzLb69q9oML6JRERERER1Yok+hcnKlvL0rOWl9w2EgCQ1KZh58wpdmuD3i9QGOaIiIiIiMgnTtl70RPBh329e3SKUX+ufAGUio2IvjQcSLKjWQY6hjkiIiIiIvLJ3iOFfl8THqrDoF6JAKraNLzisYbKcnKxa4NyQR8GQatvmJsGEMMcERERERH5pKTM5vW6mj3AYdC5lufQiAJ0GgkAsONAHvKMZq/zPCtz7vYE1H+ac547htIvnoQt+8d6v1d9YZgjIiIiIiKfSOXKaJUNm3QLM2gqXGO1OfHznhz1tSx7X69ATXP1ToxtD13qCGiT+tX/zeoJV7MkIiIiIiKf1LT1gKfIMB3yiy0w6DVwOi/MtfPcQ2755iPeF53Pcn7cxm+KxQSIEgRdCPT9RtbfjRoAwxwREREREfmkfGWuOr2SY9GxdQTCQ7QoKr0wPNNqq3oPOYca+uonzSmKAvPaTCh2K0JHPQVBaN4DFRnmiIiIiIjIJ/5U5iRRREyEa1ERXxc02X+s0K/z/SUIAnR9rodiK2v2QQ5gmCMiIiIiIh/VdsuABt5ooFKyKR9ieBw07Xs1dlcCpvnHUSIiIiIiahD+DLP0VH4vufL71ZUX6H3m7Ie3ovTzKXDmHAxou42NYY6IiIiIiHyi1XjHB6u96vlvnspnM5tdxv6jBRXOS4gOAeDfcE5faNr2gK7X3yAmdA5ou42NYY6IiIiIiHzi3omgfUK4X9eV3zfO5pDxxwljxfMEINSgrXX/ypPLjFAUGYIhHPq0myFILWuWGcMcERERERH5RFEUCIKgVtrcC5zUpHxlzl5FRU+WAze/TrGZUbZsFqwbPwpQi01Py4qmRERERERUb2S4gpm7QpfcNsqn68qHOadc+WbjsqIEbiVLrQG6XldDapUcoAabHoY5IiIiIiLyjeJdOfM1d5UfZllVmHPKSoXFUvylKDIUcwnE0CjoLvlbndpq6jjMkoiIiIiIfOIeZqnyMXdVVpnTa6UK5xWZrCgps1U47g/bjhUo+2oG5LKKc/JaGlbmiIiIiIjIJwrOD7M8/9rXGppGIyJEr0GoVkSe0YziUpvPK2H6S5PcH1CcEEJ8GwLanLEyR0REREREPrHYnLA7ZCjuSXM+DokUBQGj/9oF/bu3AgAcOVMc8L7JZlebUkw76PvfWOfhms0BwxwREREREfnkVJ4JABAd7lrFMlTv30A/9/5x5ferqyu56CxKP38Ctn3rAtpuU8dhlkRERERE5Jeu7aPQOiYEUeG+bU3gJp0Pc+L5qllcpAH5xRavc/wNiAAghMdB2+1yaDpc6ve1zRkrc0RERERE5JOocD0iw3QQBMHvIAe4RmUKggCHUwYA9OkaX+GcPt0SfG5Pcdig2K0QJA0Ml90GMaJiey0ZwxwREREREflGURBSi8qZmyAIEEUBdocrzElixTii82MIpmXDeyj7ZjYU2VHrPjVnHGZJREREREQ1stgcKCq1IS7KUKd2JFGA7XxlTq8T0TMpFmEGDbZm5wKAXwuXaLteBrkkD4IYnLEmOD81ERERERH5xWp3BbC4qJA6taORRNjOb0sgCgK6dYhGcemFveV8iXKKtRSCPgyaTn3q1JfmjsMsiYiIiIioRs7z1TSNVLcl/w0612bhoiCoVTivfchraN5xej9Mn0yC48wfdepHS8AwR0RERERENXLKrr3lpDru36bTuiKIIF5oR/T4uaZhlmJMO2iT+0OK61infrQEHGZJREREREQ1ks+HOc/gVRsGrSuCeDYjwDPMVX6dYjMDWgPEkEgY0v9Vpz60FKzMERERERFRBbKsQFEU9bVamatjmNOfH2bpyXNRS6GSWXOK046yb1+CdeMHdbp3S8MwR0REREREXqx2J5ZvPoJDp4vVY4GqzOm1rjDn3p4AuLCJOFBFZU7UQNO5HzQdU+t075aGYY6IiIiIiLxYz682eSynRD1Wn5U5oZowp9jMEAQB+j43QJPEMOeJYY6IiIiIiLy485S7GgcAshKoylzFCOI1zNIjzdn2b0Dp4mmQS87V6Z4tFcMcERERERF5UTOcR24zllgB1L0yZ9BVXIOxqhUspYTO0HToBSEspk73bKkY5oiIiIiIyIs6P84jZBWoYa5uEcI9Z86T5310GhGK3eK6V3wnGK64B4JY8RpimCMiIiIionKcslzhWFykATqtVOdhljVtOq6Yi1C6eBps+9bV6T7BwKcwN3/+fKxatQoAkJ2djdGjR2PEiBF47rnn1HMyMjIwYsQIjBo1Cvv27av2XCIiIiIiarouVOY8jikKNHUMckDNm4ILulBo2vWE1OqiOt+rpasxzN1zzz14++231dcZGRmYOHEili9fjgMHDmDr1q3Ytm0bdu/ejWXLlmHKlCnIyMio8lwiIiIiImra3CtXei4tqShKjUGsThQZouyAoNHBkP4vSPGd6u9eLUSNYW7hwoUYPnw4AMBmsyErKwuDBw+GIAhIT0/Hpk2bsHHjRgwdOhSiKGLgwIHYs2dPlecSEREREVHT5q7MFZmsF44pdV/J0q1nUixSOnovatI1dw1Sj38ExWELyD2CQcWlZKphNBoRHh6uJvKoqCgcP34cANC+fXsArrJpeHh4tef6Iy4u3O9rqOVJSIho7C5QkOEzR42Bzx01ND5zVBWTXUZYmB7Aheck/GQRIIl1em7c11bWhiU6GRqdDq3axNW6/WDjV5iLiYmByWSCLMsQRRFGoxGxsbEQBAGFhYUAXOVXk8lU5bn+ys83ee1vQcEnISECeXklNZ9IFCB85qgx8LmjhsZnjqpzLt+E0lJXVc79nBiLzLDanbV+bqp65hSHDYJGh+LYi6G/qD+fSw+iKFRb3PJrNUutVovU1FRs2rQJiqJgw4YNGDJkCK644gqsW7cOsizj119/Re/evas8l4iIiIiImjbPxSyV85uFK4ritYVAIDjzj6P008fhOL0fV/Ztj16dWZXzh1+VOQCYPHkynnjiCcyZMwdpaWno168fACA1NRUjR46EKIrqAihVnUtERERERE2X58i4gyeL0K1DNGTZaz2UgBAMEZBaJUOMSgxsw0FCUNxRu4niMEviMBBqaHzmqDHwuaOGxmeOqvPH8ULsP1aovh41JBk/7T4NSRQw+JI2tWrT85lTnHZA1NTv6pgtQECHWRIRERERUctXvpiyastxFBRbArKapSLLMK95C9aNi+rcVrDze5glERERERG1bCaLw+u1xeZ6HZBCmiBAik+CEBoVgMaCG8McERERERF5OZVnAgC0jgnF2cIy9XhOfllVl/hEcTogSBro+4+uUzvkwmGWRERERESk8lxSIzpCH7B2Sw9sReniJyEX5waszWDHMEdEREREFIQURYFcyVqIVrtT/VkKwBw5ta2waIjRbSCEcHhloHCYJRERERFREPr9cAEOny5CSscYpHSKUY/b7K5N5v6S0gpWu1zV5X4ztOuK0GsmBKw9YmWOiIiIiCgoHTlTDADIPl7oddxdrats5cpeyf5v6u3MOwrrrm8h26216CVVh2GOiIiIiCgIaaTKh1C6R14KgqCuYulWm9UsHcd3wb77O0AOXJWPXDjMkoiIiIgoCFW1Ybd7j7nKpssJ8D/N6fuNgrbnUIj6EADcqD6QWJkjIiIiIgpCVVXZ3KtZCoKAjq0jvN47k1/q1z0UmxkAIIZE+t9BqhHDHBERERFRELLanJUeV+fMCQLCQ7S44bIkpHR0LZCS3Nb3UObMOQjTxxPgOPNH3TtLleIwSyIiIiKiIFNmsVf53oU5c65/NZKI7h2j0S4hDBGhOp/vIYREQJs8AFJ8Uh16StVhmCMiIiIiCjLfbz1R5XuyxzBLN0EQ/ApyACBGJcKQfk/tOkg+4TBLIiIiIqIg57l5+Pn1TyrdmsBXtj1rIJcW1nwi1QnDHBERERFRkArRuwbquVewBDwXQKldm3LRWVh/+QyOQ7/VuX9UPQ6zJCIiIiIKUjERepitDjidCjSS65i7SCfWMs2JUa0RdksGhNCoAPWSqsLKHBERERFRkNJIrjhgMtvV6lx1+8zVRJFdK2SKkQkQNP7NsSP/McwREREREQUpd5jbmHUauw+dA1D5Aii+UBQF5pUvw/LrZ4HtJFWJYY6IiIiIKEhppQuBLaegDIDHPnP+luYUJ8T4ThCjEgPWP6oe58wREREREQUpjaZibcc9zFLyM8wJogaGgbcGpF/kG1bmiIiIiIiClHuYpacLc+Z8D3POc0fhPHcsYP0i3zDMEREREREFEcVjTzmtR5iz2pzIM5qx/5hrfzh/hllaty6BefUb6gIo1DA4zJKIiIiIKIgoHj9Lkndg2/z7mVq1GTL035CLzkIQpTr0jPzFyhwRERERUTDxSHM6TeXhKzpC71tT7pUv9WGQWiXXuWvkH4Y5IiIiIqIg4jw/J65TYgTCQiofqHdxUqxvbZ3IQtk3syGXFgasf+Q7hjkiIiIioiDicMoAgJgIPSSx8jjg60qWisMKxWmHYIgIWP/Id5wzR0REREQURNxhTiOKfm8/UJ42eQA0nf/i9wbjFBiszBERERERBRGH0zXMUqMRq1yxsqZwpigKHKf2QVEUBrlGxDBHRERERBRELlTmqg5hNeUz54nfYf72JTiObAtk18hPDHNEREREREFEDXOaqqNATbU2qX1PGK68H5qk1AD2jPzFOXNEREREREHE7jgf5qRq6jo1lOYEUQNt18sC2S2qBVbmiIiIiIiCiHtrAo3k/zBLRZFhXpsJx7Fd9dE18hPDHBERERFREPGlMldVzFPMxZCNZ6BYS+uhZ+QvDrMkIiIiIgoiTqcMQRCq3ZZAr5UqPS6GRiN0zLOAUl+9I3+wMkdEREREFEQcsgKNJFS7pYCukjAnF+e6NggXRAhVbDZODYu/BSIiIiKiIHIy16QOtaxMZJiuwjFFkWFePRfmVa/XZ9fITxxmSUREREQUJJyyDKvd6XUsIToEeq2EjokRSIgyVHGlAP2gW1HzpgXUkBjmiIiIiIiCREmZvcKxwZe0qfE6QRCgad+rPrpEdcBhlkREREREQUKW/V+5xH50O6y7voXidNRDj6guGOaIiIiIiIKEUotVKJ2n9sFx8BeAi540ORxmSUREREQUJJTzewq0jQ/z+RrD4H9CsZkhCAxzTQ1/I0REREREweJ8ZS65TWTNp8pOKBYTAEDQhdRnr6iWGOaIiIiIiIKEOsrSh0UpHX/+CtOnk+AsPF2fXaI6YJgjIiIiIgoS7jAn+JDmxITO0Pa4EmJ0Yv12imqNc+aIiIiIiILF+RVQBB8qc1JMW0gDb6nnDlFdsDJHRERERBQkfFnNUpGdsG79CnJpYf13iOqk1pW5559/Hr///ju0Wi2ee+45WK1WTJ06FQ6HAwMGDMD06dMBABkZGdi8eTMkScILL7yAnj17BqzzRERERETkO3WYZTWlOWfuYdh2rYSUkAwxLKZhOka1Uqswt2vXLhw+fBiff/451q9fjzfffBMFBQWYOHEiBg8ejDvuuANbt26FIAjYvXs3li1bhi1btiAjIwMfffRRoD8DERERERH5QPGhNKdJ7IqwcS9BCIttgB5RXdRqmKVWq4XFYoHD4UBpaSkEQUBWVhYGDx4MQRCQnp6OTZs2YePGjRg6dChEUcTAgQOxZ88e2Gy2QH8GIiIiIiKqQZnFjr1HCgBUPWdOcbj+VhfD46qt3lHTUKvK3MUXX4zOnTvjb3/7G2w2GxYvXqxW4gAgKioKx48fBwC0b98egKuUGx4ejqKiIiQkJPh8r7i48Np0kVqYhISIxu4CBRk+c9QY+NxRQ+MzF1xW/3oMiigiLEyP+LhwxEQavN5XnHaceGcKIvpchZjBY+qlD3zmAqtWYW7FihWw2+1Yt24dsrOz8dBDD8FkMkGWZYiiCKPRiNjYWAiCgMJC18RJRVFgMpkQHR3t173y802QZR9malKLlZAQgby8ksbuBgURPnPUGPjcUUPjMxd8jEVlKC11Vd4KCkvhsNq93lfsFggdU2EJbVsvzwafOf+JolBtcatWwyxLSkoQEuLaBd5gMMBkMiE1NRWbNm2CoijYsGEDhgwZgiuuuALr1q2DLMv49ddf0bt3b2i12tp9EiIiIiIiqjXP6XJiJUMoBa0BhoG3QtO+VwP2iuqiVpW5kSNHYuLEibjllltgs9nw5JNPok2bNnjiiScwZ84cpKWloV+/fgCA1NRUjBw5EqIoIiMjI6CdJyIiIiIi33guflI+zDlOZEEIiYIU36mhu0V1ICi+LGnTiDjMkliSp4bGZ44aA587amh85oKL2erAxt2nUWZ1AACuSesIg85V11EUBWVfTYegDUHoyGn11gc+c/6raZhlrfeZIyIiIiIi/+UWlmHvkQKk92kHUaz/FSMLii34afdpr2OelTlBEBA6YioUC4NWc1OrOXNERERERFQ7u//MR1GpTa2S1TeLzVnhmDtEKooMABD0YRCjEhukPxQ4DHNERERERH5QFAVyHWYqaSRXkHI45UB1qVpaTcU/+d2VOfveH1D2zWwoNnOD9IUCi2GOiIiIiMgP63acwvJNR2p1rdnqQNH57QEaKsxVFjvdoywFXQgEQwSgNVRyFjV1nDNHREREROSHkjJXGDNbHQjR+/fndGGJVf25suGP9aGy9Q6F82lO2+1yaLtd3iD9oMBjZY6IiIiIqBZqE8bcQywBwGiyVnNmAHlkudhIA/qntILisMFxbFelQY+aD4Y5IiIiIqJa+HHXKZzKM/l1jdNjy60/TxbhRK5/19eG5/y+iBAt2ieEw35gM8yrX4ecV7vhotQ0cJglEREREZGPyleyzhVZ0C6h6n3AynOW2z/ZaLKiQyvfr68Nzy6rwytThkAMi4HUKrle7031i5U5IiIiIiIflR+VKPi5TZzT6d2AILgqZ/U53NGz5VPnXJVAQdRA06lPvd2TGgbDHBERERGRj8pvSXD4dLFf15evzCkKsHrLcfxYblPvQPIMik6bBWXLX4Dj1L56ux81HA6zJCIiIiLyUfkw5v/13tsRyLICq90Jq73+VraUPfpssBdDsZkhaHT1dj9qOAxzREREREQ+kusa5soNs/QMcflFFsRFBX6/N89qYpk+HqFjnlXnzlHzxmGWREREREQ+qmlu2++H87Fqy/Eq3y8+v0edm81+oVK3MSvwQy1lRUHWn/kAgAjzGfTsEMkg14IwzBERERER+cjurBjmPAPeoVNFsNgcVV5/+lyp12tHuWGXgbYp6wxkRYEo25B64n9od2hJvd6PGhbDHBERERGRjyqb26YowDmj2avq5nB6hzSnLHu937dbgut4JeEwkAqKLQAAWdDiYNIt0Pe+pl7vRw2Lc+aIiIiIiHxktbnC3FX92uOH7ScBACVlNmz6/YzXeXaHDI10oW6y88A5nPTYYLxj6wjsOJCHknLDLmVFgVhuGOSZ/FJoJRHx0SG177ggYMDQdA6xbGFYmSMiIiIi8pG7MqfXSuqxghJrhfPKr3rpGeQqE6p31VjKLBWHaG7Zd7ZCWPRH+4Lf0Onc5lpfT00XwxwRERERkY+c54dPajQX/owurCTM+bvqZZnVFeJ2HsyrUzue8oxmAECU+SSizCdYlWuBGOaIiIiIiHzklBWIogBREDCgR2sAgNFUSZirYdXL8kTRFbQc5ebQ+duOpyKTawjn3nY3Ir/3HbVuh5ouhjkiIiIiIh85ZQXS+eDlrs4Vl9oqnOdvRS29d1sAQIeEcK/jnitl+hvsZFsZtI4yRIfr0ad7W7+upeaBYY6IiIiIyEdOpwJJdP0JrRGrHrZYPsxFR+jVny/uHOv1XlSYDobzc+aEcn+dezZjq2QlzeoYDq3DZYfm4oqUCGg1/LO/JeJvlYiIiIioEss2HfHayDu/yIKjOcVqqPKcN5fSMcbrWme5KprdY3PwxNhQAEBEqA6AK7C5V7BUym8759GMeyVNX+XH9MKZtldBDIn06zpqPhjmiIiIiIgqoSgK8oss6uujOSUALgx31HpsPRAeqvW6NuvPfK/XnvvOuVfC7NMlXj3mHrrpLLeJuOfQSouflTmjGIfipHS/rqHmhfvMERERERH5oPxikJ77yHkGOwAotdhhtjoQotdAURRY7U4kJUaiU2IEdOfDnCRdaNDddvmpduc8wqSvlTnFYoJ1xzI4HJciNIpz5VoyVuaIiIiIiHxQPsx5hjFJFNC9QzTCQy5U6Fb/dhwn80w4da4UAHDqnAkxHnPnRNEzzAmQRKHCXLu9RwrUn3MLzT7105HzB+z71wO2UoQaWLtpyRjmiIiIiIh8IMA7zYke6U6SRPRIisWw/h3UOXEAcLbArG4Ebnd4D6F0X+1esVIQBBw8afQaktk6JkT9+WSeCT9sP4kyi73afmqT+sE5cjZK9a3UzcipZWKYIyIiIiLygcPpGuboHibpSfJc2bJcBS/sfLXu0ovivY675861O78dgTvE7TtaiHNGsxryQjwCWUmZTZ27VxnFWgpZUZBv03jdg1omRnUiIiIiIh+cdPyBbY4duK3zrRXe03gMufSs2Ol1F2oncVEGr2t0WgnXD+rkNfcOAA6fLsLh00VoFRMCvVbyag8oFxw9yOZilH42BWc6XYN92ktc/eKWBC0awxwRERERkQ/ahbfBgXMJ6BgXW+E9ve5CBcxz3tvZAjPOnCsDUHkI02qqrpx5zpFLiA5BntH1WpIqD2iCKEHbIx1HTW3UY54hk1oeRnUiIiIionLMVkeFY6dOSOgmDapQKQOgbiQOADkFZerPJWU2lJ6f41ZVRa0qnvPdIsN0HveqvB1BHwbDwFtRpr8wnFMj8s/9loy/XSIiIiKics4WXghkiqLgx2NbUaK4946rXbXL3zBXdj5Qhhq0Xitplm9HsZXB/P2bkI05FdrQaFiZa8kY5oiIiIiIyjFbL+zpVmIpw9Ijy3DcmQXAe4uCtvFhSG4b6XVtqMF7A3E3qZZDHmMi9F4raQrlKoOy8QycZw9CsZq8jndqHeFVMaSWh79dIiIiIqJq/HJ6O+yyDe3Fiyu8N6BH6wqrVA7r177Sdiobnunp8kvbVHpcFID84gubh7tXuXSTWl2EsHEvQ2rdxfs6PyuB1PwwzBERERERVUFRFPya+xvahrZFlNjKp2tEUcDfB3eucLx8Ra28+KgQdGkfVbE9QfDae86d5WRTPuwHf4aiKBA0ugrXdW0f7VN/qflimCMiIiIiKsdd/TIqOcg15yLW1q3Ce9URRaFWG3ZXVr0TRO/tyhW47m/7/XtYNn0ExVxUaVuhBi5c39LxN0xEREREVI47r5lRhEhtJFopF114z8c2DHqNuoiJrypbJKV8wHP3TZ92C7TdBkMMjfZ4z/Vm2/gwv+5LzRMrc0RERERE5aihSEzBoxc/CklwLWrSpX2UzxW3GkZVVnGN66KocL16TBS9A6RgyoVit0AQRUhxHb37ff7fqLCKwy6p5WFljoiIiIioHFkBrEoZdAgBcGFj716d43xuw11RG9QrEa1jQn26xl2Zs9ourKbpVZlTZERtfQ/m7CiEjphasd/nNyzn4ifBgZU5IiIiIqJyDp0yYqtjKfY5f4TTY/ERf/ToFIOwEC1iIwx+X+sZxnRaCQnRIa4XgoiiXjdB1//GSq9zVxRrWmyFWgaGOSIiIiIiD19vPIx85QTMKEGc2B5Zh1ybhVe20mR1YiMNuLp/B2g1vv/JbbO7KnIdW4WrxxKiQ3Bx51gMvdS1mqYt5iJo2nSv9Hr5fO6saRsEahkY5oiIiIiIznNXtk7Ie6FDCFoJnWE9H7Dio0Lq/f6W8/cy6CVIkutPdY0kAOZiiN9MR2JRVrWraZ4tLAPgmmdHLR9/zURERERE5ykAzEoJzinH0U5MgShcmC+naYB5aEmJkdBqRLSOCVVDmyQKEEQJUuuuKNEnQq5mOc0dB/IAAE6nr2tuUnPGMEdERERE5KYAp+U/ACgY0n6Q11vuSll9ionQ4/pBSQjRa9Du/PYCOq0EwRCOkGHjYQ5tDdmHfe7c1URq2RjmiIiIiIjOkxUFSWIf9JNGoEN0gtd7Gqlh56H16RqPa7rrYF2bCdlcDMA1F06ppjTnXvjEl8BHzR/DHBERERGRB0nQIFZsh5By+8lpGqAy59UPUYRUcgrO3MOA4lrZRBSFaodZtolzbYHQvUN01SdRi1HrJ3L9+vX4xz/+geuuuw4///wzsrOzMXr0aIwYMQLPPfecel5GRgZGjBiBUaNGYd++fQHpHP0mPgAAIABJREFUNBERERFRffg4ezFOydkAKlbiGjrMAYD2ojSE3ZIBMdQVzgSh+qqborg2HNdqpCrPoZajVpuGWywWZGZm4pNPPsHRo0fx22+/Yf78+Zg4cSIGDx6MO+64A1u3boUgCNi9ezeWLVuGLVu2ICMjAx999FGgPwMRERERUZ3llJ7Fb2e3o4uYBgDQa70DkdSAwywdOQcBpx2adj0haHTq8ZqGWTplWd14nFq+Wv3nhZ07d8JgMOChhx7CxIkTcemllyIrKwuDBw+GIAhIT0/Hpk2bsHHjRgwdOhSiKGLgwIHYs2cPbDZboD8DEREREVGdbTz1KyRBQjsxBQCg1YhI7Xph3lxD7t1m27EMlk0fQZG9FzIRBcGrMnfghBFfbzysrnzpcCoMc0GkVpW5/Px85OfnY/ny5di0aRPeeOMNhIeHqxMuo6KicPz4cQBA+/btAbgmY4aHh6OoqAgJCQlVtl1eXFx4zSdRi5eQENHYXaAgw2eOGgOfO2pofOYusDis+O3sDvylXR/EmKIRFa5Hq1aRaNUqEhq9BodPFTXo9yXf9iScJfnQxnrPfYuMNCAiwqD2Zc2OUwgL0yM2LhySKMDqVGCQxCb7u22q/WquahXmIiIikJycDK1Wi6SkJJw+fRomkwmyLEMURRiNRsTGxkIQBBQWFgJwbcBoMpkQHe3fZMz8fBPk6mZ5UouXkBCBvLySxu4GBRE+c9QY+NxRQ+Mz5+3n01tRZjejX0xfHDhrRZc2F76fdjEhaBcT0iDflzP/OMSYdhBECUAEUO6epaVWFBVbkNw6DP/P3n3H13Hdd97/zNze0HsnQbBC7GIn1SVLtizZceIo0Tqxvc6mbJJ1eSQ9ayfZbGyvHtvrOFvSHe/G2axrZMlWJFmSRYmU2MXeSZAAid7b7TPz/HHJS0IsIkGQBInv+/Xyy8CUM2cuhtD8cH7nd9wuk9HRBAA/f+cEs6rzGB1NEPYFJ+XPVs/c1TNN47KDW+NKs5w7dy6HDh0ikUhw/PhxamtrWbRoERs3bsRxHNavX8/atWtZt24dv/jFL7Btm82bN7NgwQI8Hs+4b0ZERERE5HooDhSwumI5dZE6IFNo5Eaz48NEX/gvJN7550sfYztE4ym2H+4as721e4QdZ7bNrFIly6liXCNzxcXFfPKTn+SJJ54A4Ctf+QqmafLMM8/w9a9/neXLl7NkyRIAFi1axGOPPYZpmjz77LMT13MRERERkQnSkF9PQ3490XgaAIMbH82Z/gj+dZ/EVTztfY/tGYhfsG1wNFObwtEac1PGuII5gCeffJInn3xyzLbnnnvuguOefvppnn766fFeRkRERETkutrdvY+aSBX5/jzg5gRCTjqB4fbhqV922eOyi4JfZhqSQrmpQ4uGi4iIiMiUFU1F+c7+/8tLJ18HzgVCNzLN0uo+weg/f4F0x5ErPudya80V5vgnoltyC1AwJyIiIiJT1paOd0nZKdZWrgAyi27DuRGwG8HwhXCVz8KVX/n+x75Pt+bWFWBqaYIpY9xpliIiIiIitzLHcdjQupm6nBqqI5XZbcANnTFn5pQQeODfX9Gx7+2X22WStuxzbd2Myi1y02hkTkRERESmpKMDx+mMdmVH5QBOdY1kvrgBMVG6eSfxt/4XTjox7jbeu0C4YrmpRcGciIiIiExJp4bbiHjCLC5ZkN125NQAcGPSLK2+01g9J8C4ilfy8/rVMxDDsh2mV+TicZtndiuam0qUZikiIiIiU9J9NetYW7kCr+vCdZBvREjkW/Qo3vkfwLjI9S/l/H5t3NsOgMdlcLa4paNallOKRuZEREREZMqJpzPrtHld3ovuP38e2kRLHd+K1XcK4KoCucwJF24yTYOcYKads+vkydSgYE5EREREphTbsfnylm/y/PGXLnlMLHF9giLHSpPY+gOS2y9cn3m8XKZJXVkOgCpZTjFKsxQRERGRKWVfz0H6EwPURqoueUw4cJUjZlfIcLkJPv7H4z//ItsGR5MsbCgkGk/RUJ03/s7JLUcjcyIiIiIypWxo3UyuN4c7iuaO2R6Np4BMIFdRFJrw61pdTTiOgxnIwQzkTFi7nf1RXKbJnLoC3C693k8l+mmLiIiIyJTRE+vlYN8RVlcsw2W6xuw70TEMQNpyJrwqpNV9guhP/ozUwTeuqZ2z/SrI8We3zazSaNxUpTRLEREREZkyNrZuwTAMVlcuv2Df2fDt7kUVE35ds6gW39rfwDNj5YS0N6+uAL/PxcGT/UyriExIm3LrUTAnIiIiIlPG/bV3MS23hjxf7gX7LNvB4zbxeyfuFdlxHEgnMTw+vHPuvub2zgacDg4hv4els0uuuU25dSnNUkRERESmjLAnxILixovuO946SCo9sUsSpI++w+gP/yP2cPfENKhilXIeBXMiIiIiMiV8//Bz7Onef0OvaeaV46qYjREqnNiGtTa4oDRLEREREZkCWkfaeat1E4WBgksekxf24fe6Lrl/PFwl0wmUTJ+w9gwNzcl5NDInIiIiIre9ja2bcZtuVpQvveQxacuesNL+iV0vknj3eRxnYtM2z9LAnICCORERERG5zcXTCbZ2vMuSkgWEPZdePy5tObhc1z7y5TgOdn8bdn87hjGxr9tVJZn+h/zXZ1FzubUozVJEREREbmvbOncStxKsrVxxyWPiyTTJlIXfc+1ploZhELjnMzhW+prbeq/a0gjVJWFcpsZkRCNzIiIiInKbi3jD3Fm6iLqcmkse09I5gu04VJWEr+layX2vYY/2A2C4Jn7cxDAMBXKSpZE5EREREbmtLSxuZOElliMASKVtDpzsw+dxEQl6x30de6SXxNYf4MSH8S39yLjbEblSCuZERERE5LZ1qO8otTnVBNz+Sx4TT2bSISuLr21UzgwXEvrYlzFCl66YKTKRNEYrIiIiIrelkdQof7XnO/y06ZXLHhdLWgAU5PjGdR3HsbE6jwFg5pRcl/RKkYtRMCciIiIit6XN7dtJ22nWVCy/7HHtPaMAeMa5LEH66DtEn/8y6fbD4zpfZLz0ZwMRERERue3Yjs2G1s3U59ZRES4bsy9t2ZimgWkYZ451MA2DkvzAuK7lnr4Mn5XGVTbzmvstcjU0MiciIiIit53DfcfoifWytnLlBft+9s5JNu3rACCRtGjuGMbtNjGMq1tjzrFSOFYaw+3FO+fuqz5f5FopmBMRERGR287RgSbCnhALS+4Ysz1t2QB0D8T4yYYmdhzpAsBtXn0gltj2Y6I/+TOcdOLaOywyDkqzFBEREZHbzofrP8C91WvxmGNfd5vahsZ839UfA2DN/PKrvoa7bBaGy4PhHl/hFJFrpWBORERERG4raTuN23QT9oYu2HfgZN9Fzwn4rv612F23CHfdoqs+T2SiKM1SRERERG4blm3xnzd/ndda3rxg39t727Nf54V91JXnAFBRFLri+W6O4xB/89ukjrw9MR0WuQYK5kRERETktrGn5wC98X5KAkU4jkPPQAzbcXAch+6BWPa4uxZWkBvyAuA4V3GBdBJ7qAs7OjDBPRe5ekqzFBEREZHbxobWTeT78mgsmkP3YJx39rbTOL2QkH/sa69hGNhnojjXVRQ/MTw+Ah98ekL7LDJeGpkTERERkdtCZ7Sbw/3HWF2xHNMwGY4mARiJpegeiGePa6jOA6A0P4jf62ZmTd77tu1YaRLbn8NJxjBME8PUa7TcfBqZExEREZHbwsbWzZiGyaqKZfQOxtl7vBfIjLxZVmYU7q6FleSFM+mV4YCHDyyvuaK2rfbDJHf+FFdxHe5aFT2RyUHBnIiIiIjcFu6qWkV1pJJcX4SfbG3Kbm/vjRKNpwgHPORHxreMgLtqHqGPP4uZUzJR3RW5ZgrmREREROS2UBQopChQiPOeiibReAoAt+vqUyPt6ADOaD+u4mkK5GTSUbKviIiIiNzynjv2IscGTgAwGk9f9JiUZV91u4ktPyT64tdwktFr6p/I9aCRORERERG5pZ0abuW1ljfJ8+UyI28aiaQFgMdtEgl66RvKFD+JXSLIuxz/yiewGlZieIMT2meRiaCRORERERG5pW1o3YTH9LC8bAntvaP0DycAWDmvLFvREqC8KHTFbdqj/TiOjeEP465qnPA+i0wEBXMiIiIicsuKpWNs69jJ0tKFBD0BthzoZN+JTBVLt9ukIOLPfO0yWdRQdEVtOskY0ee/TGLjP163fotMBKVZioiIiMgta0vHuyTtFGsrV1ywz+MyWTq7mMMtA8ypy8d1pWvDefx4FzyCq6h2gnsrMrEUzImIiIjILctrelhQNI/anOoLqlh6PSYu06RxeuEVt+fYFobpwjvvvonuqsiEU5qliIiIiNyyVlUs47fm/wYAvYPx7PZZNVcxEneG1dfK6Pefwepqev+DRSYBBXMiIiIicks6MdiMZVvZ76OJTLXK+5dWM6c2f1xtmuFCjHDBhPRP5HpTMCciIiIit5yh5DB//u5f87MTP89uG4llFgd3mca42nQVVBJ89BnMYN6E9FHkerumYK65uZlFixaxd+9eDh06xEc+8hEeffRR/uzP/ix7zLPPPsujjz7K448/zoEDB665wyIiIiIim9q2YTkWy8sWZ7cdOTUAZCpXXo3Uie0ktv4Ix776dehEbqZxB3OWZfGlL32JvLzMXy6effZZPv/5z/PCCy9w5MgRtm3bxvbt29m9ezfPP/88Tz/9NM8+++yEdVxEREREpibbsXm7bQsNedMpC5Vi2TZpy87u97ivcq5c5zHSrfvBef9jRSaTcVez/Ku/+ivuu+8+Xn/9dRzHYc+ePaxevRrDMLjrrrvYuHEjAPfeey+mabJixQp+7/d+j2QyidfrnbAbEBEREZGp5UDvYXrj/TxW/wgAP337JABFuQGccURk/hW/ipNOYLhU6F1uLeN6Yvfs2cPOnTv5+7//e15//XWSySThcBjDyOQn5+bm0tLSAkBVVRUAhmEQDocZHBykuLj4iq9VWBgeTxflNlNcHLnZXZApRs+c3Ax67uRGu1WfuaPNx8j153D/nBXEkw6hkA+AWNqmpixyxfc1tOs1AnV34MkrBW7Nz+JWc6s+c5PVuIK5l19+mYGBAT7xiU9w8OBBvvrVrzIyMoJt25imycDAAAUFBRiGQX9/PwCO4zAyMpJNy7xSvb0j2LbGvKey4uII3d3DN7sbMoXomZObQc+d3Gi38jP3eM2HWFeymv6+GK9tP8XomcInAC47fEX35cRHGHntH/HUL8e/5hPXs7tyxq38zN0spmlcdnBrXHPmnnrqKX784x/z3e9+lzlz5vCnf/qnLFq0iI0bN+I4DuvXr2ft2rWsW7eOX/ziF9i2zebNm1mwYAEej2fcNyMiIiIiU5vjOBiGQWEgs3xALDG2aElBju+K2jH8YUIf+U/4ln98wvsocqNMWGLwU089xTPPPMPXv/51li9fzpIlSwBYtGgRjz32GKZpqgCKiIiIiIxb2k7z1a3f4v6au1hVcScA1nsyuHJCl6/N4DgOVvth3BWzMXOufOqPyGR0zcHcd7/73ezXzz333AX7n376aZ5++ulrvYyIiIiITHG7u/fRGe0i13fhvKui3ABz6/Lfd1mC9LFNxN/4WwIffAp35dzr1VWRG0Ile0RERETklrChdTOF/gJm5MwgGk8TTZybK1deGKQgx/++bbjrl+F3bFwVc65nV0VuCAVzIiIiIjLptY92cnSgicfqH2bT/k4GhhP4vZlX2byIj+kVOZc930nFwTAw3D48M9fciC6LXHfjXjRcRERERORG2di6GbfhYmX5nQwMJwCIJzPFTxbPLM4ukXUp8Y3fJfqTL+NY6cseJ3Ir0ciciIiIiEx6y8oWUxYqJeINA11j9rnN9x+f8DSsxC6q1cLgclvR0ywiIiIik15tTjW1OdU4ztjqlQtmFBH0X/qV1nFsDMPEXdUIVY3Xu5siN5TSLEVERERkUvvXE6/SOtIOQDxpZbfXlecwrfzSc+UcK0X0ha+SOrzhuvdR5GbQyJyIiIiITFrNQ6d48cSrhD0hKsPl9A3FAVjUUEx1afjyJ6eTGN4A+EI3oKciN56CORERERGZtN5q3YTX5eXOssUAbDuUmS9XlOfHfJ+iJ4YvROADn3vf4igityqlWYqIiIjIpBRNRdnRuZs7SxcRcPsZiWXWlfN73QR9lx6TsEf7ib/5bZzEqAI5ua1pZE5EREREJqXNHTtI2SnWVq7kJxuastsXzCi8bJBmdR4ldWIH3gWPYCjFUm5jCuZEREREZNJxHIfReII5BTOpjlSwg3PBXOAyo3IAnunLcFc1YniD17ubIjeVgjkRERERmVQGR5N098ewOqbzaMMy7PcsR5Ab8l70PKvzGI7j4C5rUCAnU4KCORERERGZVN549zQjTh8h8jndPUrPYAKAyuIwd0wvuGSKZWLbj7FH+wn98lcwTNeN7LLITaFgTkREREQmlYQzyub0j6g3l2IMLM5ub6jKxe+99Otr4ME/wI72K5CTKUPVLEVERERkUmm1D+FgU2JOz27LDfvIC/suerzVfQLHtjG8AVx5FTeqmyI3nUbmREREROSmO9Y6iGXZzKjKodU+QLGrmoU1dcyrK2A0nrrkUgT2cA/RF76Cd/7D+O78pRvca5GbS8GciIiIiNx0+5p6cRyHg7EdxBnl7qIHmVdXAEDI77nkeUa4EP+6T+GqarxRXRWZNBTMiYiIiMik4GCztW0XhUY1q2oWvP/xySiGN4inYdUN6J3I5KM5cyIiIiJyzQZGEozEUuM6t2O4h5STwDRcLHY9wiLXwxSEA5c9J9W0ldHvPY3V1zqua4rcDhTMiYiIiMg1W7+zlde2n7qqc2KJNPt7DvPstr/gkLUBAI/hxzDMSy4/cJaroBp33SLMvNJx91nkVqc0SxERERG5Jomklf36JxuaWD63lAMn+1k6q5jci1SgtB2H/Sd6ea1lPcfsrYQpYLprKXlhHwMjCWrLIpe8luM4GIaBmVeOf92nrsv9iNwqFMyJiIiIyDU51NI/5vstBzoB6BmKXzSYO93bz4+bf0C3c5IyYwZzXXfhMjyUFgRZOruEkP/Sr6jJbT/CSSfxrXwCw1CSmUxt+hcgIiIiItekrXf0otsHhhO8tLmZ9vP29w7G6RoYYdjpYZa5ikbXfbgMD8vmlDKrOo9wwHPJFEvHcXDSSUinFMiJoGBORERERK5RWX7wottPdY2QSFnZkbr9PUd4a/dpTrenWeX+OP9u9aMYhoHf66asMIhpXn6enGEY+Ff9Or61n5jwexC5FSmYExEREZFr4nGbuF0my+eWMqc2H4Cq4nB2v+3YfO/g8/zlnr/ntH0QAL/Hh8/j4vG103lwWTXmZQqeOI5N/J1/xh7oANConMgZmjMnIiIiItfEsh1cpkF5YYjywhCzavJxHIfuwRgub5K3Bn5Gf3s71WYjleZsAO5fWp09/3KBHIAz1EXq6NuYeeV488qu672I3EoUzImIiIjINUmlbdyusaNlhmEwe7bB3+39PsNOlEbXvZSbM1kyq4TqkvAlWro4M7eM0K/8Fwz/patcikxFGqMWERERkWsST1r4vK4LtpuGQcAT4HOLfpdycybAZStVvpeTjJE6vjXTViDnfdeeE5lqFMyJiIiIyDUZiaWIBDwAJK0U2zt3AVCbU80Xl32WaflV2WMDvisP5pL7XiX+i7/OzpUTkbGUZikiIiIi4zYSSxFPpomEvPTE+vi7vf9I60g7FaEyKsJlmGeKlTy8vJa+4fhVBXPehR/CVT4LU/PkRC5KwZyIiIiIXLXOvih5ER99Q3EAuq1m/mbbj3GA357/m1SExwZgPq+L8sLQFbVtD/dg+EIY3gDu8lkT3XWR24aCORERERG5KpZts2l/B5Ggl8qiECetnbx2bCsV4TI+0/gJioOF427bcWxir/53cHkIfviLmicnchkK5kRERETkqti2A8BwNMmhliQ+I8TS0kX82uyP4nV5x9Wmk04CYLi9+Fb+GlgpBXIi70MFUERERETkqtg2DDu9dNrHASg3Z/Kb83513IGcHRti9HtPkTr4BgDu8lm4qxonrL8itysFcyIiIiJyVbZ17mRr+jmOWpuxHYuls0uuug0nGSPdcRTILDvgnrECs3j6RHdV5LamNEsRERERuSKWbfEvx37G+tNvk2eUM9/1ANUluVQVX90i4ADxjf9IumU34Sf/HMPtw7/iV69Dj0VubwrmREREROR9xVNJ/nzH33A6eopFeXdSMLKQJTPLqCy+sgqVTmKU5N6f45l7D2YwD++iR/E2PoDh9l3nnovcvpRmKSIiIjLJJJIWJzuGcBzn5vYjZbHtUBfJlMXOI3144iUs8j3AvWUPYRouygqCuF1X9jrpxIdJ7vwZ1ul9ALjyK3CVKK1S5FpoZE5ERERkkjlwso/mzmFyQz7yIzdv5Kq5Y4hNHZsZcqbhxPKY4boTbNhzvAcAj/vygVxi249xUnH8q34dM7eM0K99AzOUfyO6LjIlKJgTERERmWT6hhNAZj23m2UwGuX7x35Eh3MUq3+QGc6aMfuL8wKY5oVLBzjxEQx/Zg6dk0pAKoHjOBiGoUBOZIIpzVJERERkkkmkLAAs6+akWXZFe/iv7/4lHc5R6s07qUuvwrId8sLnRglXNZZdcF765E5G/s9/wOprBcC38gn8d31K68WJXCcamRMRERGZZM7Oldu0v4PH197YeWWnhzr41s6/xHZgkeuDFJnV2X2zavIYGEmSSFnZAM0e7MBxbFx5FbjKGvDMvhvDFwRQECdynWlkTkRERGQS6B9OZEfkzPOCoJe3tGDbDgMjCXYe7ca+zkVRdu6NUmHO5uGCX6c+Us9Dy2qy+8oLQ8ypzWfhjCIAHDtN9IWvktzyQwAMfxj/6ieVTilyg2hkTkRERGQSeHNXKz6vi4eX147ZHk+m+dmmk9h2JoibVp4zJt1xIoymovzo6As8Vv8wlg3TWcHoIJTkuwj43Ny7pIqz4aXVd5r08S14l34Uw3Tjv+93MPPKJ7Q/InJlNDInIiIicpOdTatMJC1+sqEpO0J31tlADuBE29A1XSuVtkilzxVWOTXcxv+37b+xo3M3zUOnxhybG8oEjTlBL5GgFwCr4wjJfa/iDGcqWror5mAG866pTyIyPgrmRERERG6yi6VOhvyeix7b3DlM2rryKpfvXavuxU3NvLgpM9K3pX0H/3XH/8ByLD67+HdYUNw45thI0IMdHyb60jdJNW0DwDNrLeFf+6+YOcVX3AcRuT7GnWb5N3/zN7zyyivYts0zzzxDXV0dn/3sZ4lGo9TV1fGNb3wDj8fDP/zDP/Dcc88B8PTTT7NmzZr3aVlERERkajl/5O2smtIwRbkBNuxpu2Df4EiSwlz/+7bbP5zgzV2t3LWwkraeUfxeV3bfj3e/zg+P/JiGvOl8uvFJIt7wmBG7sJmgqiSM4TiQimf+BxguD7guHmiKyI01rmCus7OTH/3oR7z00kts3bqVb37zmzQ0NPD444/z8Y9/nKeeeooXX3yRZcuW8f3vf5/nn3+ezs5OPvOZz/DKK6+ospGIiIjIeayLBHPAJQO2LQc7eWRF7UX3nbXneA9NZ1IymzuGaWrvZ8DpwMGm0Kwm1VPKY9Mf5r6adbjMTJD30pZmANbE1+PvOYCx8lkM003g0f9X728ik9C4gjnTNHnmmWdwu914PB4Mw2DDhg187nOfA+Cee+7h9ddfJ5VKsXLlSvx+P7W1tXg8HlpaWqitvfwvHxEREZGp5GIjc+Ezc9QuxnEcdh/rYXZtPj6P64L9tuPQ1DZE2knR65xi3+kTdDvNpEmSZ5RRaFaD7WFN2RpcpgvHcbBO7YW0D0wPRs1CvOXVcKZbCuREJqdxBXPFxcXcd9999PT08LWvfY0vfOELfPrTnyY3NxeA3Nxc+vv76evry24DyMnJob+//6qCucLC8Hi6KLeZ4uLIze6CTDF65uRm0HM3dfUMxAiFfKxoLKeiKASAz+vCMAxCZ4qQ5Ed89A8nyA15GRxN0jWUoGtvB7/20OwxbY0kRsHyEAr52DTyCp3WCbyGnwpvPWXueko8NTTWlXKouY+3D3QRDnp4qN6h9eVvUlvzYbpKljNr9ToFcHJd6PfcxBr3nLmmpiY+//nP88UvfpGlS5dSVFTEwMBA9v8LCgooLCykre1cnvfg4CAFBQVXdZ3e3pGL/rVKpo7i4gjd3cM3uxsyheiZk5tBz93Udriln9HRBIZlMTwUA+Ds07BsZhG2A7lhLzjwwtsnxpx7qrWfgVQfvzi2g9bkcVpGTvPUgi8wOppgYWQ5tWX3km+W8+6RHu5prCQc9OA40LVzH1Z0mLb8xfxTj8Gc+Z/kZLKCuSUhenpGbvAnIFOBfs9dPdM0Lju4Na5gLhaL8bnPfY5vfOMbzJgxA4B169bx6quv8sQTT/DGG2+wdu1ali1bxt/+7d8Sj8fp6OjAsixqamrep3URERG5Fqm0zf6TfRTl+KkqCdM7GCc/4sM0NdIyWaUsG5dpEA5cWFgk9/w15c77Efo8LjoTbXxl6w/pS/YCkOcq5pG6+9lxpAfwsrxuNqX5QQCqSiIYjoNhZoqZF/XtwpUYoi1vETawP1UNBhTlBq7XbYrIBBtXMPfCCy/Q1dXFH/3RH2W3fetb3+IP//AP+d73vkddXR2PPPIIbrebJ554go997GMA/PEf//HE9FpEREQu6cVNJwE42T6EYRpsO9jJrJp85tTm39R+yaXZtoPLdfkVo1J2miP9x+jL3U2lv44VFQt56d1BSPlZlnMv3mg5ASNCcSLM6VRmZO38xcXtll3EN/xvgh/9U8xgLsfrPspQ3IAz6ZRBn5t40iIvfOm5eiIyuRjOexcfmWSUZikakpcbTc+c3AwT9dzZjsMLG09csL26JMKSWReuC9bSOUxz5zBLZpa/bg8qAAAgAElEQVQQ8Lk0T+om2Xmkm66BGA8tG5vB5DgO2zt3sbtnPwd6D5GwkvhcXh6uu597qtbxs3dOXrLNh5bV4B1uxfAFMSPF2AMdJLb+EN+Kj2PmlGB43Pz8nRPkhLx4PSaLGrRunFxf+u/r1bsuaZYiIiIyOaVSF19MuncwMw/LcRyGYyksy8Gybd490g3Az7e1MLsmn9kavbspLNvJpsH2xwdoHWmnsWgOhmHwast6hpLDLC1dxILieczMq8fj8lywGDiAyzSwbIeHltXgN5KMPP9lPLPW4l/zCcy8MgIP/n722KK8AA/cWX3D7lFEJp6CORERkduA4zi8tKWF/IjvovvjKQvbcXjj3VaGo8mLHnP41ICCuZvAtm2O95+mM32CHdv+hVPDrXhdXr625k/wuDz87oJPkeONYBpj0zDPH0UNBzwsmFGEu2Ur9J4k4PsNwE3gwd/HVVJ/g+9IRG4UBXMiIiK3uM7+KJv2dWS+7osCsHRWCd0DMSzbwXYc2npGaesevWggV1EUoq1nNLPWmG3jMi8/d0uuzNBokvbeUWZW512QvmrZFoZhYBom/3fPy7wTWw/AtEAtj9c/wvyiuXhcmWIoeb7c9zY9hic9yroFc/F6XCSO9ZEeaMaxUhguD+7q+dfl3kRkclAwJyIicgsaiiZp7R5lekVONpA7X1lhkKqSzDyLU10jtPWMsv1w15hjivMCLJ9bittlsvlABx29UTbt62TN/PIbcg+3u7f3tpNIWdSV5eDzukhaSQ72HWFP9wH29h5gVc4HYKgEnFLmuNZxb/0S5lZd3WefP9rEwpZ/xpj9NJTPwrv4UbxLHtfcR5EpQsGciIjILejY6UFaOofpGYiN2b5kVgkG4D6vMuJ7y917PS6SKYuls0uyxy2bU8oLG0/QMzi2PRm/RMoCoHtkkJ+dfoFDfUdJ2SkC7gBz8mcx1G+QY0DIyKc4UMKcyrL3bdNxbKxTe8Dtx10xm8FANacKljE3UgSAYerVTmQq0b94ERGRW0wskaa1ZxSA3qE4AOWFIZbPLb3o8fkRH3cvqmT9zlYAHryzGsty8Hlc2WNMw6CyOExr1zAv/+Jd7llUxYiZQ8BMwsa/wzPnHjx1i6/znd0eLNvi1SPbabV7qDTnkIy7GEoOs6piGfOL5tLbFqS7PzFmzbi188svO5rmOE5mvwPxt/8PrsJq3BWzsU0Px0ofpDFceAPuTEQmGwVzIiIiE2AomiQS8NyQ9LbugRiWZeN2maStTPXKnNDl1wY7u96Yy2Xidpm4z8VxpI5txvD6qShqoLVrmOVNf01ndCnv5t6PCawdGabrVBt1dYtxEqPEXvkLvEsex10593rd4i1pNBXl7bYtrG95h8HUIDlGMRXGbPYc7+XJOZ/CMGDPsV5iiUT2nA+urMPjvvwcxeShN0kdepPgh7+EYZoEH/k8xpmRuHULKhiJpa7rfYnI5KVgTkRE5Br1DcV5a3cbuWEfgyMJ7lpYecmqkgCt3SNsO9TFg3dWE/R7LnncWY7jsHl/JzkhL0G/m93HegC4Z3Elr247BcC08sjl27At7llchddtktj+HNhpfMt+GYDk7n/FCOWTf/c8bGy2lz9M0psZ6Yk5UX5QsoYiu5rQQIwCBnHsNJiZaNDqPkn8re/gv+tTuIpqz40gTTFvt23hh0deIGWnyDcqWOBaQbFRi9vtwrJsth7svOCcxumFlwzkrJ5mzLwyDLcPwxvEDOZBMgr+MGbuuXTMghw/BTn+63ZfIjK5KZgTEREZp7Rl09Q2RDyZBmBwJDPi8uauVh5dXTemKuTZgG96RS5NbYMA7G3qu2Rq5PlOtA/T2R+lsz86ZnvI7+HxtdMvON6ODeEMdeEqnQHA6PpvM9h3kvQD/46h4WH6RpopdVzMAoaTI3y7tpThdIzhbV9hNB2FAMw0V1FLFWkS7LF+jhsvzftn8ZHGddQ99kfnAjY7jeELYgRyMp/JsU0k332BwIeexgzlk0gkMEw3lu0Q8Llp7hgmnkzTUJ2HeQsHfbZjs7/3EKXBEkqCRVSEyrizdCEl1lxG+wMAPHhnDS6XwUubm8ece+/iqsuOpFq9LUT/5U/wrfkE3rn34pl+J57pd17X+xGRW5OCORGR8/QPJ7BMk3TKwiBTKELkUo6eGuDwqYGL7vvp2ydpqM5jXl0BtuPw1u42gGwgB9DeO8rp7hHKCoIXbeNE+xCnu0ay8+LOd9/SyuzXe4+vp7/rCNHyGYwkR+hv20ttdwcP/NJfkHYsnrIPQx6w7b+dO79mHbMAj+nBMqAsVEKDt56IN0xvj4MZKwCgyF/E0sSjtKYPcSJxkG/s2EtJsIjfnf9pioOFuEpnEPzQ09l2jUAOZkEVti/C6c5hBjb+gLKhvWyq/z0cw4XLSmCZXjr6oty18Nw93Cpi6Rib2rfz5qm36Yn3cV/NOj4640NMy61lWm4tP9nQBMDKxjKC/sxr1tmlHwBm1+RfNJBLHlwPjoN37j2YBdX4130K97QlN+y+ROTWpGBOROQ8b+5qJRTyMTqaGWH50Kq6MVUB5dbhOA7AdUv56x9OXBDIza0rwOdxsfNoN5AJ9ubW5vPCxhNApsiIfaZfHrdJKm2z/VAXHrfJb374DlJ2mpHkCEPJYVJpm33HMtUQj1vbiDr9JIiBO0nCGqbzLZvfuvuLGL4Q3215lVEnBU3H8Lt8RNx+SmeuzFzH5eHD0z9A0BMkxxsmxxsh4o2Q482kZfrdPj6/5PfG3Mebg630xxMsbCiiriwHqOVwSyN7T3biKuikyz5JgT8PgM3t2zENkwXFjfhcXtxVjbirGtmwu43eoThFgXIMLBwj84eROe0/JZDsY9v03yKRsvAkBjGCuRjm5PrDSdqyaesZJT/iIxL00twxzCunfs6h6E4SVpLpubV8uP5hFhY3Zs85+8wBlOafC9CXzcmMvsaT6TFFZ5xUAsOTScdNN+/MBnOGYeCZve5636KI3AYUzImInHE2Ve58r2xt4YMr6wA43T3CvqY+7ltSicc9uV485UKvbD1FOOCZsDXT4sk0BgY+r4vTXSPZNdsaqvMoyQtgGgaFuZm5S4YB7x7JBHT7T/Zl23hweQUtA130xHoxXDadTZmAaHv8JV79wbdJOecKYxTYuaxwPUbKHWQofRwn3YvbW0JZpIxcu5jK9mac+AiGL8TvL/wMfref3GABXteFoz4P1d17Vfc6v76IXUe7qSgMZbfNqMrlYHM/9cFG1hYsw3Um+Nrcvp2jA034XF4WlyxgedkSZuRNy44m9kRmM3v1PdS4TN7Y2UpXzlzCrszC5bFEmvTLf44RLiD4gc8CYPWdwswpxXBfvqDL9XS8bZC9x3txHIcBp4P6vDr6hhL0WaNUeuuZnbeYWUV11BVFsqm0acvGsjLB3LxpBRdt1+8999qVOryB+KZ/JvSrX8P0Rwjc+9vg0dw3Ebk6CuZERMhUIvzFjtMXbE+lbfY19dI4vTA7N+rFTc0Xnackk4ftOMSTaeLJNB19UXKC3mzK23g4jsPLW1ouum92TV72hd5xHIaSI6T9vaQjbbiHKzh2epCj1mY6nKO8umE0e16uN8Kfrf4iOw5309yRT2lykLRZR2npNOKd/SxrfYmBkiYK59/FcvsTFHRsxjN7HWZOyQV9qM6vG/e9XUx+xMc9i6vGbHOZJkGfm+OtgxxvzaSK1pXnUDvyAItrojSnDvJu1242tW9jXeVK8nxLiCXSY+YO3rekCtOsJpmyadrVyvqdrcyvvJuuEYeFyTQ+t0H0J1/GM2sN/tX/BoD06f24SqZjeAPXdE+245BIWjhOZu7e5UZsD7b0cMo6wCl7H6P0Yww8Rp5ZzixzNYZlkBqCfUO97GvqBaCsIEjXQAzbzgRz713XD86sD9eyBzO/EjOnGLNkOp6G1XB2BPka709EpiYFcyIiQCJpXXLfsdZBYkkrW9wCwLLtMcUtZHIZPa9U++b9HbhdJh9aVTeutizb5uipc/PcbMcixjAN9V6WlM/BZZpsaN3EW6c30RPrJWlnrm1gcK/73xIJ+Knzl1DmclMUyKcoUESRN4fw9p9iH32bBfWr6OxayF3NP+dIaS2nB+vw+qqxZpaweOFCPMEIkAs1H7uWj2RCWOelEQKcbB/CMAz62kP8m7W/wi83PMaLBzZT4i6mP2lRXGrx33f9LcvLlrCo5A4iwczIk9s89+9tT3oa+OHlLS3cOauI0vt+GyOUGdmyh3uI/evX8a36dbyND+CkEqRP7cFdORfDF+JKvLW7jbywj9yQN5v+Om9aAQ1VeRccG03F+NcTr7Mhupk0SUp8ZTxU/lEGTxeeOa+QAyf7qCgKkUrbdJ9ZsL2jb2xhmuK8CwMzJzZM7NX/gfeOB/Et/xVc+ZW4Vj95RfcgInIpCuZERCD7Ugbw8Qdm0dc7QiJp8dKWTBW61u6RMccPDCezKXUy+cQSY1Nm05Z9xSXzHcdhNBWlO9ZLeaiUtq4EG07uotneRcwZJk7mWXjnMNQXPENhoACv6aUoUMjsggYKAwUUBwop9EQoMvy4I4VANaPP/WdcxdPwr3kAgGg8ipNK4PO6uGdZPVuCf8RwPBMs3bO0lpxgw8R+KBOgviKXA+eljZ4V9GVeJ+JxcA1W0zsI4GC74gwmhvinQz/kB0d+wsKSO1hetoSZ+fXMrM7jyHvmHG473MPjaxdlvzcCOQQ++BRmXiZV1uo8Svy1/0ngkS/grmrEHu4m3XoAT/1yDI8fe6Adq/MY7vplGG4f8a4W/M1bOJm7gJKiHMLxDvKipxgsXAvkYXU1ke44QrxhJbmBXIzuk2w7vYlCo5q1FatZE3Zhd5/Es3Y5iaSFp/sQteGT+OZ8iGTKou/gNtzDbWy0FwJQPHSIGZEobldm5D556E3srhP41/0mZjCX4KPPYBbXTfjPRUSmLgVzIjLl9A3FOd09wh3TC7Mv9139mWBudk0+LjOzzed1sXxuKcmUnf2Lfl7Ex8BwgoPN/axqLMPB0QjdJJRM2RdsGxxNZhfOtmyL3ng/QVeQsC9I89Bpvr/vJRLGMAPJfuJWZhT2s4t/h6GRMODg4DC/dCZFwUKKA4UUBQqyRUSWly9haaAcZ3Qgu5D26HN/StIbwP3BpwBwV80bkyIZ/PB/zH4dDnh4/L65fPfF/dy/tPqiaXqTwczqPEJ+N0G/h5DfzY4j3YzGUozEUtkqjue7s3oOa6Y3cmKomc3tO3i3azfvdu3hv6z+EnPrCsC0CPv81JRG2LCnjd7BOLbtYJ75N2i4vWMWJneVzyb42JcwC6oBSLfsIfH2d3FXzMXw+Em3Hyax4X8RqmpkIAbHN73DnM6X6Y7MoaMvSs3oCRq6XmV97nzay8IcPf46bw0cIDWyiz9o/EMG9+zgqVOtbJj1KVZNq8Pe9RzJPS/hW/gIAZ+b+Km9pA6ux7foQ3g9LvKGj5E6thmmL8QwDOb6O/Cc3g9kRlHtnmacxAiObWOYZnapCBGRiWI4zntyJiaZ3t6RbA66TE3FxRG6u4dvdjfkNtHVH+WdfR1AZo2uBQ1FFER8vLS5mdqyHObXF170mWtqG2LP8Z4L2nO7TB5YWo3HbWZfQOXGcxyHhJUgmo4xlBhl08FTDCVGWd0wk7r8cn627SBN1nY8wQQDqX4Gk4M4ODS67uPeacsYposfHPsxASOHuRVVFAcLIRGkty2Ax/Djdpncu7hyzALf6bZDWF3H8S38IACx1/8Kq+Mo4V//JgCpkzswTA/umvlXdA+36u+6s8VCznf/0mps27mgBH/SSnFquJX6vDoAvrb9v2NisqJ8CcXUc7BpmAfurCZ0BQupQ2YemjPcixHOxzDdOMkYTmIEI1TAiY5R9h9tw23FSbjDYJjMrgwxEu9lfeduTjsHSRGnPFjCXVVrSHdXMDQUx8TGMjw8vq4ex7bAsTFcnuz1cMB4zx9wOvuiFOT4brnCSLfqMye3Lj1zV880DQoLw5fcr5E5EZlSzgZyAKPxFO/sbc9+Hwle+gWyJD8zB+bOOaW092TWBoNM+t7ZVEyAaeWZgPB6lcOfbFJpG5dpTFggm7RSRNNRoqkY0XSMsCdIWaiUlJ3m5ZOvn9l+bv/yssWsq1rFYHKIL779lQvam5Z00RiowcGm22kmEI0QoIh8czpBI4c8o5SDzf2Ah1WeX82c1AWeXD+9g3E8Z25r+dxSvF0HiB54g8CDv49hurDaDpLc+wreOx7EcHnwLnkMg3Mv+Z66qbFG2PTyHEzDIJG06OiPMreu4JIji16XJxvI2Y7NouI72Nyxg/97+F9wGW6KqGV0x0I+unQJAd/7v6IYhomRU3zue28gW0hkb1MvjunFMr3Z682eXsqu7m5OduyiyKilxryD/GQFvScMIA2mm2lVuRTnZtrILJfgGnM9LvKol15inUARketNwZyITBnvl4hwuZfHcMCTrWBZXhDMBnPvdaJ9iLqyCLln0vluV9F4ih1HuukdzJSfzwv7mFOXT3FugLSTJpqKMZwcpaMnxuyyKiJBL2+3bmEgOUTsTCA2mooyLbeWD5wpm/+Ft/6YWHrs4thrKpbzxOxfwmWY/Lz5DfwuH0F3gKAnSMDlx214ONjcz2A0xn3l9+OkPPT0W3jw4TF8rKnMrAH2K2vmc0dzNcdOD45pv6Y0Qkvnub8SN5R6OdYepXcwTuHIUeZ1vkjex/4EMxwg1RPDGenFiQ1hhPLxLngY7+JHMczMc+PKq7hun/dkZhgG08pzAJhdm3/F55mGyQO1d3N/zV20DJ/m7dZtbG3fSUG6kr1NvTTOyGEwOURpoATDyFznSuY9jsZTvLrtFJApVlM9c4SfHnmDhtwGYAbzi+byn1Y+xe4DMYajyTHnLp5ZTE1p5Oo+ABGRm0jBnIhMGefPo1q3oIK3dreN2Z9zmZG585mmwYdW1fHW7jaGRpMX7H9jZyuza/Kv6sV2MnAch/U7W6kujTCjMpfO/ihNrUOkLJuq4jCJZJppFTn4vW62HuxiYCSRfbkeGEnwP3d9m36nHZtzxUcKjCpaWz9EQY6fV0d/QV+8H7/LT9ATIOgOkLLOfX73Vq/FZbgIeoJnArYARf5MFUHTMPmLu7+KaWRGvtbvbGVgJEFXE3TRnzmGzHyk0jODY36vm6AnM2LiMk1m1+Rj25mAO+h3c/f8Usz+FhoKcoi5IxTEWoj99D9TdtcfsHO4mPL8KgLeuWBl7sczYwWeGSuy/TW0JtiEMAyD2pxqanOqeajqA7y1q5W2nlFGw8f40dHnyTGKmRGYx9KyhTSfTlBaEGROXT45wbEpnLbjEE+k6R6IkXRinLYP0MYBYgdGKQkUMbMkE2ybhklRoJC68kx6aOO0QmpKw3g9t1aKpIgIKJgTkSkkkc6UQ186u4SCHD8zKnOxHYeKohAelzlmPtT7cbtMVjWWZdcem16Rwx3TC3l5SwuJlMWhln4aqnPHLCh8qmuEwlz/BS+hk0VT2xCDo0kGm3rxuMxs0RfIFI0BONTSR6gwxv7BI/Q5p0k6cZ6o/jQnO4bINUoIGXl48OPBh9vwURIshHjm/Ds9v8TMGUUkUw4zKnMu+LwfmfbAZft3NpDrG4ozcN4yEZdSX5kz5nuXk2Z2ah9zGqowiioxo32MPv9lfKv/DZF59+EEqvAu/Sih8irun3WmUEnjvPe9jkycwkiQ+ooCmtoGiXeV0OhdQ3PyIO9G17Oz6S2KjTru6LmP9t5RKovDLJ1VnB2pO9Tcz5FTA9SURjhobaDLaWJGzgwenLaOOQUzs8/PWdPLcwj63JQVBKdMWrSI3H5UAEUmPU2WlfEYGEmwfmcrPo+L1XeUkxPy0jMYY+OedlY1llGSf+k5LlfzzA1Fkxw9NUjjtAJ83sxf9k+0D7H7WA+LGoqpLcukbL20pTm7lt38+iKmV+Rcss3LcVIJnHQCwxc6M5/n2qXSNi6XwQsbT1x4vTP/iSjKC7CzbzvH7W2kyQRSxf4SZuTU88TcDzM4kiIS9LL1YCfdAzE8bpO5dQXUlIYxMOjsj7LlQGe2XZ/XxcPLa6+qn7btcLCln6MtfXDmxbzKbmXR3CpeP+EimkizLPomsUApVSsewusxGf3e/4Nn+jJ8y38Fx7YY+c7v4Jl3L/4Vv4rjOFgtuzBL6jED4/t5TCT9rsuwHSf7LJqGQSTk5fRwK232EZLGCHeYDwLQah9iXuk01s6cyZ6eA/x4/2vMcd1FyMgj6Rpk3YIKykKlN/NWJj09c3Kj6Zm7eiqAIiJT0tm5UWdHycoLQwydmR8zkelUOUEvS2YVj9lWVxahqW2I090j2WDu/EXJ9xzvoaVzmLULynGZJk46CYaB4fJgRwdJn9iGu2YhZqQIq/sE8be+g3/dp3AV12G1HST2yrcIfPiLuMsaSJ/eR3zD/ybw0B/gKqjG6jxGct9r+Jb/Mma4EKu/Fev0fjwzV2P4QtjRAZzhHsyiWjDdnOoY5N2jvXDeyETCidLntNJntxL1dvAHC/8tpaESgu3TSBzvI2yV89CcRUwrPjcqUpCT+UxX31F+0c+pvDA0JrU1kbT46TsnuWt+GRHfuZTFdNtBsC3cVZm5bomtPwK3F8/CR3nh7RPc2fS3NHoL2Ff1MR5bM43R7/81yfQ07l73WwCkftZCQW4wG1h7pi/DLJ4GZIpZhD7+LEYok/5qGAbu2kXI5GIaBivmlTE0msz+0WP7YRfrCuZk/jhgGMTTCZ5669scaFvPc21e0iTxEyHhjFIWKqGhagZlIc19E5Hbn4I5EbntDL2nqEFbzyhtPaPZ773u67sunGEY5Ed8tHQOs2nPKZJtR/B786morSFMDGvb92nNW8yh5gCzc6NEf/Ql/Pf/Lp7py3BigyTe/ieMQC5mpAjD48cI5mUr6JnF0/CtfjK7XpnhC+Eqa8DwZkYancQIVs8JcDLzA+3O4yQ2/TPuaUswfCHSJ3eS2Pi/CT35LXadTmEffJ37Ol/mrYYv0OeKcdx6iW4nU9zFg4857hKi776As/o3WVJ+BwvdEeyBNtxnAjk7OgDpZLY/TjqJk4xhBnOBTPl+J9qPZ8ZKCnL8PBzeT6y3i/W+e7Asm77nv44r5BB6/I8BSL77Ak46lQ3m7OFuLNPHS29nRmra8xaScgW4Z3EVhmEQeODfY/hCmGcCdO9H/mTMz8K3/FfGfG+GCybuBy3XTVlBkLLzKkSumFs2Zr/f7eO3G36f149vZdDppMScTrFRy5JZpSpgIiJTioI5EbmtpC2bX+w4DUB+xIdhGNn5XgAzKnOvqOT55djRATBMzEAOjm2R3PUirpJ63FXzcFIJRn/0Raqm3UMLc+jtG+Kulu9ypORBakvn4XXcDMdO0x2ZxdHTAzSUluBd+lHM/EoAzPwKQk9+C8OfGZEw88oJPvy57LXNYC7eefdnv3cVTyNwz29lv3fXLCRcs/Dc9zNXE562BDyBM/sX4Dz0Hzgw2Mmb7XsYCJ/koLuRlTPKcfsd+o4GWTrs0Lj8k9TkVpHa/TLJQy/Cmk9nPt+mrST3/ZxIwyoAkrtfInXoTSKf/GsAEu/8E+mWPYSf/BYAqSMbsVoP4JmxMtOhVAIfCR68s4afb2uhLW8RRXURHMchmkizv/RReoZTLO6LUlYQxH/vb7NxTzuc+Rne8fAvZ0fdAFyFNdf0s5Rb19zqMiK+e9lxuCu7rfQy6dMiIrcjzZmTSU/51XI1Djb3c7glU92wuiTMnNp8jrUOcrJ9mEUzi6kuuXTeOYBj24QGDjGUcOEunwVA7LW/xFUyDe/8hwEY/s5v45m1Dv+qX8NxHEa+8+/wNj6Ib9nHcByH+Jt/j7tuKS+eygXHIT96kpWrF+ONnKtu+fNtp4jGUwAU5QYoyPExuyb/ui487jgOf7/vuxzoPUrSzsx7K/KU8oH6daysuPPK2kiM4sRHMHMzc5GsnmbswU489cuATJqkM9SNZ/Y6AOzYUGYtMP+Fn/twNMnrZwLvi1kwo4gDJ/tIpW38Xjcr5pWSdxsv+aDfdeOTSFpsOdhJXtjH/PrCm92dW4qeObnR9MxdPc2ZE5HbViptEUta2eqQacvOBnLTK3KpLgkT9HuYX1/E/PqiS7bjWCnswS5cBZVgGPS98U84ORXZYA7bwrHPLWvgX/MJzNxM2pdhGIR/4y8xXO7s94G7PwPAPcVJTnePUJpfgTcSGHPNlfNKs4FMz2CMnsEYHX1R1s6vwHOVaaB9Q3F2Hu1hZvX/396dR1dV3/0ef++9z5BzEjJPJIQkzKMYBAIVkSsoFbHCUuu0artQl60trXWsPlZ9Cra4Vltd9d662ntta61UFxWH6qNVhFYKgiCCQoAAMoSQkJCRJGfe+/4RCSBaBkkOJ3xea7HgZGef/d2HL5zzyW/v3y+9K6w2BZvZ2ridtdUVuFwOd5R9B8Mw8JgechlIptWPTKOAC4cXU5CdfNLHMrzJGN4j329lF2NlH5nIxFUwHAqGdz3+TxOLfNHC0h63xciSTD7aXs/GHQcB8HtdXDq+SDMOyhfyeiymjDk31/gTEdHInJz19FMc+TJvrt5DKBIjyePikrGFvPvhPkKRzolGDi/w/WWOXnw48M7/Jlb3Kck3/hLDMMnwhmhoCWMmde+9N5t3NbJ9X/MxXxs3NJd+nxs9dByHQCiGP+n4n78Fw9Gu5REA7MzdfNyyjvpgZxDy4CPLKOKuSd/G47ZoD0RY/lE1Oek+Jo7M61o6IV6aDoV4b+N+xg3LJS3Z0xXw6po6WLWplhSfm0vG9uvWEcuzhf6vk56mnpOepp47dRqZE5Gz2tGh6lR0BKNdwS0YjvI/q/d0bRsz6MtH4QCiezYQWv0C/jkPY3j8eEbPwIkcua/OlZqNGer+N5uRpZkMLEztCmOGYXAoEDnu+9ZureuawGX88DwKs5OJxCLsat3Du5Ub2BvdTZl1OR7DR3V9O47jZ4g5ielVFD8AABu4SURBVEyzHylkYhgGb6+tOuY5Rw3IinuQg877Gq+aXHrc13Mz/CcM5CIiIuc6hTkRiZvqg+2s3XKA0r6pJwxgR6tpaO9as2xESSYVuxu7to0dknPcbHZOqJ3Itvdw9S/DTM/H8KVipObiBNswPH6s/MFn5oROQ5LH1RValq6rYtveJoYWpR8zEnX0TJyrtm+louJ9Gu39RO0oBgZpRh4jB6ewfUeMImskRXQudJ2T7mP0gCyWrT/2vrQBBWmkJZ+dC5eLiIjIyVOYE5G4WbulM5DtqmklP8uP3+sixecmZju4rM5Ro1AkRiAU7Zr4wradYxafHliYSnFeH/Y3tNMejHTdM+aEAzjhDsyULJxYlNCaxWC68KTnY+UOOGaGyLNFboaPtkCEQ4EIackeWtpCbNrVGVTdLpPB/dJZt6uF9ughCszhlKYNwGzPYsLQQvrn9WFk3877CEMRG9MAf1LnJYuHw6JtO7R2hBXkREREegmFORGJi0jUPubx+5tqj3lckJ1MSX4fPt7ZQFsgQmnfVApzktlTe+TyxxElmVimieWB0r5HJtpwHJv2xf+FlTcI3/Q7MP1pJN/4K8zkDM5mJfmpfLq/leXr93Hx+YX8a0N117bJ5xWQluxhSFEZmWuyCIaj0AGmZZCTfmRyFbfLwu364kXRTdPo1bNBioiInGsU5kQkLvbVdy5MPagwjR3VLcdt//xC37tqWtlV09r1+POXU4Y/fpNo9Rb8l9+FYZh4J16P2efIpZtne5ADSPEfmd3x6CA3YXjeMaNp08f1Y8ueJnLSfaT63V953TwRERFJTPoEICI9wnZs9rRU0dHsp6k1ysGWANA5CUhRbgq7aw/R2h6moTXI8OIM2oNR9h7oHIVzu8xjRvLyMvwU+oKE1i/Hc/5MDNMFlgfDnYQTi2BY7q51zxKJaRhcPrGYN4+azKVscM5xSwe4LJPRA7SeloiIyLlOYU5Euk1buJ2Kxm1UNGyjonEb7ZEOyqwryDaLACjK7YNhGKSleBkzyEtbIEJVXRtDitIxDIOxQ3KOeT470EoMC7cvmcjuDwmvexlX4QisvEF4Rk6DkdPicZpnlNdtMfuiAWza1cCBxsAJFzkXERGRc5fCnIicMbZjE46FSXIlsb+tlp9/8AQODinuZEZkDiM1VkisOZt+OSnHBTXoXER6ePEXXw5pHzpI+wv34Z10I4yajqtoDMk3/TohLp88HaNKsxh1/Iz9IiIiIl0U5kTkK+mIdLClsZLNDZ0jcGW5o7lu6Bzyk3OZNeAyhmUOpl9yIZt2NbG7phXTgHHDck/4vI7jEFrxRwxfGt7xV2P2ycZb/k1c/UYBYFgujF4a5EREREROhsKciJy2//vJc2ys34SDQ7LLz/CsIQzPHAKAaZh8vWQaO/e38PrGI/eAlY/I+9LnizXsJVa/C8+wizEMA8d2MByna7vnvK9338mIiIiIJBiFORE5oUA0wJbG7VQ0bKOm/QD3XPB9DMOgX0oB+cm5jMwaRklqEaZhdu1T19RBVV0bVXWds1ampXiZOCLvuJkX7bYGjORMDMMgsn0VkS3/xD1wIobbi2/qLT16niIiIiKJRGFORL5Q9cF2tjdX8mHz++xu3YuNjc+VxLCMwQSjIXzuJC4vPTLhiO04tAUiVNe3caApQGNrEIAkj4vRA7Mo/GxGRsdxwLExTIvIp2sJLv0/+K/+GVZWfzxjZuItuxLDrbXQRERERE5EYU5EAAhGg2xr2sHmhq1M7TeZtVs6qLMbqY8dor85hmyjPznuAqLNDv9YvZ+C7GRsx6GhJYhpGoTCsc4ncmxMJ4bb42VYoZ/C+vdxR0cAg7HbGmh/8SckTb4Z99CLcBUMxzP+GgxfGgCmL/XLCxQRERGRYyjMiZzDAtEgK/evYfPBrexo3oWNjQs3HfUZZFNKjlHCgNQh5Gb4sSyDA40dRAgTDgXZfxD6+Nz0r11OIKWQWt9ghhSmUPDuTzBGX4Gn7Co8lk3bW69gWC6s/MEYvjTcI6dhZhQCYCSl4C2bFd8XQURERCRBKcyJnENCsTCVTTswDZORWcMwHHht51tkebPob55HvqeE4Wn9SDJieFMzKMpNwdj8JkYkFc/AixlZkknbcz/C6j8G16Tv4HaZtG3diKuvjwkTO+fRD429Cit/CC6PBVikzP0dhssDdM5AmTTx+ji+AiIiIiK9h8KcSC93oKOezQ1b2XRwKzuaPyXmxMg186jy+QlHYlx3aAT+ZpuqnElcekER9hsLMHx98F9+NwDtezdipubBsIsB8Iybg9knG5erc7KT5Bt/jWEemfjEO/Ybxxz/cJATERERkTNLYU6kmziOQzRmE4rYBMNRDAxCkRjBcIxkX+c/vazUJMKRGK2BMA2tHWDEiDoxHCMG4SSCIZuWcCttsVbCsQjhaBTDiGAZEUr7jMI0LQ60VXIoVoOdlIxh2hBuJRruYEz2bAzD4O19/4+9NJFMBoXmSCY0fMqwwAEOTPLjcZlkNzdjOSFKxhTg87qIlM3CsNxd5+H/xn9hGEbXY8/wqcec59FBTkRERER6To+EuYULF7Jy5Uosy+LnP/85I0aM6InDyjkmEIoCYJkGpmlgGGAYBgZ0hRHbsYnGooTtKIZjYTgWUTtCY6gJ27EJxcK0doRoD4XJ9uTgMXzUtTVRE9wDpoNj2thOFGJBhqSdRx9PBrWH9rCleT1hy0XEtolFAziRdkrcU/Aa2bSGPmans4GQ5SWGA04InDAXuGaTZOVwMPAuH7m2H3c+/8t9A+m+bGob/4cPXPuP255mDSDZ5aOxcRXrPI0Q6Py66YDbcUg70ILP62FyRzrpbe3UDv4WBdnJDBpcgxEJ0bcku3OHknnHPK+7dNwxj48OciIiIiJy9uj2MLdu3To2btzIq6++ypo1a1i4cCF//vOfu/uw3WZXTSu1jR10fbw1wDQM3JaJ/dnaxobROSrjOJ3TtXfu9yq7olWE/bkYGLjDrbijIb5W8D0cHKpqX6XGPkAouQADA2+wkaRYmLKi2wCo2r+Eg7Emgqn9wTHwtdfis22G9/82hmFQve9vNDvthNIHYBoGSS17SMbF0IE3YRqwe+eLHDKixLIGYxgG3vptJJt+SgddAwbs2fZX2i2TcOYgHBw89Vvo406jqKTzkrmd25+nw+0lkt4fA3DXbyUtKZf+xZ2LOG+p/AshTwrRPvlggOtgJZn+fpQUdU5dv2Hbn4n40oj5snAAV+NOclJKKcq/CNuOsv7TRcSS0oklpeHYNu7WfeT1GURB1gR21NbzXsVfCHn6EHElEbPDWO01FHpHkJEynvb2A3zS8QoBy0fEdAFRrOghBjGSDN/XiET2sNJ+k6hp4HBkAerx0dGk+y4kFNzMe9aK4/6uJ0XPJ8U3ESe0jvfMdcc3Q6ONP+l8wh0b2W5WgOXDND247ShJ4UMUZkbIz8niwL4QTfVNGLnDsFx+kkLNWPW7GD0ylUA0hay6dDKaTXzDLsbl9mM178es28mEiQNI9qdRs3M85+/fiG/kdNyWF6OxGrNpPwVjSnFZLgL13+Sa1gN4S8ZhxwzCzfW4Y0GS8ks+C2LfA2BkV+EZp9X7IiIiInJ26fYwt2LFCi655BJM02TixIl8//vfJxwO4/Ek5n00HaFo5xTsBuCAA9h25+V0RmeKAz4bETKO/E64A9MJE7NjnetsxULYdpBIzAYgFG2lxeggGG3AcRxcThteJ0Z7IIID1IcPssvVRiSwA3AwCJEC9G0LYTuwI1LDbncQu/XgZ4HFITNqwd4mADaH9rLfE4X6vV3nkhd00fZpAwAbwrupd9tQt6Nre1Gbh5ZdndvXRnbT7AB127q2D2g+SEt0PACrIrtptw0Ibu7aPqShkZbQGAD+Gd1DtN2A9iOv5Yi6Q7QERuDYUVbYVdBRBR1Htp9X18GhjiGk+EJ8YldjhNwQ8WJh4I+1kB+uIcXnJsXtZeuhdtzeFEx/OlYsRlJDEyXZSRQUZBBobSO0yyKcPgD8uXhjIVLqN9OvsIjs/BwCLaXk7KoglnseRkouqQTx1XxMwcgJpGWXEGn1MH57FN+AibhTczDbmnH2bcJTUo47JQM60plTNxxX4UgMbzJOsA37UD1mRiGGy8PA/DlMis7E8CR/8SWJw64Frv3Snus78EL6DrzwyBfSiqH0yENfzgDIGdD5wIKk3L5f+lwiIiIi0nsYjuM4J/620/fwww8zevRorr2288PqlClTeOmll8jJyenOw57zHMfBwcE0TGzbIRwNE7FtbNsm5tjYjo1pmCR7/DiOw6FwG45jf3ZZYue4o8u0SPb4AWgLdWB/tp3PtlumhdfqDOWBSBCcI5c1Oo6DaZq4zM57r8KRAIZhYloWpmlih4O4LDcujxfbdnDCbRiWG8udBIaB09GK6fFieX04jo0dbMd0J2G43DhHBWYRERERkXNVt4/MZWVl0dTUOTrkOA5tbW2kp6ef9P4NDW3YdrfmzXOUSQxo7Tg8FGZhYAF0XYgYAZrbO47Z52gxYoQP36jVxTnmO0J8tpD04aFMokc9VwzajxwfbI4MzVkQjAKHyMnpQ2MbQPCzXyLdKyenD/X1h+Jdhpxj1HfS09Rz0tPUc6fONA2yslK+fHt3FzBlyhSWLVuGbdusXr2aMWPG4Ha7T7yjiIiIiIiIfKluH5krKyujrKyMq666CtM0WbhwYXcfUkREREREpNfr9nvmvipdZikakpeepp6TeFDfSU9Tz0lPU8+durhfZikiIiIiIiJnnsKciIiIiIhIAlKYExERERERSUAKcyIiIiIiIglIYU5ERERERCQBKcyJiIiIiIgkIIU5ERERERGRBKQwJyIiIiIikoAU5kRERERERBKQwpyIiIiIiEgCUpgTERERERFJQK54F3AipmnEuwQ5C6gPpKep5yQe1HfS09Rz0tPUc6fmRK+X4TiO00O1iIiIiIiIyBmiyyxFREREREQSkMKciIiIiIhIAlKYExERERERSUAKcyIiIiIiIglIYU5ERERERCQBKcyJiIiIiIgkIIU5ERERERGRBKQwJyIiIiIikoAU5kRERERERBKQwpycdWzbjncJIiIiIiJnPVe8CxABeP3119m3bx/f/e53412KnCNee+01kpOTueiii/B4PPEuR84Rf/3rXwGYMWMGmZmZca5GzgV/+MMf8Hg8zJ49m5SUlHiXI+eA5557DtM0mTZtGvn5+fEup9ezHn300UfjXYSc24LBIL/61a9YsWIF06ZNIz09nWg0imlq4FjOvMbGRr73ve/R1NTE5s2baWhoYOjQobjd7niXJr1YW1sb8+bNo6Wlhb1791JZWcngwYP14Vq6TSgUYv78+QQCATIyMvB6veTl5cW7LOnFDv8/19jYSDgcZunSpWRlZVFQUIBt2xiGEe8SeyV9Wpa4cByn689JSUkUFRUxbtw4fv3rXwPgcmnQWM6swz3X3t7O4MGDWbhwIbfeeitbtmzB5/PFuTrp7cLhMCkpKfz3f/83d9xxBzU1NSQnJ8e7LOnF3G436enpXHnllWzZsoW33nqL3bt3x7ss6YWi0SgAlmWRkpLCo48+yoMPPsjYsWO7PtfpB/TdRyNz0qOCwSA/+9nP2LhxIy0tLQwaNIiGhgYWLVrEb37zG/70pz9RUVFBbm4uOTk58S5XeoGjey4UCpGfn88rr7xCR0cHy5Yt48CBA11vMtnZ2TiOo58eyldyuIfef/99gsEgWVlZ1NbWEggEKC4uxuv18vLLL3PZZZeRlJSkfpOv7OieC4VCZGZmUldXx4oVK1i3bh0XXHABDQ0NrF+/Xu+vcsYEg0EWLFjAqlWraGlpYeDAgbz22muMHTuW9PR0Bg0axLvvvks0GmX48OF6f+0misnSY9rb21m4cCEej4fx48ezYMECVq9eTTQaZdy4cbz00kscOnSIlStXMnz4cODYETyRU/X5nnvooYeor6/nrrvuYteuXbS0tHDvvfeyYcMGli9frstA5IwwDIOWlhaef/55NmzYAEBpaSmXX345OTk5rFmzhoEDB5KZmYlhGJr0Sb6yo3vuo48+AiAvL4+0tDRaWlq4/PLL+c53vkMgEKC6ujrO1UpvEIlEePrpp3G5XEyZMoV7772XYDBIRkYGr7zyCoZh4Pf7mTp1KjU1NQpy3UhhTrpdbW0tAF6vl82bN3PDDTcwefJkbr31VhYvXszu3btZtGgRFRUVPPnkkxQVFfHHP/4RQP/w5bR8Wc/NnTuXp59+mtTUVAKBAPPmzWPYsGGkpKSQlJSky0DkKzncdwCLFi2isrKSLVu2sH79eoCu+5X27NnDddddR0VFBT/96U/ZtGlTXOqVxPdFPVdRUcG6desAuOaaa7Asi6VLl5Kfn49pmrS1tcWrXOkFDvecy+Vi2bJlzJ49mylTpjBz5kyqqqq45ZZbWLlyJe+88w4AdXV1pKWl6fNcN9JlltJtDhw4wCOPPMLixYtpaWkhPT0dwzDYu3cvY8eO5fzzz+e5557j/PPP584772TWrFlkZ2dTWFhIVlYW/fr1i/cpSII5Uc+VlZXxwgsvMGjQIBobG1m6dCmvv/461dXVzJo1i4KCgnifgiSgz/ddfn4+l1xyCXPmzGHbtm0cPHiQYcOG4Xa7CYfDLF68mNdee40PPviAq6++mvLy8nifgiSY/9RzlZWVNDQ0MGTIEHJycrAsi40bN/LMM8/Q2trKVVddpcss5ZQd3XNNTU2UlpZSVlZGLBajb9++vPDCC1x22WUMHDgQj8fD+vXr+d3vfse+ffuYPXs2ffv2jfcp9FoKc9Jtnn/+eSKRCA8++CAffvghy5cvJzMzk9bWVvx+P/n5+RiGwaJFi7jpppsAiMVi9OvXT0FOTsvJ9JzjOCxZsoTHHnuMwsJCMjIyuP/++xXk5LQd3Xdr165l6dKljB8/nrS0NBobG6msrMTtdlNcXEw0GuVvf/sb3/jGN3jooYcoKSmJd/mSgE6250pKShg0aBBf+9rXKCgoYN68eQpyclqO7rl169bx1ltvceWVVzJgwAD+9a9/UVVVxTe/+U0ASkpKmDp1Kvn5+dx9990Kct1MYU7OqBdffJFFixZx8OBBamtrufjiixk5ciT5+fns3r2bffv2UVpayt///neuuOIKPvjgA/r27cu4ceMAzXYkp+5Ue27t2rVkZmYyfvx48vLyGDZsWLxPQRLQl/VdYWEhmzZtYufOnUyYMIGCggIqKyvZuXMnpaWlZGRkMHPmTMaMGRPvU5AEczo9d3j5C8uyKCoqivcpSII5Uc99+umnTJgwgbVr1zJu3Dh27NjBXXfdRXFxMSUlJRQXF8f7FM4J+uQsZ8yrr77K8uXLufDCC3nvvfd47rnnePvttwEoKCigvLwcv9/PJZdcQm5uLrfffjuvv/4606ZNi3PlkqhOt+cuvfTSOFcuiew/9V3fvn2ZOnUqtbW1NDQ04Pf7GTt2LHl5eV1LEWiRejlVp9tzXq83zpVLojqZnqupqQFg9erV/PjHP+btt99m/vz5XHTRRfEs/ZyjxbzkjPnkk08YNWoUV1xxBR0dHYwZM4ann36aK6+8kvHjx5Obm0swGKSoqIgHHniAxsZG8vPz4122JDD1nMTDifouPz+fSCRCnz59ACgvL9d9cfKVqOekp51Mz4XDYSKRCNOmTePSSy/l61//erzLPicpzMkZc/3113ctSLpq1Srmzp1Lnz59eOqpp/j2t7/Njh07aGpqoqOjo+v+JZGvQj0n8XAyfdfY2EgsFotvodJrqOekp53s+6tt28ycOTO+xZ7jFObkjCktLaW4uJiWlhaqq6sZPXo0o0ePxufz8eGHH1JbW8uCBQvw+/3xLlV6CfWcxMPJ9p3P54t3qdJLqOekp51Mzz322GO6lPcsoDAnZ4xlWViWxf79+7nsssuorq5m/vz5nHfeedx3333xLk96IfWcxIP6Tnqaek56mnoucSjMyRm3c+dOfvnLX7JixQrmzJnD7Nmz412S9HLqOYkH9Z30NPWc9DT13NnPcBzHiXcR0rt88MEHbN68mZtuukmztkmPUM9JPKjvpKep56SnqefOfgpzcsY5joNhGPEuQ84h6jmJB/Wd9DT1nPQ09dzZT2FOREREREQkAWnRcBERERERkQSkMCciIiIiIpKAFOZEREREREQSkMKciIj0Km+88Qbz58+PdxkiIiLdThOgiIhIwho6dCjbtm3r0WN+61vf4gc/+AHl5eU9elwREZHP08iciIiIiIhIAlKYExGRhPP44493jYyVl5czY8aMrm1LlizhJz/5Sdfjp556irlz53LxxRezYMECZs2axS233ALAxx9/zOzZsykvL+enP/0phy9WWbZsGdOnT6e8vJyHHnoIx3F45513KC8vZ/369dxxxx2Ul5ezc+dOAD766CNmzZrFpEmT+OEPf0g0GmXJkiVcf/31zJgxg/vuu48bb7yRWbNmEYlEGDp0KA8//DCTJk1i3rx5dHR09NRLJyIivYjCnIiIJJz777+fNWvWALBmzRr+8Y9//Mfvj0ajPPLII7z88ss888wzrFy5knA4zD333MOCBQv45z//SVVVFUuXLgXgiSee4MEHH2TFihXEYjH27t3LpZdeypo1axg7diy//e1vWbNmDQMHDgRg8eLF3H333axatYr29nZWrlwJQFNTE0888QSvvvoqjz/+OA0NDdTX1wNQWlrKv//9bwD+8pe/dMvrJCIivZvCnIiI9HplZWUkJyczZMgQ8vLycByHXbt2UV1dze2338706dOpqKhgx44dAIwbN45nn32WV155hTvvvJPi4uL/+PwPPPAAdXV13HfffWzYsIGGhgYARo8eTWpqKnl5eRQVFeHz+bBtG4Brr70Wy7K44oor2LBhQ/e+ACIi0iu54l2AiIhId3O5XMf8DuA4Dv379+fNN98EIBAIEIvFAHjkkUfYsGEDa9as4eqrr+bZZ5/tGoX7PNu2ue6665g5cyY333wzpnnk56RfdNyjj394/6P3EREROVl69xARkYSVnp5OVVUVkUiE1tbWU9p3wIABBAIBVq9eTSwW45577mHJkiUAzJgxg/T0dG677TZKS0vZunVr134ZGRns27cPgMbGRpqbm9m7dy8333wzPp+v6xLLE3nxxReJxWK88cYblJWVnVLtIiIioDAnIiIJ7N577+WGG25g8uTJVFZWntK+Ho+HJ598kl/84hdMnjwZv9/P9ddfD8CPfvQj5s6dy6RJk0hOTmbq1Kld+9122238/ve/Z/z48bz00ktkZmYyZ84cpk+fziOPPMKoUaPYvXv3CY9/4MABJk+ejGVZ3HjjjadUu4iICGidORERkR4Xj/XxRESk99HInIiIiIiISALSyJyIiIiIiEgC0siciIiIiIhIAlKYExERERERSUAKcyIiIiIiIglIYU5ERERERCQBKcyJiIiIiIgkIIU5ERERERGRBPT/AR+HuEEJWFK8AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(15, 8))\n", "gzmt.plot(alpha=0.5, style=\"-\")\n", "gzmt.resample(\"BA\").mean().plot(style=\":\")\n", "gzmt.asfreq(\"BA\").plot(style=\"--\")\n", "plt.title('贵州茅台历史收盘价年末采样');\n", "plt.legend([\"input\", \"resample\", \"asfreq\"], loc=\"upper left\");" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "> 在每个数据点上,`resample`反映的是**上一年的均值**,而`asfreq`反映的是**上一年最后一个工作日的收盘价**。\n", ">\n", "> 在进行上采样(up-sampling,增加采样频率,从月到日)时,`resample()`与`asfreq()`的用法大体相同,\n", "\n", "两种方法都默认将采样作为缺失值`NaN`,与`pd.fillna()`函数类似,`asfreq()`有一个`method`参数可以设置填充缺失值的方式。对数据按天进行重采样(包含周末),`asfreq()`向前填充与向后填充缺失值的结果对比:" ] }, { "cell_type": "code", "execution_count": 112, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T15:34:13.065419Z", "start_time": "2020-05-12T15:34:12.334625Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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ZbVatWPHDr399tt6//33jZBWws/PzwhNL7zwgtatW6e0tDRlZGQoNjZWktStWzdJ0okTJ3TffffJZrPJZDIpPT1dQUFBstvt6tevnyTJ6/UqIiJCH3zwgTZv3qwJEyYoMDBQJpNJLpdLZrNZVqvVeO2Saxw7dqw6d+6sLl26yOVyacuWLUpKStLEiRNlNpuVk5Oju+++W5LUpk0bvfjii5KkGTNmyGKxyGw2a+PGjZo6dapatmwpSbJYLEbwPpXValVQUJDx2G63nzGQAgCqBwIeAOCMrrrqKs2cOVNt2rRRu3btNHv2bIWFhalt27Z68cUX9fjjj0uSdu3apeeff15JSUnq2bOnli1bppEjR8rr9eqLL76Qw+HQiBEjJElBQUE6evSoXC6X4uLiFBMTo4ULF0qSunTpounTp6thw4byeDzavXu3Uct7772ntm3b6vXXX5ckffzxxzpx4oQee+yxcmv/6KOPlJaWprCwMG3fvl3jx4+X2+2W0+lUTEyM8vPzjff9/vvv9cYbb+j48eO69957NWHCBL366qsaPXq0Ro4cKUl6++23df3118tutysqKkpxcXGSpMzMTN19990aMmSI7r//fm3cuFEhISFq3bq1UUvnzp31xRdfGI9Hjx6tm2++Wf379y+39qKiIu3fv1/R0dGSiqfFzp8/X35+furevbsWLlxYJqD++9//Nr6/++67lZycrMcff1x2u12SlJKSor59++pvf/ubevXqdfbfeEn79+/XqlWrjIANAKgeCHgAgLPq16+fpk6dqnvuuUePPvqo6tSpo7i4ODVo0MAIINdee60WLVqkO+64Q82aNVNMTIzcbrcsFouCgoIUEBBQajplvXr1NGnSJHm9XknFAcbj8cjPz08ul0tWq1W5ubnGFENJuuuuu0o9PnnypDE19HRHjhzRBx98YLxnYWGhWrRooddee80Yc8sttxgduw4dOmjOnDnq06ePZs+ebUxz/PHHH43xWVlZZaZFrl27Vm+99ZZGjx6tPn36SJJCQ0M1evRovfXWW0YH7XQ5OTkKDAw842eekJCgv/71r7rxxhv11FNPyeFwlOnAmUwm2Ww24/GePXu0cuVKPfjggzKZTOratau6desms9msoqIi3X777fryyy/LvNdTTz0lm82mJk2aaNy4cfJ4PJo7d65mzJih2NhYFRQUGCERAFD1EfAAAOXyeDwqKipS+/btNX36dEnSt99+q9q1a+vuu+82wl1RUZFMJpN+/vlnJSQk6PPPP1edOnV04MABffXVV8rLy5PL5dI333yjevXqacqUKcrMzNTDDz8si8WigwcP6k9/+pN69+6tmJgY5eTkyOPxGCtk5ufny9/fX0OHDlVAQIARvtLS0mQ2m7V48WJJxVMis7OztWHDBh05ckQjRowwFhYxm83asGFDqemQqampxvenhqeS74uKirRr1y7j+OmLwUjSW2+9pdzcXI0dO1bvvvuu8vPzlZWVpebNm+uJJ57QwoULS4WwEseOHdMbb7yhd955R1Jx4LvjjjuMbmTTpk21dOlSzZkzR4WFherbt68xlTI/P9+4jtzcXD333HPq2LGj6tSpo1WrVmnv3r1q3bq1LBaLxo0bpzvvvFM33HDDGX+fX331VXXu3Flut1tHjx7Vzp07dc0112jBggXnvMcRAFD1EPAAAOXau3evHnnkEaNrlZmZqczMTFksFk2ZMsXonrndbr344ov65JNPFB0drXr16mnixImKi4vTww8/rPnz5yspKUmPPvqo8dphYWHGQh4xMTH66KOPdPLkSQ0ZMkRJSUn64osvVKtWLXk8HtWrV08xMTH69ttvjfNdLpfuuOMORUZGatasWWU6eTfeeKNuvPHGUitH1q9fX3/84x+NxwcOHDjr9dvt9lIrf06aNKnMmJIpnj169NCSJUu0c+dOzZo1S6+99pry8vLKDXdOp1OHDh3Shg0bFBYWJkl644035HA4So0LCgrSiBEjlJCQYHTePvzwQ504cUJPPPFEmdd1OBx699131adPHz300EOSpDp16uizzz47a8ArURJs27Ztq2eeeeac4wEAVRPbJAAAytWyZUt98803Wr58ud58802Fh4frjjvu0H333adWrVrp66+/VlxcnFasWCGv16vjx4/rD3/4gxo0aKC33npL+fn5ZbYjKCwslNvtllQcanbs2CFJ2rJli2bMmKEvv/xSERERql+/vhYuXKjFixcrJiamTG3vvfeeunfvriFDhujZZ581XvNsgoKC1KhRI+NXeSt1ulwuzZ8/v0KfU15eXqmpoyXONH30q6++UosWLYxwJxV3IyMiIsqM/fTTTzVz5kxJxR3FxYsXa/DgwZo2bZpyc3PLjE9ISFDdunU1a9YsJScna+DAgWrWrFmFrgcAUL0R8AAAZ7Vhwwb99a9/1YQJE1SzZk21aNFCnTt31oMPPqikpCRJxR25U7tKFotFsbGxGjRokKZNm6ZPP/1UMTExuvvuu41OXFZWlhEAzWazLBaLvvvuO7Vq1UohISHatGlTufV89tln+uKLLzRmzBj1799fNWrU0AMPPKD4+PizXsevv/6qyZMnG7+cTqfx3O7du/XnP/9ZoaGhslqteuKJJ+T1evXJJ58Yv2w2m/76179q/fr1pV536dKl6tq16xnfs+Q+Q0nKyMjQ1KlTjQVnSqSlpZWZDpmamqqZM2ca0zY/+OADDRkyRI0aNVJmZqax2EyJxMREPffcc5o0aZLuvfdeTZ48WfXq1dPf//73s34ukrRmzRqNGjWqzPGdO3fK5XKd83wAQNXBFE0AQLlSUlL0z3/+U3v27NGUKVN07bXX6uuvv5Yk/fnPf1ZISIj69++vzp07a/z48WrVqpV2794ts9msli1bGtMKy5uiKcnYUy41NVVTpkxRo0aNNGHCBL3++utyu90aM2aMPvnkE0VFRUmStm/frunTp/9/9u47sKr6/v/489yVvRMySCBM2RsEkSUoS2UW627BDqut32q1uKXW0aqt/WrhK/2pta2jggMVEZElywEiIHuTANnzZt11fn+g0ZgwgiQnIa/HPzHn3HPO6ybhet/38znvD0ePHuX5558nMjISOLGkwYsvvsj06dMZOHAg8+bNq55uGAgE8Hq9mKbJ0KFDazVZCQQC+P1+0tPTmTVrVnWhdvHFF3PHHXcwePBgfvazn/Hss89y6NAhfve735GUlFR9jp07dzJ37lyef/554ETjk8LCQgKBABUVFcyYMYO3336bdu3aceTIEW677TYGDRrExIkTgRPTNfPy8ti+fXuN83q9Xu68806uvfZaYmJi+PDDD1mwYAGzZs3ib3/7G7m5uXz44YdcccUV9OnTh4yMDK699lpuv/122rVrx0033VRdPPv9fvLy8rDZan+m63a7eeSRR4iMjOTee+/FZrORl5dHRUUFdrudBx54gBtvvPGk3T5FRKTpUYEnIiJ1atWqFVdeeSVPPfVU9XRDr9dbPaIzbdo0xowZw6ZNm4iOjgZOTHH87ojVN3w+X61t48aNIyQkhD/96U9kZGTwu9/9jiuvvLK68+T111/PNddcw9y5c+nUqRO7d++md+/e/OUvf6nR1dEwDGbOnMnUqVM5dOhQjYYpHo+HN954gxUrVmAYRo0mK4mJiVx//fX8z//8D0OGDKku7rZs2cLtt9/Or3/96+rC5he/+AWvvPIKt9xyC6+++ioul4t77rmHVatW8fjjj9OuXTsA0tPTqaqqYsKECdhsNqZOnVq979///jf9+vXj7rvvrs7w3HPP8corrzBmzBg6depUvb2yspIuXbpU542NjWX48OFERETQt29f2rZty6hRo9i/fz99+vQhJSWFRx99tPo5fPfns3r1an7zm99w/fXX1/odeDwepk6dyo033ohhGPj9frp161Z93bS0tOruoCIi0jwYZl3/JxYRETlHfD4fgUCgzoYj33C73SxdupRp06bV2L5q1SouuuiiUx7bEIqLi2s1PQGql34A2Lp1K+3atSMiIuKsr+P1enE4HNWdQRuC3+/H5/PVudRBhflxcgAAIABJREFUIBCoc2RPRESaLxV4IiIiIiIi54kz+thu/vz5fPDBBwDs27ev+sb5xx57rMbjDh8+TN++fdm2bRtwYtHVKVOmcMUVV/Dwww+f4+giIiIiIiLyXact8GbOnMm8efOqv3/66ae56667WLhwIStWrODw4cPAiSkg9913X/V9GACPP/44d9xxB++88w579uzh888/b4CnICIiIiIiInAGBd4LL7zA2LFjq7+fM2cOvXv3prS0FI/HQ1hYGADz5s1j9OjRpKamAidu3N66dStDhw7FMAxGjBhRq7W0iIiIiIiInDv1vrM6Li6O/Px8xo4dy/Dhw4mPj2fr1q1s3ryZG2+8sfpxRUVFhIeHV984HhUVRWFh4blLLiIiIiIiIjXUe5mE7OxsEhMTWbVqFddddx0bN25kxYoVFBUVccMNN7Bz504efPBB5s+fj9vtru7QVVRUVGsR1zORn+8mEFAfGBGRcyEhIYLc3FKrY4iIiMgZsNkM4uLC63dMfS9y1VVXkZOTg8vlIjg4mPLycu666y7eeOMN/v3vf9O1a1fmzJlDfHw8ffv2Ze3atZimyapVqxg2bFh9LyciIiIiIiJnqN4jeA888AA333wzNpuNrl27Vi+qWpe77rqL2bNn88QTT3DhhRfSv3//HxRWRERERERETq7Jr4NX1xTNiooy3O4i/H6fRank5AxcrmBiYhIadOFeETk7mqIpIiLSfJzNFM16j+BZ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Tf/+/Ws9U3W55s6d675eVqkq19///nfz/PPPG2OMWbJkidm9e7dH5PqugQMHmgMHDnhErkmTJpl3333XGGPMmDFjzMcff+wRuQYPHmw+++wz43K5zJAhQ8ypU6dqPdcXX3xhRowYYYwxZvny5Wbs2LHmf/7nf8ymTZuMy+UyDz74oPn0009rPZen2rZtm0lISDBOp9N88skn5qGHHjKTJk0yS5YsMcYYk5CQYD766COPyPXYY4+ZHTt2GGOMiY2NNUeOHPGIXMYYs379ehMXF2dGjRpV65mqyzVx4kT39bJKVblefvlls3TpUmOMMWlpaSYjI8Mjcp1VWVlpevToYc6cOeMRuUaMGGE+++wzY4wx9957rzl48GCt56ouW9euXc3JkydNWVmZufvuu01ZWVmt53r44YdNp06dzKpVq4wxxmP6+/NzrVmzxvTp08eyz4TV5fKE/r6qXJ7Q318uHjVFc/78+dx7770MHDiQLVu2kJ+fz4gRI0hISOCRRx6hqKio1jPZ7XZSU1Px9vbG4XBgs9kYPXo0cXFxlJeXk5+f775TaXWusrIypk6daumdo6py5efn89prr/GLX/yCkSNHUl5e7hG5Pv74YzIyMnjwwQdZt24dbdq08YhcZ2VkZFBRUUGLFi08IpePjw8FBQU4nU5KSkrw8fHxiFw2m43i4mJcLhcAe/furfVczZo1Y86cOQCcOnWKwMBAdu/ezW233YbNZqNXr15s3ry51nPBt3e/7777bgYOHOi+NtnZ2YwaNcqSPACbNm2iT58+2O12unbtyp49e+jVqxe9e/cGuODfgpW5pk6dSseOHSkoKKC8vJzAwECPyJWdnc3cuXMZN25creepKVd+fj5z5szh3nvvJTU11WNybdiwgZ07dzJkyBCOHDlCkyZNPCLX2ffDTz/9lOuvv57g4GCPyGW3293/z1dWVrqfe+wJ2SorK919fmFhoXsEtDYtWLDAPXJYXl7uMf39d3MBxMbGsmjRIkuyfNf5uTyhv68qlyf092elpaWxevXqc16bNGkSjz766EWd7zEFXmZmJm+//TZLliwhOTmZ5557jjfffJMOHTrw5ptvEhYWxrvvvlvruSIjI+nbty/Z2dk8++yzJCUlERYWhsPhIC4ujoiICG644QaPyDVz5kwSEhJo3LhxreepKVdMTAwpKSksWbIEf39//vGPf3hErpycHFq0aMFrr72Gj48PH374oUfkOmv16tXccccdtZ6puly//vWvmT9/PnfccQdBQUGWTLOtKldqaiovvfQSKSkphISEUFhYWOu5fH19CQkJYc6cOfzlL39hwIABBAUFud+0QkNDyc3NrfVc27dv51//+hcrV64kJSWF6dOns3btWoYMGcI333xT63nOys3NpUGDBgDYbDaCgoLo0KEDkZGRvP766wQEBHDbbbd5RC6Xy0VOTg5xcXH07NnTPdXc6lxJSUmMGzfOkoKgplyxsbFMmTKFd955h6+++ort27d7RK7c3FxuueUW3nrrLfbt28fOnTs9Ild+fj4Aq1atsmyqYVW5Ro4cSXJyMnfccQfdu3e3pCCuLtvvf/97Jk6cyDPPPEN4eDgFBQWWZDsrLy/PI/r7uqRv376W9/dViYiIsLy/BxgxYgQvvfTSOa9t2LCBbdu2XfT38JgCr6o78506dXKvPbKywj906BAjR44kJSWFmJgYsrKycLlcrFu3jsDAQFauXOkRuTZu3MiyZctISkri2LFjPPvssx6R64YbbqBjx44AREVFkZ2d7RG5goKCaN26tTuXVR94z8911urVqy17w68q17hx45g+fTrr1q3jZz/7Ga+++qpH5LrqqqtYuHAhs2bNwul0EhERUeuZCgsLKSoq4oknnmD69Om88MILFBYWukcV8/LyCA8Pr/VcVd397tmzp+V3dCMiItwfgIwxFBYW0qBBA2bPns2OHTt48cUXsdtr/+2pqlzl5eVERkayceNGvvzyS0sKlvNznT59mmPHjjF37lymTZvGrl27WLhwoeW5CgsL6dKlCy1atMBmsxEVFUVWVpZH5PL393fP0oiKiuLEiRMekatBgwY4nU42btxI3759az1TdbkmTpzIkiVL2LBhAxkZGaxfv95jst1www28/vrrTJ06lYKCAkv6/O8KCwvziP6+rrG6v69KZmam5f09XDiyePr06UueseEZV5TqR36ioqJYu3Ythw8fZsCAAbWeq6SkxD061rlzZwASExPZvXs3drudwMBASkpKPCLX2rVrefXVV3nuuee49tprSU5O9ohcSUlJ7rule/bsoW3bth6Rq1OnTnz22WfAt4vbo6KiPCIXwNGjRykuLrZk2mh1uQoKCggICADAz8/PkpGyqnLNmDGDtWvXcvr0aQ4fPkx0dHSt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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(2, sharex=True, figsize=(15, 8))\n", "data = gzmt.iloc[-14:]\n", "\n", "ax[0].set_title(\"贵州茅台近两周收盘价\")\n", "data.asfreq(\"D\").plot(ax=ax[0], marker=\"o\")\n", "\n", "ax[1].set_title(\"采样缺失值填充方法对比\")\n", "\n", "data.asfreq(\"D\", method=\"bfill\").plot(ax=ax[1], style=\"-o\")\n", "data.asfreq(\"D\", method=\"ffill\").plot(ax=ax[1], style=\"--o\")\n", "ax[1].legend([\"back-fill\", \"forward-fill\"]);" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T15:53:33.431702Z", "start_time": "2020-05-12T15:53:33.427498Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### 时间迁移\n", "\n", "Pandas提供`shift()`方法**迁移数据**,`tshift()`方法**迁移索引**。两种方法都是按照频率代码进行迁移。\n", "\n", "用`shift()`和`tshift()`这两种方法让数据迁移900天:\n", " " ] }, { "cell_type": "code", "execution_count": 114, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T16:04:34.763549Z", "start_time": "2020-05-12T16:04:33.798730Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "image/png": "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ZSWovd9lgLfffptnn302+Fn3vvbpTIwb6N7Xts7EWfe+9ulMjHXva7/2xnnx4sUsWLCAefPm8c477wDgdru54YYbWLBgAddddx2VlZUdr4AZYQoKCsxzzjnHrK+vN1euXGledtll5s9//nPzlVdeMU3TNO+8805z8eLF5qFDh8xvfOMbZk1Njbl//37z3HPPNf1+v/nkk0+ajzzyiGmapnnHHXeYL7/8cndeTo/U2Ribpmlu2bLFvPjii82LLrqoOy+lR+tsnN966y3z0UcfNU3TNP/973+bGzdu7M7L6ZE6G+N7773XfPPNN03TNM0f/vCH5rJly7rzcnqu3FzTHD7cNOvrTfPDD01zyhTTvOEG03zqqcD273zHNP/+98DyddeZZlKSaT700NH9WyorQe39Lpumad59993m5MmTzWeeeSa4v+59betsjE1T97726Gycde9rW2djrHtf+7Q3zvX19ea0adPMiooKc9++fea0adNM0zTNxx9/3PzjH/9omqZpPvroo+af//znDtch4lrkLBYLd999NzabDbvdjmEYLF++nHPOOQeAs88+mxUrVrBy5UrOPPNMoqOjGTJkCHa7nZycHCZMmMCCBQsAgvtLY52NcV1dHffddx/33ntvN19Jz9bZOC9btoycnByuuuoqPv74Y0aPHt3NV9TzdDbGDoeDyspKfD4fNTU1OByObr6iHspqhYcfBpsNHA4wDHj/fTjyu5a5c+GDDwLLzz0Ht93WeP+WykpQe7/LAA888ABXX311o/1172tbZ2Ose1/7dDbOuve1rbMx1r2vfdob5/r6ehYtWkR8fDwOhyP4+/f4sitXrux4HbrucsIjPT2dr3/96xQXF/Pggw9y++23U1paSmJiIgCJiYm4XK5G6wASEhJwuVxMmTKFzMxMPvroI/bt28e8efO661J6rM7G+KGHHuLKK69kwIAB3XUJEaGzcS4pKWH48OG89NJLOBwOPtDDbxOdjfEtt9zCU089xTe+8Q2cTidTpkzprkvp2fr1g3nz4PBhuPPOQDfLoiJISQlsT06G4uKW9+9I2ZNUe7/LLdG9r22djbHufe3T2Tjr3te2zsZY9772aW+cY2JimDdvHtXV1dxzzz3cfffdAB36mbQk4hI5gL1793LjjTeyaNEipkyZQlpaGmVlZQCUlZWRkpJCampqcB0E3g9IOfKg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oYpxhxK55ORk3G43fr8fi8VCWVkZKSkpGIaBy+UCwDRN3G53i2U7qqTEjd9vdni/9PR4iooqO7yfdIziHHqKcXgozqGnGIdeV8fY5qoGwKufWyP6LoeeYhweinPodTbGFovRYsNWh0attNvtZGVlsWLFCkzTZOnSpcycOZNZs2bxySef4Pf7WbVqFePHj2+xrIiIiIiIiHROh1rkAO666y7uvvtuHnroIaZMmcKkSZMAyMrKYv78+VgsluBgJy2VFRERERERkRNnmKbZ8X6LYaSulT2b4hx6inF4KM6hpxiHXpd3rfxiNQDeM6Z02TF7A32XQ08xDg/FOfR6TNdKERERERER6X5K5ERERERERCKMEjkREREREZEIo0ROREREREQkwiiRExERERERiTBK5ERERERERCKMEjkREREREZEIo0ROREREREQkwiiRExERERERiTBKpA9r1gAAIABJREFU5ERERERERCKMEjkREREREZEIo0ROREREREQkwiiRExERERERiTBK5ERERERERCKMEjkREREREZEIo0ROREREREQkwiiRExERERERiTBK5ERERERERCKMEjkREREREZEIo0ROREREREQkwiiRExERERER6UH8pslXu4sxTbPFMkrkREREREREepBP1uXy2Gsb2bC7pMUySuRERERERER6kOLyWgDKqupaLKNETkREREREpAf5cmcRADsOuFoso0RORERERESkhzBNM9giZ7W1nK4pkRMREREREekh6up9weWaWl+L5WzhqIyIiIiIiIi0LrfIzd/f2x78XFHtabGsEjkRERER+f/s3XdgVfX9//HnnbnZG0IIEAgQhoyAygbFWWXpTy3Ura21amurVWj9aqt+v5hvsWqtft1Y96p1bwVkCAjI3huSkJC9xx3n98dNLoQkkHWzeD3+8Z5zPuecz3nfY8598/mcz0dEOoDnPtpKek4pALERDopKNNiJiIiIiIhIh1aTxAHMmNCXhmeRU4uciIiIiIhIhzJ5RA9G9I8hr1gtciIiIiIiIh1aQmwIAFed25+QQBszJ/ZtsKwSORERERERkQ7AMAxGDYwlyGE7ZVklciIiIiIiIu3su3VppOeU4rBbGlVeiZyIiIiIiEg7e+ObXQCkZ5eeoqSXEjkREREREZF2lHHcaJWjk2MbtY8SORERERERkXb0wqfbAPjZ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pk+fzvTp01m+fDkAhYWF3HTTTcyePZubb76Z0tLS9ryUDqslMa7x7LPPMm3atPaofqfRkji73W4eeughrrrqKq6//npKSkra81I6rJbEOC0tjeuuu47Zs2dz//33YxhGe15Kx/bIIzB6NKSkwOLFkJYGEyfCyJFw1VVQHWcA3noLHn302PLJyopPY+9lgE8//ZSXXnrJt6xnX+O0JMY19Ow7tZbEWc++xmlJjPXsa7zGxvmDDz5g1qxZzJgxg88++wyAkpISbr75ZmbNmsWNN95IcXFx0ytgdDKZmZnG+eefbzidTmPFihXGlVdeafz5z3823n77bcMwDOOee+4xPvjgAyM9Pd248MILjfLycuPAgQPGBRdcYHg8HuPZZ581Hn/8ccMwDOPuu+823nzzzfa8nA6ppTE2DMPYunWrMW3aNOPSSy9tz0vp0Foa508++cR44oknDMMwjHfffdfYtGlTe15Oh9TSGN9///3Gxx9/bBiGYfz2t781li5d2p6X03GlpRlGUpJhOJ2G8c03hjFmjGHcfLNhPPecd/u11xrGK694P994o2FERBjGggXH9m+orPg09l42DMOYN29RBwE9AAAgAElEQVSeceaZZxovvviib389+06tpTE2DD37GqOlcdaz79RaGmM9+xqnsXF2Op3G+PHjjaKiImP//v3G+PHjDcMwjKefftr4+9//bhiGYTzxxBPGP//5zybXodO1yJnNZubNm4fVasVms2EymVi2bBnnn38+AOeeey7Lly9nxYoVjBs3DofDQZ8+fbDZbBw6dIiRI0cya9YsAN/+UltLY1xZWcmDDz7I/fff385X0rG1NM5Lly7l0KFDXHPNNXz33XckJye38xV1PC2Nsd1up7i4GLfbTXl5OXa7vZ2vqIOyWOCxx8BqBbsdTCb48kuo/lvL9Onw9dfezwsXwp131t6/obLi09h7GeCRRx7huuuuq7W/nn2n1tIY69nXOC2Ns559p9bSGOvZ1ziNjbPT6WTu3LmEhoZit9t9f39PLLtixYqm16H1LqdtxMbGct5555GTk8Pf/vY37rrrLvLy8ggPDwcgPDyc/Pz8WusAwsLCyM/PZ8yYMSQmJvLtt9+yf/9+ZsyY0V6X0mG1NMYLFixg9uzZxMfHt9cldAotjXNubi5JSUm8/vrr2O12vtaP3zpaGuPbbruN5557jgsv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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots(3, sharey=True, figsize=(15, 8))\n", "\n", "# 对数据应用时间频率,用向后填充解决缺失值\n", "gzmt = gzmt.asfreq(\"D\", method=\"pad\")\n", "\n", "gzmt.plot(ax=ax[0])\n", "gzmt.shift(900).plot(ax=ax[1])\n", "gzmt.tshift(900).plot(ax=ax[2])\n", "\n", "# 设置图例与标签\n", "local_max = pd.to_datetime(\"2010-01-01\")\n", "offset = pd.Timedelta(900, \"D\")\n", "\n", "ax[0].legend([\"input\"], loc=2)\n", "ax[0].get_xticklabels()[5].set(weight=\"heavy\", color=\"red\")\n", "ax[0].axvline(local_max, alpha=0.3, color=\"red\")\n", "\n", "ax[1].legend([\"shift(900)\"], loc=2)\n", "ax[1].get_xticklabels()[5].set(weight=\"heavy\", color=\"red\")\n", "ax[1].axvline(local_max + offset, alpha=0.3, color=\"red\")\n", "\n", "ax[2].legend([\"tshift(900)\"], loc=2)\n", "ax[2].get_xticklabels()[1].set(weight=\"heavy\", color=\"red\")\n", "ax[2].axvline(local_max + offset, alpha=0.3, color=\"red\");" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "-" } }, "source": [ "> `shift(900)`将**数据**向前推进了900天,这样图形中的一段就消失了(最左侧就变成了缺失值),而`tshift(900)`方法是将**时间索引值**向前推进了900天。" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "可以用迁移后的值来计算gzmtle股票一年期的投资回报率:" ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T16:02:04.141296Z", "start_time": "2020-05-12T16:02:03.726884Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA20AAAHxCAYAAAD+yVTbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdeWBU5b3/8c+ZJQvZIBAVZRPEXRGxgAvSqt3uvVyX2qq11au1vb16va3iFVq1ttfWH1Zbb70ubbVa21p3EVu1dYMKVjarLAqCKLIJBEggCUlmO78/JufMmS2ZSc5kZjLv1z9OZs6ceXIkk3zm+zzfxzBN0xQAAAAAoCB58j0AAAAAAEB6hDYAAAAAKGCENgAAAAAoYIQ2AAAAAChghDYAAAAAKGCENgBAwevs7FQ4HM73MAAAyAtCGwCgXzz66KO6++670z7e2tqqyZMnp3zsqquu0ptvvpl0/zPPPKPvfe979tdnn3221q5d2+04tm/frnvuuUetra09jvnJJ5/UI4880uNxibZt26alS5dm/TwAAFLx5XsAAICB6z/+4z/scNTY2KhgMKglS5bYj//yl79UVVWVJKmsrEyDBg2yHzvxxBP1j3/8w37M7/dLklauXKkbb7xR1dXVam5u1r59+/T1r39dkrR582bdeOONqqysVHt7u66++mpNnz49bkz/8z//o8rKSpWXlysQCMjv98swjKSxB4NB/epXv9KPf/zjlI9JsseUaNu2bfrZz36mxx9/PO45fr9f//d//6cHHnhA5eXlKi8v12WXXabLL79ckvTEE0/orrvuUiQS0VVXXaWLL77Yfv7s2bM1YcIEXXTRRSlfEwAwcBHaAAA5s2rVKi1atEhStCq2a9cufetb35Ikffazn5XHE5vw4fF44r62wlyiY489Vs8++6w8Ho9eeeUVrVmzRldffbUk6aKLLtIPf/hDHXHEESmf+8ADDygSieinP/2pvF6vbrvtNrW1telHP/pRUnD74x//qHA4rHvuuUf33HOP3n77bU2cOFGmaSoYDOqcc86xA9T27dv15S9/WYcffrj9fJ/Pp2984xuSpLa2No0fP1633HKLJOnrX/+6rrvuOm3evFlf+cpXdMopp6isrEx33HGHHn30Ufn9fp1//vmaOnWqxo0bl/kFBwAMSIQ2AEDOHH300XYVzKq0LVy4UJLU0NCgSCQiSbr99tt1wgknSJIeeughzZgxQ4Zh6Le//a0+//nPx53TCnbf//739eGHH8rv99uv4fV69b3vfU9nnXWWrrzyyrjnPfXUU3r55Zf129/+Vl6vV5J0zTXX6Morr9Qtt9yiH/zgB/axW7Zs0b333qtHH31UY8eOlSSdfvrp+v3vf5/y+/R4PBo1apRuvfVWrVixQi+99JK++93vSpIuueQSPfTQQyorK0t63siRIzVhwgR9+OGH2r59u0477TQ7pE2bNk0LFiwgtAEACG0AAPdt2LBBa9eu1XnnnWfft3TpUu3bt09nnXWWfd+CBQt02GGH6Z133tFnPvMZSdLGjRu1YsUKSdLOnTv1t7/9LeVr3HrrrZKkP/zhDzrllFM0duxY3Xzzzdq4cWPc60rRKt8NN9ygiRMn6sorr1R7e7tM07Sray+99JLKy8s1a9YsBYNBXX311br00kvtwOYUiUQUDAZVXl5u32eapjwej1atWqWlS5dq48aNeuWVVyRJHR0deu211zR8+HANHz487lzbtm3T6tWr9d3vflfLli3TwQcfbD82fPhwbd26tYcrDQAoBYQ2AIDrvF6vysrK5PPFfs1MmzYt6bhQKCSfz6eNGzdq7NixMgxDRx11lFavXi1JOumkk/Tss88mPc+5Fq26ulpXXHGFJk+erObmZt1///1JVa1TTjlFd911l8aOHauhQ4eqrq7OrrZJ0fC0a9cuSdF1aj/96U/V1NSkKVOm2FMe9+zZo6997WuKRCLyer1xVbdgMCifz6ezzjpLgwcP1gsvvKC//vWvkqT9+/frsssuixvPI488oqefflotLS267rrrdOSRR6qzs1NDhgyxj/H7/ero6MjsggMABjRCGwDAdWPGjNGYMWPipjA6hcNh1dXV6b777tNHH32ksrIydXR0qLa2VpMmTdLy5cslSZMmTdKrr76qpqamuOd+9atflc/nsytlO3bs0Ny5czVx4kRdeuml6uzs1Pbt2/X666/L5/PpoIMO0l133aU777wz5XhPOumkuIYj48eP18qVKzVp0iTde++9kqLTI//whz+kfH5bW5tqamrU1NSk5cuX22vZJOmss87SW2+9pUmTJtn3XXzxxbrqqqv06U9/2m6UUllZqc7OTvuYQCCgysrKni82AGDAI7QBAHKmra1NN998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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ROI = (gzmt.tshift(-365) / gzmt - 1) * 100\n", "\n", "ROI.plot(figsize=(15, 8))\n", "plt.title(\"贵州茅台年度ROI\");" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T14:29:30.077494Z", "start_time": "2020-05-12T14:29:30.020586Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### 移动时间窗口\n", "\n", "Pandas处理时间序列数据的第3种操作是移动统计值(rolling statistics)。通过`Series`和`DataFrame`的`rolling()`属性实现,它会返回与`groupby`操作类似的结果。\n", "\n", "计算茅台股票收盘价的一年期移动平均值和标准差:" ] }, { "cell_type": "code", "execution_count": 123, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T16:07:50.438050Z", "start_time": "2020-05-12T16:07:49.932431Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3MAAAHxCAYAAADHruWAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOzdd3xUVf7/8dedyaSTQApNpDfLKm0BQUFYVmyAIrJfXBGxg7o2EMQFKcICsrg/FFCkCOqii1KsiAqu4IqK1FAE6ZAEQkhIz5R7f3+EjBmSkATSeT8fDx87c+fce8+c5PHYvPmce45hWZaFiIiIiIiIVCm2iu6AiIiIiIiIlJzCnIiIiIiISBWkMCciIiIiIlIFKcyJiIiIiIhUQQpzIiIiIiIiVZDCnIjIJSY7OxuPx1PR3ZCL5Ha7K7oLIiJSwRTmRESqoKVLl/L6668X+nlaWhodO3Ys8LPHH3+cH374Id/x5cuX88ILL3jf9+vXjz179py3H/Hx8cyePZu0tLRi9rz4li1bxnvvvVdkO6fTyQ033ADAihUreOWVV4p9j6NHj3pf//jjjyQlJRX73P3793Pw4MF8x03TxOl0nre/pmme99qZmZnn/Xzfvn3cfvvtuFwuAI4dO0a3bt2KvK7b7SYuLu68bQD69u3LsWPHgPzh3+Vyee8L5PvZv/zyy2zfvp0dO3ac92dx7Ngxvv76a+/7//znP2zZsqXIvomIyO/8KroDIiJSPMOGDfP+4ZyQkIDL5eLHH3/0fv7GG28QEhICgL+/P8HBwd7P2rVrx+bNm72fORwOALZv387f//53QkNDSU5OJiUlhcGDBwM5Qefvf/87QUFBZGZm8uSTT9K9e3efPk2cOJGgoCACAgJwOp04HA4Mw7jo7+pyuXjzzTd5+eWXC/wM8H4HwzC839XhcBAQEMDx48fp27cvLVu2xOl0EhISwpIlS0hPT2f+/PkcOHCAmJgYgoKCmD17Nna7nWHDhrFixQpq1arlcz+3241hGNjtdp/X33zzDYmJiT4BGGDv3r2MHDnS27+UlBTS0tKoX7++t/8TJ06kbdu23nP+8pe/MGXKFJo1awbAyJEjue666/jrX/9a4Ph88cUX/OlPf+Jvf/sbJ06cwOVycebMGQYMGABAaGgoS5YsAeC9995jz549HD16lOTkZK6++uoCxzWvgIAAQkNDAZg0aRJbt27FbrcDOeHuqaee4pZbbgHgvvvuY9CgQdx9992kpaXx0UcfMXz4cNxuNwcOHMh3bcuyvL8jCxcupFu3bgC88847zJ8/P18bEREpnMKciEgVsWPHDjZs2ADkVNFOnTrFI488AsCf//xnbLbfJ1vYbDaf97kh71xXX301K1euxGaz8fXXX7N7926efPJJAAYNGsT48eNp1apVgefOnz8f0zSZPn06drudadOmkZ6ezoQJEy76D/F///vfeDweZs+ezezZs9myZQtt27bFsixcLhd33HEHgwYNAuDee+8lPj6eQYMGkZSURGZmJrVr16Zly5YsXbqUY8eO8dJLL3nHoX79+vzhD3/g0KFDrFq1CoDnnnuOBg0aMHr0aFJTU3E4HKxYsQKANWvWMHfuXGw2Gx6Ph5EjR9K9e3fsdjvR0dH5+t66dWs+/vhjnE4nAQEBrF69mvXr1zN58mScTieZmZmEh4f7nOPv74+fX87/JaelpbF+/Xqio6OZNm0aALVr12bo0KEAZGVl8f7777N06VLq16+Pn58f27dvZ9asWSxYsMA7Rrl69uzJLbfcwlNPPcVbb71FdHQ0K1euZMaMGdSuXRvI+ceB9evXc+bMGU6dOoXL5eLo0aOkpqYWGfxGjhzJ8OHDadeuHZs2bQJyqr8ejwfTNLn77rvJyMjgs88+A+Af//gHW7Zs8X7fnj17UrNmTYKCgnj66adxOp307t3b+7stIiKFU5gTEakirrzySm/VLLcyt379egCio6O9U+xeeeUV2rRpA8CiRYvo06cPhmHw9ttv07t3b59r5ga+MWPGcODAARwOh/cedrudF154gV69ejF8+HCf8z788EO++uor3n77bW/F5plnnmH48OFMmjSJcePGXfD3PHbsGHPmzGHp0qU0bdoUgG7duvHOO+8U2P6DDz6ge/fuPPLII2zatInAwED+/Oc/884777Bu3ToSExN92vfr14/U1FQgp0q2fPlyTp48Sf/+/Rk0aBBjxozhzjvv9La/9dZbufXWW73vDxw4wKhRo9i/fz92u52DBw+yZcsWPv30U+94Ll++nJiYGG+IzLVq1SpWr17NggULgJwq3rPPPsvx48d59NFHue2227Db7QwfPpx+/foBEBcXx9SpU71hbsmSJSQmJlKrVi22bdvGhAkT8Hg8pKSk0L9/f7Kysli+fDmQU+GqXbu292cEeEPmXXfdxTPPPAPg/b3YsmULCxcu5Ndff2X69Om0atWKv//97+f9eV133XXcd999BAQE8O6773LdddcxZ84cli9fzuHDh733yDVmzBhcLpe3cnnXXXcxefJkWrdu7e1f7mciInJ+CnMiIpXc/v372bNnD/379/ce++mnn0hJSaFXr17eY99++y3Nmzdn69at9OjRA4BDhw6xbds2AE6ePMl///vfAu8xZcoUAN599126dOlC06ZNeemllzh06JDPfSEnqLz44ou0bduW4cOHk5mZ6TMtbs2aNQQEBDBq1ChM0yQjI4OgoCCfQJGXZVlkZmbi7++PZVk8+eSTDBkyxBvk8jJNE5fLRUBAQL7jGRkZZGdnExgYiGEYeDweMjIy8j1/NmzYME6ePMmxY8cYPHgwDz/8MK+99horVqzglltuYcCAAVx//fUAeDwebr75ZoKCgjAMA9M0ufHGG5k2bRqvvvoqDRs25K677uL666/3qYT269ePuXPnEhsb6z2WmprK3LlzvVMJAZo3b87y5ct58MEHmTRpEsnJyYwZM4axY8eya9cuevbsyZkzZ7zTSI8ePcqiRYuIiIgAcsJoq1atmDFjhveaPXv29Fa9kpKSGDp0KHa7nZ07d/Lggw/i5+eXr+qV+7O78cYbadiwIbfccguzZ8/myJEj3HzzzQQHB3PmzBlCQ0Ox2+2kp6ezePFi6tatC+QE+eXLlxMXF8fll1+e72fj8Xi8AS0rK4t77rnHOzV33759TJgwwfu74HQ6WbBgQb7priIikp/CnIhIJWe3232m4QHeBT/ycrvd+Pn5cejQIZo2bYphGFxxxRXExMQA0KFDB1auXJnvvLzPuoWGhvLQQw/RsWNHkpOTeeutt/D39/dp36VLF2bNmkXTpk2JjIwkPDzcJ6jFxsZy6tQpAA4ePOitahUW5nIX11iyZAmdOnVi+vTpJCUl0alTJ1q2bAnA6dOnuffeezFNE7vdnq9Kl5KSwrvvvktSUhK33XYbpmlSq1YtbrvtNo4dO8a3337rbbtgwQJmzJjB+vXrmTJlCvv27WPGjBkcOnSI8PBwn+fU7HY7H330EV9//TU7d+5k9OjR3imMiYmJtG3blrS0tHzTWP38/Fi6dCnR0dFs374dyHmeb8qUKT4h1WazecfXMAyaNm3KzJkzCQsLY8iQIXTt2pX09HSfMPfQQw95p4DabDa+//5775RTyKna5oqIiGDVqlWsXbuWYcOG8eqrr9KsWTNWr15d4M8C4LvvvgNg3rx5PPzww962f/vb33jiiSe8P5O8Dh8+jMvl4pFHHmHBggUMGjSI06dPk5WVxcaNG+nQoQMjR47Esizsdru3crh69WrWrFnDzJkzfa7ndDr13JyISDEozImIVHKNGzemcePGPlMh8/J4PISHhzN37lwOHjyIv78/WVlZhIWF0b59e+9zTO3bt+ebb77xWbHR4/Fwzz334Ofn5/3D+cSJE6xYsYK2bdsyZMgQsrOziY+P57vvvsPPz4+6desya9YsXn311QL726FDB+9zVo0bN+bHH3/0LpJSEJfLRWZmJkFBQQC0aNGC7du30759e+bMmQPkTLN89913Cx2jevXqsXTpUj777DMOHDhAdnY2+/fv59FHHyUrK8snCMfHx/PDDz+QlZXFM888w//93/9xzz338OWXX/L+++/z2GOPkZ2dzaOPPkrv3r0JCwvjs88+48knn+T111+nV69e/OEPf/BWulJTU72LhRw5coSHH37YJ9zlLoCye/du77H09HRGjRpFz549fb5HWFgYYWFhQE6Y2rx5M5mZmd4w16VLF7p06eINcwANGjSgb9++3vfnLjricrmYM2cODRo04NVXX6Vr166FVr1M0+Tjjz+madOmOJ1Opk+fTps2bbzjd/LkSebMmcOMGTN8xnTMmDE8+eSThISEsHXr1kKnWSYlJXH//fd7z929ezctW7bMV/11u9289dZb1KlTp8B+iohIDoU5EZEqIj09nZdeeokrrriClStX0qBBAzp06EBCQoL3D+bGjRuzYsUKtm/fTqNGjWjRogUtWrRg7ty5hIeHM3nyZJ/n3+x2Ox9++KH3/dKlSwkPD2f//v0sXryYgIAAli1bRkxMjM8f7wkJCUyYMIFOnTr59PHHH39k0aJFPtevWbPmeb+Xw+HwBlSPx1PkHni5C3w4HA62bdvG5MmTMQyDwYMHk5WV5f2vc+fOvPzyy8TGxnqXyHc6nYwYMYJ7772Xt99+mxkzZpCens5HH31EbGws33zzDaGhofTv35/27dsDsHPnTjIyMqhduzZJSUksXLiQ0aNHc+rUKRo3bszevXupUaMGAA0bNuTLL7/06W/eBVDOZ+vWrRw+fJjo6GjWrl3LmjVraN68OV26dPFZmfRcISEhNGrUyPs+788JYPr06XTt2pXNmzfz1FNP8dprr3lXojzXqlWruOaaa9i1axcPPvggHo+Hp59+mokTJ7Ju3Tpq167NmTNnmDVrFs8++ywA69evx+Vy0alTJ2JiYvjll198KnP/+9//aNu2LWPGjCEiIoKPP/4YyFm9slatWsybN89btc392Z5bDRYRkYIpzImIVBF5N4l+//33GTFiBOnp6dhsNm/VyzAMatasyWeffUbnzp1LdP3//Oc/LFu2jMWLF/tUSgYMGECfPn182p4bGPLK++xYSf3yyy/eqo/dbvcuxnL69Gnv69znql5//XXatGnDvHnz+Oc//8mECRN44YUXeO655/jkk0+IjIwkLCyMlJQU7/UPHTpEkyZN6N69O2+//TYtWrTg9OnT1KtXj/79+/PQQw/RpUsXbrzxRqKiogAYP348R44cYdKkSXTs2JGtW7cybdo0hgwZgmEYpKamesNcSW3YsIEPP/yQvXv3sm7dOoYMGcKKFSsICgpiwYIFREVFsXLlyvOGuV9//ZXXXnvN+z7v9925cyf79u1j/vz5DB06lJo1azJr1ixWr17NRx995F1AJ3dfvJtuuonrr7+exx9/nKCgIGJiYggICPAuTgI5+8j169eP22+/nfDwcEaNGsWsWbO8ld3cimphC6BYlsXixYtZsWIFDRo04J577uHIkSNERUURGhqKzWYr1v6CIiKiMCciUmU8//zzOBwOZsyYQVhYGIGBgdx55520b9+eESNGeNsdPHiQdevW+axCmHepesuyfK67Z88e5syZQ0pKCosXL84XTAzDIDAw0OeYZVmMGjUq3/GsrCyuuOKKC/6OHTt25D//+U++44WtZunxeBgzZgw33XQTdrudgQMHsnHjRpYuXcrixYu9fc0NGi1btmTSpEmcPn3aOw4RERE89NBDHD9+HMuyOHr0qHdLAMgJc5dffjlhYWFkZmZy5MgR9u3bx/Tp0/nqq6/4/PPPC9yiIJdpmoVu5h0aGsp1113Hyy+/7J2qmbv/XHZ2NidOnGD79u3ehUbyXtPlcmFZFl27ds23AEruoiNXXXUVCxcuLDBgDx48mEcffRTA+/sTEhJCSEiIt8/ffPMN999/P4mJiSQlJWG327nsssv44IMPaNasGYcPH6ZHjx506NDBO9Y///wz/fv3Jy0tDbfbzfr168nIyGDixIk0bNiQkSNHEhgYyJIlS7xbNIwYMYK77747X6VXRETOT2FORKSSczqdvPTSS+zfv5/U1FQGDBjA7NmzcTgcfPHFF6xbt44XX3yR66+/nmeffZb58+fz0EMP+YSyvIt6OJ1ObyUmMTGRkSNHcsstt/DII4/gcrl47733SE5OLnTBEsipEk6bNq3AaZZvvfVWKY9ATrBxOp35pt+dPn2aP/7xj96tBDp06MAvv/zCjTfeSIMGDfB4PAwfPty7MXUup9OJy+XCNE3GjBnDpk2biIyM5L777uO2227zaXvVVVd5X+/du5eUlBTefPNNb3WyQYMG3HvvvYX2PfdeBWnTpo13G4lznT59mn79+tG8eXOGDBmS75offfQRa9euxTAMnwVQ6tSpw+DBg3n66ae57rrrvEHO5XJ5q7s333yzz/XyhsG8fR47diwAzz77LAEBATRo0ADAu7l5o0aNfKaPulwu/vjHP3qfdSxoLAYOHEiNGjUYOnSot6IcFxfHvn37CA4OxrIsAgMDefvttwu8hoiI/M6wzv0nWhERqXS2bNlCVFRUvmXfc3k8Hk6fPk10dLT3D/bzTYXM69xVAxctWsRVV11Fx44dL77jFcA0Tdxutzf4nT592ruUf0EOHTpEWFjYeduIiIhURgpzIiIiIiIiVVCxnlKfN29evj1pxo4d651rDzB16lT69OnDHXfcwa5du4Cc5zDuvPNO+vTpw6RJk0qx2yIiIiIiIpe2IsPcAw88wNy5c32OrVu3jp9//tn7ftOmTWzbto1Vq1YxatQopk6dCuQEvOeee46PP/6YvXv3+pwjIiIiIiIiF67IMLdw4UJ69+7tfX/69Glmz57ts3La+vXr6dmzJzabjc6dOxMTE4PT6WT79u107doVwzDo3r07GzZsKJtvISIiIiIicokp8WZA48aNY8SIET6rpCUlJXk3hTUMg9DQUJKTkwkNDfU+VB8eHk5SUlIpdVtEREREROTSVqKtCU6cOMHevXuZPXs2KSkpxMfHs2jRIiIjI71BzbIs0tLSqFWrFmlpaZimic1mIzk5+YJWCktMTMM0S75GS3R0DRISUkt8npSMxrnsaYzLh8a57GmMy4fGuexpjMuHxrnsaYzL3sWOsc1mEBkZWvjnJblYnTp1WLNmDe+88w5jxoyhTZs2DB06lG7durF27VpM02Tjxo1ce+21OBwO2rZty4YNG7Asi2+//ZYbbrjhgr+IiIiIiIiI/K5UNg1v27Ytbdu2pV+/fthsNu8CKM8//zyjR4/mlVdeoVOnTrRv3740biciIiIiInLJq/T7zGmaZeWmcS57GuPyoXEuexrj8qFxLnsa4/KhcS57GuOyV9bTLEulMleecp7JO0NmZhqm6Sm03cmTNkzTLMeeXZqq6zjbbHaCgkIJDQ33LuIjIiIiIlKZVLkwl5SUgGEYRETUwW73K/QPbT8/G2539QsZlU11HGfLsvB43KSmJpOUlEBERO2K7pKIiIiISD4l3pqgojmdWdSsGYmfn0MVEykThmHg5+egZs1InM6siu6OiIiIiEiBqlyYAwvDqILdlion5/esUj9SKiIiIiKXMKUiERERERGRKkhhTkREREREpApSmCslr746ncTEU6V2vX37fmXz5k2ldj0REREREaleqtxqluf6fkccG7bH5TtuGHCxO+hdf009uv6hXrHaPvPM8xd3s3Ps27eXuLhY2rXrUKrXFRERERGR6qHKh7nK4oknHuHFF8dTr159Bgzow8CBg/jmm69wOrN59dU5fPTRB8TEbMfpdOLxeBg7diKXXdaAAQP68OGHnwAwefJ4brnldj777GN27ozB6cxm06afeOqp52jd+soK/oYiIiIiIlKZVPkw1/UPBVfPKnr/M4/H5M03FzF9+mR+/nkjANHRtRkz5iXWrFnNvHlzmDBhSoHnjh07kc8//4S4uFgefPDR8uy2iIiIiIhUEXpmroz069cfgMjIKFwuFwBXXnk1AK1btyY29li+c7Kzs8uvgyIiIiIiUqUpzJWR4ODgfMdiYrYDsHv3Li6/vBEAWVmZeDwe0tLS2LLlF2/bgIAAMjIyALAu9uE/ERERERGpdqr8NMuqJDk5iccff9j7zBxA7963Mm7caGrViqBFi1betp06deGTT1YybNiDdOp0Hfff/1BFdVtERERERCohw6rkZZ/ExDRM8/cuxscfpm7dRkWeV9HPzJ1rwYI3qVevPrfe2qeiu1KqKts4l7bi/r6VpejoGiQkpFZoHy4FGueypzEuHxrnsqcxLh8a57KnMS57FzvGu48k0a19w0I/V2WunGghExERERERKa70LBdfbzp23jCnZ+ZEREREREQq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5Syff+bMKTyewsuPNpsN06y6C6BUFdV1nO12P2rUqOX9fRMRERERKUjeApNlXlycK2llr8qFOcgJdEX9ka3VecqHxllERERELmXuPAHuYqdZmiUMg1VumqWIiIiIiEhF2n04ifjTOc+2eTy/z1K7yMJcicNgscLcvHnzWL16NQDHjh3jnnvu4e677+bZZ5/F4/EAsHDhQvr06UOfPn3YsGEDAPHx8QwaNIh+/frx1FNP4XK5StQ5ERERERGRyuY/637jzY93AuD25JlmWdkqcw888ABz5871vp83bx533nkny5YtIy4uju+//57Y2Fg++OADli1bxuuvv87EiROxLIvXXnuNO+64g1WrVhEQEMBnn31W8m8kIiIiIiJSSX3yv0Pe1xe7PmNJK3tFhrmFCxfSu/fvGzR3796dG2+8EQCHw4FhGHz//fdcd911BAYG0qhRIxwOB0eOHGH9+vX06tULgB49engrdiIiIiIiIlXduZW0i67MlfUCKH/6058AeO+99wgODqZr16689dZbhIeHe9uEhYWRlJTE6dOnvcfDw8NJSkoq6e2IjAwt8Tm5oqNrXPC5Unwa57KnMS4fGueypzEuHxrnsqcxLh8a57KnMb4wDr+cmljMkWTva4DwmsH5xrQkYxyWmOm9XnHOu6DVLP/5z38SGxvLa6+9hs1mIzIyktjYWO/nZ86cISIigqioKJKTk73/GxERUeJ7JSamlXjuKGiVxfKicS57GuPyoXEuexrj8qFxLnsa4/KhcS57GuML53LnLHqy4tvffI7/dug04QF27/uSjnHi6XRcbpNhd1xNQkIqNptx3uJWiVez/Pe//01ycjIzZszA4cjZIO/666/nhx9+ICsri0OHDuHxeGjYsCHdunXjq6++AmDdunXccMMNJb2diIiIiIhIpda9TX0A9h1LvqjrON05i0uGBhav5lbiytycOXOoU6cO99xzDwB33XUXAwYMYNCgQQwYMACAcePGAfD444/z1FNP8f7779O4cWNuvfXWkt5ORERERESkUut+bX3+uzWWX4/+HuYsy8KdZ9uC4sh25oQ5f4e9iJY5ihXmpk6d6n1d2CImQ4cOZejQoT7H6tSpw/vvv1+sjoiIiIiIiFRWZ9Ky+e34Gdq3qp3vM8Mw8h1buf4gu48kMebe9sW+h9tjYgB2W/7rFeSCnpkTERERERG5lLy/9jfiT2fQqmGtYrXffiARh5+NpNRsatUIKNY5btPCz24rMBwWpMTPzImIiIiIiFxqcqdAZma7fY5HhQcCcHm070IluatSus4+B1ccbo+Jn714QQ4U5kRERERERIqUWyz76L/7fY7f3aM5AE3rhwH595orydZxbo+F3V78iKYwJyIiIiIiUoSss5W5E0mZPscDzy5Wkhv2Nu89xa5Dp/GcXfyksCx3/FQ6X2866hP+3G4TRwnCnJ6ZExERERERKUJhe1/XCM7Zrs12Ns19+sMh72d28lfqci38bDemZdGj3WXYz57rNk3smmYpIiIiIiJSelpcXrPA497FSgrJYIVkQC+PJ6eBy22y61ASp85kFbtPCnMiIiIiIiJFyK3AFcZW2AqUhVTmbGeTmOds2juRlFHiPinMiYiIiIiIFOF/MfEXdF5hC6DkVvQWfbEHgM2/JgDQ7dr6xb62wpyIiIiIiMhFshWy0XdRi1kmJOcsqBIe6g/A9X+oW/x7FruliIiIiIjIJaiwRUzyKmzZksLOPXdfutxn6/y0mqWIiIiIiEjpOJ6Qnu9Yu5bRBPnbve+NQp6ZKywH2s+p5Jmmhd1mFHqdgijMiYiIiIiIFMC0LL7bGsueI0neYz3bXcahuFT6dGns07bQ9U8KmWiZ96jL7WHDjrgS909hTkREREREpADfbYvlv9tive/7d2vKH5pGcsM1+dsWtpplMWZoku0yL6h/emZORERERESkALHnTK8M8i+8FlbCnQmKXhmlGBTmREREREREChAVHuh74LyPs/3+YfPLwr2vC1sAxcyT5nLb3Na5UYn6pzAnIiIiIiJyjpR0Jz/sOuFz7Hxrk3jM36dKDrixmXeT8eJU5nLblGTxE1CYExERERERyWfrb6fyHTPOU5oLDvx9CmaAw85fejQHCl8AJa/cypythOlMYU5EREREROQcHjN/CDtf4eyqxhEFNv731/v4Ls8iKrnyXj33VucLiwVRmBMRERERESmGwlashPxTJPNuI7duy/F87fM+S+fy5EzRLGllTlsTiIiIiIiInKNkNbICzi8k+CUkZzJnZYzPMbc793m7kt1VYU5ERERERORcBeSqotYnefC2K6gR5CjsdACOnUzLd8zlVmVORERERESkzBS12mSD6NA8bQtuE3I27OW17exiK2fSnCXqj56ZExERERERKYYS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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "rolling = gzmt.rolling(365, center=True)\n", "\n", "data = pd.DataFrame(\n", " {\n", " \"input\": gzmt,\n", " \"one-year rolling_mean\": rolling.mean(),\n", " \"one-year rolling_std\": rolling.std(),\n", " }\n", ")\n", "ax = data.plot(style=[\"-\", \"--\", \":\"], figsize=(15, 8))\n", "ax.lines[0].set_alpha(0.8)\n", "plt.title(\"贵州茅台一年期移动平均值和标准差\");" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T12:51:35.320237Z", "start_time": "2020-05-12T12:51:35.315521Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "## 高性能Pandas:`eval()`与`query()`\n", "\n", "Pandas在处理复合代数式时(compound expression),每段中间过程都需要占用内存。Pandas从0.13版开始(2014年1月)基于[`Numexpr`](https://github.com/pydata/numexpr)程序包实现了`query()`与`eval()`,可以避免中间过程直接运算,借助NumPy风格的**字符串**实现,可以比普通方法快一倍(而且内存消耗更少)" ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:00:34.170633Z", "start_time": "2020-05-12T13:00:33.706778Z" } }, "outputs": [], "source": [ "nrows, ncols = 100000, 100\n", "rng = np.random.RandomState(42)\n", "df1, df2, df3, df4 = (pd.DataFrame(rng.rand(nrows, ncols)) for i in range(4))" ] }, { "cell_type": "code", "execution_count": 125, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:00:52.812072Z", "start_time": "2020-05-12T13:00:47.014104Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "46.6 ms ± 394 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], "source": [ "%timeit df1 + df2 + df3 + df4" ] }, { "cell_type": "code", "execution_count": 126, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:01:02.540173Z", "start_time": "2020-05-12T13:00:59.683786Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "28.3 ms ± 424 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n" ] } ], "source": [ "%timeit pd.eval('df1 + df2 + df3 + df4')" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 算术运算符\n", "\n", "`pd.eval()`支持所有的算术运算符:" ] }, { "cell_type": "code", "execution_count": 127, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:12:15.998953Z", "start_time": "2020-05-12T13:12:15.751989Z" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result1 = -df1 * df2 / (df3 + df4)\n", "result2 = pd.eval('-df1 * df2 / (df3 + df4)')\n", "np.allclose(result1, result2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 比较运算符\n", "\n", "\n", "`pd.eval()`支持所有的比较运算符,包括链式代数式(chained expression):" ] }, { "cell_type": "code", "execution_count": 128, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:12:21.516305Z", "start_time": "2020-05-12T13:12:20.883480Z" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result1 = (df1 < df2) & (df2 <= df3) & (df3 != df4)\n", "result2 = pd.eval('df1 < df2 <= df3 != df4')\n", "np.allclose(result1, result2)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 位运算符\n", "\n", "`pd.eval()`支持`&`(与)和`|`(或)等位运算符:" ] }, { "cell_type": "code", "execution_count": 129, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:12:38.189831Z", "start_time": "2020-05-12T13:12:37.545002Z" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result1 = (df1 < 0.5) & (df2 < 0.5) | (df3 < df4)\n", "result2 = pd.eval('(df1 < 0.5) & (df2 < 0.5) | (df3 < df4)')\n", "np.allclose(result1, result2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "还可以在布尔类型的代数式中使用`and`和`or`:" ] }, { "cell_type": "code", "execution_count": 130, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:13:02.115815Z", "start_time": "2020-05-12T13:13:01.894472Z" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 130, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result3 = pd.eval('(df1 < 0.5) and (df2 < 0.5) or (df3 < df4)')\n", "np.allclose(result1, result3)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 对象属性与索引\n", "\n", "`pd.eval()`可以通过`obj.attr`语法获取对象属性,通过`obj[index]`语法获取对象索引:" ] }, { "cell_type": "code", "execution_count": 131, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 131, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result1 = df2.T[0] + df3.iloc[1]\n", "result2 = pd.eval('df2.T[0] + df3.iloc[1]')\n", "np.allclose(result1, result2)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 用`DataFrame.eval()`实现列间运算\n", "\n", "由于`pd.eval()`是Pandas的顶层函数,因此`DataFrame`有一个`eval()`方法可以做类似的运算。使用`eval()`方法的好处是可以借助**列名称**进行运算,示例如下:" ] }, { "cell_type": "code", "execution_count": 133, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:14:55.280852Z", "start_time": "2020-05-12T13:14:55.271385Z" } }, "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", "
ABC
00.6158750.5251670.047354
10.3308580.4128790.441564
20.6890470.5590680.230350
30.2904860.6954790.852587
40.4242800.5343440.245216
\n", "
" ], "text/plain": [ " A B C\n", "0 0.615875 0.525167 0.047354\n", "1 0.330858 0.412879 0.441564\n", "2 0.689047 0.559068 0.230350\n", "3 0.290486 0.695479 0.852587\n", "4 0.424280 0.534344 0.245216" ] }, "execution_count": 133, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(rng.rand(1000, 3), columns=[\"A\", \"B\", \"C\"])\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 134, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:15:07.008844Z", "start_time": "2020-05-12T13:15:06.993621Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 134, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result1 = (df['A'] + df['B']) / (df['C'] - 1)\n", "result2 = pd.eval(\"(df.A + df.B) / (df.C - 1)\")\n", "np.allclose(result1, result2)" ] }, { "cell_type": "code", "execution_count": 135, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:15:22.982546Z", "start_time": "2020-05-12T13:15:22.973607Z" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result3 = df.eval('(A + B) / (C - 1)')\n", "np.allclose(result1, result3)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 用`DataFrame.eval()`新增或修改列\n", "\n", "\n", "除了前面介绍的运算功能,`DataFrame.eval()`还可以创建新的列,创建一个新的列`'D'`:" ] }, { "cell_type": "code", "execution_count": 136, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:16:28.644980Z", "start_time": "2020-05-12T13:16:28.625821Z" }, "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", "
ABCD
00.6158750.5251670.04735424.095868
10.3308580.4128790.4415641.684325
20.6890470.5590680.2303505.418335
30.2904860.6954790.8525871.156439
40.4242800.5343440.2452163.909296
\n", "
" ], "text/plain": [ " A B C D\n", "0 0.615875 0.525167 0.047354 24.095868\n", "1 0.330858 0.412879 0.441564 1.684325\n", "2 0.689047 0.559068 0.230350 5.418335\n", "3 0.290486 0.695479 0.852587 1.156439\n", "4 0.424280 0.534344 0.245216 3.909296" ] }, "execution_count": 136, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.eval('D = (A + B) / C', inplace=True)\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "还可以修改已有的列:" ] }, { "cell_type": "code", "execution_count": 137, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:16:47.841491Z", "start_time": "2020-05-12T13:16:47.823015Z" } }, "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", "
ABCD
00.6158750.5251670.0473541.915527
10.3308580.4128790.441564-0.185752
20.6890470.5590680.2303500.564268
30.2904860.6954790.852587-0.475016
40.4242800.5343440.245216-0.448844
\n", "
" ], "text/plain": [ " A B C D\n", "0 0.615875 0.525167 0.047354 1.915527\n", "1 0.330858 0.412879 0.441564 -0.185752\n", "2 0.689047 0.559068 0.230350 0.564268\n", "3 0.290486 0.695479 0.852587 -0.475016\n", "4 0.424280 0.534344 0.245216 -0.448844" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.eval('D = (A - B) / C', inplace=True)\n", "df.head()" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:17:05.096390Z", "start_time": "2020-05-12T13:17:05.092549Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### `DataFrame.eval()`使用局部变量\n", "\n", "\n", "\n", "`DataFrame.eval()`方法还支持通过`@`符号使用Python的局部变量,如下所示: " ] }, { "cell_type": "code", "execution_count": 138, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:22:08.471607Z", "start_time": "2020-05-12T13:22:08.463594Z" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ "column_mean = df.mean(1)\n", "result1 = df['A'] + column_mean\n", "result2 = df.eval('A + @column_mean')\n", "np.allclose(result1, result2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> `@`符号表示**变量名称**(Python对象的命名空间)而非**列名称**(DataFrame列名称的命名空间)。需要注意的是,`@`符号只能在`DataFrame.eval()`**方法**中使用,而不能在`pandas.eval()`**函数**中使用,因为`pandas.eval()`函数只能获取一个(Python)命名空间的内容。" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### `DataFrame.query()`方法\n", "\n", "用`query()`方法进行过滤运算:" ] }, { "cell_type": "code", "execution_count": 139, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:23:23.044350Z", "start_time": "2020-05-12T13:23:22.990045Z" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 139, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result1 = df[(df.A < 0.5) & (df.B < 0.5)]\n", "result2 = pd.eval('df[(df.A < 0.5) & (df.B < 0.5)]')\n", "np.allclose(result1, result2)" ] }, { "cell_type": "code", "execution_count": 140, "metadata": { "ExecuteTime": { "end_time": "2020-05-12T13:23:24.588425Z", "start_time": "2020-05-12T13:23:24.581871Z" } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 140, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result3 = df.query('A < 0.5 and B < 0.5')\n", "np.allclose(result1, result3)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Cython与Numba\n", "\n", "## [Cython](http://cython.org/)\n", "\n", "直接将Python代码编译成C/C++,然后编译成Python模块:\n", "\n", "- 用Python代码调用原生C/C++\n", "- 用静态类型声明让Python代码达到C语言的性能\n", "- 代码变得更啰嗦,会破坏可维护性和可读性\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:01:18.135810Z", "start_time": "2020-05-14T07:01:17.784138Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "%load_ext Cython\n", "\n", "# %reload_ext Cython" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:01:18.942250Z", "start_time": "2020-05-14T07:01:18.931261Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "45\n" ] } ], "source": [ "%%cython\n", "\n", "cdef int a = 0\n", "for i in range(10):\n", " a += i\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. 用Cython把`.pyx`文件编译(翻译)成`.c`文件。这些文件里的源代码,基本都是纯Python代码加上一些Cython代码\n", "2. `.c`文件被C语言编译器编译成`.so`库,这个库之后可以导入Python\n", "3. 编译代码有3种方法:\n", " 1. 创建一个`distutils`模块配置文件,生成自定义的C语言编译文件。\n", " 1. 运行`cython`命令将`.pyx`文件编译成`.c`文件,然后用C语言编译器(gcc)把C代码手动编译成库文件。\n", " 1. 用`pyximport`,像导入`.py`文件一样导入`.pyx`直接使用。" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 创建Cython模块" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:01:25.948962Z", "start_time": "2020-05-14T07:01:25.923900Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/home/junjiet/data_science2020/2.数据处理\n", "2.数据处理.ipynb\n", "cat_neural_network.mp4\n", "cpp.ipynb\n", "data2info.png\n", "data_type.png\n", "markmap.png\n", "matlab_numpy.png\n", "nn_flow.png\n", "numpy.png\n", "pandas.png\n", "py_cy.png\n", "pysparkdf.png\n", "python_visual.png\n", "rdd.png\n", "sigmoid.png\n", "social_network.jpg\n", "test_cython\n", "two_layer_nn.png\n" ] } ], "source": [ "%%bash\n", "pwd\n", "rm -rf test_cython\n", "mkdir test_cython\n", "ls" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:01:31.787706Z", "start_time": "2020-05-14T07:01:31.779584Z" }, "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/home/junjiet/data_science2020/2.数据处理/test_cython\n" ] } ], "source": [ "cd test_cython" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:01:33.700411Z", "start_time": "2020-05-14T07:01:33.681023Z" } }, "outputs": [ { "data": { "text/plain": [ "'/home/junjiet/data_science2020/2.数据处理/test_cython'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pwd" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:01:35.089222Z", "start_time": "2020-05-14T07:01:35.082405Z" }, "scrolled": true, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing test.pyx\n" ] } ], "source": [ "%%file test.pyx\n", "\n", "def join_n_print(parts):\n", " \"\"\"merge string list with space\"\"\"\n", " print(' '.join(parts))" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:04:57.413975Z", "start_time": "2020-05-14T07:04:57.286461Z" }, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "test.pyx\r\n" ] } ], "source": [ "ls" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### pyximport自动编译" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:05:23.826522Z", "start_time": "2020-05-14T07:05:23.310042Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "This is a test\n" ] } ], "source": [ "%%cython\n", "import pyximport; pyximport.install()\n", "from test_cython.test import join_n_print\n", "\n", "join_n_print([\"This\", \"is\", \"a\", \"test\"])" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### setup.py手动编译" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:06:43.271763Z", "start_time": "2020-05-14T07:06:43.264777Z" }, "scrolled": true, "slideshow": { "slide_type": "-" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing setup.py\n" ] } ], "source": [ "%%file setup.py\n", "\n", "from distutils.core import setup\n", "from Cython.Build import cythonize\n", "\n", "setup(\n", " name=\"Test app\", ext_modules=cythonize(\"test.pyx\"),\n", ")" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:08:39.540052Z", "start_time": "2020-05-14T07:08:39.078942Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "running build_ext\r\n" ] } ], "source": [ "!python setup.py build_ext --inplace" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:08:40.541024Z", "start_time": "2020-05-14T07:08:40.414210Z" }, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[0m\u001b[01;34mbuild\u001b[0m/ setup.py test.c \u001b[01;32mtest.cpython-37m-x86_64-linux-gnu.so\u001b[0m* test.pyx\r\n" ] } ], "source": [ "ls" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:08:50.738385Z", "start_time": "2020-05-14T07:08:50.608762Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "build/\r\n", "└── temp.linux-x86_64-3.7\r\n", " └── test.o\r\n", "\r\n", "1 directory, 1 file\r\n" ] } ], "source": [ "!tree build/" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "Cython通常都需要导入两类文件:\n", "\n", "- **定义文件**:文件扩展名.pxd,是Cython文件要使用的变量、类型、函数名称的C语言声明。\n", "- **实现文件**:文件扩展名.pyx,包括在`.pxd`文件中已经定义好的函数实现。" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T06:47:39.124806Z", "start_time": "2020-05-13T06:47:39.119618Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing dishes.pxd\n" ] } ], "source": [ "%%file dishes.pxd\n", "cdef enum otherstuff:\n", " sausage, eggs, lettuce\n", "\n", "cdef struct spamdish:\n", " int oz_of_spam\n", " otherstuff filler" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T06:47:43.393973Z", "start_time": "2020-05-13T06:47:43.389292Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing restaurant.pyx\n" ] } ], "source": [ "%%file restaurant.pyx\n", " \n", "cimport dishes\n", "from dishes cimport spamdish\n", "\n", "cdef void prepare(spamdish * d):\n", " d.oz_of_spam = 42\n", " d.filler = dishes.sausage\n", "\n", "def serve():\n", " cdef spamdish d\n", " prepare( & d)\n", " print(f\"{d.oz_of_spam} oz spam, filler no. {d.filler}\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 调用Cython模块" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:10:04.328712Z", "start_time": "2020-05-14T07:10:04.197829Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[0m\u001b[01;34mbuild\u001b[0m/ setup.py test.c \u001b[01;32mtest.cpython-37m-x86_64-linux-gnu.so\u001b[0m* test.pyx\r\n" ] } ], "source": [ "ls" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:10:04.601900Z", "start_time": "2020-05-14T07:10:04.595888Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a b c\n" ] } ], "source": [ "from test_cython.test import join_n_print\n", "\n", "join_n_print([\"a\", \"b\", \"c\"])" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-13T06:55:03.341543Z", "start_time": "2020-05-13T06:55:03.335016Z" }, "slideshow": { "slide_type": "slide" } }, "source": [ "## 定义函数类型\n", "\n", "Cython除了可以调用标准C语言函数,还可以定义两种函数:\n", "\n", "- **标准Python函数**:与纯Python代码中声明的函数完全一样,用`cdef`关键字定义。接受Python对象作为参数,也返回Python对象\n", "- **C函数**:是标准函数的优化版,用Python对象或C语言类型作为参数,返回值也可以是两种类型。要定义这种函数,用`cpdef`关键字定义\n", "\n", "> 虽然这两种函数都可以通过Cython模块调用。但是从Python代码(.py)中调用函数,必须是标准Python函数,或者`cpdef`关键字定义函数。这个关键字会创建一个函数的封装对象。当用Cython调用函数时,它用C语言对象;当从Python代码中调用函数时,它用纯Python函数。" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-13T06:55:03.341543Z", "start_time": "2020-05-13T06:55:03.335016Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "下面是一个纯Python函数,因此Cython会让这个函数返回并接收一个Python对象,而不是C语言原生类型。" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:10:09.924074Z", "start_time": "2020-05-14T07:10:09.916584Z" } }, "outputs": [], "source": [ "%%cython\n", "\n", "cdef full_python_function (x):\n", " return x**2" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-13T06:55:03.341543Z", "start_time": "2020-05-13T06:55:03.335016Z" } }, "source": [ "这个函数使用了`cpdef`关键字,所以它既是一个标准函数,也是一个优化过的C语言函数。" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:10:10.755659Z", "start_time": "2020-05-14T07:10:10.749436Z" } }, "outputs": [], "source": [ "%%cython\n", "\n", "cpdef int c_function(int x):\n", " return x**2" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 优化示例\n", "\n", "两经纬度地理距离,A点经纬度(110.0123, 23.32435),B点经纬度(129.1344,25.5465)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 纯Python" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:11:38.587179Z", "start_time": "2020-05-14T07:11:38.581712Z" } }, "outputs": [], "source": [ "lon1, lat1, lon2, lat2 = 110.0123, 23.32435, 129.1344, 25.5465\n", "num = 5000000" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:11:39.096680Z", "start_time": "2020-05-14T07:11:39.089394Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Overwriting great_circle_py.py\n" ] } ], "source": [ "%%file great_circle_py.py\n", "from math import pi, acos, cos, sin\n", "\n", "def great_circle(lon1, lat1, lon2, lat2):\n", " radius = 6371 # 公里\n", " x = pi / 180\n", "\n", " a = (90 - lat1) * (x)\n", " b = (90 - lat2) * (x)\n", " theta = (lon2 - lon1) * (x)\n", " c = acos((cos(a) * cos(b)) + (sin(a) * sin(b) * cos(theta)))\n", " return radius * c" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:11:54.149554Z", "start_time": "2020-05-14T07:11:49.110412Z" }, "slideshow": { "slide_type": "-" } }, "outputs": [], "source": [ "from great_circle_py import great_circle\n", "for i in range(num):\n", " great_circle(lon1, lat1, lon2, lat2)" ] }, { "cell_type": "code", "execution_count": 104, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:31:44.170058Z", "start_time": "2020-05-14T07:31:43.237843Z" }, "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "building '_cython_magic_510139e97843e1ad4066ec2ca94da783' extension\n", "/home/junjiet/conda/bin/x86_64-conda_cos6-linux-gnu-cc -Wno-unused-result -Wsign-compare -DNDEBUG -fwrapv -O2 -Wall -Wstrict-prototypes -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -pipe -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -pipe -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -ffunction-sections -pipe -isystem /home/junjiet/conda/include -DNDEBUG -D_FORTIFY_SOURCE=2 -O2 -isystem /home/junjiet/conda/include -fPIC -I/home/junjiet/conda/include/python3.7m -c /home/junjiet/.cache/ipython/cython/_cython_magic_510139e97843e1ad4066ec2ca94da783.c -o /home/junjiet/.cache/ipython/cython/home/junjiet/.cache/ipython/cython/_cython_magic_510139e97843e1ad4066ec2ca94da783.o\n", "x86_64-conda_cos6-linux-gnu-gcc -pthread -shared -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-rpath,/home/junjiet/conda/lib -L/home/junjiet/conda/lib -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-rpath,/home/junjiet/conda/lib -L/home/junjiet/conda/lib -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,--disable-new-dtags -Wl,--gc-sections -Wl,-rpath,/home/junjiet/conda/lib -Wl,-rpath-link,/home/junjiet/conda/lib -L/home/junjiet/conda/lib -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -ffunction-sections -pipe -isystem /home/junjiet/conda/include -DNDEBUG -D_FORTIFY_SOURCE=2 -O2 -isystem /home/junjiet/conda/include /home/junjiet/.cache/ipython/cython/home/junjiet/.cache/ipython/cython/_cython_magic_510139e97843e1ad4066ec2ca94da783.o -o /home/junjiet/.cache/ipython/cython/_cython_magic_510139e97843e1ad4066ec2ca94da783.cpython-37m-x86_64-linux-gnu.so\n" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\n", " \n", " Cython: _cython_magic_510139e97843e1ad4066ec2ca94da783.pyx\n", " \n", "\n", "\n", "

Generated by Cython 0.29.15

\n", "

\n", " Yellow lines hint at Python interaction.
\n", " Click on a line that starts with a \"+\" to see the C code that Cython generated for it.\n", "

\n", "
 01: 
\n", "
+02: from math import pi, acos, cos, sin
\n", "
  __pyx_t_1 = PyList_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  __Pyx_INCREF(__pyx_n_s_pi);\n",
       "  __Pyx_GIVEREF(__pyx_n_s_pi);\n",
       "  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_pi);\n",
       "  __Pyx_INCREF(__pyx_n_s_acos);\n",
       "  __Pyx_GIVEREF(__pyx_n_s_acos);\n",
       "  PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_acos);\n",
       "  __Pyx_INCREF(__pyx_n_s_cos);\n",
       "  __Pyx_GIVEREF(__pyx_n_s_cos);\n",
       "  PyList_SET_ITEM(__pyx_t_1, 2, __pyx_n_s_cos);\n",
       "  __Pyx_INCREF(__pyx_n_s_sin);\n",
       "  __Pyx_GIVEREF(__pyx_n_s_sin);\n",
       "  PyList_SET_ITEM(__pyx_t_1, 3, __pyx_n_s_sin);\n",
       "  __pyx_t_2 = __Pyx_Import(__pyx_n_s_math, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_2);\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_pi); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pi, __pyx_t_1) < 0) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_acos); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  if (PyDict_SetItem(__pyx_d, __pyx_n_s_acos, __pyx_t_1) < 0) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_cos); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  if (PyDict_SetItem(__pyx_d, __pyx_n_s_cos, __pyx_t_1) < 0) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_sin); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  if (PyDict_SetItem(__pyx_d, __pyx_n_s_sin, __pyx_t_1) < 0) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n",
       "
 03: 
\n", "
 04: 
\n", "
+05: def great_circle(lon1, lat1, lon2, lat2):
\n", "
/* Python wrapper */\n",
       "static PyObject *__pyx_pw_46_cython_magic_510139e97843e1ad4066ec2ca94da783_1great_circle(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n",
       "static PyMethodDef __pyx_mdef_46_cython_magic_510139e97843e1ad4066ec2ca94da783_1great_circle = {\"great_circle\", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_46_cython_magic_510139e97843e1ad4066ec2ca94da783_1great_circle, METH_VARARGS|METH_KEYWORDS, 0};\n",
       "static PyObject *__pyx_pw_46_cython_magic_510139e97843e1ad4066ec2ca94da783_1great_circle(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n",
       "  PyObject *__pyx_v_lon1 = 0;\n",
       "  PyObject *__pyx_v_lat1 = 0;\n",
       "  PyObject *__pyx_v_lon2 = 0;\n",
       "  PyObject *__pyx_v_lat2 = 0;\n",
       "  PyObject *__pyx_r = 0;\n",
       "  __Pyx_RefNannyDeclarations\n",
       "  __Pyx_RefNannySetupContext(\"great_circle (wrapper)\", 0);\n",
       "  {\n",
       "    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_lon1,&__pyx_n_s_lat1,&__pyx_n_s_lon2,&__pyx_n_s_lat2,0};\n",
       "    PyObject* values[4] = {0,0,0,0};\n",
       "    if (unlikely(__pyx_kwds)) {\n",
       "      Py_ssize_t kw_args;\n",
       "      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n",
       "      switch (pos_args) {\n",
       "        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  0: break;\n",
       "        default: goto __pyx_L5_argtuple_error;\n",
       "      }\n",
       "      kw_args = PyDict_Size(__pyx_kwds);\n",
       "      switch (pos_args) {\n",
       "        case  0:\n",
       "        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lon1)) != 0)) kw_args--;\n",
       "        else goto __pyx_L5_argtuple_error;\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  1:\n",
       "        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lat1)) != 0)) kw_args--;\n",
       "        else {\n",
       "          __Pyx_RaiseArgtupleInvalid(\"great_circle\", 1, 4, 4, 1); __PYX_ERR(0, 5, __pyx_L3_error)\n",
       "        }\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  2:\n",
       "        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lon2)) != 0)) kw_args--;\n",
       "        else {\n",
       "          __Pyx_RaiseArgtupleInvalid(\"great_circle\", 1, 4, 4, 2); __PYX_ERR(0, 5, __pyx_L3_error)\n",
       "        }\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  3:\n",
       "        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lat2)) != 0)) kw_args--;\n",
       "        else {\n",
       "          __Pyx_RaiseArgtupleInvalid(\"great_circle\", 1, 4, 4, 3); __PYX_ERR(0, 5, __pyx_L3_error)\n",
       "        }\n",
       "      }\n",
       "      if (unlikely(kw_args > 0)) {\n",
       "        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"great_circle\") < 0)) __PYX_ERR(0, 5, __pyx_L3_error)\n",
       "      }\n",
       "    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {\n",
       "      goto __pyx_L5_argtuple_error;\n",
       "    } else {\n",
       "      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n",
       "      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n",
       "      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);\n",
       "      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);\n",
       "    }\n",
       "    __pyx_v_lon1 = values[0];\n",
       "    __pyx_v_lat1 = values[1];\n",
       "    __pyx_v_lon2 = values[2];\n",
       "    __pyx_v_lat2 = values[3];\n",
       "  }\n",
       "  goto __pyx_L4_argument_unpacking_done;\n",
       "  __pyx_L5_argtuple_error:;\n",
       "  __Pyx_RaiseArgtupleInvalid(\"great_circle\", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 5, __pyx_L3_error)\n",
       "  __pyx_L3_error:;\n",
       "  __Pyx_AddTraceback(\"_cython_magic_510139e97843e1ad4066ec2ca94da783.great_circle\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
       "  __Pyx_RefNannyFinishContext();\n",
       "  return NULL;\n",
       "  __pyx_L4_argument_unpacking_done:;\n",
       "  __pyx_r = __pyx_pf_46_cython_magic_510139e97843e1ad4066ec2ca94da783_great_circle(__pyx_self, __pyx_v_lon1, __pyx_v_lat1, __pyx_v_lon2, __pyx_v_lat2);\n",
       "\n",
       "  /* function exit code */\n",
       "  __Pyx_RefNannyFinishContext();\n",
       "  return __pyx_r;\n",
       "}\n",
       "\n",
       "static PyObject *__pyx_pf_46_cython_magic_510139e97843e1ad4066ec2ca94da783_great_circle(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_lon1, PyObject *__pyx_v_lat1, PyObject *__pyx_v_lon2, PyObject *__pyx_v_lat2) {\n",
       "  PyObject *__pyx_v_radius = NULL;\n",
       "  PyObject *__pyx_v_x = NULL;\n",
       "  PyObject *__pyx_v_a = NULL;\n",
       "  PyObject *__pyx_v_b = NULL;\n",
       "  PyObject *__pyx_v_theta = NULL;\n",
       "  PyObject *__pyx_v_c = NULL;\n",
       "  PyObject *__pyx_r = NULL;\n",
       "  __Pyx_RefNannyDeclarations\n",
       "  __Pyx_RefNannySetupContext(\"great_circle\", 0);\n",
       "/* … */\n",
       "  /* function exit code */\n",
       "  __pyx_L1_error:;\n",
       "  __Pyx_XDECREF(__pyx_t_1);\n",
       "  __Pyx_XDECREF(__pyx_t_2);\n",
       "  __Pyx_XDECREF(__pyx_t_3);\n",
       "  __Pyx_XDECREF(__pyx_t_4);\n",
       "  __Pyx_XDECREF(__pyx_t_5);\n",
       "  __Pyx_XDECREF(__pyx_t_6);\n",
       "  __Pyx_XDECREF(__pyx_t_7);\n",
       "  __Pyx_AddTraceback(\"_cython_magic_510139e97843e1ad4066ec2ca94da783.great_circle\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
       "  __pyx_r = NULL;\n",
       "  __pyx_L0:;\n",
       "  __Pyx_XDECREF(__pyx_v_radius);\n",
       "  __Pyx_XDECREF(__pyx_v_x);\n",
       "  __Pyx_XDECREF(__pyx_v_a);\n",
       "  __Pyx_XDECREF(__pyx_v_b);\n",
       "  __Pyx_XDECREF(__pyx_v_theta);\n",
       "  __Pyx_XDECREF(__pyx_v_c);\n",
       "  __Pyx_XGIVEREF(__pyx_r);\n",
       "  __Pyx_RefNannyFinishContext();\n",
       "  return __pyx_r;\n",
       "}\n",
       "/* … */\n",
       "  __pyx_tuple_ = PyTuple_Pack(10, __pyx_n_s_lon1, __pyx_n_s_lat1, __pyx_n_s_lon2, __pyx_n_s_lat2, __pyx_n_s_radius, __pyx_n_s_x, __pyx_n_s_a, __pyx_n_s_b, __pyx_n_s_theta, __pyx_n_s_c); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 5, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_tuple_);\n",
       "  __Pyx_GIVEREF(__pyx_tuple_);\n",
       "/* … */\n",
       "  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_510139e97843e1ad4066ec2ca94da783_1great_circle, NULL, __pyx_n_s_cython_magic_510139e97843e1ad40); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 5, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_2);\n",
       "  if (PyDict_SetItem(__pyx_d, __pyx_n_s_great_circle, __pyx_t_2) < 0) __PYX_ERR(0, 5, __pyx_L1_error)\n",
       "  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n",
       "
+06:     radius = 6371  # 公里
\n", "
  __Pyx_INCREF(__pyx_int_6371);\n",
       "  __pyx_v_radius = __pyx_int_6371;\n",
       "
+07:     x = pi / 180
\n", "
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pi); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 7, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  __pyx_t_2 = __Pyx_PyInt_TrueDivideObjC(__pyx_t_1, __pyx_int_180, 0xB4, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 7, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_2);\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_v_x = __pyx_t_2;\n",
       "  __pyx_t_2 = 0;\n",
       "
 08: 
\n", "
+09:     a = (90 - lat1) * (x)
\n", "
  __pyx_t_2 = __Pyx_PyInt_SubtractCObj(__pyx_int_90, __pyx_v_lat1, 90, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 9, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_2);\n",
       "  __pyx_t_1 = PyNumber_Multiply(__pyx_t_2, __pyx_v_x); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 9, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n",
       "  __pyx_v_a = __pyx_t_1;\n",
       "  __pyx_t_1 = 0;\n",
       "
+10:     b = (90 - lat2) * (x)
\n", "
  __pyx_t_1 = __Pyx_PyInt_SubtractCObj(__pyx_int_90, __pyx_v_lat2, 90, 0, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 10, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  __pyx_t_2 = PyNumber_Multiply(__pyx_t_1, __pyx_v_x); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 10, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_2);\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_v_b = __pyx_t_2;\n",
       "  __pyx_t_2 = 0;\n",
       "
+11:     theta = (lon2 - lon1) * (x)
\n", "
  __pyx_t_2 = PyNumber_Subtract(__pyx_v_lon2, __pyx_v_lon1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 11, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_2);\n",
       "  __pyx_t_1 = PyNumber_Multiply(__pyx_t_2, __pyx_v_x); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n",
       "  __pyx_v_theta = __pyx_t_1;\n",
       "  __pyx_t_1 = 0;\n",
       "
+12:     c = acos((cos(a) * cos(b)) + (sin(a) * sin(b) * cos(theta)))
\n", "
  __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_acos); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_2);\n",
       "  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_cos); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_4);\n",
       "  __pyx_t_5 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {\n",
       "    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);\n",
       "    if (likely(__pyx_t_5)) {\n",
       "      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);\n",
       "      __Pyx_INCREF(__pyx_t_5);\n",
       "      __Pyx_INCREF(function);\n",
       "      __Pyx_DECREF_SET(__pyx_t_4, function);\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_v_a) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_a);\n",
       "  __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;\n",
       "  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_3);\n",
       "  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_cos); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_5);\n",
       "  __pyx_t_6 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) {\n",
       "    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);\n",
       "    if (likely(__pyx_t_6)) {\n",
       "      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);\n",
       "      __Pyx_INCREF(__pyx_t_6);\n",
       "      __Pyx_INCREF(function);\n",
       "      __Pyx_DECREF_SET(__pyx_t_5, function);\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_4 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_6, __pyx_v_b) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_b);\n",
       "  __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;\n",
       "  if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_4);\n",
       "  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n",
       "  __pyx_t_5 = PyNumber_Multiply(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_5);\n",
       "  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_sin); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_3);\n",
       "  __pyx_t_6 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) {\n",
       "    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3);\n",
       "    if (likely(__pyx_t_6)) {\n",
       "      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);\n",
       "      __Pyx_INCREF(__pyx_t_6);\n",
       "      __Pyx_INCREF(function);\n",
       "      __Pyx_DECREF_SET(__pyx_t_3, function);\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_4 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_6, __pyx_v_a) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_a);\n",
       "  __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;\n",
       "  if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_4);\n",
       "  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n",
       "  __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_sin); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_6);\n",
       "  __pyx_t_7 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) {\n",
       "    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6);\n",
       "    if (likely(__pyx_t_7)) {\n",
       "      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);\n",
       "      __Pyx_INCREF(__pyx_t_7);\n",
       "      __Pyx_INCREF(function);\n",
       "      __Pyx_DECREF_SET(__pyx_t_6, function);\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_3 = (__pyx_t_7) ? __Pyx_PyObject_Call2Args(__pyx_t_6, __pyx_t_7, __pyx_v_b) : __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_v_b);\n",
       "  __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;\n",
       "  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_3);\n",
       "  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;\n",
       "  __pyx_t_6 = PyNumber_Multiply(__pyx_t_4, __pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_6);\n",
       "  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n",
       "  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_cos); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_4);\n",
       "  __pyx_t_7 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {\n",
       "    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_4);\n",
       "    if (likely(__pyx_t_7)) {\n",
       "      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);\n",
       "      __Pyx_INCREF(__pyx_t_7);\n",
       "      __Pyx_INCREF(function);\n",
       "      __Pyx_DECREF_SET(__pyx_t_4, function);\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_3 = (__pyx_t_7) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_7, __pyx_v_theta) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_theta);\n",
       "  __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;\n",
       "  if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_3);\n",
       "  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __pyx_t_4 = PyNumber_Multiply(__pyx_t_6, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_4);\n",
       "  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n",
       "  __pyx_t_3 = PyNumber_Add(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_3);\n",
       "  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __pyx_t_4 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) {\n",
       "    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);\n",
       "    if (likely(__pyx_t_4)) {\n",
       "      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);\n",
       "      __Pyx_INCREF(__pyx_t_4);\n",
       "      __Pyx_INCREF(function);\n",
       "      __Pyx_DECREF_SET(__pyx_t_2, function);\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_t_3) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3);\n",
       "  __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;\n",
       "  if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 12, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n",
       "  __pyx_v_c = __pyx_t_1;\n",
       "  __pyx_t_1 = 0;\n",
       "
+13:     return radius * c
\n", "
  __Pyx_XDECREF(__pyx_r);\n",
       "  __pyx_t_1 = PyNumber_Multiply(__pyx_v_radius, __pyx_v_c); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  __pyx_r = __pyx_t_1;\n",
       "  __pyx_t_1 = 0;\n",
       "  goto __pyx_L0;\n",
       "
" ], "text/plain": [ "" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%cython -a\n", "\n", "from math import pi, acos, cos, sin\n", "\n", "\n", "def great_circle(lon1, lat1, lon2, lat2):\n", " radius = 6371 # 公里\n", " x = pi / 180\n", "\n", " a = (90 - lat1) * (x)\n", " b = (90 - lat2) * (x)\n", " theta = (lon2 - lon1) * (x)\n", " c = acos((cos(a) * cos(b)) + (sin(a) * sin(b) * cos(theta)))\n", " return radius * c" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Cython编译" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:12:46.091960Z", "start_time": "2020-05-14T07:12:46.084755Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing great_circle_cy_v1.pyx\n" ] } ], "source": [ "%%file great_circle_cy_v1.pyx\n", "from math import pi, acos, cos, sin\n", "\n", "def great_circle(double lon1, double lat1, double lon2, double lat2):\n", " cdef double a, b, theta, c, x, radius\n", " \n", " radius = 6371 # 公里\n", " x = pi/180\n", "\n", " a = (90-lat1)*(x)\n", " b = (90-lat2)*(x)\n", " theta = (lon2-lon1)*(x)\n", " c = acos((cos(a)*cos(b)) + (sin(a)*sin(b)*cos(theta)))\n", " return radius*c" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:13:42.512623Z", "start_time": "2020-05-14T07:13:42.505435Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing great_circle_setup_v1.py\n" ] } ], "source": [ "%%file great_circle_setup_v1.py\n", "from distutils.core import setup\n", "from Cython.Build import cythonize\n", "\n", "setup(\n", " name='Great Circle module v1',\n", " ext_modules=cythonize(\"great_circle_cy_v1.pyx\"),\n", ")" ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:13:46.874030Z", "start_time": "2020-05-14T07:13:45.557078Z" }, "scrolled": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Compiling great_circle_cy_v1.pyx because it changed.\n", "[1/1] Cythonizing great_circle_cy_v1.pyx\n", "/home/junjiet/conda/lib/python3.7/site-packages/Cython/Compiler/Main.py:369: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: /home/junjiet/data_science2020/2.数据处理/test_cython/great_circle_cy_v1.pyx\n", " tree = Parsing.p_module(s, pxd, full_module_name)\n", "running build_ext\n", "building 'great_circle_cy_v1' extension\n", "/home/junjiet/conda/bin/x86_64-conda_cos6-linux-gnu-cc -Wno-unused-result -Wsign-compare -DNDEBUG -fwrapv -O2 -Wall -Wstrict-prototypes -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -pipe -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -pipe -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -ffunction-sections -pipe -isystem /home/junjiet/conda/include -DNDEBUG -D_FORTIFY_SOURCE=2 -O2 -isystem /home/junjiet/conda/include -fPIC -I/home/junjiet/conda/include/python3.7m -c great_circle_cy_v1.c -o build/temp.linux-x86_64-3.7/great_circle_cy_v1.o\n", "x86_64-conda_cos6-linux-gnu-gcc -pthread -shared -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-rpath,/home/junjiet/conda/lib -L/home/junjiet/conda/lib -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-rpath,/home/junjiet/conda/lib -L/home/junjiet/conda/lib -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,--disable-new-dtags -Wl,--gc-sections -Wl,-rpath,/home/junjiet/conda/lib -Wl,-rpath-link,/home/junjiet/conda/lib -L/home/junjiet/conda/lib -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -ffunction-sections -pipe -isystem /home/junjiet/conda/include -DNDEBUG -D_FORTIFY_SOURCE=2 -O2 -isystem /home/junjiet/conda/include build/temp.linux-x86_64-3.7/great_circle_cy_v1.o -o /home/junjiet/data_science2020/2.数据处理/test_cython/great_circle_cy_v1.cpython-37m-x86_64-linux-gnu.so\n" ] } ], "source": [ "!python great_circle_setup_v1.py build_ext --inplace" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:13:48.268971Z", "start_time": "2020-05-14T07:13:48.139436Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[0m\u001b[01;34mbuild\u001b[0m/\r\n", "great_circle_cy_v1.c\r\n", "\u001b[01;32mgreat_circle_cy_v1.cpython-37m-x86_64-linux-gnu.so\u001b[0m*\r\n", "great_circle_cy_v1.pyx\r\n", "great_circle_py.py\r\n", "great_circle_setup_v1.py\r\n", "\u001b[01;34m__pycache__\u001b[0m/\r\n", "setup.py\r\n", "test.c\r\n", "\u001b[01;32mtest.cpython-37m-x86_64-linux-gnu.so\u001b[0m*\r\n", "test.pyx\r\n" ] } ], "source": [ "ls" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:14:25.334488Z", "start_time": "2020-05-14T07:14:22.509546Z" } }, "outputs": [], "source": [ "from great_circle_cy_v1 import great_circle\n", "for i in range(num):\n", " great_circle(lon1, lat1, lon2, lat2)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:15:03.011688Z", "start_time": "2020-05-14T07:15:02.997463Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", " \n", " Cython: _cython_magic_a8c9eb2e14c0c5fef8bdedbf1ab48c55.pyx\n", " \n", "\n", "\n", "

Generated by Cython 0.29.15

\n", "

\n", " Yellow lines hint at Python interaction.
\n", " Click on a line that starts with a \"+\" to see the C code that Cython generated for it.\n", "

\n", "
 01: 
\n", "
+02: from math import pi, acos, cos, sin
\n", "
  __pyx_t_1 = PyList_New(4); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  __Pyx_INCREF(__pyx_n_s_pi);\n",
       "  __Pyx_GIVEREF(__pyx_n_s_pi);\n",
       "  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_pi);\n",
       "  __Pyx_INCREF(__pyx_n_s_acos);\n",
       "  __Pyx_GIVEREF(__pyx_n_s_acos);\n",
       "  PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_acos);\n",
       "  __Pyx_INCREF(__pyx_n_s_cos);\n",
       "  __Pyx_GIVEREF(__pyx_n_s_cos);\n",
       "  PyList_SET_ITEM(__pyx_t_1, 2, __pyx_n_s_cos);\n",
       "  __Pyx_INCREF(__pyx_n_s_sin);\n",
       "  __Pyx_GIVEREF(__pyx_n_s_sin);\n",
       "  PyList_SET_ITEM(__pyx_t_1, 3, __pyx_n_s_sin);\n",
       "  __pyx_t_2 = __Pyx_Import(__pyx_n_s_math, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_2);\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_pi); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pi, __pyx_t_1) < 0) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_acos); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  if (PyDict_SetItem(__pyx_d, __pyx_n_s_acos, __pyx_t_1) < 0) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_cos); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  if (PyDict_SetItem(__pyx_d, __pyx_n_s_cos, __pyx_t_1) < 0) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_sin); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  if (PyDict_SetItem(__pyx_d, __pyx_n_s_sin, __pyx_t_1) < 0) __PYX_ERR(0, 2, __pyx_L1_error)\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n",
       "
 03: 
\n", "
+04: def great_circle(double lon1, double lat1, double lon2, double lat2):
\n", "
/* Python wrapper */\n",
       "static PyObject *__pyx_pw_46_cython_magic_a8c9eb2e14c0c5fef8bdedbf1ab48c55_1great_circle(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n",
       "static PyMethodDef __pyx_mdef_46_cython_magic_a8c9eb2e14c0c5fef8bdedbf1ab48c55_1great_circle = {\"great_circle\", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_46_cython_magic_a8c9eb2e14c0c5fef8bdedbf1ab48c55_1great_circle, METH_VARARGS|METH_KEYWORDS, 0};\n",
       "static PyObject *__pyx_pw_46_cython_magic_a8c9eb2e14c0c5fef8bdedbf1ab48c55_1great_circle(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n",
       "  double __pyx_v_lon1;\n",
       "  double __pyx_v_lat1;\n",
       "  double __pyx_v_lon2;\n",
       "  double __pyx_v_lat2;\n",
       "  PyObject *__pyx_r = 0;\n",
       "  __Pyx_RefNannyDeclarations\n",
       "  __Pyx_RefNannySetupContext(\"great_circle (wrapper)\", 0);\n",
       "  {\n",
       "    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_lon1,&__pyx_n_s_lat1,&__pyx_n_s_lon2,&__pyx_n_s_lat2,0};\n",
       "    PyObject* values[4] = {0,0,0,0};\n",
       "    if (unlikely(__pyx_kwds)) {\n",
       "      Py_ssize_t kw_args;\n",
       "      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n",
       "      switch (pos_args) {\n",
       "        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  0: break;\n",
       "        default: goto __pyx_L5_argtuple_error;\n",
       "      }\n",
       "      kw_args = PyDict_Size(__pyx_kwds);\n",
       "      switch (pos_args) {\n",
       "        case  0:\n",
       "        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lon1)) != 0)) kw_args--;\n",
       "        else goto __pyx_L5_argtuple_error;\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  1:\n",
       "        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lat1)) != 0)) kw_args--;\n",
       "        else {\n",
       "          __Pyx_RaiseArgtupleInvalid(\"great_circle\", 1, 4, 4, 1); __PYX_ERR(0, 4, __pyx_L3_error)\n",
       "        }\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  2:\n",
       "        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lon2)) != 0)) kw_args--;\n",
       "        else {\n",
       "          __Pyx_RaiseArgtupleInvalid(\"great_circle\", 1, 4, 4, 2); __PYX_ERR(0, 4, __pyx_L3_error)\n",
       "        }\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  3:\n",
       "        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lat2)) != 0)) kw_args--;\n",
       "        else {\n",
       "          __Pyx_RaiseArgtupleInvalid(\"great_circle\", 1, 4, 4, 3); __PYX_ERR(0, 4, __pyx_L3_error)\n",
       "        }\n",
       "      }\n",
       "      if (unlikely(kw_args > 0)) {\n",
       "        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"great_circle\") < 0)) __PYX_ERR(0, 4, __pyx_L3_error)\n",
       "      }\n",
       "    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {\n",
       "      goto __pyx_L5_argtuple_error;\n",
       "    } else {\n",
       "      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n",
       "      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n",
       "      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);\n",
       "      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);\n",
       "    }\n",
       "    __pyx_v_lon1 = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_lon1 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 4, __pyx_L3_error)\n",
       "    __pyx_v_lat1 = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_lat1 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 4, __pyx_L3_error)\n",
       "    __pyx_v_lon2 = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_lon2 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 4, __pyx_L3_error)\n",
       "    __pyx_v_lat2 = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_lat2 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 4, __pyx_L3_error)\n",
       "  }\n",
       "  goto __pyx_L4_argument_unpacking_done;\n",
       "  __pyx_L5_argtuple_error:;\n",
       "  __Pyx_RaiseArgtupleInvalid(\"great_circle\", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 4, __pyx_L3_error)\n",
       "  __pyx_L3_error:;\n",
       "  __Pyx_AddTraceback(\"_cython_magic_a8c9eb2e14c0c5fef8bdedbf1ab48c55.great_circle\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
       "  __Pyx_RefNannyFinishContext();\n",
       "  return NULL;\n",
       "  __pyx_L4_argument_unpacking_done:;\n",
       "  __pyx_r = __pyx_pf_46_cython_magic_a8c9eb2e14c0c5fef8bdedbf1ab48c55_great_circle(__pyx_self, __pyx_v_lon1, __pyx_v_lat1, __pyx_v_lon2, __pyx_v_lat2);\n",
       "\n",
       "  /* function exit code */\n",
       "  __Pyx_RefNannyFinishContext();\n",
       "  return __pyx_r;\n",
       "}\n",
       "\n",
       "static PyObject *__pyx_pf_46_cython_magic_a8c9eb2e14c0c5fef8bdedbf1ab48c55_great_circle(CYTHON_UNUSED PyObject *__pyx_self, double __pyx_v_lon1, double __pyx_v_lat1, double __pyx_v_lon2, double __pyx_v_lat2) {\n",
       "  double __pyx_v_a;\n",
       "  double __pyx_v_b;\n",
       "  double __pyx_v_theta;\n",
       "  double __pyx_v_c;\n",
       "  double __pyx_v_x;\n",
       "  double __pyx_v_radius;\n",
       "  PyObject *__pyx_r = NULL;\n",
       "  __Pyx_RefNannyDeclarations\n",
       "  __Pyx_RefNannySetupContext(\"great_circle\", 0);\n",
       "/* … */\n",
       "  /* function exit code */\n",
       "  __pyx_L1_error:;\n",
       "  __Pyx_XDECREF(__pyx_t_1);\n",
       "  __Pyx_XDECREF(__pyx_t_2);\n",
       "  __Pyx_XDECREF(__pyx_t_4);\n",
       "  __Pyx_XDECREF(__pyx_t_5);\n",
       "  __Pyx_XDECREF(__pyx_t_6);\n",
       "  __Pyx_XDECREF(__pyx_t_7);\n",
       "  __Pyx_XDECREF(__pyx_t_8);\n",
       "  __Pyx_XDECREF(__pyx_t_9);\n",
       "  __Pyx_AddTraceback(\"_cython_magic_a8c9eb2e14c0c5fef8bdedbf1ab48c55.great_circle\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
       "  __pyx_r = NULL;\n",
       "  __pyx_L0:;\n",
       "  __Pyx_XGIVEREF(__pyx_r);\n",
       "  __Pyx_RefNannyFinishContext();\n",
       "  return __pyx_r;\n",
       "}\n",
       "/* … */\n",
       "  __pyx_tuple_ = PyTuple_Pack(10, __pyx_n_s_lon1, __pyx_n_s_lat1, __pyx_n_s_lon2, __pyx_n_s_lat2, __pyx_n_s_a, __pyx_n_s_b, __pyx_n_s_theta, __pyx_n_s_c, __pyx_n_s_x, __pyx_n_s_radius); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 4, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_tuple_);\n",
       "  __Pyx_GIVEREF(__pyx_tuple_);\n",
       "/* … */\n",
       "  __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_46_cython_magic_a8c9eb2e14c0c5fef8bdedbf1ab48c55_1great_circle, NULL, __pyx_n_s_cython_magic_a8c9eb2e14c0c5fef8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 4, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_2);\n",
       "  if (PyDict_SetItem(__pyx_d, __pyx_n_s_great_circle, __pyx_t_2) < 0) __PYX_ERR(0, 4, __pyx_L1_error)\n",
       "  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n",
       "
 05:     cdef double a, b, theta, c, x, radius
\n", "
 06: 
\n", "
+07:     radius = 6371  # 公里
\n", "
  __pyx_v_radius = 6371.0;\n",
       "
+08:     x = pi/180
\n", "
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pi); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 8, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  __pyx_t_2 = __Pyx_PyInt_TrueDivideObjC(__pyx_t_1, __pyx_int_180, 0xB4, 0, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_2);\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_t_3 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely((__pyx_t_3 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 8, __pyx_L1_error)\n",
       "  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n",
       "  __pyx_v_x = __pyx_t_3;\n",
       "
 09: 
\n", "
+10:     a = (90-lat1)*(x)
\n", "
  __pyx_v_a = ((90.0 - __pyx_v_lat1) * __pyx_v_x);\n",
       "
+11:     b = (90-lat2)*(x)
\n", "
  __pyx_v_b = ((90.0 - __pyx_v_lat2) * __pyx_v_x);\n",
       "
+12:     theta = (lon2-lon1)*(x)
\n", "
  __pyx_v_theta = ((__pyx_v_lon2 - __pyx_v_lon1) * __pyx_v_x);\n",
       "
+13:     c = acos((cos(a)*cos(b)) + (sin(a)*sin(b)*cos(theta)))
\n", "
  __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_acos); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_cos); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_5);\n",
       "  __pyx_t_6 = PyFloat_FromDouble(__pyx_v_a); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_6);\n",
       "  __pyx_t_7 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) {\n",
       "    __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5);\n",
       "    if (likely(__pyx_t_7)) {\n",
       "      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);\n",
       "      __Pyx_INCREF(__pyx_t_7);\n",
       "      __Pyx_INCREF(function);\n",
       "      __Pyx_DECREF_SET(__pyx_t_5, function);\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_4 = (__pyx_t_7) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_7, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6);\n",
       "  __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;\n",
       "  if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_4);\n",
       "  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n",
       "  __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_cos); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_6);\n",
       "  __pyx_t_7 = PyFloat_FromDouble(__pyx_v_b); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_7);\n",
       "  __pyx_t_8 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) {\n",
       "    __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_6);\n",
       "    if (likely(__pyx_t_8)) {\n",
       "      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);\n",
       "      __Pyx_INCREF(__pyx_t_8);\n",
       "      __Pyx_INCREF(function);\n",
       "      __Pyx_DECREF_SET(__pyx_t_6, function);\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_5 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_6, __pyx_t_8, __pyx_t_7) : __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_7);\n",
       "  __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n",
       "  if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_5);\n",
       "  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;\n",
       "  __pyx_t_6 = PyNumber_Multiply(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_6);\n",
       "  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n",
       "  __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_sin); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_4);\n",
       "  __pyx_t_7 = PyFloat_FromDouble(__pyx_v_a); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_7);\n",
       "  __pyx_t_8 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) {\n",
       "    __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_4);\n",
       "    if (likely(__pyx_t_8)) {\n",
       "      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);\n",
       "      __Pyx_INCREF(__pyx_t_8);\n",
       "      __Pyx_INCREF(function);\n",
       "      __Pyx_DECREF_SET(__pyx_t_4, function);\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_5 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_8, __pyx_t_7) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_7);\n",
       "  __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n",
       "  if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_5);\n",
       "  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_sin); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_7);\n",
       "  __pyx_t_8 = PyFloat_FromDouble(__pyx_v_b); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_8);\n",
       "  __pyx_t_9 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) {\n",
       "    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_7);\n",
       "    if (likely(__pyx_t_9)) {\n",
       "      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);\n",
       "      __Pyx_INCREF(__pyx_t_9);\n",
       "      __Pyx_INCREF(function);\n",
       "      __Pyx_DECREF_SET(__pyx_t_7, function);\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_4 = (__pyx_t_9) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_9, __pyx_t_8) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_8);\n",
       "  __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;\n",
       "  if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_4);\n",
       "  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n",
       "  __pyx_t_7 = PyNumber_Multiply(__pyx_t_5, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_7);\n",
       "  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __Pyx_GetModuleGlobalName(__pyx_t_5, __pyx_n_s_cos); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_5);\n",
       "  __pyx_t_8 = PyFloat_FromDouble(__pyx_v_theta); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_8);\n",
       "  __pyx_t_9 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_5))) {\n",
       "    __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_5);\n",
       "    if (likely(__pyx_t_9)) {\n",
       "      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);\n",
       "      __Pyx_INCREF(__pyx_t_9);\n",
       "      __Pyx_INCREF(function);\n",
       "      __Pyx_DECREF_SET(__pyx_t_5, function);\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_4 = (__pyx_t_9) ? __Pyx_PyObject_Call2Args(__pyx_t_5, __pyx_t_9, __pyx_t_8) : __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_8);\n",
       "  __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;\n",
       "  if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_4);\n",
       "  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n",
       "  __pyx_t_5 = PyNumber_Multiply(__pyx_t_7, __pyx_t_4); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_5);\n",
       "  __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  __pyx_t_4 = PyNumber_Add(__pyx_t_6, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_4);\n",
       "  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;\n",
       "  __pyx_t_5 = NULL;\n",
       "  if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_1))) {\n",
       "    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_1);\n",
       "    if (likely(__pyx_t_5)) {\n",
       "      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);\n",
       "      __Pyx_INCREF(__pyx_t_5);\n",
       "      __Pyx_INCREF(function);\n",
       "      __Pyx_DECREF_SET(__pyx_t_1, function);\n",
       "    }\n",
       "  }\n",
       "  __pyx_t_2 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_1, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_1, __pyx_t_4);\n",
       "  __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;\n",
       "  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;\n",
       "  if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_2);\n",
       "  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;\n",
       "  __pyx_t_3 = __pyx_PyFloat_AsDouble(__pyx_t_2); if (unlikely((__pyx_t_3 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 13, __pyx_L1_error)\n",
       "  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;\n",
       "  __pyx_v_c = __pyx_t_3;\n",
       "
+14:     return radius*c
\n", "
  __Pyx_XDECREF(__pyx_r);\n",
       "  __pyx_t_2 = PyFloat_FromDouble((__pyx_v_radius * __pyx_v_c)); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 14, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_2);\n",
       "  __pyx_r = __pyx_t_2;\n",
       "  __pyx_t_2 = 0;\n",
       "  goto __pyx_L0;\n",
       "
" ], "text/plain": [ "" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%cython -a\n", "\n", "from math import pi, acos, cos, sin\n", "\n", "def great_circle(double lon1, double lat1, double lon2, double lat2):\n", " cdef double a, b, theta, c, x, radius\n", " \n", " radius = 6371 # 公里\n", " x = pi/180\n", "\n", " a = (90-lat1)*(x)\n", " b = (90-lat2)*(x)\n", " theta = (lon2-lon1)*(x)\n", " c = acos((cos(a)*cos(b)) + (sin(a)*sin(b)*cos(theta)))\n", " return radius*c" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### C标准库函数" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:15:30.208339Z", "start_time": "2020-05-14T07:15:30.200784Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing great_circle_cy_v2.pyx\n" ] } ], "source": [ "%%file great_circle_cy_v2.pyx\n", "cdef extern from \"math.h\":\n", " float cosf(float theta)\n", " float sinf(float theta)\n", " float acosf(float theta)\n", "\n", "cpdef double great_circle(double lon1, double lat1, double lon2, double lat2):\n", " cdef double a, b, theta, c, x, radius\n", " cdef double pi = 3.141592653589793\n", "\n", " radius = 6371 # 公里\n", " x = pi/180\n", "\n", " a = (90-lat1)*(x)\n", " b = (90-lat2)*(x)\n", " theta = (lon2-lon1)*(x)\n", " c = acosf((cosf(a)*cosf(b)) + (sinf(a)*sinf(b)*cosf(theta)))\n", " return radius*c" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:15:36.151667Z", "start_time": "2020-05-14T07:15:36.144605Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Writing great_circle_setup_v2.py\n" ] } ], "source": [ "%%file great_circle_setup_v2.py\n", "from distutils.core import setup\n", "from Cython.Build import cythonize\n", "\n", "setup(\n", " name=\"Great Circle module v2\", ext_modules=cythonize(\"great_circle_cy_v2.pyx\"),\n", ")" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:15:42.128861Z", "start_time": "2020-05-14T07:15:41.145366Z" }, "scrolled": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Compiling great_circle_cy_v2.pyx because it changed.\n", "[1/1] Cythonizing great_circle_cy_v2.pyx\n", "/home/junjiet/conda/lib/python3.7/site-packages/Cython/Compiler/Main.py:369: FutureWarning: Cython directive 'language_level' not set, using 2 for now (Py2). This will change in a later release! File: /home/junjiet/data_science2020/2.数据处理/test_cython/great_circle_cy_v2.pyx\n", " tree = Parsing.p_module(s, pxd, full_module_name)\n", "running build_ext\n", "building 'great_circle_cy_v2' extension\n", "/home/junjiet/conda/bin/x86_64-conda_cos6-linux-gnu-cc -Wno-unused-result -Wsign-compare -DNDEBUG -fwrapv -O2 -Wall -Wstrict-prototypes -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -pipe -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -pipe -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -ffunction-sections -pipe -isystem /home/junjiet/conda/include -DNDEBUG -D_FORTIFY_SOURCE=2 -O2 -isystem /home/junjiet/conda/include -fPIC -I/home/junjiet/conda/include/python3.7m -c great_circle_cy_v2.c -o build/temp.linux-x86_64-3.7/great_circle_cy_v2.o\n", "x86_64-conda_cos6-linux-gnu-gcc -pthread -shared -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-rpath,/home/junjiet/conda/lib -L/home/junjiet/conda/lib -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-rpath,/home/junjiet/conda/lib -L/home/junjiet/conda/lib -Wl,-O2 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,--disable-new-dtags -Wl,--gc-sections -Wl,-rpath,/home/junjiet/conda/lib -Wl,-rpath-link,/home/junjiet/conda/lib -L/home/junjiet/conda/lib -march=nocona -mtune=haswell -ftree-vectorize -fPIC -fstack-protector-strong -fno-plt -O2 -ffunction-sections -pipe -isystem /home/junjiet/conda/include -DNDEBUG -D_FORTIFY_SOURCE=2 -O2 -isystem /home/junjiet/conda/include build/temp.linux-x86_64-3.7/great_circle_cy_v2.o -o /home/junjiet/data_science2020/2.数据处理/test_cython/great_circle_cy_v2.cpython-37m-x86_64-linux-gnu.so\n" ] } ], "source": [ "!python great_circle_setup_v2.py build_ext --inplace" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:15:44.882132Z", "start_time": "2020-05-14T07:15:43.383184Z" } }, "outputs": [], "source": [ "from great_circle_cy_v2 import great_circle\n", "for i in range(num):\n", " great_circle(lon1, lat1, lon2, lat2)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:16:03.253476Z", "start_time": "2020-05-14T07:16:03.240373Z" }, "scrolled": true, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", "\n", " \n", " Cython: _cython_magic_001d315da99fd0491a49a895f572c5f0.pyx\n", " \n", "\n", "\n", "

Generated by Cython 0.29.15

\n", "

\n", " Yellow lines hint at Python interaction.
\n", " Click on a line that starts with a \"+\" to see the C code that Cython generated for it.\n", "

\n", "
 01: 
\n", "
 02: cdef extern from "math.h":
\n", "
 03:     float cosf(float theta)
\n", "
 04:     float sinf(float theta)
\n", "
 05:     float acosf(float theta)
\n", "
 06: 
\n", "
+07: cpdef double great_circle(double lon1, double lat1, double lon2, double lat2):
\n", "
static PyObject *__pyx_pw_46_cython_magic_001d315da99fd0491a49a895f572c5f0_1great_circle(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n",
       "static double __pyx_f_46_cython_magic_001d315da99fd0491a49a895f572c5f0_great_circle(double __pyx_v_lon1, double __pyx_v_lat1, double __pyx_v_lon2, double __pyx_v_lat2, CYTHON_UNUSED int __pyx_skip_dispatch) {\n",
       "  double __pyx_v_a;\n",
       "  double __pyx_v_b;\n",
       "  double __pyx_v_theta;\n",
       "  double __pyx_v_c;\n",
       "  double __pyx_v_x;\n",
       "  double __pyx_v_radius;\n",
       "  double __pyx_v_pi;\n",
       "  double __pyx_r;\n",
       "  __Pyx_RefNannyDeclarations\n",
       "  __Pyx_RefNannySetupContext(\"great_circle\", 0);\n",
       "/* … */\n",
       "  /* function exit code */\n",
       "  __pyx_L0:;\n",
       "  __Pyx_RefNannyFinishContext();\n",
       "  return __pyx_r;\n",
       "}\n",
       "\n",
       "/* Python wrapper */\n",
       "static PyObject *__pyx_pw_46_cython_magic_001d315da99fd0491a49a895f572c5f0_1great_circle(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/\n",
       "static PyObject *__pyx_pw_46_cython_magic_001d315da99fd0491a49a895f572c5f0_1great_circle(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {\n",
       "  double __pyx_v_lon1;\n",
       "  double __pyx_v_lat1;\n",
       "  double __pyx_v_lon2;\n",
       "  double __pyx_v_lat2;\n",
       "  PyObject *__pyx_r = 0;\n",
       "  __Pyx_RefNannyDeclarations\n",
       "  __Pyx_RefNannySetupContext(\"great_circle (wrapper)\", 0);\n",
       "  {\n",
       "    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_lon1,&__pyx_n_s_lat1,&__pyx_n_s_lon2,&__pyx_n_s_lat2,0};\n",
       "    PyObject* values[4] = {0,0,0,0};\n",
       "    if (unlikely(__pyx_kwds)) {\n",
       "      Py_ssize_t kw_args;\n",
       "      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);\n",
       "      switch (pos_args) {\n",
       "        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  0: break;\n",
       "        default: goto __pyx_L5_argtuple_error;\n",
       "      }\n",
       "      kw_args = PyDict_Size(__pyx_kwds);\n",
       "      switch (pos_args) {\n",
       "        case  0:\n",
       "        if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lon1)) != 0)) kw_args--;\n",
       "        else goto __pyx_L5_argtuple_error;\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  1:\n",
       "        if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lat1)) != 0)) kw_args--;\n",
       "        else {\n",
       "          __Pyx_RaiseArgtupleInvalid(\"great_circle\", 1, 4, 4, 1); __PYX_ERR(0, 7, __pyx_L3_error)\n",
       "        }\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  2:\n",
       "        if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lon2)) != 0)) kw_args--;\n",
       "        else {\n",
       "          __Pyx_RaiseArgtupleInvalid(\"great_circle\", 1, 4, 4, 2); __PYX_ERR(0, 7, __pyx_L3_error)\n",
       "        }\n",
       "        CYTHON_FALLTHROUGH;\n",
       "        case  3:\n",
       "        if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_lat2)) != 0)) kw_args--;\n",
       "        else {\n",
       "          __Pyx_RaiseArgtupleInvalid(\"great_circle\", 1, 4, 4, 3); __PYX_ERR(0, 7, __pyx_L3_error)\n",
       "        }\n",
       "      }\n",
       "      if (unlikely(kw_args > 0)) {\n",
       "        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, \"great_circle\") < 0)) __PYX_ERR(0, 7, __pyx_L3_error)\n",
       "      }\n",
       "    } else if (PyTuple_GET_SIZE(__pyx_args) != 4) {\n",
       "      goto __pyx_L5_argtuple_error;\n",
       "    } else {\n",
       "      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);\n",
       "      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);\n",
       "      values[2] = PyTuple_GET_ITEM(__pyx_args, 2);\n",
       "      values[3] = PyTuple_GET_ITEM(__pyx_args, 3);\n",
       "    }\n",
       "    __pyx_v_lon1 = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_lon1 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 7, __pyx_L3_error)\n",
       "    __pyx_v_lat1 = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_lat1 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 7, __pyx_L3_error)\n",
       "    __pyx_v_lon2 = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_lon2 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 7, __pyx_L3_error)\n",
       "    __pyx_v_lat2 = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_lat2 == (double)-1) && PyErr_Occurred())) __PYX_ERR(0, 7, __pyx_L3_error)\n",
       "  }\n",
       "  goto __pyx_L4_argument_unpacking_done;\n",
       "  __pyx_L5_argtuple_error:;\n",
       "  __Pyx_RaiseArgtupleInvalid(\"great_circle\", 1, 4, 4, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 7, __pyx_L3_error)\n",
       "  __pyx_L3_error:;\n",
       "  __Pyx_AddTraceback(\"_cython_magic_001d315da99fd0491a49a895f572c5f0.great_circle\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
       "  __Pyx_RefNannyFinishContext();\n",
       "  return NULL;\n",
       "  __pyx_L4_argument_unpacking_done:;\n",
       "  __pyx_r = __pyx_pf_46_cython_magic_001d315da99fd0491a49a895f572c5f0_great_circle(__pyx_self, __pyx_v_lon1, __pyx_v_lat1, __pyx_v_lon2, __pyx_v_lat2);\n",
       "\n",
       "  /* function exit code */\n",
       "  __Pyx_RefNannyFinishContext();\n",
       "  return __pyx_r;\n",
       "}\n",
       "\n",
       "static PyObject *__pyx_pf_46_cython_magic_001d315da99fd0491a49a895f572c5f0_great_circle(CYTHON_UNUSED PyObject *__pyx_self, double __pyx_v_lon1, double __pyx_v_lat1, double __pyx_v_lon2, double __pyx_v_lat2) {\n",
       "  PyObject *__pyx_r = NULL;\n",
       "  __Pyx_RefNannyDeclarations\n",
       "  __Pyx_RefNannySetupContext(\"great_circle\", 0);\n",
       "  __Pyx_XDECREF(__pyx_r);\n",
       "  __pyx_t_1 = PyFloat_FromDouble(__pyx_f_46_cython_magic_001d315da99fd0491a49a895f572c5f0_great_circle(__pyx_v_lon1, __pyx_v_lat1, __pyx_v_lon2, __pyx_v_lat2, 0)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 7, __pyx_L1_error)\n",
       "  __Pyx_GOTREF(__pyx_t_1);\n",
       "  __pyx_r = __pyx_t_1;\n",
       "  __pyx_t_1 = 0;\n",
       "  goto __pyx_L0;\n",
       "\n",
       "  /* function exit code */\n",
       "  __pyx_L1_error:;\n",
       "  __Pyx_XDECREF(__pyx_t_1);\n",
       "  __Pyx_AddTraceback(\"_cython_magic_001d315da99fd0491a49a895f572c5f0.great_circle\", __pyx_clineno, __pyx_lineno, __pyx_filename);\n",
       "  __pyx_r = NULL;\n",
       "  __pyx_L0:;\n",
       "  __Pyx_XGIVEREF(__pyx_r);\n",
       "  __Pyx_RefNannyFinishContext();\n",
       "  return __pyx_r;\n",
       "}\n",
       "
 08:     cdef double a, b, theta, c, x, radius
\n", "
+09:     cdef double pi = 3.141592653589793
\n", "
  __pyx_v_pi = 3.141592653589793;\n",
       "
 10: 
\n", "
+11:     radius = 6371  # 公里
\n", "
  __pyx_v_radius = 6371.0;\n",
       "
+12:     x = pi/180
\n", "
  __pyx_v_x = (__pyx_v_pi / 180.0);\n",
       "
 13: 
\n", "
+14:     a = (90-lat1)*(x)
\n", "
  __pyx_v_a = ((90.0 - __pyx_v_lat1) * __pyx_v_x);\n",
       "
+15:     b = (90-lat2)*(x)
\n", "
  __pyx_v_b = ((90.0 - __pyx_v_lat2) * __pyx_v_x);\n",
       "
+16:     theta = (lon2-lon1)*(x)
\n", "
  __pyx_v_theta = ((__pyx_v_lon2 - __pyx_v_lon1) * __pyx_v_x);\n",
       "
+17:     c = acosf((cosf(a)*cosf(b)) + (sinf(a)*sinf(b)*cosf(theta)))
\n", "
  __pyx_v_c = acosf(((cosf(__pyx_v_a) * cosf(__pyx_v_b)) + ((sinf(__pyx_v_a) * sinf(__pyx_v_b)) * cosf(__pyx_v_theta))));\n",
       "
+18:     return radius*c
\n", "
  __pyx_r = (__pyx_v_radius * __pyx_v_c);\n",
       "  goto __pyx_L0;\n",
       "
" ], "text/plain": [ "" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%%cython -a\n", "\n", "cdef extern from \"math.h\":\n", " float cosf(float theta)\n", " float sinf(float theta)\n", " float acosf(float theta)\n", "\n", "cpdef double great_circle(double lon1, double lat1, double lon2, double lat2):\n", " cdef double a, b, theta, c, x, radius\n", " cdef double pi = 3.141592653589793\n", "\n", " radius = 6371 # 公里\n", " x = pi/180\n", "\n", " a = (90-lat1)*(x)\n", " b = (90-lat2)*(x)\n", " theta = (lon2-lon1)*(x)\n", " c = acosf((cosf(a)*cosf(b)) + (sinf(a)*sinf(b)*cosf(theta)))\n", " return radius*c" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## [Numba](http://numba.pydata.org)\n", "\n", "通过装饰器控制Python解释器把函数转变成机器码,实现了与C和Cython同样的性能,但是不需要用新的解释器或者写C代码。可以按需生成优化(JIT)的机器码,甚至可以编译成CPU或GPU可执行代码。\n", "\n", "- JIT即时代码生成(On-the-fly code generation)\n", "- CPU和GPU原生代码生成\n", "- 与Numpy相关包交互" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### `@jit`装饰器" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:17:43.775964Z", "start_time": "2020-05-14T07:17:43.725961Z" }, "scrolled": true }, "outputs": [], "source": [ "a = np.random.rand(1000, 1000)" ] }, { "cell_type": "code", "execution_count": 80, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:17:52.855889Z", "start_time": "2020-05-14T07:17:44.564557Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "275 ms ± 13.1 ms per loop (mean ± std. dev. of 3 runs, 10 loops each)\n" ] } ], "source": [ "def sum2d(arr):\n", " M, N = arr.shape\n", " result = 0\n", " for i in range(M):\n", " for j in range(N):\n", " result += arr[i, j]\n", " return result\n", "\n", "%timeit -r3 -n10 sum2d(a)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### 延迟编译(Lazy compilation)" ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:18:06.926856Z", "start_time": "2020-05-14T07:18:04.858154Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.28 ms ± 48.7 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)\n" ] } ], "source": [ "from numba import jit\n", "\n", "# jit装饰器告诉Numba编译函数,当函数被调用时,Numba再引入参数类型\n", "@jit\n", "def sum2d(arr):\n", " M, N = arr.shape\n", " result = 0\n", " for i in range(M):\n", " for j in range(N):\n", " result += arr[i, j]\n", " return result\n", "\n", "%timeit sum2d(a)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "#### 即时编译(Eager compilation)\n", "\n", "由于python支持动态类型,因此`@jit`装饰器可以设置函数的接收类型(返回类型),按照配置参数进行优化,适合进行浮点数精度控制float32、float64。" ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:18:27.588685Z", "start_time": "2020-05-14T07:18:19.544085Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "949 µs ± 1.69 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" ] } ], "source": [ "from numba import jit, float64\n", "\n", "\n", "@jit(float64(float64[:, :]))\n", "def sum2d(arr):\n", " M, N = arr.shape\n", " result = 0\n", " for i in range(M):\n", " for j in range(N):\n", " result += arr[i, j]\n", " return result\n", "\n", "\n", "%timeit sum2d(a)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "@jit配置函数签名的常用类型如下。\n", "\n", "- `void`:函数返回值类型,表示不返回任何结果。\n", "- `intp`和`uintp`:指针大小的整数,分别表示签名和无签名类型。\n", "- `intc`和`uintc`:相当于C语言的整型和无符号整型。\n", "- `int8`、`int16`、`int32`和`int64`:固定宽度整型(无符号整型前面加`u`,比如`uint8`)。\n", "- `float32`和`float64`:单精度和双精度浮点数类型。\n", "- `complex64`和`complex128`:单精度和双精度复数类型。\n", "- 数组可以用任何带索引的数值类型表示,比如`float32[:]`就是一维浮点数数组类型,`int32[:,:]`就是二维整型数组。" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### 编译选项\n", "\n", "1. 非GIL模式:把`nogil=True`属性传到装饰器,就可以不受GIL的限制,多线程系统的常见问题(一致性、数据同步、竞态条件等)就可以解决。\n", "1. [无Python模式](https://numba.pydata.org/numba-doc/latest/user/troubleshoot.html#numba-troubleshooting):可以通过`nopython`参数设置Numba的编译模式:\n", " 1. `object`模式:默认模式,产生的代码可以处理所有Python对象,并用C API完成Python对象上的操作;\n", " 1. `nopython`模式:可以不调用C API而生成更高效的代码,不过只有一部分函数和方法可以使用:\n", " - 函数中表示数值的所有原生类型都可以被引用\n", " - 函数中不可以分配新内存\n", "1. 缓存模式:避免重复调用,通过`cache=True`将结果保证在缓存文件中\n", "1. [并行模式](https://numba.pydata.org/numba-doc/latest/user/parallel.html#numba-parallel):通过`parallel=True`并行计算,必须配合`nopython=True`使用" ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T07:19:11.138043Z", "start_time": "2020-05-14T07:19:02.779467Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "962 µs ± 29.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)\n" ] } ], "source": [ "@jit(nopython=True)\n", "def sum2d(arr):\n", " M, N = arr.shape\n", " result = 0\n", " for i in range(M):\n", " for j in range(N):\n", " result += arr[i, j]\n", " return result\n", "\n", "\n", "%timeit sum2d(a)" ] }, { "cell_type": "code", "execution_count": 207, "metadata": { "ExecuteTime": { "end_time": "2020-05-13T12:16:43.068215Z", "start_time": "2020-05-13T12:16:43.027926Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "from numba import prange\n", "\n", "@jit(parallel=True, nopython=True)\n", "def sum2d(arr):\n", " M, N = arr.shape\n", " result = 0\n", " for i in prange(M):\n", " for j in range(N):\n", " result += arr[i, j]\n", " return result\n", "\n", "\n", "%timeit sum2d(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. @njit:@jit(nopython=True)的\n", "1. @vectorize与@guvectorize:支持NumPy的通用函数(ufunc)\n", "1. @stencil:定义一个核函数实现stencil(模版)类操作\n", "1. @jitclass:jit编译python类\n", "1. @cfunc:定义可以被C/C++直接调用的函数\n", "1. @overload:注册一个在nopython模式使用自定义函数" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# [pyspark](https://spark.apache.org/docs/latest/api/python/)\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## 安装\n", "\n", "直接用connda安装即可,自动配置\n", "\n", "```bash\n", "conda install pyspark -c conda-forge\n", "pip install findspark\n", "```\n", "\n", "## 初始化" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:47:30.735658Z", "start_time": "2020-05-15T06:47:27.169577Z" } }, "outputs": [], "source": [ "import findspark\n", "\n", "findspark.init(spark_home=\"/home/junjiet/conda/lib/python3.7/site-packages/pyspark\")\n", "\n", "from pyspark.sql import SparkSession, dataframe\n", "from pyspark import SparkConf, SparkContext\n", "from pyspark.sql.types import *\n", "from pyspark.sql import functions as F\n", "\n", "sparkConf = SparkConf().set(\"spark.sql.execution.arrow.enabled\", \"false\")\n", "spark = SparkSession.builder.config(conf=sparkConf).enableHiveSupport().getOrCreate()\n", "sc = SparkContext.getOrCreate()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## [RDD简介](https://spark.apache.org/docs/latest/api/python/pyspark.html#pyspark.RDD)\n", "\n", "RDD(Resilient Distributed DataSet,弹性分布式数据集),是Spark中最基本的数据抽象是,具有分区,不可变,并行操作特点\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:47:32.045112Z", "start_time": "2020-05-15T06:47:31.757048Z" } }, "outputs": [], "source": [ "rdd = sc.parallelize([1, 2, 2, 3, 3, 4, 5])" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-14T08:51:17.822011Z", "start_time": "2020-05-14T08:51:17.148564Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### RDD常用转换(Transformation)API\n", "" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:47:33.453966Z", "start_time": "2020-05-15T06:47:32.300347Z" }, "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "[2, 2, 4]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rdd.filter(lambda x: x % 2 == 0).collect()" ] }, { "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2020-05-14T08:32:46.666843Z", "start_time": "2020-05-14T08:32:46.659191Z" }, "slideshow": { "slide_type": "subslide" } }, "source": [ "### RDD常用动作(Action)API\n", "" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:47:33.609323Z", "start_time": "2020-05-15T06:47:33.455841Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "7" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rdd.count()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:47:34.247797Z", "start_time": "2020-05-15T06:47:33.627380Z" } }, "outputs": [ { "data": { "text/plain": [ "[1, 2, 3, 4, 5]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rdd.distinct().collect()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## RDD与DataFrame基本操作" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "![](2.data-elt/rdd.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "![](2.data-elt/pysparkdf.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "## Dataframe" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:47:35.241922Z", "start_time": "2020-05-15T06:47:35.235227Z" } }, "outputs": [], "source": [ "schema = (\n", " StructType()\n", " .add(\"user_id\", \"string\")\n", " .add(\"country\", \"string\")\n", " .add(\"browser\", \"string\")\n", " .add(\"OS\", \"string\")\n", " .add(\"age\", \"integer\")\n", " .add(\"salary\", \"double\")\n", ")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:47:37.735454Z", "start_time": "2020-05-15T06:47:36.017342Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "root\n", " |-- user_id: string (nullable = true)\n", " |-- country: string (nullable = true)\n", " |-- browser: string (nullable = true)\n", " |-- OS: string (nullable = true)\n", " |-- age: integer (nullable = true)\n", " |-- salary: double (nullable = true)\n", "\n" ] } ], "source": [ "df = spark.createDataFrame(\n", " [\n", " (\"A203\", \"India\", \"Chrome\", \"WIN\", 33, 12.34),\n", " (\"A201\", \"China\", \"Safari\", \"MacOS\", 45, 14.56),\n", " (\"A205\", \"UK\", \"Mozilla\", \"Linux\", 25, 16.78),\n", " (\"A206\", \"China\", \"Chrome\", \"MacOS\", 68, 23.45),\n", " ],\n", " schema=schema,\n", ")\n", "\n", "df.printSchema()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:47:38.828103Z", "start_time": "2020-05-15T06:47:37.738535Z" }, "scrolled": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+-------+-------+-------+-----+---+------+\n", "|user_id|country|browser| OS|age|salary|\n", "+-------+-------+-------+-----+---+------+\n", "| A203| India| Chrome| WIN| 33| 12.34|\n", "| A201| China| Safari|MacOS| 45| 14.56|\n", "| A205| UK|Mozilla|Linux| 25| 16.78|\n", "| A206| China| Chrome|MacOS| 68| 23.45|\n", "+-------+-------+-------+-----+---+------+\n", "\n" ] } ], "source": [ "df.show()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:47:39.105824Z", "start_time": "2020-05-15T06:47:38.831614Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "DataFrame[user_id: string, country: string, browser: string, OS: string, age: int, salary: double]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.filter(df[\"age\"] > 30)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:47:39.517904Z", "start_time": "2020-05-15T06:47:39.107273Z" }, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.filter(df[\"age\"] > 30).count()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:47:40.279015Z", "start_time": "2020-05-15T06:47:39.928238Z" }, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+-------+-------+-------+-----+---+------+\n", "|user_id|country|browser| OS|age|salary|\n", "+-------+-------+-------+-----+---+------+\n", "| A201| China| Safari|MacOS| 45| 14.56|\n", "| A206| China| Chrome|MacOS| 68| 23.45|\n", "+-------+-------+-------+-----+---+------+\n", "\n" ] } ], "source": [ "df.where((df[\"age\"] > 30) & (df[\"country\"] == \"China\")).show()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:58:48.483420Z", "start_time": "2020-05-15T06:58:48.233972Z" } }, "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", "
user_idcountrybrowserOSagesalary
0A203IndiaChromeWIN3312.34
1A201ChinaSafariMacOS4514.56
2A205UKMozillaLinux2516.78
3A206ChinaChromeMacOS6823.45
\n", "
" ], "text/plain": [ " user_id country browser OS age salary\n", "0 A203 India Chrome WIN 33 12.34\n", "1 A201 China Safari MacOS 45 14.56\n", "2 A205 UK Mozilla Linux 25 16.78\n", "3 A206 China Chrome MacOS 68 23.45" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.toPandas()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "## 自定义函数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### DataFrame属性" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:58:50.748839Z", "start_time": "2020-05-15T06:58:50.740716Z" } }, "outputs": [], "source": [ "from pyspark.sql import dataframe\n", "\n", "def spark_shape(self):\n", " return (self.count(), len(self.columns))\n", "dataframe.DataFrame.shape = spark_shape" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:58:51.856018Z", "start_time": "2020-05-15T06:58:51.641149Z" } }, "outputs": [ { "data": { "text/plain": [ "(4, 6)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### UDF" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:58:53.737059Z", "start_time": "2020-05-15T06:58:53.161264Z" }, "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "+-------+-------+-------+-----+---+------+------------+\n", "|user_id|country|browser| OS|age|salary|age_category|\n", "+-------+-------+-------+-----+---+------+------------+\n", "| A203| India| Chrome| WIN| 33| 12.34| B|\n", "| A201| China| Safari|MacOS| 45| 14.56| B|\n", "| A205| UK|Mozilla|Linux| 25| 16.78| A|\n", "| A206| China| Chrome|MacOS| 68| 23.45| C|\n", "+-------+-------+-------+-----+---+------+------------+\n", "\n" ] } ], "source": [ "from pyspark.sql.functions import udf\n", "\n", "\n", "def age_category(age):\n", " if 18 <= age < 30:\n", " return \"A\"\n", " elif age < 60:\n", " return \"B\"\n", " else:\n", " return \"C\"\n", "\n", "\n", "age_udf = udf(age_category, StringType())\n", "\n", "df.withColumn(\"age_category\", age_udf(df[\"age\"])).show()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "### Pandas UDF" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T06:58:55.635726Z", "start_time": "2020-05-15T06:58:55.362825Z" } }, "outputs": [ { "data": { "text/plain": [ "(12.34, 23.45)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "min_sal, max_sal = df.agg(F.min(\"salary\"), F.max(\"salary\")).collect()[0]\n", "min_sal, max_sal" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "ExecuteTime": { "end_time": "2020-05-15T07:15:09.975720Z", "start_time": "2020-05-15T07:15:09.969746Z" }, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "from pyspark.sql.functions import pandas_udf\n", "\n", "def scaled_salary(salary):\n", " scaled_sal = (salary - min_sal) / (max_sal - min_sal)\n", " return scaled_sal\n", "\n", "\n", "scaling_udf = pandas_udf(scaled_salary, DoubleType())" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "ExecuteTime": { "end_time": "2020-05-14T09:33:01.423540Z", "start_time": "2020-05-14T09:33:01.419429Z" }, "scrolled": false, "slideshow": { "slide_type": "subslide" } }, "outputs": [], "source": [ "df.select(df[\"salary\"], scaling_udf(df[\"salary\"])).show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](http://dblab.xmu.edu.cn/wp-content/themes/labstyle/images/branding.png)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "subslide" } }, "source": [ "1. [捕蛇者说](https://pythonhunter.org/) 中文python播客,有趣有料\n", "1. [pandas_profiling](https://github.com/pandas-profiling/pandas-profiling) EDA可视化报表,支持导出html格式\n", "2. [pandarallel](https://github.com/nalepae/pandarallel) CPU并行加速,apply、map、groupby与rolling等应用场景\n", "3. [jax](https://github.com/google/jax) NumPy的GPU加速——谷歌开源,jakavdp参与开发\n", "4. [cudf](https://github.com/rapidsai/cudf) Datafame的GPU加速\n", "5. [koalas](https://koalas.readthedocs.io/en/latest/index.html) Databricks按照pandas实现的pyspark接口" ] } ], "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.7.6" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 4 }