{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Reading Data from External API\n", "\n", "Often you want to add external data to your analysis. External data can be retrieved from API (Application Programable Interface) that is provided by various services such as CRM (Customer Relationship Management) systems. You can import HTML directly into Excel using _\"Import\"_.\n", "\n", "In this notebook, we will learn how to use pandas _from_dict_ to load data from these external API\n", "\n", "[![Open In Studio Lab](https://studiolab.sagemaker.aws/studiolab.svg)](https://studiolab.sagemaker.aws/import/github/aiola-lab/from-excel-to-pandas/blob/master/notebooks/01.03_loading_data_from_API.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading API data\n", "\n", "We will load a few tables from simple API as well as complex ones" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [], "source": [ "import warnings\n", "warnings.filterwarnings('ignore')" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading from simple API\n", "\n", "If you have a simple API with no authentication, you can pass the URL of the requests library that we used in our previous toturial for loading HTML\n", "\n", "For this excercise we will use the API of the Wikipedia page views. We will use it to test the idea that people who are thinking to buy stocks, are going to the wikipedia page of that stock, and therefore, if we see an increase in the views of a page, we will see an increase in the price of that share. \n", "\n", "We will check the format of the API call from the [technical page](https://www.mediawiki.org/wiki/API:Tutorial). We see the we need to plug the name of stock ticker, and we will use the f-string syntax that is replacing the {page} (or any other variable in curly brackets) with the value of the variable (for example, _AMZN_)." ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "page = 'AMZN'\n", "\n", "header = {\n", " \"User-Agent\": \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36\",\n", " \"X-Requested-With\": \"XMLHttpRequest\"\n", "}\n", "\n", "page_views_api_url = f'https://wikimedia.org/api/rest_v1/metrics/pageviews/per-article/en.wikipedia/all-access/all-agents/{page}/daily/2020030100/2020033000'\n", "\n", "import requests\n", "response = requests.get(page_views_api_url, headers=header)\n", "response" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use two methods to extract the data that we want from the JSON format. The first is using _json_normalize_ and the second is using _from_dict_" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
projectarticlegranularitytimestampaccessagentviews
0en.wikipediaAMZNdaily2020030100all-accessall-agents2
1en.wikipediaAMZNdaily2020030200all-accessall-agents6
2en.wikipediaAMZNdaily2020030300all-accessall-agents16
3en.wikipediaAMZNdaily2020030400all-accessall-agents1
4en.wikipediaAMZNdaily2020030500all-accessall-agents1
\n", "
" ], "text/plain": [ " project article granularity timestamp access agent views\n", "0 en.wikipedia AMZN daily 2020030100 all-access all-agents 2\n", "1 en.wikipedia AMZN daily 2020030200 all-access all-agents 6\n", "2 en.wikipedia AMZN daily 2020030300 all-access all-agents 16\n", "3 en.wikipedia AMZN daily 2020030400 all-access all-agents 1\n", "4 en.wikipedia AMZN daily 2020030500 all-access all-agents 1" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = (\n", " pd\n", " .json_normalize(\n", " response.json(), \n", " 'items'\n", " )\n", ")\n", "df.head(5)" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
projectarticlegranularitytimestampaccessagentviews
0en.wikipediaAMZNdaily2020030100all-accessall-agents2
1en.wikipediaAMZNdaily2020030200all-accessall-agents6
2en.wikipediaAMZNdaily2020030300all-accessall-agents16
3en.wikipediaAMZNdaily2020030400all-accessall-agents1
4en.wikipediaAMZNdaily2020030500all-accessall-agents1
\n", "
" ], "text/plain": [ " project article granularity timestamp access agent views\n", "0 en.wikipedia AMZN daily 2020030100 all-access all-agents 2\n", "1 en.wikipedia AMZN daily 2020030200 all-access all-agents 6\n", "2 en.wikipedia AMZN daily 2020030300 all-access all-agents 16\n", "3 en.wikipedia AMZN daily 2020030400 all-access all-agents 1\n", "4 en.wikipedia AMZN daily 2020030500 all-access all-agents 1" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "page_view_data = (\n", " requests\n", " .get(page_views_api_url, headers=header)\n", " .json()['items']\n", ")\n", "page_views_table = (\n", " pd\n", " .DataFrame\n", " .from_dict(page_view_data)\n", ")\n", "page_views_table.head(5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simple Data Visualization\n", "\n", "* Start with the page view table from the previous API call\n", "* Convert the timestamp column to date time format using the _%Y%m%d%H_ format\n", "* Extract the day of the month from the above timestamp\n", "* Plot the results\n", "* as bar chart with the day of the month as x and the number of views as y \n", "* and title the graph as 'Page views for ...' with the name of the page\n", "\n" ] }, { "cell_type": "code", "execution_count": 89, "metadata": { "tags": [] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEZCAYAAACO4n6tAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAcn0lEQVR4nO3de5wcZZ3v8c8XEg0hQyBhlkuurAoKQS47GAQDCB4TQQX3hA0ICCpkXRU4KyAoHEGPF1SOioBRhICAIDEgsgqRrAgE5ZJwCQkJggsBQsAMySIIIhd/+0c9g02neqanuzMzT/J9v171mqqnfl31dE33t6uru6sUEZiZWX426O8OmJlZYxzgZmaZcoCbmWXKAW5mlikHuJlZphzgZmaZcoBbViRdL+nIflr3dpLulfScpOP6ow9mlRzg9jqSlkn6i6Q/S/qjpIslDevvfnWJiPdFxI/6afWfBX4TEW0R8d1WLVTSUZJC0rSq9n1S+8+q2ndK7Tel6c+n/1fl8Hyq+UiqWSZppaSNK5ZzdNcyLE8OcCvzgYgYBuwKdACn9XN/BopxwP2N3FDSoG5mHwmsBj5SMq8TeKekkVX1D3ZNRMRXI2JY5QB8G1gCXFVxuw2B4xvpvw1MDnCrKSKeAK4HJkjaTNIvJHVK+u80PrqrVtI2km5Jhxf+U9J5ki6rmL+7pN9JekbSQkn7lK1T0smSZle1nS3pu2n8JklHV8z7mKSlqU+/kjQutX9R0jlpfHDaI/1mmt5I0ouSRkgaIukySatS3+ZL2qKkXzcC7wbOTXu420oaLumStE0elXSapA1S/VGSfivp25JWAWfUuL/jgL2B6cBkSVtWlbwEXAMckuo3BKYBPy5bXqrZHzgOmBoRz1fM+iZwoqRNa93W8uIAt5okjQH2B+6heKxcRLEXOhb4C3BuRfnlwJ3ASIqwOqJiOaOAXwJfBkYAJwJXSWovWe1PgP0ltaXbbgj8S1p+df8OBD4P/DPQDswDrkizbwb2SeO7AU8Be6XpdwK/j4jVFHuzw4Exqe+fSPftdSJi37T8T6e93AeBc9Jt/5EihD8CfLTiZhOBh4EtgK+U3FfSbRZExFXAUuCwkppL+Pve+WRgMbCibGGSxgOXAsdExNKq2QuAmyi2v60DHOBW5hpJzwC3UgThVyNiVURcFREvRMRzFIG0N4CksRQh+YWIeCkibgWurVje4cB1EXFdRPwtIuZShMn+1SuOiEeBu4EPpaZ9gRci4vaSfn4C+FpELI2IV4CvAjunvdrbgLekQw97ARcCo9Lx/L3T/QJ4mSK43xwRr0bEXRHxbE8bKL2wHAJ8LiKei4hlwP+n4oULWBER50TEKxGxxotC8hH+/uJ0OSWHUSLid8AISdul+ZfU6NMbgdnAjyPiyhrr+wJwbI0XT8uMA9zKHBQRm0bEuIj4ZET8RdJQST9IhwqeBW4BNk1BtjWwOiJeqFjG4xXj44CD0yGKZ9KLw7uArWqs/3Lg0DT+YUr2viuWe3bFMlcDAkalwFxAEdZ7UQT274A9eX2AXwr8CviJpBWSviFpcB3baHNgMPBoRdujwKiK6cfphqQ9gW0o3nWQ7ueOknYuKb8U+DTFYZyflcwHOJviBemEWuuMiMXAL4BTuuub5cEBbvU6AdgOmBgRm/D3wxECnqTYQxxaUT+mYvxx4NL0otA1bBwRZ9ZY10+BfdIx9g9RO8AfB/61arkbpT1WKEJ6X2AXYH6angy8g+IFiIh4OSK+GBHbA3sA76f8w8RqT1OE5biKtrHAExXTPZ3q80iK7XevpKeAOyraq10KfJLincwL1TMlHQH8b+BfIuLlHtZ7OnAMr3+xsQw5wK1ebRTHhp+RNIIiBIDXDnssAM6Q9AZJ7wQ+UHHby4APSJosacP0wWFXQK8hIjopjtVeBDxSciy3y/eBz0naASB9qHhwxfybKcJ4SUS8lJZ5dFpmZ7rNuyXtmN5JPEsRyn/raWNExKvALOArktrSYZvPpPvaI0lDKI7tTwd2rhiOBT5c/a2ViHiE4p3DqSXLmgB8DzgsIrrd60/L+gNwJcUHnZYxB7jV6zvARhR7nrcDc6rmH0bx4eAqig8rrwT+CpBCpesDx06KPeeT6P7xdznwHmrvfRMRPwO+TnH441mKD/feV1Hyu9TnW9L0EuDFimmALSmOGz9L8SHizRR7u/U4Fnie4oPKW1NfZ9Z524MoXhAviYinuoZ0+0HAlOobRMStEVH24eVngI2Bq7Xm98E/X2P9X0q3sYzJF3SwtUHSlcADEXF6j8Vm1hDvgVtLSNpN0pskbSBpCsUe9zX93C2zdVp3vw4z640tgaspvpK3HPi3iLinf7tktm7zIRQzs0z5EIqZWaYc4GZmmerTY+Cbb755jB8/vi9XaWaWvbvuuuvpiFjj9Ad9GuDjx49nwYIFfblKM7PsSXq0rN2HUMzMMuUANzPLlAPczCxT/iGPmQ0oL7/8MsuXL+fFF1/s7670uSFDhjB69GgGD67njMYOcDMbYJYvX05bWxvjx49HUn93p89EBKtWrWL58uVss802dd2mx0MokmaquJr14qr2YyU9IOl+Sd9osM9mZq/z4osvMnLkyPUqvAEkMXLkyF6986jnGPjFVJ3aUtK7KU5WtFNE7ACc1Yt+mpl1a30L7y69vd89BnhE3EJxqapK/wacGRFd53te2au1mpllZMWKFUydOrW/u7GGRo+BbwtMkvQVihPknxgR88sKJU2nuOoIY8eObXB1vTf+lF+Wti8784A+64OZNa/Wc7lRjWTA1ltvzezZs1vaj1Zo9GuEg4ARwO4UV1aZpRr7/hFxfkR0RERHe7svhG1mA9spp5zCeeed99r0GWecwVlnncWECRMAePXVVznppJPYbbfdePvb384PfvADAD71qU9x7bXXAvChD32Ij33sYwDMnDmTU089leeff54DDjiAnXbaiQkTJnDllVc23ddGA3w5cHUU7qS4huDmTffGzKyfTZs2jVmzZr02PWvWLCZOnPja9IUXXsjw4cOZP38+8+fP54c//CGPPPIIkyZNYt68eQA88cQTLFmyBIB58+ax1157MWfOHLbeemsWLlzI4sWLmTJljavm9VqjAX4N8G4ASdsCb6C4VqKZWdZ22WUXVq5cyYoVK1i4cCGbbbYZY8aMeW3+DTfcwCWXXMLOO+/MxIkTWbVqFQ899NBrAb5kyRK23357tthiC5588kluu+029thjD3bccUfmzp3LySefzLx58xg+fHjTfe3xGLikK4B9gM0lLae4GvlMYGb6auFLwJHhK0OY2Tri4IMPZvbs2Tz11FNMmzbtdfMignPOOYfJkyevcbtnnnmGOXPmsNdee7F69WpmzZrFsGHDaGtro62tjbvvvpvrrruO0047jf32248vfOELTfWzxwCPiENrzDq8qTWbmQ1Q06ZN45hjjuHpp5/m5ptv5q9//etr8yZPnsyMGTPYd999GTx4MA8++CCjRo1i4403Zvfdd+c73/kON954I6tWrWLq1KmvfXtlxYoVjBgxgsMPP5xNN92UCy64oOl++peYZmZVdthhB5577jlGjRrFVlttxbJly16bd/TR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", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-06T09:56:21.558231\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "(\n", " page_views_table\n", " .assign(timestamp = lambda x: pd.to_datetime(x.timestamp, format='%Y%m%d%H', errors='coerce'))\n", " .assign(day = lambda x: x.timestamp.dt.day)\n", " .plot\n", " .bar(\n", " x='day', y='views',\n", " title=f'Page views for {page}'\n", " )\n", ");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading the page views of all NASDAQ 100\n", "\n", "We saw in the previous section how to load the values of a table from Wikipeia (or other HTML pages). Let's use it now to load all the NASDAQ 100 index companies to compare their page views." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Defaulting to user installation because normal site-packages is not writeable\n", "Collecting lxml\n", " Downloading lxml-4.6.4-cp39-cp39-macosx_10_14_x86_64.whl (4.5 MB)\n", "\u001b[K |████████████████████████████████| 4.5 MB 4.5 MB/s \n", "\u001b[?25hInstalling collected packages: lxml\n", "Successfully installed lxml-4.6.4\n", "\u001b[33mWARNING: You are using pip version 21.2.4; however, version 21.3.1 is available.\n", "You should consider upgrading via the '/usr/local/bin/python3 -m pip install --upgrade pip' command.\u001b[0m\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install lxml" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [], "source": [ "nasdaq_100_wikipedia_entry = 'https://en.wikipedia.org/wiki/NASDAQ-100'\n", "nasdaq_100_tickers = (\n", " pd\n", " .read_html(\n", " nasdaq_100_wikipedia_entry, \n", " match='Ticker'\n", " )\n", ")" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CompanyTickerGICS SectorGICS Sub-Industry
0Activision BlizzardATVICommunication ServicesInteractive Home Entertainment
1Adobe Inc.ADBEInformation TechnologyApplication Software
2Advanced Micro DevicesAMDInformation TechnologySemiconductors
3Alexion PharmaceuticalsALXNHealth CarePharmaceuticals
4Align TechnologyALGNHealth CareHealth Care Supplies
...............
97Walgreen Boots Alliance, Inc.WBAConsumer StaplesDrug Retail
98Workday, Inc.WDAYInformation TechnologyApplication Software
99Xcel Energy Inc.XELUtilitiesMulti-Utilities
100Xilinx, Inc.XLNXInformation TechnologySemiconductors
101Zoom Video CommunicationsZMInformation TechnologyApplication Software
\n", "

102 rows × 4 columns

\n", "
" ], "text/plain": [ " Company Ticker GICS Sector \\\n", "0 Activision Blizzard ATVI Communication Services \n", "1 Adobe Inc. ADBE Information Technology \n", "2 Advanced Micro Devices AMD Information Technology \n", "3 Alexion Pharmaceuticals ALXN Health Care \n", "4 Align Technology ALGN Health Care \n", ".. ... ... ... \n", "97 Walgreen Boots Alliance, Inc. WBA Consumer Staples \n", "98 Workday, Inc. WDAY Information Technology \n", "99 Xcel Energy Inc. XEL Utilities \n", "100 Xilinx, Inc. XLNX Information Technology \n", "101 Zoom Video Communications ZM Information Technology \n", "\n", " GICS Sub-Industry \n", "0 Interactive Home Entertainment \n", "1 Application Software \n", "2 Semiconductors \n", "3 Pharmaceuticals \n", "4 Health Care Supplies \n", ".. ... \n", "97 Drug Retail \n", "98 Application Software \n", "99 Multi-Utilities \n", "100 Semiconductors \n", "101 Application Software \n", "\n", "[102 rows x 4 columns]" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nasdaq_100_tickers[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we want to get all the views of each company on our list. We will define a simple function that will get the name of the company and return the views of this company's page.\n", "* Generate the URL of the wikipedia page view using the name of the company\n", "* Load the API response from above URL\n", "* Parse the JSON format of the response using the key 'items'\n", "* Return the newly create dataframe or an empty data frame if failed" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [], "source": [ "def get_views(company):\n", " company_page_url = f'https://wikimedia.org/api/rest_v1/metrics/pageviews/per-article/en.wikipedia/all-access/all-agents/{company.iat[0,0]}/daily/2020090100/2020093000'\n", " response = requests.get(company_page_url, headers=header)\n", " try:\n", " df = (\n", " pd\n", " .json_normalize(\n", " response.json(), \n", " 'items'\n", " )\n", " )\n", " except:\n", " df = pd.DataFrame()\n", " \n", " return df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can apply the function above on each of the row from the nasdaq 100 tickets list:\n", "* Start with the first table from the nasdaq 100 list above\n", "* Group the ticker by the company name (in case we have multiple ticker to a company)\n", "* Apply the get view function on each of the company names and concat all the data frames together" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [], "source": [ "nasdaq_100_views = (\n", " nasdaq_100_tickers[0]\n", " .head(2)\n", " .groupby('Company')[['Company']]\n", " .apply(get_views)\n", ")" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
projectarticlegranularitytimestampaccessagentviews
Company
Activision Blizzard0en.wikipediaActivision_Blizzarddaily2020090100all-accessall-agents1437
1en.wikipediaActivision_Blizzarddaily2020090200all-accessall-agents1715
2en.wikipediaActivision_Blizzarddaily2020090300all-accessall-agents1989
3en.wikipediaActivision_Blizzarddaily2020090400all-accessall-agents1628
4en.wikipediaActivision_Blizzarddaily2020090500all-accessall-agents1260
5en.wikipediaActivision_Blizzarddaily2020090600all-accessall-agents1253
6en.wikipediaActivision_Blizzarddaily2020090700all-accessall-agents1218
7en.wikipediaActivision_Blizzarddaily2020090800all-accessall-agents1331
8en.wikipediaActivision_Blizzarddaily2020090900all-accessall-agents1537
9en.wikipediaActivision_Blizzarddaily2020091000all-accessall-agents1431
10en.wikipediaActivision_Blizzarddaily2020091100all-accessall-agents1352
11en.wikipediaActivision_Blizzarddaily2020091200all-accessall-agents1042
12en.wikipediaActivision_Blizzarddaily2020091300all-accessall-agents1066
13en.wikipediaActivision_Blizzarddaily2020091400all-accessall-agents1327
14en.wikipediaActivision_Blizzarddaily2020091500all-accessall-agents1346
15en.wikipediaActivision_Blizzarddaily2020091600all-accessall-agents1267
16en.wikipediaActivision_Blizzarddaily2020091700all-accessall-agents1289
17en.wikipediaActivision_Blizzarddaily2020091800all-accessall-agents1241
18en.wikipediaActivision_Blizzarddaily2020091900all-accessall-agents1117
19en.wikipediaActivision_Blizzarddaily2020092000all-accessall-agents1137
20en.wikipediaActivision_Blizzarddaily2020092100all-accessall-agents4108
21en.wikipediaActivision_Blizzarddaily2020092200all-accessall-agents3319
22en.wikipediaActivision_Blizzarddaily2020092300all-accessall-agents2992
23en.wikipediaActivision_Blizzarddaily2020092400all-accessall-agents2312
24en.wikipediaActivision_Blizzarddaily2020092500all-accessall-agents1806
25en.wikipediaActivision_Blizzarddaily2020092600all-accessall-agents1557
26en.wikipediaActivision_Blizzarddaily2020092700all-accessall-agents1549
27en.wikipediaActivision_Blizzarddaily2020092800all-accessall-agents1564
28en.wikipediaActivision_Blizzarddaily2020092900all-accessall-agents1585
29en.wikipediaActivision_Blizzarddaily2020093000all-accessall-agents1703
Adobe Inc.0en.wikipediaAdobe_Inc.daily2020090100all-accessall-agents1716
1en.wikipediaAdobe_Inc.daily2020090200all-accessall-agents1854
2en.wikipediaAdobe_Inc.daily2020090300all-accessall-agents1849
3en.wikipediaAdobe_Inc.daily2020090400all-accessall-agents1698
4en.wikipediaAdobe_Inc.daily2020090500all-accessall-agents1304
5en.wikipediaAdobe_Inc.daily2020090600all-accessall-agents1319
6en.wikipediaAdobe_Inc.daily2020090700all-accessall-agents1604
7en.wikipediaAdobe_Inc.daily2020090800all-accessall-agents1743
8en.wikipediaAdobe_Inc.daily2020090900all-accessall-agents1823
9en.wikipediaAdobe_Inc.daily2020091000all-accessall-agents1819
10en.wikipediaAdobe_Inc.daily2020091100all-accessall-agents1764
11en.wikipediaAdobe_Inc.daily2020091200all-accessall-agents1395
12en.wikipediaAdobe_Inc.daily2020091300all-accessall-agents1537
13en.wikipediaAdobe_Inc.daily2020091400all-accessall-agents2398
14en.wikipediaAdobe_Inc.daily2020091500all-accessall-agents2038
15en.wikipediaAdobe_Inc.daily2020091600all-accessall-agents2203
16en.wikipediaAdobe_Inc.daily2020091700all-accessall-agents1910
17en.wikipediaAdobe_Inc.daily2020091800all-accessall-agents1873
18en.wikipediaAdobe_Inc.daily2020091900all-accessall-agents1361
19en.wikipediaAdobe_Inc.daily2020092000all-accessall-agents1480
20en.wikipediaAdobe_Inc.daily2020092100all-accessall-agents1770
21en.wikipediaAdobe_Inc.daily2020092200all-accessall-agents1874
22en.wikipediaAdobe_Inc.daily2020092300all-accessall-agents1696
23en.wikipediaAdobe_Inc.daily2020092400all-accessall-agents1751
24en.wikipediaAdobe_Inc.daily2020092500all-accessall-agents1684
25en.wikipediaAdobe_Inc.daily2020092600all-accessall-agents1325
26en.wikipediaAdobe_Inc.daily2020092700all-accessall-agents1316
27en.wikipediaAdobe_Inc.daily2020092800all-accessall-agents1695
28en.wikipediaAdobe_Inc.daily2020092900all-accessall-agents1869
29en.wikipediaAdobe_Inc.daily2020093000all-accessall-agents1758
\n", "
" ], "text/plain": [ " project article granularity \\\n", "Company \n", "Activision Blizzard 0 en.wikipedia Activision_Blizzard daily \n", " 1 en.wikipedia Activision_Blizzard daily \n", " 2 en.wikipedia Activision_Blizzard daily \n", " 3 en.wikipedia Activision_Blizzard daily \n", " 4 en.wikipedia Activision_Blizzard daily \n", " 5 en.wikipedia Activision_Blizzard daily \n", " 6 en.wikipedia Activision_Blizzard daily \n", " 7 en.wikipedia Activision_Blizzard daily \n", " 8 en.wikipedia Activision_Blizzard daily \n", " 9 en.wikipedia Activision_Blizzard daily \n", " 10 en.wikipedia Activision_Blizzard daily \n", " 11 en.wikipedia Activision_Blizzard daily \n", " 12 en.wikipedia Activision_Blizzard daily \n", " 13 en.wikipedia Activision_Blizzard daily \n", " 14 en.wikipedia Activision_Blizzard daily \n", " 15 en.wikipedia Activision_Blizzard daily \n", " 16 en.wikipedia Activision_Blizzard daily \n", " 17 en.wikipedia Activision_Blizzard daily \n", " 18 en.wikipedia Activision_Blizzard daily \n", " 19 en.wikipedia Activision_Blizzard daily \n", " 20 en.wikipedia Activision_Blizzard daily \n", " 21 en.wikipedia Activision_Blizzard daily \n", " 22 en.wikipedia Activision_Blizzard daily \n", " 23 en.wikipedia Activision_Blizzard daily \n", " 24 en.wikipedia Activision_Blizzard daily \n", " 25 en.wikipedia Activision_Blizzard daily \n", " 26 en.wikipedia Activision_Blizzard daily \n", " 27 en.wikipedia Activision_Blizzard daily \n", " 28 en.wikipedia Activision_Blizzard daily \n", " 29 en.wikipedia Activision_Blizzard daily \n", "Adobe Inc. 0 en.wikipedia Adobe_Inc. daily \n", " 1 en.wikipedia Adobe_Inc. daily \n", " 2 en.wikipedia Adobe_Inc. daily \n", " 3 en.wikipedia Adobe_Inc. daily \n", " 4 en.wikipedia Adobe_Inc. daily \n", " 5 en.wikipedia Adobe_Inc. daily \n", " 6 en.wikipedia Adobe_Inc. daily \n", " 7 en.wikipedia Adobe_Inc. daily \n", " 8 en.wikipedia Adobe_Inc. daily \n", " 9 en.wikipedia Adobe_Inc. daily \n", " 10 en.wikipedia Adobe_Inc. daily \n", " 11 en.wikipedia Adobe_Inc. daily \n", " 12 en.wikipedia Adobe_Inc. daily \n", " 13 en.wikipedia Adobe_Inc. daily \n", " 14 en.wikipedia Adobe_Inc. daily \n", " 15 en.wikipedia Adobe_Inc. daily \n", " 16 en.wikipedia Adobe_Inc. daily \n", " 17 en.wikipedia Adobe_Inc. daily \n", " 18 en.wikipedia Adobe_Inc. daily \n", " 19 en.wikipedia Adobe_Inc. daily \n", " 20 en.wikipedia Adobe_Inc. daily \n", " 21 en.wikipedia Adobe_Inc. daily \n", " 22 en.wikipedia Adobe_Inc. daily \n", " 23 en.wikipedia Adobe_Inc. daily \n", " 24 en.wikipedia Adobe_Inc. daily \n", " 25 en.wikipedia Adobe_Inc. daily \n", " 26 en.wikipedia Adobe_Inc. daily \n", " 27 en.wikipedia Adobe_Inc. daily \n", " 28 en.wikipedia Adobe_Inc. daily \n", " 29 en.wikipedia Adobe_Inc. daily \n", "\n", " timestamp access agent views \n", "Company \n", "Activision Blizzard 0 2020090100 all-access all-agents 1437 \n", " 1 2020090200 all-access all-agents 1715 \n", " 2 2020090300 all-access all-agents 1989 \n", " 3 2020090400 all-access all-agents 1628 \n", " 4 2020090500 all-access all-agents 1260 \n", " 5 2020090600 all-access all-agents 1253 \n", " 6 2020090700 all-access all-agents 1218 \n", " 7 2020090800 all-access all-agents 1331 \n", " 8 2020090900 all-access all-agents 1537 \n", " 9 2020091000 all-access all-agents 1431 \n", " 10 2020091100 all-access all-agents 1352 \n", " 11 2020091200 all-access all-agents 1042 \n", " 12 2020091300 all-access all-agents 1066 \n", " 13 2020091400 all-access all-agents 1327 \n", " 14 2020091500 all-access all-agents 1346 \n", " 15 2020091600 all-access all-agents 1267 \n", " 16 2020091700 all-access all-agents 1289 \n", " 17 2020091800 all-access all-agents 1241 \n", " 18 2020091900 all-access all-agents 1117 \n", " 19 2020092000 all-access all-agents 1137 \n", " 20 2020092100 all-access all-agents 4108 \n", " 21 2020092200 all-access all-agents 3319 \n", " 22 2020092300 all-access all-agents 2992 \n", " 23 2020092400 all-access all-agents 2312 \n", " 24 2020092500 all-access all-agents 1806 \n", " 25 2020092600 all-access all-agents 1557 \n", " 26 2020092700 all-access all-agents 1549 \n", " 27 2020092800 all-access all-agents 1564 \n", " 28 2020092900 all-access all-agents 1585 \n", " 29 2020093000 all-access all-agents 1703 \n", "Adobe Inc. 0 2020090100 all-access all-agents 1716 \n", " 1 2020090200 all-access all-agents 1854 \n", " 2 2020090300 all-access all-agents 1849 \n", " 3 2020090400 all-access all-agents 1698 \n", " 4 2020090500 all-access all-agents 1304 \n", " 5 2020090600 all-access all-agents 1319 \n", " 6 2020090700 all-access all-agents 1604 \n", " 7 2020090800 all-access all-agents 1743 \n", " 8 2020090900 all-access all-agents 1823 \n", " 9 2020091000 all-access all-agents 1819 \n", " 10 2020091100 all-access all-agents 1764 \n", " 11 2020091200 all-access all-agents 1395 \n", " 12 2020091300 all-access all-agents 1537 \n", " 13 2020091400 all-access all-agents 2398 \n", " 14 2020091500 all-access all-agents 2038 \n", " 15 2020091600 all-access all-agents 2203 \n", " 16 2020091700 all-access all-agents 1910 \n", " 17 2020091800 all-access all-agents 1873 \n", " 18 2020091900 all-access all-agents 1361 \n", " 19 2020092000 all-access all-agents 1480 \n", " 20 2020092100 all-access all-agents 1770 \n", " 21 2020092200 all-access all-agents 1874 \n", " 22 2020092300 all-access all-agents 1696 \n", " 23 2020092400 all-access all-agents 1751 \n", " 24 2020092500 all-access all-agents 1684 \n", " 25 2020092600 all-access all-agents 1325 \n", " 26 2020092700 all-access all-agents 1316 \n", " 27 2020092800 all-access all-agents 1695 \n", " 28 2020092900 all-access all-agents 1869 \n", " 29 2020093000 all-access all-agents 1758 " ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nasdaq_100_views" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We see that we have more than 2000 rows in the concatenated dataframe where each line is a view of a company in a specific day in the range of September 2020.\n", "\n", "Let's look on one of the companies (for example, _Lululemon Atheletica_)" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
projectarticlegranularitytimestampaccessagentviews
0en.wikipediaActivision_Blizzarddaily2020090100all-accessall-agents1437
1en.wikipediaActivision_Blizzarddaily2020090200all-accessall-agents1715
2en.wikipediaActivision_Blizzarddaily2020090300all-accessall-agents1989
3en.wikipediaActivision_Blizzarddaily2020090400all-accessall-agents1628
4en.wikipediaActivision_Blizzarddaily2020090500all-accessall-agents1260
5en.wikipediaActivision_Blizzarddaily2020090600all-accessall-agents1253
6en.wikipediaActivision_Blizzarddaily2020090700all-accessall-agents1218
7en.wikipediaActivision_Blizzarddaily2020090800all-accessall-agents1331
8en.wikipediaActivision_Blizzarddaily2020090900all-accessall-agents1537
9en.wikipediaActivision_Blizzarddaily2020091000all-accessall-agents1431
10en.wikipediaActivision_Blizzarddaily2020091100all-accessall-agents1352
11en.wikipediaActivision_Blizzarddaily2020091200all-accessall-agents1042
12en.wikipediaActivision_Blizzarddaily2020091300all-accessall-agents1066
13en.wikipediaActivision_Blizzarddaily2020091400all-accessall-agents1327
14en.wikipediaActivision_Blizzarddaily2020091500all-accessall-agents1346
15en.wikipediaActivision_Blizzarddaily2020091600all-accessall-agents1267
16en.wikipediaActivision_Blizzarddaily2020091700all-accessall-agents1289
17en.wikipediaActivision_Blizzarddaily2020091800all-accessall-agents1241
18en.wikipediaActivision_Blizzarddaily2020091900all-accessall-agents1117
19en.wikipediaActivision_Blizzarddaily2020092000all-accessall-agents1137
20en.wikipediaActivision_Blizzarddaily2020092100all-accessall-agents4108
21en.wikipediaActivision_Blizzarddaily2020092200all-accessall-agents3319
22en.wikipediaActivision_Blizzarddaily2020092300all-accessall-agents2992
23en.wikipediaActivision_Blizzarddaily2020092400all-accessall-agents2312
24en.wikipediaActivision_Blizzarddaily2020092500all-accessall-agents1806
25en.wikipediaActivision_Blizzarddaily2020092600all-accessall-agents1557
26en.wikipediaActivision_Blizzarddaily2020092700all-accessall-agents1549
27en.wikipediaActivision_Blizzarddaily2020092800all-accessall-agents1564
28en.wikipediaActivision_Blizzarddaily2020092900all-accessall-agents1585
29en.wikipediaActivision_Blizzarddaily2020093000all-accessall-agents1703
\n", "
" ], "text/plain": [ " project article granularity timestamp access \\\n", "0 en.wikipedia Activision_Blizzard daily 2020090100 all-access \n", "1 en.wikipedia Activision_Blizzard daily 2020090200 all-access \n", "2 en.wikipedia Activision_Blizzard daily 2020090300 all-access \n", "3 en.wikipedia Activision_Blizzard daily 2020090400 all-access \n", "4 en.wikipedia Activision_Blizzard daily 2020090500 all-access \n", "5 en.wikipedia Activision_Blizzard daily 2020090600 all-access \n", "6 en.wikipedia Activision_Blizzard daily 2020090700 all-access \n", "7 en.wikipedia Activision_Blizzard daily 2020090800 all-access \n", "8 en.wikipedia Activision_Blizzard daily 2020090900 all-access \n", "9 en.wikipedia Activision_Blizzard daily 2020091000 all-access \n", "10 en.wikipedia Activision_Blizzard daily 2020091100 all-access \n", "11 en.wikipedia Activision_Blizzard daily 2020091200 all-access \n", "12 en.wikipedia Activision_Blizzard daily 2020091300 all-access \n", "13 en.wikipedia Activision_Blizzard daily 2020091400 all-access \n", "14 en.wikipedia Activision_Blizzard daily 2020091500 all-access \n", "15 en.wikipedia Activision_Blizzard daily 2020091600 all-access \n", "16 en.wikipedia Activision_Blizzard daily 2020091700 all-access \n", "17 en.wikipedia Activision_Blizzard daily 2020091800 all-access \n", "18 en.wikipedia Activision_Blizzard daily 2020091900 all-access \n", "19 en.wikipedia Activision_Blizzard daily 2020092000 all-access \n", "20 en.wikipedia Activision_Blizzard daily 2020092100 all-access \n", "21 en.wikipedia Activision_Blizzard daily 2020092200 all-access \n", "22 en.wikipedia Activision_Blizzard daily 2020092300 all-access \n", "23 en.wikipedia Activision_Blizzard daily 2020092400 all-access \n", "24 en.wikipedia Activision_Blizzard daily 2020092500 all-access \n", "25 en.wikipedia Activision_Blizzard daily 2020092600 all-access \n", "26 en.wikipedia Activision_Blizzard daily 2020092700 all-access \n", "27 en.wikipedia Activision_Blizzard daily 2020092800 all-access \n", "28 en.wikipedia Activision_Blizzard daily 2020092900 all-access \n", "29 en.wikipedia Activision_Blizzard daily 2020093000 all-access \n", "\n", " agent views \n", "0 all-agents 1437 \n", "1 all-agents 1715 \n", "2 all-agents 1989 \n", "3 all-agents 1628 \n", "4 all-agents 1260 \n", "5 all-agents 1253 \n", "6 all-agents 1218 \n", "7 all-agents 1331 \n", "8 all-agents 1537 \n", "9 all-agents 1431 \n", "10 all-agents 1352 \n", "11 all-agents 1042 \n", "12 all-agents 1066 \n", "13 all-agents 1327 \n", "14 all-agents 1346 \n", "15 all-agents 1267 \n", "16 all-agents 1289 \n", "17 all-agents 1241 \n", "18 all-agents 1117 \n", "19 all-agents 1137 \n", "20 all-agents 4108 \n", "21 all-agents 3319 \n", "22 all-agents 2992 \n", "23 all-agents 2312 \n", "24 all-agents 1806 \n", "25 all-agents 1557 \n", "26 all-agents 1549 \n", "27 all-agents 1564 \n", "28 all-agents 1585 \n", "29 all-agents 1703 " ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nasdaq_100_views.loc['Activision Blizzard']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Start with the page view table of all the nasdaq 100\n", "* Filter to include only the _Lululemon Athletica_ views\n", "* Convert the timestamp column to date time format using the _%Y%m%d%H_ format\n", "* Extract the day of the month from the above timestamp\n", "* Plot the results\n", "* as bar chart with the day of the month as x and the number of views as y \n", "* and title the graph as 'Page views for ...' with the name of the focused company" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "image/png": "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WgTAww8/zP77789dd93FgAEDmDdvHs8++yyjR49ukfo2paV/Op98MPLPgUsjYiey51SelMpPAt5I5ZemOCQNB44GdiV7vuhV6WHXZmad1p577smqVat49dVXmTdvHr1792bw4MEb5t9zzz1MmzaNESNGMHLkSNasWcOLL764IekvWrSI4cOH069fP1asWMGjjz7KF7/4RXbffXdmz57NmWeeycMPP0zPnj1bpL5V9elLGgQcRvaA5O8rO2V8IPCtFDKV7EHQk8gew3deKp8JXJHixwDTI+JD4GVJS4B9gEdbZEvMzNrJkUceycyZM1m5ciVjx479xLyI4Fe/+hWjRn26c2PdunXcdddd7L///qxdu5YZM2bQvXt3evToQY8ePXjqqae44447OOecczjooIP4yU9+stF1rfZE7i+BHwE90nRfYF1EfJym64CBaXwgsAwgIj6W9GaKHwg8lltnfpkNJI0HxgPssMMO1W6HmVm7GTt2LKeccgqvv/46Dz74IB9++OGGeaNGjWLSpEkceOCBdO3alRdeeIGBAweyzTbbsO+++/LLX/6S++67jzVr1nDEEUdsuOrn1VdfpU+fPnznO9+hV69eXHvttS1S10aTvqSvA6si4klJB7TIqzYgIq4Grgaora31sxzNrMPbddddefvttxk4cCD9+/dn6dKlG+adfPLJLF26lL322ouIoKamht/97ncA7Lffftxzzz3stNNO7Ljjjqxdu5b99tsPgAULFnDGGWew2Wab0bVrVyZNmtQidW30GbmSfgYcC3wMdAO2BW4FRgHbp9b8F4DzImKUpLvT+KOSNgdWAjXARICI+Fla74a4Sq9dW1sbvp++Wfvq6JdsLl68mM997nPtXY12U277JT0ZEbXl4hs9kRsRZ0XEoIgYQnYi9r6I+DZwP1D/64NxwG1pfFaaJs2/L7JPllnA0enqnqHAMOCJpmycmZltnI35cdaZwHRJFwJPA5NT+WTghnSidi3ZBwURsVDSDGAR2beGCRGxfiNe38zMmqhJST8iHgAeSOMvkV19UxrzAXBkheUvIrsCyMzM2oF/kWtmnV5j5yY3Vc3Zbid9M+vUunXrxpo1awqX+Ovvp9+tW7cmLecbrplZpzZo0CDq6upYvXp1e1elzdU/OaspnPTNrFPr2rVrk54cVXTu3jEzKxAnfTOzAnHSNzMrECd9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", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-06T09:56:23.491126\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "focused_company = 'Activision Blizzard'\n", "(\n", " nasdaq_100_views\n", " .loc[focused_company]\n", " .assign(timestamp=lambda x: pd.to_datetime(x.timestamp, format='%Y%m%d%H', errors='coerce'))\n", " .assign(day = lambda x: x.timestamp.dt.day)\n", " .plot\n", " .bar(\n", " x='day', y='views',\n", " title=f'Page views for {focused_company}'\n", " )\n", ");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading from complex API\n", "\n", "Many times API are more complex, nevertheless, we can still extract the relevant data. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's get some stock data from [alphavantage.co](https://www.alphavantage.co)\n", "\n", "This web service is providing useful investment information using an API, however, like many other API providers, it requires an API key to identify the request (and sometimes chanrge for it).\n", "\n", "To allow usage of secrets such as the API key for the service call, we will use a simple mechanism using _.env_ file that each user should create and update with their private keys.\n", "\n", "Once we have the module to handle secrets installed, we can import it to the notebook and use it. You can get your free API key from [alphavantage.co](https://www.alphavantage.co/support/#api-key). Next time you will execute the cell and the whole notebook, the API key will be retrieved from the local file." ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Defaulting to user installation because normal site-packages is not writeable\n", "Requirement already satisfied: python-dotenv in /usr/local/lib/python3.9/site-packages (0.15.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "pip install python-dotenv" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [], "source": [ "import os\n", "from dotenv import load_dotenv\n", "load_dotenv()\n", "\n", "ALPHAVANTAGE_API_KEY = os.getenv(\"ALPHAVANTAGE_API_KEY\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the [API documentation](https://www.alphavantage.co/documentation/) we can learn how to extract time-series stock information of a specific symbol. Let's use Amazon (AMZN) for example. " ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [], "source": [ "symbol = 'AMZN'\n", "\n", "request_url = f'https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol={symbol}&interval=1min&apikey={ALPHAVANTAGE_API_KEY}'" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [], "source": [ "df = (\n", " pd\n", " .read_json(request_url)\n", ")" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Meta DataTime Series (1min)
1. InformationIntraday (1min) open, high, low, close prices ...NaN
2. SymbolAMZNNaN
3. Last Refreshed2021-03-05 20:00:00NaN
4. Interval1minNaN
5. Output SizeCompactNaN
.........
2021-03-05 15:11:00NaN{'1. open': '2993.4100', '2. high': '2994.0400...
2021-03-05 15:10:00NaN{'1. open': '2991.7100', '2. high': '2996.3845...
2021-03-05 15:09:00NaN{'1. open': '2990.9000', '2. high': '2992.0000...
2021-03-05 15:08:00NaN{'1. open': '2995.0000', '2. high': '2997.3695...
2021-03-05 15:07:00NaN{'1. open': '2995.0400', '2. high': '2997.0000...
\n", "

106 rows × 2 columns

\n", "
" ], "text/plain": [ " Meta Data \\\n", "1. Information Intraday (1min) open, high, low, close prices ... \n", "2. Symbol AMZN \n", "3. Last Refreshed 2021-03-05 20:00:00 \n", "4. Interval 1min \n", "5. Output Size Compact \n", "... ... \n", "2021-03-05 15:11:00 NaN \n", "2021-03-05 15:10:00 NaN \n", "2021-03-05 15:09:00 NaN \n", "2021-03-05 15:08:00 NaN \n", "2021-03-05 15:07:00 NaN \n", "\n", " Time Series (1min) \n", "1. Information NaN \n", "2. Symbol NaN \n", "3. Last Refreshed NaN \n", "4. Interval NaN \n", "5. Output Size NaN \n", "... ... \n", "2021-03-05 15:11:00 {'1. open': '2993.4100', '2. high': '2994.0400... \n", "2021-03-05 15:10:00 {'1. open': '2991.7100', '2. high': '2996.3845... \n", "2021-03-05 15:09:00 {'1. open': '2990.9000', '2. high': '2992.0000... \n", "2021-03-05 15:08:00 {'1. open': '2995.0000', '2. high': '2997.3695... \n", "2021-03-05 15:07:00 {'1. open': '2995.0400', '2. high': '2997.0000... \n", "\n", "[106 rows x 2 columns]" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Extracting the relevant data\n", "\n", "We see that the data that we are looking for (open, close, high and low prices and volume in each minute) is available in a column of the dataframe table. We will filter the table to include only the rows with the prices data and split it to separated columns." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* Start with the dataframe table that was returned from the API call\n", "* Rename the long 'Time Series...' column name to short 'ts'\n", "* Filter out (using _query_) all the rows where 'ts' column has no value (_null_)\n", "* Filter (using _loc_) only the 'ts' column \n", "* Parse each value in the column as a series of key-value pairs and create a column for each pair" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [], "source": [ "json_series = (\n", " df\n", " .rename(columns={'Time Series (1min)':'ts'})\n", " .query('ts.notnull()')\n", " .loc[:,'ts']\n", " .apply(pd.Series)\n", ")" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
1. open2. high3. low4. close5. volume
2021-03-05 20:00:003005.00003005.00003005.00003005.0000316
2021-03-05 19:59:003004.00003004.00003004.00003004.0000138
2021-03-05 19:54:003004.99993004.99993004.99993004.9999110
2021-03-05 19:41:003003.97003003.97003003.97003003.9700245
2021-03-05 19:36:003001.50003001.50003001.50003001.5000493
..................
2021-03-05 15:11:002993.41002994.04002991.93502993.48007873
2021-03-05 15:10:002991.71002996.38452991.71002994.51007801
2021-03-05 15:09:002990.90002992.00002987.43012992.000011182
2021-03-05 15:08:002995.00002997.36952991.58002991.58006006
2021-03-05 15:07:002995.04002997.00002994.79502996.03007457
\n", "

100 rows × 5 columns

\n", "
" ], "text/plain": [ " 1. open 2. high 3. low 4. close 5. volume\n", "2021-03-05 20:00:00 3005.0000 3005.0000 3005.0000 3005.0000 316\n", "2021-03-05 19:59:00 3004.0000 3004.0000 3004.0000 3004.0000 138\n", "2021-03-05 19:54:00 3004.9999 3004.9999 3004.9999 3004.9999 110\n", "2021-03-05 19:41:00 3003.9700 3003.9700 3003.9700 3003.9700 245\n", "2021-03-05 19:36:00 3001.5000 3001.5000 3001.5000 3001.5000 493\n", "... ... ... ... ... ...\n", "2021-03-05 15:11:00 2993.4100 2994.0400 2991.9350 2993.4800 7873\n", "2021-03-05 15:10:00 2991.7100 2996.3845 2991.7100 2994.5100 7801\n", "2021-03-05 15:09:00 2990.9000 2992.0000 2987.4301 2992.0000 11182\n", "2021-03-05 15:08:00 2995.0000 2997.3695 2991.5800 2991.5800 6006\n", "2021-03-05 15:07:00 2995.0400 2997.0000 2994.7950 2996.0300 7457\n", "\n", "[100 rows x 5 columns]" ] }, "execution_count": 103, "metadata": {}, "output_type": "execute_result" } ], "source": [ "json_series" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Quick Visualization\n", "\n", "Now that we have the prices from the API we can plot them. \n", "* Start with the parsed data table above\n", "* Convert the values to numeric form (_astype('float')_) \n", "* Slice the table to include only the _high_ and _low_ values (_iloc_) \n", "* Reverse the order of the time-series to be from oldest to newest (_iloc[::-1]_)\n", "* Plot the data\n", "* with the title of the ticker \n", "* and with 45° rotation. " ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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evu9tPWMPk6p0UxmPv3pT7N8+XJWrFjB1VdfPSzBHy56IlczLjR29OLu9w4I7wA0tPeQlRJdhUCNJhF5+OGHx+29tKevGRdqWrsBgjz9ggwl+jqDR6MZP7Toa8aFmhYl+tOy/SUXCjOSAXSuvkYzjmjR14wLR0zRDxPe0WmbGs34oUVfMy4cae0iO9VBuss/jZThSiLZYdPhHY1mHNGirxkXalq6mZadErRNCGEs0NKir5n49PT0sHr1apYtW8bixYv59re/PeRrBiutHC909o5mXDjS0s2sgrQB2wszXDq8o5kUuFwuXn31VdLT0+nr6+P0009n3bp1nHzyyfEe2rDQnr5mzJFSGp7+wLr5hZku7elrJgVCCNLT0wFVg6evr29YiworKio455xzWLp0Keeeey5VVVV4PB5mzpyJlJLW1lbsdjtvvvkmAGvXruXAgQMxt0N7+poxp6Wrj+4+T9AkrklhRjJv7W+Mw6g0k5rnvwZHd8b2nFNPgHX/O+ghHo+HlStXcvDgQW6//faoSiubfP7zn+fmm2/m5ptv5o9//CN33HEH//jHP5g/fz67d+/m8OHDrFixgrfeeos1a9ZQXV3N3LlzR2vVALSnrxlzzMydkjCiX5Dhor23n263Z7yHpdEMG7vdzrZt26ipqWHjxo188MEHUb/23Xff5YYbbgDgpptu4u233wbgjDPO4M033+TNN9/k61//Om+//Tbvv/8+J5100pjYoD19zZhT06L64IZO5IKK6YNK25yRNzDmr9GEZQiPfKzJzs7m7LPP5oUXXmDJkiWjOtfatWv57W9/S21tLXfddRc/+tGPeP311znjjDNiNNpgtKeviTlHj/fw+r563/MjYVbjmhRm6gVamslBQ0ODr5F5d3c3L730EgsWLIj69aeeeiqPPPIIAH/96199or569WreeecdbDYbycnJLF++nHvvvZe1a9fG3AbQoq8ZA/64/jAff/B9qpqUh1/T0k26KylsfZ1CXYpBM0moq6vj7LPPZunSpZx00kmcf/75XHrppQB861vf4umnnx709b/85S954IEHWLp0KQ899BD33HMPoLKCSktLfVlAZ5xxBu3t7ZxwwgljYocO72hizrG2HqSEhzdW8bV1C3w5+uEyHQLDOxrNRGbp0qVs3bo17L677ror7PZbbrmFW265BYAZM2bw6quvhj0u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", "image/svg+xml": "\n\n\n\n \n \n \n \n 2021-03-06T09:56:26.861317\n image/svg+xml\n \n \n Matplotlib v3.3.4, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "(\n", " json_series\n", " .filter(['2. high','3. low'])\n", " .astype('float')\n", " .iloc[::-1]\n", " .plot(\n", " title=symbol, \n", " rot=45\n", " )\n", ")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.2" }, "nbsphinx": { "timeout": 120 } }, "nbformat": 4, "nbformat_minor": 2 }