Skip to content

Instantly share code, notes, and snippets.

@polinabee
Last active December 18, 2020 14:48
Show Gist options
  • Save polinabee/25532f40c427ebf3875bf00502d9c2d9 to your computer and use it in GitHub Desktop.
Save polinabee/25532f40c427ebf3875bf00502d9c2d9 to your computer and use it in GitHub Desktop.
Some simple code to get data from an API, from a class project.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Working with APIs in Python\n",
"\n",
"In Python, there are many libraries to make HTTP requests. We will use a 3rd-party library called \"requests\", which is very easy to use and very popular. \n",
"\n",
"Making a \"GET\" request is as simple as: \n",
"\n",
"```python\n",
"import requests\n",
"\n",
"res = requests.get(url) # returns a \"Response\" object\n",
"res.content # has the \"body\" of the response\n",
"```\n",
"\n",
"You might need to install the requests library! \n",
"\n",
"You can do that with the following code in a Jupyter cell: \n",
"\n",
"```python\n",
"! pip install requests\n",
"```\n",
"\n",
"Or, if you're using anaconda, optionally you can also do: \n",
"\n",
"```python\n",
"! conda install -c anaconda requests\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Pokemon API\n",
"\n",
"There is a simple, open API called \"pokeapi\" that allows us to make requests and see how to use APIs. Like everything, we first look at the documentation: \n",
"\n",
"https://pokeapi.co/docs/v2.html\n",
"\n",
"The video below will walk you through how to read the documentation page."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/jpeg": "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7dR/QfNB6mi8s/uFjt1H9B80/uFjt1H9B80HqNPaq8X7Dvyn4LzIf/kHHDZR/QfNQq/69xrxDm0D/wADbZvQaVOgOjcc8HIDEwDrY8gpClLsrnFtXMQZiNDt3rlDFu3N8fNDjHbh4+ag7D6MNnp5BaDEnbs890FPVuuR0vWDhDp1GUmRfW0clx/W3bm+PmnrbtzfHzQdWpQYwXqZpBjJpIgieF/BTEtOZ1RxyvbcX1aTN5G4Lj+uO3N8fNPXHbh4+aDs08LMllZolrtdYjQ32zCzUwgpienBbIkM1N9y4vrbtzfHzT1t25vj5oOnlZtc7Ic2UCJsREjiPgr2YAudaq3RsGd9oF5suL627c3x80GMcNg8fNB3BgoAJrgT7MHbmyb+2d3FVObngmt7WQGeJIvGgEeI3rkeuO3Dx809bdub4+aDrVGXyNe575I4EEEnW8qTW9IJFUiGtDsxjYbDgI8VxxjHbh4+aetu3N8fNB1w1rf/AGPhry0lp/22IHh2LDQ1xHSVHdZoAiLCS2Du0C5PrbtzfHzT1t25vj5oO2MOMw+vN3xI2SLE312dyi7DODQelglkxoYEGNePgVxvW3bm+Pmhxjtw8fNB18ji8kvJcXATvJEk9wPipjCHKCKwaC0kAmDG7VcX1x24ePmhxjtw8fNB26uD6ziK7T1xF7m+u638HvxUwmQgmsDIfBB1iTrOhI8VxfW3bm+Pmnrjtw8fNB1aNAuH2gbdoidh0Jv88FMYUlwaag+8A4m2XnvJHcVx/W3bm+PmnrbtzfHzQdivhcpMvzPytIHEkCOUKVKlLwRVtmdcRM/ed8O2VxfXHbh4+aetu3N8fNB1W0MwbNQNIa09bYHG0eHPgpnDdYM6YXcRtiwmTfbMc1x/XHbh4+aetu3N8fNB16WGDhaqB1byeLhGulu+RvUcTTglxfnJIgjbaT2RbmuV627c3x809cduHj5oNdERUEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERB//2Q==\n",
"text/html": [
"\n",
" <iframe\n",
" width=\"640\"\n",
" height=\"360\"\n",
" src=\"https://www.youtube.com/embed/5-li5umLyGM\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" ></iframe>\n",
" "
],
"text/plain": [
"<IPython.lib.display.YouTubeVideo at 0x10df60580>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from IPython.lib.display import YouTubeVideo\n",
"\n",
"YouTubeVideo('5-li5umLyGM', width=640,height=360)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'count': 1050,\n",
" 'next': 'https://pokeapi.co/api/v2/pokemon?offset=20&limit=20',\n",
" 'previous': None,\n",
" 'results': [{'name': 'bulbasaur',\n",
" 'url': 'https://pokeapi.co/api/v2/pokemon/1/'},\n",
" {'name': 'ivysaur', 'url': 'https://pokeapi.co/api/v2/pokemon/2/'},\n",
" {'name': 'venusaur', 'url': 'https://pokeapi.co/api/v2/pokemon/3/'},\n",
" {'name': 'charmander', 'url': 'https://pokeapi.co/api/v2/pokemon/4/'},\n",
" {'name': 'charmeleon', 'url': 'https://pokeapi.co/api/v2/pokemon/5/'},\n",
" {'name': 'charizard', 'url': 'https://pokeapi.co/api/v2/pokemon/6/'},\n",
" {'name': 'squirtle', 'url': 'https://pokeapi.co/api/v2/pokemon/7/'},\n",
" {'name': 'wartortle', 'url': 'https://pokeapi.co/api/v2/pokemon/8/'},\n",
" {'name': 'blastoise', 'url': 'https://pokeapi.co/api/v2/pokemon/9/'},\n",
" {'name': 'caterpie', 'url': 'https://pokeapi.co/api/v2/pokemon/10/'},\n",
" {'name': 'metapod', 'url': 'https://pokeapi.co/api/v2/pokemon/11/'},\n",
" {'name': 'butterfree', 'url': 'https://pokeapi.co/api/v2/pokemon/12/'},\n",
" {'name': 'weedle', 'url': 'https://pokeapi.co/api/v2/pokemon/13/'},\n",
" {'name': 'kakuna', 'url': 'https://pokeapi.co/api/v2/pokemon/14/'},\n",
" {'name': 'beedrill', 'url': 'https://pokeapi.co/api/v2/pokemon/15/'},\n",
" {'name': 'pidgey', 'url': 'https://pokeapi.co/api/v2/pokemon/16/'},\n",
" {'name': 'pidgeotto', 'url': 'https://pokeapi.co/api/v2/pokemon/17/'},\n",
" {'name': 'pidgeot', 'url': 'https://pokeapi.co/api/v2/pokemon/18/'},\n",
" {'name': 'rattata', 'url': 'https://pokeapi.co/api/v2/pokemon/19/'},\n",
" {'name': 'raticate', 'url': 'https://pokeapi.co/api/v2/pokemon/20/'}]}"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Let's see how to make a GET request to the API: \n",
"import requests\n",
"\n",
"# let's take a look at the \"Pokemon\" resource\n",
"res = requests.get('https://pokeapi.co/api/v2/pokemon')\n",
"\n",
"# the .json() method on the Response class essentially\n",
"# wraps a call to `json.loads` on the response body \n",
"# for us:\n",
"res.json() "
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"pycharm": {
"name": "#%% \n"
}
},
"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>name</th>\n",
" <th>url</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>bulbasaur</td>\n",
" <td>https://pokeapi.co/api/v2/pokemon/1/</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>ivysaur</td>\n",
" <td>https://pokeapi.co/api/v2/pokemon/2/</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>venusaur</td>\n",
" <td>https://pokeapi.co/api/v2/pokemon/3/</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>charmander</td>\n",
" <td>https://pokeapi.co/api/v2/pokemon/4/</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>charmeleon</td>\n",
" <td>https://pokeapi.co/api/v2/pokemon/5/</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1045</th>\n",
" <td>araquanid-totem</td>\n",
" <td>https://pokeapi.co/api/v2/pokemon/10153/</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1046</th>\n",
" <td>togedemaru-totem</td>\n",
" <td>https://pokeapi.co/api/v2/pokemon/10154/</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1047</th>\n",
" <td>necrozma-dusk</td>\n",
" <td>https://pokeapi.co/api/v2/pokemon/10155/</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1048</th>\n",
" <td>necrozma-dawn</td>\n",
" <td>https://pokeapi.co/api/v2/pokemon/10156/</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1049</th>\n",
" <td>necrozma-ultra</td>\n",
" <td>https://pokeapi.co/api/v2/pokemon/10157/</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1050 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" name url\n",
"0 bulbasaur https://pokeapi.co/api/v2/pokemon/1/\n",
"1 ivysaur https://pokeapi.co/api/v2/pokemon/2/\n",
"2 venusaur https://pokeapi.co/api/v2/pokemon/3/\n",
"3 charmander https://pokeapi.co/api/v2/pokemon/4/\n",
"4 charmeleon https://pokeapi.co/api/v2/pokemon/5/\n",
"... ... ...\n",
"1045 araquanid-totem https://pokeapi.co/api/v2/pokemon/10153/\n",
"1046 togedemaru-totem https://pokeapi.co/api/v2/pokemon/10154/\n",
"1047 necrozma-dusk https://pokeapi.co/api/v2/pokemon/10155/\n",
"1048 necrozma-dawn https://pokeapi.co/api/v2/pokemon/10156/\n",
"1049 necrozma-ultra https://pokeapi.co/api/v2/pokemon/10157/\n",
"\n",
"[1050 rows x 2 columns]"
]
},
"execution_count": 28,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Exercise 1:\n",
"# Create a Dataframe with all the Pokemon names and the URL\n",
"# that can be used to get detailed information about them via\n",
"# the API:\n",
"#\n",
"# HINT: Take a look at the \"next\" property in the JSON API\n",
"# response.\n",
"\n",
"\n",
"# name | url |\n",
"# -----------|-----------------------\n",
"# bulbasaur | https://pokeapi.co/api/v2/pokemon/1/\n",
"# ...\n",
"# squirtle | https://pokeapi.co/api/v2/pokemon/7/\n",
"# ...\n",
"\n",
"import pandas as pd\n",
"\n",
"pk_data = res.json()['results']\n",
"next_url = res.json()['next']\n",
"\n",
"while next_url is not None:\n",
" current_json = requests.get(next_url).json()\n",
" pk_data.extend(current_json['results'])\n",
" next_url = current_json['next']\n",
"\n",
"\n",
"pd.DataFrame(pk_data)\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Exercise 2: Exchange Rates\n",
"\n",
"Imagine that you work with financial assets which are denominated in different currencies. You analyze this data regularly, and want to create a \"transformation\" function that transforms all your assets into EUR prices, based on today's exchange rate. \n",
"\n",
"Your data with the local-currency-denominated value of each asset lives in a file called \"assets.csv\" which should be located in the same folder as this notebook. \n",
"\n",
"Write a \"data loading\" function that: \n",
"\n",
"1. Reads the data, given the path to the file. \n",
"2. Returns a dataframe with an additional column that has the assets value in euros, as of today.\n",
"\n",
"Use this free API to get today's exchange rates: https://exchangeratesapi.io/. You will need to read the documentation and try it out to see how it works. \n",
"\n",
"HINT: Write a separate function to get the current exchange rates - a function that can be reused!"
]
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"assets_df = pd.read_csv('assets.csv')\n",
"assets_df.sort_values(by=['value'])"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"rates = requests.get('https://api.exchangeratesapi.io/latest').json()['rates']\n",
"rates_df = pd.DataFrame(rates.items(), columns=['curr', 'rate'])\n",
"rates_df\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"exchange_table = assets_df.set_index('curr').join(rates_df.set_index('curr')).sort_values(by=['value'])\n",
"exchange_table\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [
"exchange_table['euro_value'] = exchange_table.value / exchange_table.rate\n",
"exchange_table[['value','euro_value']]\n"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n"
}
}
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"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>value</th>\n",
" <th>curr</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>815</th>\n",
" <td>0.579500</td>\n",
" <td>RON</td>\n",
" </tr>\n",
" <tr>\n",
" <th>736</th>\n",
" <td>0.695027</td>\n",
" <td>AUD</td>\n",
" </tr>\n",
" <tr>\n",
" <th>268</th>\n",
" <td>0.878542</td>\n",
" <td>HUF</td>\n",
" </tr>\n",
" <tr>\n",
" <th>116</th>\n",
" <td>0.957615</td>\n",
" <td>NOK</td>\n",
" </tr>\n",
" <tr>\n",
" <th>87</th>\n",
" <td>0.971083</td>\n",
" <td>GBP</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>237</th>\n",
" <td>50.256462</td>\n",
" <td>ZAR</td>\n",
" </tr>\n",
" <tr>\n",
" <th>875</th>\n",
" <td>50.329057</td>\n",
" <td>DKK</td>\n",
" </tr>\n",
" <tr>\n",
" <th>84</th>\n",
" <td>50.432527</td>\n",
" <td>USD</td>\n",
" </tr>\n",
" <tr>\n",
" <th>293</th>\n",
" <td>50.478673</td>\n",
" <td>PLN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>171</th>\n",
" <td>50.498863</td>\n",
" <td>MXN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1000 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" value curr\n",
"815 0.579500 RON\n",
"736 0.695027 AUD\n",
"268 0.878542 HUF\n",
"116 0.957615 NOK\n",
"87 0.971083 GBP\n",
".. ... ...\n",
"237 50.256462 ZAR\n",
"875 50.329057 DKK\n",
"84 50.432527 USD\n",
"293 50.478673 PLN\n",
"171 50.498863 MXN\n",
"\n",
"[1000 rows x 2 columns]"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"exchange_table['euro_value'] = exchange_table.value / exchange_table.rate\n",
"exchange_table[['value','euro_value']]\n"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"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>curr</th>\n",
" <th>rate</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>CAD</td>\n",
" <td>1.55770</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>HKD</td>\n",
" <td>9.15280</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>ISK</td>\n",
" <td>164.00000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>PHP</td>\n",
" <td>57.33300</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>DKK</td>\n",
" <td>7.44250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>HUF</td>\n",
" <td>365.68000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>CZK</td>\n",
" <td>27.23300</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>AUD</td>\n",
" <td>1.68010</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>RON</td>\n",
" <td>4.87610</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>SEK</td>\n",
" <td>10.38050</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>IDR</td>\n",
" <td>17373.10000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>INR</td>\n",
" <td>86.84650</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>BRL</td>\n",
" <td>6.61820</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>RUB</td>\n",
" <td>92.02380</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>HRK</td>\n",
" <td>7.58260</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>JPY</td>\n",
" <td>124.79000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>THB</td>\n",
" <td>36.96500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>CHF</td>\n",
" <td>1.07240</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>SGD</td>\n",
" <td>1.60360</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>PLN</td>\n",
" <td>4.58090</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>BGN</td>\n",
" <td>1.95580</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>TRY</td>\n",
" <td>9.33010</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>CNY</td>\n",
" <td>7.89180</td>\n",
" </tr>\n",
" <tr>\n",
" <th>23</th>\n",
" <td>NOK</td>\n",
" <td>10.96980</td>\n",
" </tr>\n",
" <tr>\n",
" <th>24</th>\n",
" <td>NZD</td>\n",
" <td>1.80060</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25</th>\n",
" <td>ZAR</td>\n",
" <td>19.52450</td>\n",
" </tr>\n",
" <tr>\n",
" <th>26</th>\n",
" <td>USD</td>\n",
" <td>1.18100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>27</th>\n",
" <td>MXN</td>\n",
" <td>25.03150</td>\n",
" </tr>\n",
" <tr>\n",
" <th>28</th>\n",
" <td>ILS</td>\n",
" <td>3.99110</td>\n",
" </tr>\n",
" <tr>\n",
" <th>29</th>\n",
" <td>GBP</td>\n",
" <td>0.91329</td>\n",
" </tr>\n",
" <tr>\n",
" <th>30</th>\n",
" <td>KRW</td>\n",
" <td>1346.35000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>31</th>\n",
" <td>MYR</td>\n",
" <td>4.90170</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" curr rate\n",
"0 CAD 1.55770\n",
"1 HKD 9.15280\n",
"2 ISK 164.00000\n",
"3 PHP 57.33300\n",
"4 DKK 7.44250\n",
"5 HUF 365.68000\n",
"6 CZK 27.23300\n",
"7 AUD 1.68010\n",
"8 RON 4.87610\n",
"9 SEK 10.38050\n",
"10 IDR 17373.10000\n",
"11 INR 86.84650\n",
"12 BRL 6.61820\n",
"13 RUB 92.02380\n",
"14 HRK 7.58260\n",
"15 JPY 124.79000\n",
"16 THB 36.96500\n",
"17 CHF 1.07240\n",
"18 SGD 1.60360\n",
"19 PLN 4.58090\n",
"20 BGN 1.95580\n",
"21 TRY 9.33010\n",
"22 CNY 7.89180\n",
"23 NOK 10.96980\n",
"24 NZD 1.80060\n",
"25 ZAR 19.52450\n",
"26 USD 1.18100\n",
"27 MXN 25.03150\n",
"28 ILS 3.99110\n",
"29 GBP 0.91329\n",
"30 KRW 1346.35000\n",
"31 MYR 4.90170"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"rates = requests.get('https://api.exchangeratesapi.io/latest').json()['rates']\n",
"rates_df = pd.DataFrame(rates.items(), columns=['curr', 'rate'])\n",
"rates_df\n"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"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>value</th>\n",
" <th>rate</th>\n",
" </tr>\n",
" <tr>\n",
" <th>curr</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>RON</th>\n",
" <td>0.579500</td>\n",
" <td>4.87610</td>\n",
" </tr>\n",
" <tr>\n",
" <th>AUD</th>\n",
" <td>0.695027</td>\n",
" <td>1.68010</td>\n",
" </tr>\n",
" <tr>\n",
" <th>HUF</th>\n",
" <td>0.878542</td>\n",
" <td>365.68000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NOK</th>\n",
" <td>0.957615</td>\n",
" <td>10.96980</td>\n",
" </tr>\n",
" <tr>\n",
" <th>GBP</th>\n",
" <td>0.971083</td>\n",
" <td>0.91329</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>ZAR</th>\n",
" <td>50.256462</td>\n",
" <td>19.52450</td>\n",
" </tr>\n",
" <tr>\n",
" <th>DKK</th>\n",
" <td>50.329057</td>\n",
" <td>7.44250</td>\n",
" </tr>\n",
" <tr>\n",
" <th>USD</th>\n",
" <td>50.432527</td>\n",
" <td>1.18100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>PLN</th>\n",
" <td>50.478673</td>\n",
" <td>4.58090</td>\n",
" </tr>\n",
" <tr>\n",
" <th>MXN</th>\n",
" <td>50.498863</td>\n",
" <td>25.03150</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1000 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" value rate\n",
"curr \n",
"RON 0.579500 4.87610\n",
"AUD 0.695027 1.68010\n",
"HUF 0.878542 365.68000\n",
"NOK 0.957615 10.96980\n",
"GBP 0.971083 0.91329\n",
"... ... ...\n",
"ZAR 50.256462 19.52450\n",
"DKK 50.329057 7.44250\n",
"USD 50.432527 1.18100\n",
"PLN 50.478673 4.58090\n",
"MXN 50.498863 25.03150\n",
"\n",
"[1000 rows x 2 columns]"
]
},
"execution_count": 46,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"exchange_table = assets_df.set_index('curr').join(rates_df.set_index('curr')).sort_values(by=['value'])\n",
"exchange_table\n"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"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>value</th>\n",
" <th>euro_value</th>\n",
" </tr>\n",
" <tr>\n",
" <th>curr</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>RON</th>\n",
" <td>0.579500</td>\n",
" <td>0.118845</td>\n",
" </tr>\n",
" <tr>\n",
" <th>AUD</th>\n",
" <td>0.695027</td>\n",
" <td>0.413682</td>\n",
" </tr>\n",
" <tr>\n",
" <th>HUF</th>\n",
" <td>0.878542</td>\n",
" <td>0.002402</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NOK</th>\n",
" <td>0.957615</td>\n",
" <td>0.087296</td>\n",
" </tr>\n",
" <tr>\n",
" <th>GBP</th>\n",
" <td>0.971083</td>\n",
" <td>1.063280</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>ZAR</th>\n",
" <td>50.256462</td>\n",
" <td>2.574020</td>\n",
" </tr>\n",
" <tr>\n",
" <th>DKK</th>\n",
" <td>50.329057</td>\n",
" <td>6.762386</td>\n",
" </tr>\n",
" <tr>\n",
" <th>USD</th>\n",
" <td>50.432527</td>\n",
" <td>42.703240</td>\n",
" </tr>\n",
" <tr>\n",
" <th>PLN</th>\n",
" <td>50.478673</td>\n",
" <td>11.019379</td>\n",
" </tr>\n",
" <tr>\n",
" <th>MXN</th>\n",
" <td>50.498863</td>\n",
" <td>2.017413</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>1000 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" value euro_value\n",
"curr \n",
"RON 0.579500 0.118845\n",
"AUD 0.695027 0.413682\n",
"HUF 0.878542 0.002402\n",
"NOK 0.957615 0.087296\n",
"GBP 0.971083 1.063280\n",
"... ... ...\n",
"ZAR 50.256462 2.574020\n",
"DKK 50.329057 6.762386\n",
"USD 50.432527 42.703240\n",
"PLN 50.478673 11.019379\n",
"MXN 50.498863 2.017413\n",
"\n",
"[1000 rows x 2 columns]"
]
},
"execution_count": 49,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"exchange_table['euro_value'] = exchange_table.value / exchange_table.rate\n",
"exchange_table[['value','euro_value']]\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
},
"name": "exercises.ipynb"
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment