Skip to content

Instantly share code, notes, and snippets.

@KianYang-Lee
Created March 21, 2021 03:56
Show Gist options
  • Save KianYang-Lee/bb4c3d16a61b255458373caf83803dc6 to your computer and use it in GitHub Desktop.
Save KianYang-Lee/bb4c3d16a61b255458373caf83803dc6 to your computer and use it in GitHub Desktop.
notebook/Solution/01 - Pandas For Time Series.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {
"deletable": false,
"editable": false
},
"cell_type": "markdown",
"source": "![logo](../../picture/logo_cropped_resized.png)\n> **Copyright &copy; 2020 CertifAI Sdn. Bhd.**<br>\n **Copyright &copy; 2021 CertifAI Sdn. Bhd.**<br>\n <br>\nThis program and the accompanying materials are made available under the\nterms of the [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0). \\\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\nWARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\nLicense for the specific language governing permissions and limitations\nunder the License. <br>\n<br>**SPDX-License-Identifier: Apache-2.0**"
},
{
"metadata": {
"colab_type": "text",
"id": "WY3yWu9_m6ZT"
},
"cell_type": "markdown",
"source": "# Pandas Basic\n***\n\nPandas is built \"on top\" of NumPy which allows us to work on data easily. Thus, Numpy functions will generally work on pandas objects as well. At first, we will import both libraries:"
},
{
"metadata": {
"colab": {},
"colab_type": "code",
"id": "83ArqlL8msXF",
"trusted": false
},
"cell_type": "code",
"source": "import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\n\nimport warnings\nwarnings.filterwarnings('ignore')",
"execution_count": 1,
"outputs": []
},
{
"metadata": {
"colab_type": "text",
"id": "j66UUA3VrNE1"
},
"cell_type": "markdown",
"source": "## DataFrame Class Pt. 1\n\nHere, we will learn some basic operations using Pandas library."
},
{
"metadata": {
"colab_type": "text",
"id": "4iHHHJP2vdr_"
},
"cell_type": "markdown",
"source": "### Create new DataFrame"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 166
},
"colab_type": "code",
"id": "wJz5phjKp9g2",
"outputId": "07500d44-a080-4bd1-f559-bcb0d2de729c",
"trusted": false
},
"cell_type": "code",
"source": "data = [10, 20, 30, 40]\ndf = pd.DataFrame(data, columns=['numbers'], index=['a', 'b', 'c', 'd'])\n\ndf",
"execution_count": 2,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>numbers</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>a</th>\n <td>10</td>\n </tr>\n <tr>\n <th>b</th>\n <td>20</td>\n </tr>\n <tr>\n <th>c</th>\n <td>30</td>\n </tr>\n <tr>\n <th>d</th>\n <td>40</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " numbers\na 10\nb 20\nc 30\nd 40"
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "oCqe0dS9r-Rb"
},
"cell_type": "markdown",
"source": "### Typical operations on DataFrame objects"
},
{
"metadata": {
"colab_type": "text",
"id": "7xBsvY4H60AQ"
},
"cell_type": "markdown",
"source": "Display all indexes"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "Djp_x55Lu9aK",
"outputId": "f7a3b77a-adff-46ac-d263-be821bc5b57c",
"trusted": false
},
"cell_type": "code",
"source": "df.index",
"execution_count": 3,
"outputs": [
{
"data": {
"text/plain": "Index(['a', 'b', 'c', 'd'], dtype='object')"
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "lJbi0hEr67xx"
},
"cell_type": "markdown",
"source": "Determine what are the available columns."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "gdEiu8aHviIE",
"outputId": "5a266613-b3ab-4850-a64f-71c40e99f110",
"trusted": false
},
"cell_type": "code",
"source": "df.columns",
"execution_count": 4,
"outputs": [
{
"data": {
"text/plain": "Index(['numbers'], dtype='object')"
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "E1PjHyLv7Wjd"
},
"cell_type": "markdown",
"source": "Index slicing using characters or strings."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 50
},
"colab_type": "code",
"id": "gaEHfD0kvtGO",
"outputId": "93af2480-b40c-4bc3-ed86-cc77b99348db",
"trusted": false
},
"cell_type": "code",
"source": "df.loc['c']",
"execution_count": 5,
"outputs": [
{
"data": {
"text/plain": "numbers 30\nName: c, dtype: int64"
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "ii8H3P117GdU"
},
"cell_type": "markdown",
"source": "Index slicing using integers."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 107
},
"colab_type": "code",
"id": "ek4bBzkFvvCc",
"outputId": "4ea4752b-d423-440f-efa1-6b372baaccbf",
"trusted": false
},
"cell_type": "code",
"source": "data = [10, 20, 30, 40]\ndf_num_idx = pd.DataFrame(data, columns=['numbers'])\ndf_num_idx.iloc[1:3]",
"execution_count": 6,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>numbers</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>1</th>\n <td>20</td>\n </tr>\n <tr>\n <th>2</th>\n <td>30</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " numbers\n1 20\n2 30"
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "ftcQiW0ckWzq"
},
"cell_type": "markdown",
"source": "Summing up all numbers in every row"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 50
},
"colab_type": "code",
"id": "H2RGt8zbwE6a",
"outputId": "76815fee-433c-4121-ca42-edd60155a28f",
"trusted": false
},
"cell_type": "code",
"source": "df.sum(axis=0) #axis=0 for sum over rows (sum up vertically) and axis=1 for sum over columns (sum up horizontally)",
"execution_count": 7,
"outputs": [
{
"data": {
"text/plain": "numbers 100\ndtype: int64"
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "gg2UGbx0kfGP"
},
"cell_type": "markdown",
"source": "Perform numerical operation on each data"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 166
},
"colab_type": "code",
"id": "qmI2QvkKwZXA",
"outputId": "795f0b43-7746-48ae-c1e9-a3e3ebea8e12",
"trusted": false
},
"cell_type": "code",
"source": "df.apply(lambda x: x**2)",
"execution_count": 8,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>numbers</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>a</th>\n <td>100</td>\n </tr>\n <tr>\n <th>b</th>\n <td>400</td>\n </tr>\n <tr>\n <th>c</th>\n <td>900</td>\n </tr>\n <tr>\n <th>d</th>\n <td>1600</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " numbers\na 100\nb 400\nc 900\nd 1600"
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "A9mfxw8wkl9X"
},
"cell_type": "markdown",
"source": "Add a new column to the DataFrame"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 166
},
"colab_type": "code",
"id": "mRINYrbpweiF",
"outputId": "e31eba01-547a-4742-d482-7462c53f74b4",
"trusted": false
},
"cell_type": "code",
"source": "df['floats']=(1.5, 2.5, 3.5, 4.5)\n\ndf",
"execution_count": 9,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>numbers</th>\n <th>floats</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>a</th>\n <td>10</td>\n <td>1.5</td>\n </tr>\n <tr>\n <th>b</th>\n <td>20</td>\n <td>2.5</td>\n </tr>\n <tr>\n <th>c</th>\n <td>30</td>\n <td>3.5</td>\n </tr>\n <tr>\n <th>d</th>\n <td>40</td>\n <td>4.5</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " numbers floats\na 10 1.5\nb 20 2.5\nc 30 3.5\nd 40 4.5"
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "4Sk-Hp_Ik_y4"
},
"cell_type": "markdown",
"source": "Select the data at specific column"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 100
},
"colab_type": "code",
"id": "H7AElsuwyAv8",
"outputId": "913b6240-08ae-4027-ed11-90d915ffa234",
"trusted": false
},
"cell_type": "code",
"source": "df['floats']",
"execution_count": 10,
"outputs": [
{
"data": {
"text/plain": "a 1.5\nb 2.5\nc 3.5\nd 4.5\nName: floats, dtype: float64"
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "S4Z-eS1En-5M"
},
"cell_type": "markdown",
"source": "We can also create a new column by using a Dataframe."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 166
},
"colab_type": "code",
"id": "gMzNi2anyEZ0",
"outputId": "ac62dcb1-2d8f-4217-e2c1-451b6fc0f47f",
"trusted": false
},
"cell_type": "code",
"source": "df['names'] = pd.DataFrame(['Ali', 'Mutu', 'Lim', 'John'], index=['d', 'b', 'a', 'c'])\n\ndf",
"execution_count": 11,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>numbers</th>\n <th>floats</th>\n <th>names</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>a</th>\n <td>10</td>\n <td>1.5</td>\n <td>Lim</td>\n </tr>\n <tr>\n <th>b</th>\n <td>20</td>\n <td>2.5</td>\n <td>Mutu</td>\n </tr>\n <tr>\n <th>c</th>\n <td>30</td>\n <td>3.5</td>\n <td>John</td>\n </tr>\n <tr>\n <th>d</th>\n <td>40</td>\n <td>4.5</td>\n <td>Ali</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " numbers floats names\na 10 1.5 Lim\nb 20 2.5 Mutu\nc 30 3.5 John\nd 40 4.5 Ali"
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "BSorS8R7r66f"
},
"cell_type": "markdown",
"source": "If we want to add a new row to the dataset, we can use append. But do note that this is just a temporary DataFrame and will not affect the original DataFrame.\n\nHere, we show that we can add a new row of data by using a dictionary."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 196
},
"colab_type": "code",
"id": "U-eXphzmyYvg",
"outputId": "b4d4b3ce-2697-41da-e6c1-b9fcf6645feb",
"trusted": false
},
"cell_type": "code",
"source": "df.append({'numbers':25, 'floats': 24.72, 'names':'Fatimah'}, ignore_index=True)\n#temporary object, will not affect the original df\n# df",
"execution_count": 12,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>numbers</th>\n <th>floats</th>\n <th>names</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>10</td>\n <td>1.50</td>\n <td>Lim</td>\n </tr>\n <tr>\n <th>1</th>\n <td>20</td>\n <td>2.50</td>\n <td>Mutu</td>\n </tr>\n <tr>\n <th>2</th>\n <td>30</td>\n <td>3.50</td>\n <td>John</td>\n </tr>\n <tr>\n <th>3</th>\n <td>40</td>\n <td>4.50</td>\n <td>Ali</td>\n </tr>\n <tr>\n <th>4</th>\n <td>25</td>\n <td>24.72</td>\n <td>Fatimah</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " numbers floats names\n0 10 1.50 Lim\n1 20 2.50 Mutu\n2 30 3.50 John\n3 40 4.50 Ali\n4 25 24.72 Fatimah"
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "7Cv6hHwLsPEV"
},
"cell_type": "markdown",
"source": "Thus, we need to replace the old variable in order to 'replace' it. \n\nWe can append a new row of data using DataFrame as well instead of a dictionary."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 196
},
"colab_type": "code",
"id": "t9eALb9Mys8U",
"outputId": "acafd5ef-f0a0-404e-b697-f0d03318617b",
"trusted": false
},
"cell_type": "code",
"source": "df = df.append(pd.DataFrame({'numbers': 10, 'floats': 5.6,'names': 'Henry'}, index=['z']));df",
"execution_count": 13,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>numbers</th>\n <th>floats</th>\n <th>names</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>a</th>\n <td>10</td>\n <td>1.5</td>\n <td>Lim</td>\n </tr>\n <tr>\n <th>b</th>\n <td>20</td>\n <td>2.5</td>\n <td>Mutu</td>\n </tr>\n <tr>\n <th>c</th>\n <td>30</td>\n <td>3.5</td>\n <td>John</td>\n </tr>\n <tr>\n <th>d</th>\n <td>40</td>\n <td>4.5</td>\n <td>Ali</td>\n </tr>\n <tr>\n <th>z</th>\n <td>10</td>\n <td>5.6</td>\n <td>Henry</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " numbers floats names\na 10 1.5 Lim\nb 20 2.5 Mutu\nc 30 3.5 John\nd 40 4.5 Ali\nz 10 5.6 Henry"
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "2NguHZGWwbzg"
},
"cell_type": "markdown",
"source": "## DataFrame Class Pt. 2\n\nNow, we will work on numerical data, add on new feature like DateTimeIndex and do some basic analysis."
},
{
"metadata": {
"colab_type": "text",
"id": "HhuoVp2exxhI"
},
"cell_type": "markdown",
"source": "First, let's generate some random data for us to use in our example."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 167
},
"colab_type": "code",
"id": "waJnfbvW4_cj",
"outputId": "18f7ec95-eb34-4513-f1a5-a8c769b4d363",
"trusted": false
},
"cell_type": "code",
"source": "np.random.seed(123)\ngen_data = np.random.standard_normal((9,4)) #9 rows 4 columns\ngen_data.round(6)",
"execution_count": 14,
"outputs": [
{
"data": {
"text/plain": "array([[-1.085631, 0.997345, 0.282978, -1.506295],\n [-0.5786 , 1.651437, -2.426679, -0.428913],\n [ 1.265936, -0.86674 , -0.678886, -0.094709],\n [ 1.49139 , -0.638902, -0.443982, -0.434351],\n [ 2.20593 , 2.186786, 1.004054, 0.386186],\n [ 0.737369, 1.490732, -0.935834, 1.175829],\n [-1.253881, -0.637752, 0.907105, -1.428681],\n [-0.140069, -0.861755, -0.255619, -2.798589],\n [-1.771533, -0.699877, 0.927462, -0.173636]])"
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "3xV0zibeyRTS"
},
"cell_type": "markdown",
"source": "We can create a DataFrame directly by using the array object"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 316
},
"colab_type": "code",
"id": "OF4-x6z-yDYu",
"outputId": "280d9f34-1a57-47fb-aaf8-49fb51fb6a9f",
"trusted": false
},
"cell_type": "code",
"source": "df = pd.DataFrame(gen_data)\n\ndf",
"execution_count": 15,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>0</th>\n <th>1</th>\n <th>2</th>\n <th>3</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>-1.085631</td>\n <td>0.997345</td>\n <td>0.282978</td>\n <td>-1.506295</td>\n </tr>\n <tr>\n <th>1</th>\n <td>-0.578600</td>\n <td>1.651437</td>\n <td>-2.426679</td>\n <td>-0.428913</td>\n </tr>\n <tr>\n <th>2</th>\n <td>1.265936</td>\n <td>-0.866740</td>\n <td>-0.678886</td>\n <td>-0.094709</td>\n </tr>\n <tr>\n <th>3</th>\n <td>1.491390</td>\n <td>-0.638902</td>\n <td>-0.443982</td>\n <td>-0.434351</td>\n </tr>\n <tr>\n <th>4</th>\n <td>2.205930</td>\n <td>2.186786</td>\n <td>1.004054</td>\n <td>0.386186</td>\n </tr>\n <tr>\n <th>5</th>\n <td>0.737369</td>\n <td>1.490732</td>\n <td>-0.935834</td>\n <td>1.175829</td>\n </tr>\n <tr>\n <th>6</th>\n <td>-1.253881</td>\n <td>-0.637752</td>\n <td>0.907105</td>\n <td>-1.428681</td>\n </tr>\n <tr>\n <th>7</th>\n <td>-0.140069</td>\n <td>-0.861755</td>\n <td>-0.255619</td>\n <td>-2.798589</td>\n </tr>\n <tr>\n <th>8</th>\n <td>-1.771533</td>\n <td>-0.699877</td>\n <td>0.927462</td>\n <td>-0.173636</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " 0 1 2 3\n0 -1.085631 0.997345 0.282978 -1.506295\n1 -0.578600 1.651437 -2.426679 -0.428913\n2 1.265936 -0.866740 -0.678886 -0.094709\n3 1.491390 -0.638902 -0.443982 -0.434351\n4 2.205930 2.186786 1.004054 0.386186\n5 0.737369 1.490732 -0.935834 1.175829\n6 -1.253881 -0.637752 0.907105 -1.428681\n7 -0.140069 -0.861755 -0.255619 -2.798589\n8 -1.771533 -0.699877 0.927462 -0.173636"
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "LLnTxPUnylZk"
},
"cell_type": "markdown",
"source": "Next, we can rename all columns"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 316
},
"colab_type": "code",
"id": "1doZ7mxJygEb",
"outputId": "0bb29a69-d2c4-4c81-afa7-53bc673a66cb",
"trusted": false
},
"cell_type": "code",
"source": "df.columns = [['x1', 'x2', 'x3', 'x4']]\n\ndf",
"execution_count": 16,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead tr th {\n text-align: left;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr>\n <th></th>\n <th>x1</th>\n <th>x2</th>\n <th>x3</th>\n <th>x4</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0</th>\n <td>-1.085631</td>\n <td>0.997345</td>\n <td>0.282978</td>\n <td>-1.506295</td>\n </tr>\n <tr>\n <th>1</th>\n <td>-0.578600</td>\n <td>1.651437</td>\n <td>-2.426679</td>\n <td>-0.428913</td>\n </tr>\n <tr>\n <th>2</th>\n <td>1.265936</td>\n <td>-0.866740</td>\n <td>-0.678886</td>\n <td>-0.094709</td>\n </tr>\n <tr>\n <th>3</th>\n <td>1.491390</td>\n <td>-0.638902</td>\n <td>-0.443982</td>\n <td>-0.434351</td>\n </tr>\n <tr>\n <th>4</th>\n <td>2.205930</td>\n <td>2.186786</td>\n <td>1.004054</td>\n <td>0.386186</td>\n </tr>\n <tr>\n <th>5</th>\n <td>0.737369</td>\n <td>1.490732</td>\n <td>-0.935834</td>\n <td>1.175829</td>\n </tr>\n <tr>\n <th>6</th>\n <td>-1.253881</td>\n <td>-0.637752</td>\n <td>0.907105</td>\n <td>-1.428681</td>\n </tr>\n <tr>\n <th>7</th>\n <td>-0.140069</td>\n <td>-0.861755</td>\n <td>-0.255619</td>\n <td>-2.798589</td>\n </tr>\n <tr>\n <th>8</th>\n <td>-1.771533</td>\n <td>-0.699877</td>\n <td>0.927462</td>\n <td>-0.173636</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " x1 x2 x3 x4\n0 -1.085631 0.997345 0.282978 -1.506295\n1 -0.578600 1.651437 -2.426679 -0.428913\n2 1.265936 -0.866740 -0.678886 -0.094709\n3 1.491390 -0.638902 -0.443982 -0.434351\n4 2.205930 2.186786 1.004054 0.386186\n5 0.737369 1.490732 -0.935834 1.175829\n6 -1.253881 -0.637752 0.907105 -1.428681\n7 -0.140069 -0.861755 -0.255619 -2.798589\n8 -1.771533 -0.699877 0.927462 -0.173636"
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "3lz051Rz050T"
},
"cell_type": "markdown",
"source": "To handle with time series data efficiently, we must learn how to use time indices. \n\nAssume that our data in the four columns correspond to a month-end data, beginning in Jan 2020. We can generate a DateTimeIndex object using Pandas's date_range method:"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 84
},
"colab_type": "code",
"id": "S87iy6u7yy6X",
"outputId": "3991d526-624c-4436-90ff-10aeaea1f24f",
"trusted": false
},
"cell_type": "code",
"source": "#periods = number of periods\n#freq = frequency, can be weekly, monthly, quarterly or yearly\nall_dates = pd.date_range('2020-1-1', periods=9, freq='M')\n\nall_dates",
"execution_count": 17,
"outputs": [
{
"data": {
"text/plain": "DatetimeIndex(['2020-01-31', '2020-02-29', '2020-03-31', '2020-04-30',\n '2020-05-31', '2020-06-30', '2020-07-31', '2020-08-31',\n '2020-09-30'],\n dtype='datetime64[ns]', freq='M')"
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "pAGZWRi11vPU"
},
"cell_type": "markdown",
"source": "Previosly, we encountered indices composed of a string and int. For timeseries data, the indices we use is the DateTimeIndex object we generated earlier."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 316
},
"colab_type": "code",
"id": "EsxlxIUb1ujw",
"outputId": "275bb269-86cf-45e7-c674-cd010c68ee4a",
"trusted": false
},
"cell_type": "code",
"source": "df.index = all_dates\n\ndf",
"execution_count": 18,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead tr th {\n text-align: left;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr>\n <th></th>\n <th>x1</th>\n <th>x2</th>\n <th>x3</th>\n <th>x4</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2020-01-31</th>\n <td>-1.085631</td>\n <td>0.997345</td>\n <td>0.282978</td>\n <td>-1.506295</td>\n </tr>\n <tr>\n <th>2020-02-29</th>\n <td>-0.578600</td>\n <td>1.651437</td>\n <td>-2.426679</td>\n <td>-0.428913</td>\n </tr>\n <tr>\n <th>2020-03-31</th>\n <td>1.265936</td>\n <td>-0.866740</td>\n <td>-0.678886</td>\n <td>-0.094709</td>\n </tr>\n <tr>\n <th>2020-04-30</th>\n <td>1.491390</td>\n <td>-0.638902</td>\n <td>-0.443982</td>\n <td>-0.434351</td>\n </tr>\n <tr>\n <th>2020-05-31</th>\n <td>2.205930</td>\n <td>2.186786</td>\n <td>1.004054</td>\n <td>0.386186</td>\n </tr>\n <tr>\n <th>2020-06-30</th>\n <td>0.737369</td>\n <td>1.490732</td>\n <td>-0.935834</td>\n <td>1.175829</td>\n </tr>\n <tr>\n <th>2020-07-31</th>\n <td>-1.253881</td>\n <td>-0.637752</td>\n <td>0.907105</td>\n <td>-1.428681</td>\n </tr>\n <tr>\n <th>2020-08-31</th>\n <td>-0.140069</td>\n <td>-0.861755</td>\n <td>-0.255619</td>\n <td>-2.798589</td>\n </tr>\n <tr>\n <th>2020-09-30</th>\n <td>-1.771533</td>\n <td>-0.699877</td>\n <td>0.927462</td>\n <td>-0.173636</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " x1 x2 x3 x4\n2020-01-31 -1.085631 0.997345 0.282978 -1.506295\n2020-02-29 -0.578600 1.651437 -2.426679 -0.428913\n2020-03-31 1.265936 -0.866740 -0.678886 -0.094709\n2020-04-30 1.491390 -0.638902 -0.443982 -0.434351\n2020-05-31 2.205930 2.186786 1.004054 0.386186\n2020-06-30 0.737369 1.490732 -0.935834 1.175829\n2020-07-31 -1.253881 -0.637752 0.907105 -1.428681\n2020-08-31 -0.140069 -0.861755 -0.255619 -2.798589\n2020-09-30 -1.771533 -0.699877 0.927462 -0.173636"
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "UnE7kNmf9FIf"
},
"cell_type": "markdown",
"source": "With Datetime as the index we can select a range of data by a certain range."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 763
},
"colab_type": "code",
"id": "RbVXaRHc9L4A",
"outputId": "e560bb06-037f-4d01-faa5-41f67fe412ba",
"trusted": false
},
"cell_type": "code",
"source": "gen_data = np.random.standard_normal((24,4))\ngen_data.round(6)\n\ndates = pd.date_range('2020-1-1', periods=24, freq='M')\ndf_twoYears = pd.DataFrame(gen_data, index=dates, columns=['x1', 'x2', 'x3', 'x4']); df_twoYears",
"execution_count": 19,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>x1</th>\n <th>x2</th>\n <th>x3</th>\n <th>x4</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2020-01-31</th>\n <td>0.002846</td>\n <td>0.688223</td>\n <td>-0.879536</td>\n <td>0.283627</td>\n </tr>\n <tr>\n <th>2020-02-29</th>\n <td>-0.805367</td>\n <td>-1.727669</td>\n <td>-0.390900</td>\n <td>0.573806</td>\n </tr>\n <tr>\n <th>2020-03-31</th>\n <td>0.338589</td>\n <td>-0.011830</td>\n <td>2.392365</td>\n <td>0.412912</td>\n </tr>\n <tr>\n <th>2020-04-30</th>\n <td>0.978736</td>\n <td>2.238143</td>\n <td>-1.294085</td>\n <td>-1.038788</td>\n </tr>\n <tr>\n <th>2020-05-31</th>\n <td>1.743712</td>\n <td>-0.798063</td>\n <td>0.029683</td>\n <td>1.069316</td>\n </tr>\n <tr>\n <th>2020-06-30</th>\n <td>0.890706</td>\n <td>1.754886</td>\n <td>1.495644</td>\n <td>1.069393</td>\n </tr>\n <tr>\n <th>2020-07-31</th>\n <td>-0.772709</td>\n <td>0.794863</td>\n <td>0.314272</td>\n <td>-1.326265</td>\n </tr>\n <tr>\n <th>2020-08-31</th>\n <td>1.417299</td>\n <td>0.807237</td>\n <td>0.045490</td>\n <td>-0.233092</td>\n </tr>\n <tr>\n <th>2020-09-30</th>\n <td>-1.198301</td>\n <td>0.199524</td>\n <td>0.468439</td>\n <td>-0.831155</td>\n </tr>\n <tr>\n <th>2020-10-31</th>\n <td>1.162204</td>\n <td>-1.097203</td>\n <td>-2.123100</td>\n <td>1.039727</td>\n </tr>\n <tr>\n <th>2020-11-30</th>\n <td>-0.403366</td>\n <td>-0.126030</td>\n <td>-0.837517</td>\n <td>-1.605963</td>\n </tr>\n <tr>\n <th>2020-12-31</th>\n <td>1.255237</td>\n <td>-0.688869</td>\n <td>1.660952</td>\n <td>0.807308</td>\n </tr>\n <tr>\n <th>2021-01-31</th>\n <td>-0.314758</td>\n <td>-1.085902</td>\n <td>-0.732462</td>\n <td>-1.212523</td>\n </tr>\n <tr>\n <th>2021-02-28</th>\n <td>2.087113</td>\n <td>0.164441</td>\n <td>1.150206</td>\n <td>-1.267352</td>\n </tr>\n <tr>\n <th>2021-03-31</th>\n <td>0.181035</td>\n <td>1.177862</td>\n <td>-0.335011</td>\n <td>1.031114</td>\n </tr>\n <tr>\n <th>2021-04-30</th>\n <td>-1.084568</td>\n <td>-1.363472</td>\n <td>0.379401</td>\n <td>-0.379176</td>\n </tr>\n <tr>\n <th>2021-05-31</th>\n <td>0.642055</td>\n <td>-1.977888</td>\n <td>0.712265</td>\n <td>2.598304</td>\n </tr>\n <tr>\n <th>2021-06-30</th>\n <td>-0.024626</td>\n <td>0.034142</td>\n <td>0.179549</td>\n <td>-1.861976</td>\n </tr>\n <tr>\n <th>2021-07-31</th>\n <td>0.426147</td>\n <td>-1.605410</td>\n <td>-0.427680</td>\n <td>1.242870</td>\n </tr>\n <tr>\n <th>2021-08-31</th>\n <td>-0.735217</td>\n <td>0.501249</td>\n <td>1.012739</td>\n <td>0.278741</td>\n </tr>\n <tr>\n <th>2021-09-30</th>\n <td>-1.370948</td>\n <td>-0.332475</td>\n <td>1.959411</td>\n <td>-2.025046</td>\n </tr>\n <tr>\n <th>2021-10-31</th>\n <td>-0.275786</td>\n <td>-0.552108</td>\n <td>0.120747</td>\n <td>0.748216</td>\n </tr>\n <tr>\n <th>2021-11-30</th>\n <td>1.608691</td>\n <td>-0.270232</td>\n <td>0.812341</td>\n <td>0.499740</td>\n </tr>\n <tr>\n <th>2021-12-31</th>\n <td>0.474347</td>\n <td>-0.563924</td>\n <td>-0.997321</td>\n <td>-1.100043</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " x1 x2 x3 x4\n2020-01-31 0.002846 0.688223 -0.879536 0.283627\n2020-02-29 -0.805367 -1.727669 -0.390900 0.573806\n2020-03-31 0.338589 -0.011830 2.392365 0.412912\n2020-04-30 0.978736 2.238143 -1.294085 -1.038788\n2020-05-31 1.743712 -0.798063 0.029683 1.069316\n2020-06-30 0.890706 1.754886 1.495644 1.069393\n2020-07-31 -0.772709 0.794863 0.314272 -1.326265\n2020-08-31 1.417299 0.807237 0.045490 -0.233092\n2020-09-30 -1.198301 0.199524 0.468439 -0.831155\n2020-10-31 1.162204 -1.097203 -2.123100 1.039727\n2020-11-30 -0.403366 -0.126030 -0.837517 -1.605963\n2020-12-31 1.255237 -0.688869 1.660952 0.807308\n2021-01-31 -0.314758 -1.085902 -0.732462 -1.212523\n2021-02-28 2.087113 0.164441 1.150206 -1.267352\n2021-03-31 0.181035 1.177862 -0.335011 1.031114\n2021-04-30 -1.084568 -1.363472 0.379401 -0.379176\n2021-05-31 0.642055 -1.977888 0.712265 2.598304\n2021-06-30 -0.024626 0.034142 0.179549 -1.861976\n2021-07-31 0.426147 -1.605410 -0.427680 1.242870\n2021-08-31 -0.735217 0.501249 1.012739 0.278741\n2021-09-30 -1.370948 -0.332475 1.959411 -2.025046\n2021-10-31 -0.275786 -0.552108 0.120747 0.748216\n2021-11-30 1.608691 -0.270232 0.812341 0.499740\n2021-12-31 0.474347 -0.563924 -0.997321 -1.100043"
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 405
},
"colab_type": "code",
"id": "n74b-lGu-GeF",
"outputId": "d0eb99a0-7632-4dfc-f750-95d43c688f57",
"trusted": false
},
"cell_type": "code",
"source": "#select data from year 2020\ndf_twoYears['2020']",
"execution_count": 20,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>x1</th>\n <th>x2</th>\n <th>x3</th>\n <th>x4</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2020-01-31</th>\n <td>0.002846</td>\n <td>0.688223</td>\n <td>-0.879536</td>\n <td>0.283627</td>\n </tr>\n <tr>\n <th>2020-02-29</th>\n <td>-0.805367</td>\n <td>-1.727669</td>\n <td>-0.390900</td>\n <td>0.573806</td>\n </tr>\n <tr>\n <th>2020-03-31</th>\n <td>0.338589</td>\n <td>-0.011830</td>\n <td>2.392365</td>\n <td>0.412912</td>\n </tr>\n <tr>\n <th>2020-04-30</th>\n <td>0.978736</td>\n <td>2.238143</td>\n <td>-1.294085</td>\n <td>-1.038788</td>\n </tr>\n <tr>\n <th>2020-05-31</th>\n <td>1.743712</td>\n <td>-0.798063</td>\n <td>0.029683</td>\n <td>1.069316</td>\n </tr>\n <tr>\n <th>2020-06-30</th>\n <td>0.890706</td>\n <td>1.754886</td>\n <td>1.495644</td>\n <td>1.069393</td>\n </tr>\n <tr>\n <th>2020-07-31</th>\n <td>-0.772709</td>\n <td>0.794863</td>\n <td>0.314272</td>\n <td>-1.326265</td>\n </tr>\n <tr>\n <th>2020-08-31</th>\n <td>1.417299</td>\n <td>0.807237</td>\n <td>0.045490</td>\n <td>-0.233092</td>\n </tr>\n <tr>\n <th>2020-09-30</th>\n <td>-1.198301</td>\n <td>0.199524</td>\n <td>0.468439</td>\n <td>-0.831155</td>\n </tr>\n <tr>\n <th>2020-10-31</th>\n <td>1.162204</td>\n <td>-1.097203</td>\n <td>-2.123100</td>\n <td>1.039727</td>\n </tr>\n <tr>\n <th>2020-11-30</th>\n <td>-0.403366</td>\n <td>-0.126030</td>\n <td>-0.837517</td>\n <td>-1.605963</td>\n </tr>\n <tr>\n <th>2020-12-31</th>\n <td>1.255237</td>\n <td>-0.688869</td>\n <td>1.660952</td>\n <td>0.807308</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " x1 x2 x3 x4\n2020-01-31 0.002846 0.688223 -0.879536 0.283627\n2020-02-29 -0.805367 -1.727669 -0.390900 0.573806\n2020-03-31 0.338589 -0.011830 2.392365 0.412912\n2020-04-30 0.978736 2.238143 -1.294085 -1.038788\n2020-05-31 1.743712 -0.798063 0.029683 1.069316\n2020-06-30 0.890706 1.754886 1.495644 1.069393\n2020-07-31 -0.772709 0.794863 0.314272 -1.326265\n2020-08-31 1.417299 0.807237 0.045490 -0.233092\n2020-09-30 -1.198301 0.199524 0.468439 -0.831155\n2020-10-31 1.162204 -1.097203 -2.123100 1.039727\n2020-11-30 -0.403366 -0.126030 -0.837517 -1.605963\n2020-12-31 1.255237 -0.688869 1.660952 0.807308"
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "#select data from March to November\ndf_twoYears['2020-03':'2020-11']",
"execution_count": 21,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>x1</th>\n <th>x2</th>\n <th>x3</th>\n <th>x4</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2020-03-31</th>\n <td>0.338589</td>\n <td>-0.011830</td>\n <td>2.392365</td>\n <td>0.412912</td>\n </tr>\n <tr>\n <th>2020-04-30</th>\n <td>0.978736</td>\n <td>2.238143</td>\n <td>-1.294085</td>\n <td>-1.038788</td>\n </tr>\n <tr>\n <th>2020-05-31</th>\n <td>1.743712</td>\n <td>-0.798063</td>\n <td>0.029683</td>\n <td>1.069316</td>\n </tr>\n <tr>\n <th>2020-06-30</th>\n <td>0.890706</td>\n <td>1.754886</td>\n <td>1.495644</td>\n <td>1.069393</td>\n </tr>\n <tr>\n <th>2020-07-31</th>\n <td>-0.772709</td>\n <td>0.794863</td>\n <td>0.314272</td>\n <td>-1.326265</td>\n </tr>\n <tr>\n <th>2020-08-31</th>\n <td>1.417299</td>\n <td>0.807237</td>\n <td>0.045490</td>\n <td>-0.233092</td>\n </tr>\n <tr>\n <th>2020-09-30</th>\n <td>-1.198301</td>\n <td>0.199524</td>\n <td>0.468439</td>\n <td>-0.831155</td>\n </tr>\n <tr>\n <th>2020-10-31</th>\n <td>1.162204</td>\n <td>-1.097203</td>\n <td>-2.123100</td>\n <td>1.039727</td>\n </tr>\n <tr>\n <th>2020-11-30</th>\n <td>-0.403366</td>\n <td>-0.126030</td>\n <td>-0.837517</td>\n <td>-1.605963</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " x1 x2 x3 x4\n2020-03-31 0.338589 -0.011830 2.392365 0.412912\n2020-04-30 0.978736 2.238143 -1.294085 -1.038788\n2020-05-31 1.743712 -0.798063 0.029683 1.069316\n2020-06-30 0.890706 1.754886 1.495644 1.069393\n2020-07-31 -0.772709 0.794863 0.314272 -1.326265\n2020-08-31 1.417299 0.807237 0.045490 -0.233092\n2020-09-30 -1.198301 0.199524 0.468439 -0.831155\n2020-10-31 1.162204 -1.097203 -2.123100 1.039727\n2020-11-30 -0.403366 -0.126030 -0.837517 -1.605963"
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "# select columns\ndf_twoYears['x1']",
"execution_count": 22,
"outputs": [
{
"data": {
"text/plain": "2020-01-31 0.002846\n2020-02-29 -0.805367\n2020-03-31 0.338589\n2020-04-30 0.978736\n2020-05-31 1.743712\n2020-06-30 0.890706\n2020-07-31 -0.772709\n2020-08-31 1.417299\n2020-09-30 -1.198301\n2020-10-31 1.162204\n2020-11-30 -0.403366\n2020-12-31 1.255237\n2021-01-31 -0.314758\n2021-02-28 2.087113\n2021-03-31 0.181035\n2021-04-30 -1.084568\n2021-05-31 0.642055\n2021-06-30 -0.024626\n2021-07-31 0.426147\n2021-08-31 -0.735217\n2021-09-30 -1.370948\n2021-10-31 -0.275786\n2021-11-30 1.608691\n2021-12-31 0.474347\nFreq: M, Name: x1, dtype: float64"
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "# plot data using matplotlib\nplt.plot(df_twoYears['x1'])\nplt.show()",
"execution_count": 23,
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": "<Figure size 432x288 with 1 Axes>"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "OzIRLa045cLF"
},
"cell_type": "markdown",
"source": "## Basic Analytics"
},
{
"metadata": {
"colab_type": "text",
"id": "JATA8a2S5yPs"
},
"cell_type": "markdown",
"source": "Just like NumPy arrays, we can perform multiple operations on the array via DataFrame. We can get row-wise sums, means and cumulative means as follows:"
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "df",
"execution_count": 24,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead tr th {\n text-align: left;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr>\n <th></th>\n <th>x1</th>\n <th>x2</th>\n <th>x3</th>\n <th>x4</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2020-01-31</th>\n <td>-1.085631</td>\n <td>0.997345</td>\n <td>0.282978</td>\n <td>-1.506295</td>\n </tr>\n <tr>\n <th>2020-02-29</th>\n <td>-0.578600</td>\n <td>1.651437</td>\n <td>-2.426679</td>\n <td>-0.428913</td>\n </tr>\n <tr>\n <th>2020-03-31</th>\n <td>1.265936</td>\n <td>-0.866740</td>\n <td>-0.678886</td>\n <td>-0.094709</td>\n </tr>\n <tr>\n <th>2020-04-30</th>\n <td>1.491390</td>\n <td>-0.638902</td>\n <td>-0.443982</td>\n <td>-0.434351</td>\n </tr>\n <tr>\n <th>2020-05-31</th>\n <td>2.205930</td>\n <td>2.186786</td>\n <td>1.004054</td>\n <td>0.386186</td>\n </tr>\n <tr>\n <th>2020-06-30</th>\n <td>0.737369</td>\n <td>1.490732</td>\n <td>-0.935834</td>\n <td>1.175829</td>\n </tr>\n <tr>\n <th>2020-07-31</th>\n <td>-1.253881</td>\n <td>-0.637752</td>\n <td>0.907105</td>\n <td>-1.428681</td>\n </tr>\n <tr>\n <th>2020-08-31</th>\n <td>-0.140069</td>\n <td>-0.861755</td>\n <td>-0.255619</td>\n <td>-2.798589</td>\n </tr>\n <tr>\n <th>2020-09-30</th>\n <td>-1.771533</td>\n <td>-0.699877</td>\n <td>0.927462</td>\n <td>-0.173636</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " x1 x2 x3 x4\n2020-01-31 -1.085631 0.997345 0.282978 -1.506295\n2020-02-29 -0.578600 1.651437 -2.426679 -0.428913\n2020-03-31 1.265936 -0.866740 -0.678886 -0.094709\n2020-04-30 1.491390 -0.638902 -0.443982 -0.434351\n2020-05-31 2.205930 2.186786 1.004054 0.386186\n2020-06-30 0.737369 1.490732 -0.935834 1.175829\n2020-07-31 -1.253881 -0.637752 0.907105 -1.428681\n2020-08-31 -0.140069 -0.861755 -0.255619 -2.798589\n2020-09-30 -1.771533 -0.699877 0.927462 -0.173636"
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 100
},
"colab_type": "code",
"id": "-OqUchYf1oG3",
"outputId": "ea5d4a7b-1491-45ed-b066-8e4a5ba39176",
"trusted": false
},
"cell_type": "code",
"source": "df.sum() #default is axis=0",
"execution_count": 25,
"outputs": [
{
"data": {
"text/plain": "x1 0.870911\nx2 2.621274\nx3 -1.619401\nx4 -5.303158\ndtype: float64"
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 100
},
"colab_type": "code",
"id": "BQ1xQnS16Eda",
"outputId": "c9bea544-1210-4645-9ec3-d0fe48cb3b81",
"trusted": false
},
"cell_type": "code",
"source": "df.mean()",
"execution_count": 26,
"outputs": [
{
"data": {
"text/plain": "x1 0.096768\nx2 0.291253\nx3 -0.179933\nx4 -0.589240\ndtype: float64"
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 316
},
"colab_type": "code",
"id": "t2BDfuMy6GXO",
"outputId": "1cf253e7-22de-4014-e58a-c4fdf8290957",
"trusted": false
},
"cell_type": "code",
"source": "df.cumsum()",
"execution_count": 27,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead tr th {\n text-align: left;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr>\n <th></th>\n <th>x1</th>\n <th>x2</th>\n <th>x3</th>\n <th>x4</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2020-01-31</th>\n <td>-1.085631</td>\n <td>0.997345</td>\n <td>0.282978</td>\n <td>-1.506295</td>\n </tr>\n <tr>\n <th>2020-02-29</th>\n <td>-1.664231</td>\n <td>2.648782</td>\n <td>-2.143701</td>\n <td>-1.935207</td>\n </tr>\n <tr>\n <th>2020-03-31</th>\n <td>-0.398295</td>\n <td>1.782042</td>\n <td>-2.822587</td>\n <td>-2.029916</td>\n </tr>\n <tr>\n <th>2020-04-30</th>\n <td>1.093095</td>\n <td>1.143140</td>\n <td>-3.266569</td>\n <td>-2.464268</td>\n </tr>\n <tr>\n <th>2020-05-31</th>\n <td>3.299025</td>\n <td>3.329926</td>\n <td>-2.262515</td>\n <td>-2.078081</td>\n </tr>\n <tr>\n <th>2020-06-30</th>\n <td>4.036394</td>\n <td>4.820658</td>\n <td>-3.198349</td>\n <td>-0.902252</td>\n </tr>\n <tr>\n <th>2020-07-31</th>\n <td>2.782513</td>\n <td>4.182906</td>\n <td>-2.291244</td>\n <td>-2.330933</td>\n </tr>\n <tr>\n <th>2020-08-31</th>\n <td>2.642444</td>\n <td>3.321151</td>\n <td>-2.546863</td>\n <td>-5.129522</td>\n </tr>\n <tr>\n <th>2020-09-30</th>\n <td>0.870911</td>\n <td>2.621274</td>\n <td>-1.619401</td>\n <td>-5.303158</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " x1 x2 x3 x4\n2020-01-31 -1.085631 0.997345 0.282978 -1.506295\n2020-02-29 -1.664231 2.648782 -2.143701 -1.935207\n2020-03-31 -0.398295 1.782042 -2.822587 -2.029916\n2020-04-30 1.093095 1.143140 -3.266569 -2.464268\n2020-05-31 3.299025 3.329926 -2.262515 -2.078081\n2020-06-30 4.036394 4.820658 -3.198349 -0.902252\n2020-07-31 2.782513 4.182906 -2.291244 -2.330933\n2020-08-31 2.642444 3.321151 -2.546863 -5.129522\n2020-09-30 0.870911 2.621274 -1.619401 -5.303158"
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "52qzDtZ16Nlb"
},
"cell_type": "markdown",
"source": "There's a shortcut to obtain all commonly needed values in statistics for numerical datasets and that is the describe method:"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 286
},
"colab_type": "code",
"id": "jZnJjl1j6H3p",
"outputId": "54482185-9cfa-4167-851c-c403ba656461",
"trusted": false
},
"cell_type": "code",
"source": "df.describe()",
"execution_count": 28,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead tr th {\n text-align: left;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr>\n <th></th>\n <th>x1</th>\n <th>x2</th>\n <th>x3</th>\n <th>x4</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>count</th>\n <td>9.000000</td>\n <td>9.000000</td>\n <td>9.000000</td>\n <td>9.000000</td>\n </tr>\n <tr>\n <th>mean</th>\n <td>0.096768</td>\n <td>0.291253</td>\n <td>-0.179933</td>\n <td>-0.589240</td>\n </tr>\n <tr>\n <th>std</th>\n <td>1.387261</td>\n <td>1.263003</td>\n <td>1.116230</td>\n <td>1.170512</td>\n </tr>\n <tr>\n <th>min</th>\n <td>-1.771533</td>\n <td>-0.866740</td>\n <td>-2.426679</td>\n <td>-2.798589</td>\n </tr>\n <tr>\n <th>25%</th>\n <td>-1.085631</td>\n <td>-0.699877</td>\n <td>-0.678886</td>\n <td>-1.428681</td>\n </tr>\n <tr>\n <th>50%</th>\n <td>-0.140069</td>\n <td>-0.637752</td>\n <td>-0.255619</td>\n <td>-0.428913</td>\n </tr>\n <tr>\n <th>75%</th>\n <td>1.265936</td>\n <td>1.490732</td>\n <td>0.907105</td>\n <td>-0.094709</td>\n </tr>\n <tr>\n <th>max</th>\n <td>2.205930</td>\n <td>2.186786</td>\n <td>1.004054</td>\n <td>1.175829</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " x1 x2 x3 x4\ncount 9.000000 9.000000 9.000000 9.000000\nmean 0.096768 0.291253 -0.179933 -0.589240\nstd 1.387261 1.263003 1.116230 1.170512\nmin -1.771533 -0.866740 -2.426679 -2.798589\n25% -1.085631 -0.699877 -0.678886 -1.428681\n50% -0.140069 -0.637752 -0.255619 -0.428913\n75% 1.265936 1.490732 0.907105 -0.094709\nmax 2.205930 2.186786 1.004054 1.175829"
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "TWNRGMeH6ZWI"
},
"cell_type": "markdown",
"source": "In general, we can apply Numpy universal functions to pandas DataFrame objects.\n\nFor example:"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 349
},
"colab_type": "code",
"id": "mx00joVh7XkW",
"outputId": "0586e502-3871-40db-b877-af4c83a7e7da",
"trusted": false
},
"cell_type": "code",
"source": "np.sqrt(df)",
"execution_count": 29,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead tr th {\n text-align: left;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr>\n <th></th>\n <th>x1</th>\n <th>x2</th>\n <th>x3</th>\n <th>x4</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2020-01-31</th>\n <td>NaN</td>\n <td>0.998672</td>\n <td>0.531957</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>2020-02-29</th>\n <td>NaN</td>\n <td>1.285082</td>\n <td>NaN</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>2020-03-31</th>\n <td>1.125138</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>2020-04-30</th>\n <td>1.221225</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>2020-05-31</th>\n <td>1.485237</td>\n <td>1.478779</td>\n <td>1.002025</td>\n <td>0.621439</td>\n </tr>\n <tr>\n <th>2020-06-30</th>\n <td>0.858702</td>\n <td>1.220955</td>\n <td>NaN</td>\n <td>1.084357</td>\n </tr>\n <tr>\n <th>2020-07-31</th>\n <td>NaN</td>\n <td>NaN</td>\n <td>0.952421</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>2020-08-31</th>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n <td>NaN</td>\n </tr>\n <tr>\n <th>2020-09-30</th>\n <td>NaN</td>\n <td>NaN</td>\n <td>0.963049</td>\n <td>NaN</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " x1 x2 x3 x4\n2020-01-31 NaN 0.998672 0.531957 NaN\n2020-02-29 NaN 1.285082 NaN NaN\n2020-03-31 1.125138 NaN NaN NaN\n2020-04-30 1.221225 NaN NaN NaN\n2020-05-31 1.485237 1.478779 1.002025 0.621439\n2020-06-30 0.858702 1.220955 NaN 1.084357\n2020-07-31 NaN NaN 0.952421 NaN\n2020-08-31 NaN NaN NaN NaN\n2020-09-30 NaN NaN 0.963049 NaN"
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "SHIoDQ_t8gjO"
},
"cell_type": "markdown",
"source": "We can plot out the graph easily by using the plot method.\n\nPandas provide a wrapper around matplotlib (a library that allows us to plot graph), but specifically designed for DataFrame object."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 294
},
"colab_type": "code",
"id": "mlyGAcST7Y42",
"outputId": "802bc1ef-f442-4378-ab1d-0690a6bf3530",
"trusted": false
},
"cell_type": "code",
"source": "df.cumsum().plot(lw=2.0)\nplt.show()",
"execution_count": 30,
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": "<Figure size 432x288 with 1 Axes>"
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "XYYpZFD3Q7be"
},
"cell_type": "markdown",
"source": "## More on dates and times <I>(Optional)</I>"
},
{
"metadata": {
"colab_type": "text",
"id": "CxYzz9o9RRCg"
},
"cell_type": "markdown",
"source": "In this section, we will discuss about the difference between Timestamps and Timespans. But first, let us create dates and times."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 84
},
"colab_type": "code",
"id": "RULAtg6xRDl3",
"outputId": "3cc27041-377e-4e11-e330-8d1b5024c227",
"trusted": false
},
"cell_type": "code",
"source": "# TIMES\nrng = pd.date_range('2020 Jan 1', periods = 10, freq = 'D')\n\nrng",
"execution_count": 31,
"outputs": [
{
"data": {
"text/plain": "DatetimeIndex(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04',\n '2020-01-05', '2020-01-06', '2020-01-07', '2020-01-08',\n '2020-01-09', '2020-01-10'],\n dtype='datetime64[ns]', freq='D')"
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "27sZ0K8gR_ze"
},
"cell_type": "markdown",
"source": "### Timestamp"
},
{
"metadata": {
"colab_type": "text",
"id": "WubMTuZihHja"
},
"cell_type": "markdown",
"source": "Each DatetimeIndex consists of Time Stamp"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "TgcBXcqOhGko",
"outputId": "a5446a6f-3191-402f-9b96-6351bdf4ae58",
"trusted": false
},
"cell_type": "code",
"source": "df.index[0]",
"execution_count": 32,
"outputs": [
{
"data": {
"text/plain": "Timestamp('2020-01-31 00:00:00', freq='M')"
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "QlCGjw_AhbBr"
},
"cell_type": "markdown",
"source": "We can generate Timestamp by using the following methods."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "Hb4dyxRZRYLS",
"outputId": "b7cc351e-d497-45a6-f510-3134a08248c6",
"trusted": false
},
"cell_type": "code",
"source": "pd.Timestamp('2020-07-10')",
"execution_count": 33,
"outputs": [
{
"data": {
"text/plain": "Timestamp('2020-07-10 00:00:00')"
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "0Gr4W8V4RwFN",
"outputId": "56630147-c780-4b42-8c7e-a114eb7ec15e",
"trusted": false
},
"cell_type": "code",
"source": "# We can introduce more details into the argument of the method\npd.Timestamp('2020-07-10 10')",
"execution_count": 34,
"outputs": [
{
"data": {
"text/plain": "Timestamp('2020-07-10 10:00:00')"
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "4T4jOjWuR3Sc",
"outputId": "75efac7c-f96f-47e7-c75d-b1728b648c20",
"trusted": false
},
"cell_type": "code",
"source": "# And even more details...\npd.Timestamp('2020-07-10 10:15')",
"execution_count": 35,
"outputs": [
{
"data": {
"text/plain": "Timestamp('2020-07-10 10:15:00')"
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "4Qzy5URbR-z5",
"outputId": "95a5a156-ac15-41e7-d15b-bf30a761cdce",
"trusted": false
},
"cell_type": "code",
"source": "# we can create Timestamp via datetime.datetime object\npd.Timestamp(2020, 7, 10, 10)",
"execution_count": 36,
"outputs": [
{
"data": {
"text/plain": "Timestamp('2020-07-10 10:00:00')"
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "-A6HG24YjphR"
},
"cell_type": "markdown",
"source": "With Timestamp we can perform date and time arithmetic with absolute and relative time increments."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "i6Yr0lyjjzGf",
"outputId": "b1ec144e-5c21-4c8e-e4f0-45a22f97f856",
"trusted": false
},
"cell_type": "code",
"source": "#what day is 10th of July 2020?\n\ndate = pd.Timestamp('2020-07-10')\ndate.day_name()",
"execution_count": 37,
"outputs": [
{
"data": {
"text/plain": "'Friday'"
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "Fph32OUhkE8X"
},
"cell_type": "markdown",
"source": "We can also perform arithmetic operation on the Timestamp object."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "KVoSoGR0kYhi",
"outputId": "98f86c1a-91e0-4bab-f899-8a6ca8888d00",
"trusted": false
},
"cell_type": "code",
"source": "# add 1 day\nfriday = date\nsaturday = friday + pd.Timedelta('1 day')\nsaturday.day_name()",
"execution_count": 38,
"outputs": [
{
"data": {
"text/plain": "'Saturday'"
},
"execution_count": 38,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "YIBUBaUdlFlb",
"outputId": "9f6a3dfa-85cd-4034-ff0c-275ec7350535",
"trusted": false
},
"cell_type": "code",
"source": "# add 1 business day\n\nmonday = friday + pd.offsets.BDay()\nmonday.day_name()",
"execution_count": 39,
"outputs": [
{
"data": {
"text/plain": "'Monday'"
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### Timestamps vs Timespans"
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "p = pd.Period('2017-06-13') #timespan\ntest = pd.Timestamp('2017-06-13 22:11') #timestamp\np.start_time < test < p.end_time",
"execution_count": 40,
"outputs": [
{
"data": {
"text/plain": "True"
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "Dw5uV_FBintd"
},
"cell_type": "markdown",
"source": "### Timespans"
},
{
"metadata": {
"colab_type": "text",
"id": "LmCdYv8knilF"
},
"cell_type": "markdown",
"source": "Timestamped data is basic type of time series data that associates values with points in time."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "05bEXYL1nXuJ",
"outputId": "de68da33-1537-48ed-9d96-d79d135d02e4",
"trusted": false
},
"cell_type": "code",
"source": "pd.Timestamp('2020-07-10')",
"execution_count": 41,
"outputs": [
{
"data": {
"text/plain": "Timestamp('2020-07-10 00:00:00')"
},
"execution_count": 41,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "UDqi0fp_xaCt"
},
"cell_type": "markdown",
"source": "In many cases, it is more natural to associate things like change variables with a time span instead. \nWe can think of time span as a period of time between fixed points.\nWe can represent the span using Period. For example:"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "R78-dEdfitID",
"outputId": "de2f2955-cd77-48ac-def3-4fc4ccfa5edf",
"trusted": false
},
"cell_type": "code",
"source": "#What are the extra details given by the code?\npd.Period('2020-07')",
"execution_count": 42,
"outputs": [
{
"data": {
"text/plain": "Period('2020-07', 'M')"
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "emAIvPw9mxMv",
"outputId": "755dcc8b-5ecb-442d-e3bd-9f5d771fbc72",
"trusted": false
},
"cell_type": "code",
"source": "#How detailed can it go?\npd.Period('2020-07-10')",
"execution_count": 43,
"outputs": [
{
"data": {
"text/plain": "Period('2020-07-10', 'D')"
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "wppQJrnWnIlW",
"outputId": "0bb55b4e-cc96-48f2-b201-a96978f41cbe",
"trusted": false
},
"cell_type": "code",
"source": "pd.Period('2020-07-10 10')",
"execution_count": 44,
"outputs": [
{
"data": {
"text/plain": "Period('2020-07-10 10:00', 'H')"
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "QY1XvgsQnHc8",
"outputId": "d8b56d29-d046-4807-8bb8-01dbcdec45a0",
"trusted": false
},
"cell_type": "code",
"source": "pd.Period('2020-07-10 10:10')",
"execution_count": 45,
"outputs": [
{
"data": {
"text/plain": "Period('2020-07-10 10:10', 'T')"
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "DN6KyAaJm75A",
"outputId": "301ae366-3bac-4e28-cf93-a20fa91936c1",
"trusted": false
},
"cell_type": "code",
"source": "pd.Period('2020-07-10 10:10:10')",
"execution_count": 46,
"outputs": [
{
"data": {
"text/plain": "Period('2020-07-10 10:10:10', 'S')"
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "h9_8tacqxXwS"
},
"cell_type": "markdown",
"source": "Arithmetric operations work on Period as well."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "1_UUrGNEm9st",
"outputId": "8662170f-0656-4c84-9148-daa23a4c9d23",
"trusted": false
},
"cell_type": "code",
"source": "pd.Period('2016-01-01 10:10') + pd.Timedelta('2 day')",
"execution_count": 47,
"outputs": [
{
"data": {
"text/plain": "Period('2016-01-03 10:10', 'T')"
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "sHoNlHng4zXI"
},
"cell_type": "markdown",
"source": "Remember how we can create a range of Timestamp using date_range? Similarly, we can create a range of Periods using period_range."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 84
},
"colab_type": "code",
"id": "XQ36_Zvb4yvI",
"outputId": "953eda88-d7c5-4c5b-f7cc-80626930a666",
"trusted": false
},
"cell_type": "code",
"source": "#create a range of periods of 10 business days\nprng= pd.period_range('2020-07-10 10:10', freq = 'B', periods = 10)\n\nprng",
"execution_count": 48,
"outputs": [
{
"data": {
"text/plain": "PeriodIndex(['2020-07-10', '2020-07-13', '2020-07-14', '2020-07-15',\n '2020-07-16', '2020-07-17', '2020-07-20', '2020-07-21',\n '2020-07-22', '2020-07-23'],\n dtype='period[B]', freq='B')"
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "67HzCXKt68AS"
},
"cell_type": "markdown",
"source": "Indexing with Time Objects"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 201
},
"colab_type": "code",
"id": "a4f2ChJt6-64",
"outputId": "f4774ea3-c3fe-4a33-91a7-227bb8b247e7",
"trusted": false
},
"cell_type": "code",
"source": "# We can create a Series with Timestamp such as follows.\n# Difference between series and DataFrame: A series can only contain a single indexed list of data. We can say that a dataframe is a collection of series.\nrng = pd.date_range('2020 Jul 1', periods = 10, freq = 'D')\nrng\nts_idx_timestamp = pd.Series(range(len(rng)), index = rng)\nts_idx_timestamp",
"execution_count": 49,
"outputs": [
{
"data": {
"text/plain": "2020-07-01 0\n2020-07-02 1\n2020-07-03 2\n2020-07-04 3\n2020-07-05 4\n2020-07-06 5\n2020-07-07 6\n2020-07-08 7\n2020-07-09 8\n2020-07-10 9\nFreq: D, dtype: int64"
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 84
},
"colab_type": "code",
"id": "EqxnI18-7bbc",
"outputId": "782b5a2f-0937-46ec-f4fc-6082f5cd5cc3",
"trusted": false
},
"cell_type": "code",
"source": "# Sometimes, it makes more sense to think about the index as a time span rather than a single point in time\n\nperiods = [pd.Period('2020-01'), pd.Period('2020-02'), pd.Period('2020-03')]\nts_idx_periods = pd.Series(np.random.randn(len(periods)), index = periods)\nts_idx_periods",
"execution_count": 50,
"outputs": [
{
"data": {
"text/plain": "2020-01 -0.756437\n2020-02 0.321687\n2020-03 0.760949\nFreq: M, dtype: float64"
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "5DiB2DlD8Q2c"
},
"cell_type": "markdown",
"source": "Pandas will convert the Timestamp and Period to DatetimeIndex and PeriodIndex repectively."
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "1whWv5SO8P7F",
"outputId": "35391a4a-c77e-443e-d71b-3a0badb613b4",
"trusted": false
},
"cell_type": "code",
"source": "type(ts_idx_timestamp.index)",
"execution_count": 51,
"outputs": [
{
"data": {
"text/plain": "pandas.core.indexes.datetimes.DatetimeIndex"
},
"execution_count": 51,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 33
},
"colab_type": "code",
"id": "5hvh00sj7bXk",
"outputId": "56c3d65a-faba-44d8-ef40-05aae913ae35",
"trusted": false
},
"cell_type": "code",
"source": "type(ts_idx_periods.index)",
"execution_count": 52,
"outputs": [
{
"data": {
"text/plain": "pandas.core.indexes.period.PeriodIndex"
},
"execution_count": 52,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "EEFaRCaCAAdU"
},
"cell_type": "markdown",
"source": "We can convert Timestamp to Period indices with to_period and vice versa with to_timestamp"
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 201
},
"colab_type": "code",
"id": "5cqG9T5wAAJK",
"outputId": "629c7f4d-5f68-406f-8874-62b7011dbce1",
"trusted": false
},
"cell_type": "code",
"source": "ts = pd.Series(range(10), pd.date_range('2020-01-10 8:00', periods = 10, freq = 'H'))\nts",
"execution_count": 53,
"outputs": [
{
"data": {
"text/plain": "2020-01-10 08:00:00 0\n2020-01-10 09:00:00 1\n2020-01-10 10:00:00 2\n2020-01-10 11:00:00 3\n2020-01-10 12:00:00 4\n2020-01-10 13:00:00 5\n2020-01-10 14:00:00 6\n2020-01-10 15:00:00 7\n2020-01-10 16:00:00 8\n2020-01-10 17:00:00 9\nFreq: H, dtype: int64"
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "ts.index",
"execution_count": 54,
"outputs": [
{
"data": {
"text/plain": "DatetimeIndex(['2020-01-10 08:00:00', '2020-01-10 09:00:00',\n '2020-01-10 10:00:00', '2020-01-10 11:00:00',\n '2020-01-10 12:00:00', '2020-01-10 13:00:00',\n '2020-01-10 14:00:00', '2020-01-10 15:00:00',\n '2020-01-10 16:00:00', '2020-01-10 17:00:00'],\n dtype='datetime64[ns]', freq='H')"
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 201
},
"colab_type": "code",
"id": "zAK4G54WAkND",
"outputId": "543fe161-fd39-482a-8dba-d9bbdd39e85e",
"trusted": false
},
"cell_type": "code",
"source": "ts_period = ts.to_period()\nts_period",
"execution_count": 55,
"outputs": [
{
"data": {
"text/plain": "2020-01-10 08:00 0\n2020-01-10 09:00 1\n2020-01-10 10:00 2\n2020-01-10 11:00 3\n2020-01-10 12:00 4\n2020-01-10 13:00 5\n2020-01-10 14:00 6\n2020-01-10 15:00 7\n2020-01-10 16:00 8\n2020-01-10 17:00 9\nFreq: H, dtype: int64"
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "ts_period.index",
"execution_count": 56,
"outputs": [
{
"data": {
"text/plain": "PeriodIndex(['2020-01-10 08:00', '2020-01-10 09:00', '2020-01-10 10:00',\n '2020-01-10 11:00', '2020-01-10 12:00', '2020-01-10 13:00',\n '2020-01-10 14:00', '2020-01-10 15:00', '2020-01-10 16:00',\n '2020-01-10 17:00'],\n dtype='period[H]', freq='H')"
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 100
},
"colab_type": "code",
"id": "viYpntBdAn-J",
"outputId": "6dccf1d6-2c7d-4c97-abbe-2eb125bf56d9",
"trusted": false
},
"cell_type": "code",
"source": "ts_period['2020-01-10 08:30':'2020-01-10 11:45'] # we have the concept of overlap with time periods",
"execution_count": 57,
"outputs": [
{
"data": {
"text/plain": "2020-01-10 08:00 0\n2020-01-10 09:00 1\n2020-01-10 10:00 2\n2020-01-10 11:00 3\nFreq: H, dtype: int64"
},
"execution_count": 57,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 84
},
"colab_type": "code",
"id": "IyE9qWVDA2xa",
"outputId": "64c312b8-e9ca-4d1a-dba7-7551cbdf4909",
"trusted": false
},
"cell_type": "code",
"source": "ts['2020-01-10 08:30':'2020-01-10 11:45'] # we have the concept of include with timestamps",
"execution_count": 58,
"outputs": [
{
"data": {
"text/plain": "2020-01-10 09:00:00 1\n2020-01-10 10:00:00 2\n2020-01-10 11:00:00 3\nFreq: H, dtype: int64"
},
"execution_count": 58,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Exercise"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "We will run through a simple exercise of utilizing Pandas for time series data analysis. "
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Tasks that you are required to perform are listed down as comments. Please insert your codes below the comment. An approximation of number of lines *n* is provided as a guideline to help you."
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### a) DataFrame Class Pt. 1"
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "# import Pandas library (~1 line of code)\nimport pandas as pd\n\n# Preparing own data\n# create new DataFrame with specified data (~1 line of code)\ndataframe = pd.DataFrame([1,2,3,4], columns=['Data'], index=['a','b','c','d'])\n\n# sum up all the observations in 'Data' column (~1 line of code)\nsum_of_data = dataframe.Data.sum()\n\n# add a new integer column \"Multiplier\" filled with values 2,4,6,8 (~1 line of code)\ndataframe['Multiplier'] = [2, 4, 6, 8]\n\n# add a new integer column \"Product\" filled with products of 'Data' and 'Multiplier' (~1 line of code)\ndataframe['Product'] = dataframe['Data'] * dataframe['Multiplier']\n\n# add a new string column \"Fruit\" filled with your favourite fruits (~1 line of code)\ndataframe['Fruit'] = 'apple', 'orange', 'grape', 'durian'\n\n# sum up all the observations in first row except for 'Fruit' column (~1 line of code)\nsum_of_first_row = dataframe.iloc[0, :-1].sum()\n\n# drop the 'Fruit' column (~1 line of code)\ndataframe = dataframe.drop(columns='Fruit')\n\n# append a new row of data using Pandas Series or Pandas DataFrame (~1 line of code)\n# dataframe = dataframe.append(pd.Series({'Data':5, 'Multiplier':10, 'Product':5*10}, name='e'))\ndataframe = dataframe.append(pd.DataFrame({'Data':5, 'Multiplier':10, 'Product':5*10}, index=['e']))\n\n# Add a new float column 'Quotient' by using lambda function to devide 'Product' by 2 (~1 line of code)\ndataframe['Quotient'] = dataframe.Product.apply(lambda x: x/2)\n\n# display info of DataFrame (~1 line of code)\ninfo = dataframe.info\nprint(f'\\nDataFrame info is : {info}')\n\n# display column names of DataFrame (~1 line of code)\ncolumns = dataframe.columns\nprint(f'\\nDataFrame column names are : {columns}')\n\n# display index of Dataframe (~1 line of code)\nindex = dataframe.index\nprint(f'\\nDataFrame index is : {index}')",
"execution_count": 59,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": "\nDataFrame info is : <bound method DataFrame.info of Data Multiplier Product Quotient\na 1 2 2 1.0\nb 2 4 8 4.0\nc 3 6 18 9.0\nd 4 8 32 16.0\ne 5 10 50 25.0>\n\nDataFrame column names are : Index(['Data', 'Multiplier', 'Product', 'Quotient'], dtype='object')\n\nDataFrame index is : Index(['a', 'b', 'c', 'd', 'e'], dtype='object')\n"
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "# output your result here (~1 line of code)\ndataframe",
"execution_count": 60,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Data</th>\n <th>Multiplier</th>\n <th>Product</th>\n <th>Quotient</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>a</th>\n <td>1</td>\n <td>2</td>\n <td>2</td>\n <td>1.0</td>\n </tr>\n <tr>\n <th>b</th>\n <td>2</td>\n <td>4</td>\n <td>8</td>\n <td>4.0</td>\n </tr>\n <tr>\n <th>c</th>\n <td>3</td>\n <td>6</td>\n <td>18</td>\n <td>9.0</td>\n </tr>\n <tr>\n <th>d</th>\n <td>4</td>\n <td>8</td>\n <td>32</td>\n <td>16.0</td>\n </tr>\n <tr>\n <th>e</th>\n <td>5</td>\n <td>10</td>\n <td>50</td>\n <td>25.0</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " Data Multiplier Product Quotient\na 1 2 2 1.0\nb 2 4 8 4.0\nc 3 6 18 9.0\nd 4 8 32 16.0\ne 5 10 50 25.0"
},
"execution_count": 60,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### b) DataFrame Class Pt. 2"
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "# import NumPy and Pandas (~2 lines of code)\nimport numpy as np\nimport pandas as pd\n\n# set a random seed for numpy (~1 line of code)\nnp.random.seed(42)\n\n# generate a normally distributed random data of 10 rows and 2 columns (~1 line of code)\nrandom_data = np.random.normal(size=(10, 2))\n\n# round them up to just 2 decimal points (~1 line of code)\nrandom_data = random_data.round(2)\n\n# display the type of data structure (~1 line of code)\ndata_struct = type(random_data)\nprint(f'\\n\\nData structure is : {data_struct}')\n\n# convert data structure from numpy ndarray to Pandas DataFrame (~1 line of code)\nrandom_data = pd.DataFrame(random_data)\n\n# display the type of data structure (~1 line of code)\ndata_struct = type(random_data)\nprint(f'\\n\\nData structure is : {data_struct}')\n\n# rename the columns of DataFrame (~1 line of code) to your desired names\nrandom_data.columns = ['Column_1', 'Column_2']\n\n# Generate a DateTimeIndex object with yearly frequency, starting from 2020 January\n# and number of periods matching total rows of our DataFrame (~1 line of code)\ndate_time_index = pd.date_range('2020', periods=len(random_data), freq='A-JAN')\n\n# Reset the DataFrame index into our date_time_index (~1 line of code)\nrandom_data.index = date_time_index\n\n# Just using loc slicing to retrieve 5 years data starting from 2020 (~1 line of code)\nfive_years_data = random_data.loc['2020':'2024']\nprint(f'\\n\\nFive years data is : \\n{five_years_data}')\n\n# likewise, iloc slicing to retrieve 5 years data starting from 2020 (~1 line of code)\n# iloc is for slicing using index referred as integers (the default indexes)\nfive_years_data = random_data.iloc[0:5]\nprint(f'\\n\\nFive years data is : \\n{five_years_data}')\n\n# for the following, just use the five years data to perform basic analytics\n# summation of each columns (~1 line of code)\nsummations = five_years_data.sum()\n\n# mean of each columns (~1 line of code)\nmeans = five_years_data.mean()\n\n# cummulative sum of each columns (~1 line of code)\ncumsums = five_years_data.cumsum()\n\n# generate descriptive statistics for each column (~1 line of code)\ndescriptive_stats = five_years_data.describe()\n\nprint(f\"\\n\\nSummation is:\\n{summations} \\n\\nMean is:\\n{means} \\n\\nCumulative sum is:\\n{cumsums} \\n\\nDescriptive statistics is: \\n{descriptive_stats}\")",
"execution_count": 61,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": "\n\nData structure is : <class 'numpy.ndarray'>\n\n\nData structure is : <class 'pandas.core.frame.DataFrame'>\n\n\nFive years data is : \n Column_1 Column_2\n2020-01-31 0.50 -0.14\n2021-01-31 0.65 1.52\n2022-01-31 -0.23 -0.23\n2023-01-31 1.58 0.77\n2024-01-31 -0.47 0.54\n\n\nFive years data is : \n Column_1 Column_2\n2020-01-31 0.50 -0.14\n2021-01-31 0.65 1.52\n2022-01-31 -0.23 -0.23\n2023-01-31 1.58 0.77\n2024-01-31 -0.47 0.54\n\n\nSummation is:\nColumn_1 2.03\nColumn_2 2.46\ndtype: float64 \n\nMean is:\nColumn_1 0.406\nColumn_2 0.492\ndtype: float64 \n\nCumulative sum is:\n Column_1 Column_2\n2020-01-31 0.50 -0.14\n2021-01-31 1.15 1.38\n2022-01-31 0.92 1.15\n2023-01-31 2.50 1.92\n2024-01-31 2.03 2.46 \n\nDescriptive statistics is: \n Column_1 Column_2\ncount 5.000000 5.000000\nmean 0.406000 0.492000\nstd 0.809092 0.717126\nmin -0.470000 -0.230000\n25% -0.230000 -0.140000\n50% 0.500000 0.540000\n75% 0.650000 0.770000\nmax 1.580000 1.520000\n"
}
]
},
{
"metadata": {
"trusted": false
},
"cell_type": "code",
"source": "# you can display your object here\nrandom_data",
"execution_count": 62,
"outputs": [
{
"data": {
"text/html": "<div>\n<style scoped>\n .dataframe tbody tr th:only-of-type {\n vertical-align: middle;\n }\n\n .dataframe tbody tr th {\n vertical-align: top;\n }\n\n .dataframe thead th {\n text-align: right;\n }\n</style>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>Column_1</th>\n <th>Column_2</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>2020-01-31</th>\n <td>0.50</td>\n <td>-0.14</td>\n </tr>\n <tr>\n <th>2021-01-31</th>\n <td>0.65</td>\n <td>1.52</td>\n </tr>\n <tr>\n <th>2022-01-31</th>\n <td>-0.23</td>\n <td>-0.23</td>\n </tr>\n <tr>\n <th>2023-01-31</th>\n <td>1.58</td>\n <td>0.77</td>\n </tr>\n <tr>\n <th>2024-01-31</th>\n <td>-0.47</td>\n <td>0.54</td>\n </tr>\n <tr>\n <th>2025-01-31</th>\n <td>-0.46</td>\n <td>-0.47</td>\n </tr>\n <tr>\n <th>2026-01-31</th>\n <td>0.24</td>\n <td>-1.91</td>\n </tr>\n <tr>\n <th>2027-01-31</th>\n <td>-1.72</td>\n <td>-0.56</td>\n </tr>\n <tr>\n <th>2028-01-31</th>\n <td>-1.01</td>\n <td>0.31</td>\n </tr>\n <tr>\n <th>2029-01-31</th>\n <td>-0.91</td>\n <td>-1.41</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " Column_1 Column_2\n2020-01-31 0.50 -0.14\n2021-01-31 0.65 1.52\n2022-01-31 -0.23 -0.23\n2023-01-31 1.58 0.77\n2024-01-31 -0.47 0.54\n2025-01-31 -0.46 -0.47\n2026-01-31 0.24 -1.91\n2027-01-31 -1.72 -0.56\n2028-01-31 -1.01 0.31\n2029-01-31 -0.91 -1.41"
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
}
]
},
{
"metadata": {
"colab_type": "text",
"id": "4n5GtBHpBUkw"
},
"cell_type": "markdown",
"source": "## References\n\n1. Python for Finance (2014), Yves Hilpisch\n2. https://github.com/AileenNielsen/TimeSeriesAnalysisWithPython/blob/master/1.+Dates+%26+Times.ipynb"
}
],
"metadata": {
"celltoolbar": "Edit Metadata",
"colab": {
"name": "01 - Pandas for time series.ipynb",
"provenance": []
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.7.10",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"gist": {
"id": "",
"data": {
"description": "notebook/Solution/01 - Pandas For Time Series.ipynb",
"public": true
}
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment