From ae94175140044cf7d77c6ba4e28cc361a952292c Mon Sep 17 00:00:00 2001 From: Conor Smith Date: Tue, 18 Oct 2022 19:05:48 -0400 Subject: [PATCH 1/7] completed mini-project --- mec-3.4.1-api-mini-project/.env | 2 +- .../api_data_wrangling_mini_project.ipynb | 576 +++++++++++++++--- mec-3.4.1-api-mini-project/python.gitignore | 160 +++++ 3 files changed, 660 insertions(+), 78 deletions(-) create mode 100644 mec-3.4.1-api-mini-project/python.gitignore diff --git a/mec-3.4.1-api-mini-project/.env b/mec-3.4.1-api-mini-project/.env index 5d011ea4..5080b71a 100644 --- a/mec-3.4.1-api-mini-project/.env +++ b/mec-3.4.1-api-mini-project/.env @@ -1 +1 @@ -NASDAQ_API_KEY=KRfk96yoWvruWZ-LjPb +API_KEY='7MadrSm5uJz-31r7rF4z' \ No newline at end of file diff --git a/mec-3.4.1-api-mini-project/api_data_wrangling_mini_project.ipynb b/mec-3.4.1-api-mini-project/api_data_wrangling_mini_project.ipynb index 0d34bd5c..e0b34166 100755 --- a/mec-3.4.1-api-mini-project/api_data_wrangling_mini_project.ipynb +++ b/mec-3.4.1-api-mini-project/api_data_wrangling_mini_project.ipynb @@ -2,147 +2,151 @@ "cells": [ { "cell_type": "markdown", + "metadata": {}, "source": [ "This exercise will require you to pull some data from https://data.nasdaq.com/ (formerly Quandl API)." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "As a first step, you will need to register a free account on the https://data.nasdaq.com/ website." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ - "After you register, you will be provided with a unique API key, that you should store:\r\n", - "\r\n", - "*Note*: Use a `.env` file and put your key in there and `python-dotenv` to access it in this notebook. \r\n", - "\r\n", - "The code below uses a key that was used when generating this project but has since been deleted. Never submit your keys to source control. There is a `.env-example` file in this repository to illusrtate what you need. Copy that to a file called `.env` and use your own api key in that `.env` file. Make sure you also have a `.gitignore` file with a line for `.env` added to it. \r\n", - "\r\n", + "After you register, you will be provided with a unique API key, that you should store:\n", + "\n", + "*Note*: Use a `.env` file and put your key in there and `python-dotenv` to access it in this notebook. \n", + "\n", + "The code below uses a key that was used when generating this project but has since been deleted. Never submit your keys to source control. There is a `.env-example` file in this repository to illusrtate what you need. Copy that to a file called `.env` and use your own api key in that `.env` file. Make sure you also have a `.gitignore` file with a line for `.env` added to it. \n", + "\n", "The standard Python gitignore is [here](https://github.com/github/gitignore/blob/master/Python.gitignore) you can just copy that. " - ], - "metadata": {} + ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "7MadrSm5uJz-31r7rF4z\n" + ] + } + ], "source": [ "# get api key from your .env file\n", "import os\n", "from dotenv import load_dotenv # if missing this module, simply run `pip install python-dotenv`\n", "\n", "load_dotenv()\n", - "API_KEY = os.getenv('NASDAQ_API_KEY')\n", + "API_KEY = os.getenv('API_KEY')\n", "\n", "print(API_KEY)" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "KRfk96yoWvruWZ-LjPbo\n" - ] - } - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Nasdaq Data has a large number of data sources, but, unfortunately, most of them require a Premium subscription. Still, there are also a good number of free datasets." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "For this mini project, we will focus on equities data from the Frankfurt Stock Exhange (FSE), which is available for free. We'll try and analyze the stock prices of a company called Carl Zeiss Meditec, which manufactures tools for eye examinations, as well as medical lasers for laser eye surgery: https://www.zeiss.com/meditec/int/home.html. The company is listed under the stock ticker AFX_X." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "You can find the detailed Nasdaq Data API instructions here: https://docs.data.nasdaq.com/docs/in-depth-usage" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "While there is a dedicated Python package for connecting to the Nasdaq API, we would prefer that you use the *requests* package, which can be easily downloaded using *pip* or *conda*. You can find the documentation for the package here: http://docs.python-requests.org/en/master/ " - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Finally, apart from the *requests* package, you are encouraged to not use any third party Python packages, such as *pandas*, and instead focus on what's available in the Python Standard Library (the *collections* module might come in handy: https://pymotw.com/3/collections/).\n", "Also, since you won't have access to DataFrames, you are encouraged to us Python's native data structures - preferably dictionaries, though some questions can also be answered using lists.\n", "You can read more on these data structures here: https://docs.python.org/3/tutorial/datastructures.html" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Keep in mind that the JSON responses you will be getting from the API map almost one-to-one to Python's dictionaries. Unfortunately, they can be very nested, so make sure you read up on indexing dictionaries in the documentation provided above." - ], - "metadata": {} + ] }, { "cell_type": "code", - "execution_count": 6, - "source": [ - "# First, import the relevant modules" - ], + "execution_count": 4, + "metadata": {}, "outputs": [], - "metadata": {} + "source": [ + "import requests" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ - "Note: API's can change a bit with each version, for this exercise it is reccomended to use the nasdaq api at `https://data.nasdaq.com/api/v3/`. This is the same api as what used to be quandl so `https://www.quandl.com/api/v3/` should work too.\r\n", - "\r\n", + "Note: API's can change a bit with each version, for this exercise it is reccomended to use the nasdaq api at `https://data.nasdaq.com/api/v3/`. This is the same api as what used to be quandl so `https://www.quandl.com/api/v3/` should work too.\n", + "\n", "Hint: We are looking for the `AFX_X` data on the `datasets/FSE/` dataset." - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 7, - "source": [ - "# Now, call the Nasdaq API and pull out a small sample of the data (only one day) to get a glimpse\n", - "# into the JSON structure that will be returned" - ], - "outputs": [], - "metadata": {} + ] }, { "cell_type": "code", - "execution_count": 9, - "source": [ - "# Inspect the JSON structure of the object you created, and take note of how nested it is,\n", - "# as well as the overall structure" - ], + "execution_count": 50, + "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "{'dataset': {'id': 10095370, 'dataset_code': 'AFX_X', 'database_code': 'FSE', 'name': 'Carl Zeiss Meditec (AFX_X)', 'description': 'Stock Prices for Carl Zeiss Meditec (2020-11-02) from the Frankfurt Stock Exchange.

Trading System: Xetra

ISIN: DE0005313704', 'refreshed_at': '2020-12-01T14:48:09.907Z', 'newest_available_date': '2020-12-01', 'oldest_available_date': '2000-06-07', 'column_names': ['Date', 'Open', 'High', 'Low', 'Close', 'Change', 'Traded Volume', 'Turnover', 'Last Price of the Day', 'Daily Traded Units', 'Daily Turnover'], 'frequency': 'daily', 'type': 'Time Series', 'premium': False, 'limit': None, 'transform': None, 'column_index': None, 'start_date': '2021-01-03', 'end_date': '2020-12-01', 'data': [], 'collapse': None, 'order': None, 'database_id': 6129}}\n" + "\n" ] } ], - "metadata": {} + "source": [ + "#1. Collect data from the Franfurt Stock Exchange, for the ticker AFX_X, for the whole year 2017 (keep in mind that the date format is YYYY-MM-DD).\n", + "fse = requests.get(f'https://data.nasdaq.com/api/v3/datasets/FSE/AFX_X.json?api_key={API_KEY}')\n", + "fse = requests.get(f'https://data.nasdaq.com/api/v3/datasets/FSE/VNA_X?start_date=2017-01-01&end_date=2017-12-31&api_key={API_KEY}')\n", + "#2. Convert the returned JSON object into a Python dictionary.\n", + "json = fse.json()\n", + "print(type(json))" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "These are your tasks for this mini project:\n", "\n", @@ -153,28 +157,449 @@ "5. What was the largest change between any two days (based on Closing Price)?\n", "6. What was the average daily trading volume during this year?\n", "7. (Optional) What was the median trading volume during this year. (Note: you may need to implement your own function for calculating the median.)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Date', 'Open', 'High', 'Low', 'Close', 'Change', 'Traded Volume', 'Turnover', 'Last Price of the Day', 'Daily Traded Units', 'Daily Turnover']\n" + ] + } ], - "metadata": {} + "source": [ + "print(json['dataset']['column_names'])" + ] }, { "cell_type": "code", - "execution_count": null, - "source": [], + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[['2017-12-29', 41.225, 41.425, 41.145, 41.39, None, 601057.0, 24840221.0, None, None, None], ['2017-12-28', 41.3, 41.34, 41.095, 41.22, None, 608053.0, 25062545.0, None, None, None], ['2017-12-27', 41.01, 41.335, 40.815, 41.335, None, 732911.0, 30168070.0, None, None, None], ['2017-12-22', 40.64, 40.975, 40.585, 40.975, None, 843468.0, 34444774.0, None, None, None], ['2017-12-21', 41.085, 41.1, 40.565, 40.7, None, 1384516.0, 56441896.0, None, None, None], ['2017-12-20', 41.715, 41.895, 40.935, 41.035, None, 1411562.0, 58322057.0, None, None, None], ['2017-12-19', 41.95, 42.215, 41.625, 41.64, None, 1314959.0, 55010330.0, None, None, None], ['2017-12-18', 41.5, 42.05, 40.92, 41.88, None, 2098187.0, 87316028.0, None, None, None], ['2017-12-15', 40.72, 41.35, 40.68, 41.35, None, 2733044.0, 112478446.0, None, None, None], ['2017-12-14', 40.79, 41.0, 40.63, 40.94, None, 1243035.0, 50820573.0, None, None, None], ['2017-12-13', 41.205, 41.22, 40.81, 40.845, None, 1036110.0, 42434183.0, None, None, None], ['2017-12-12', 41.36, 41.435, 40.845, 41.08, None, 1477381.0, 60712041.0, None, None, None], ['2017-12-11', 41.175, 41.355, 41.04, 41.125, None, 1043727.0, 42973562.0, None, None, None], ['2017-12-08', 41.13, 41.45, 40.99, 41.22, None, 1289642.0, 53150892.0, None, None, None], ['2017-12-07', 40.74, 41.23, 40.57, 40.84, None, 1376033.0, 56276968.0, None, None, None], ['2017-12-06', 40.54, 40.64, 40.165, 40.6, None, 1205912.0, 48764021.0, None, None, None], ['2017-12-05', 40.05, 40.775, 39.97, 40.665, None, 1948545.0, 78968966.0, None, None, None], ['2017-12-04', 39.79, 40.11, 39.585, 39.77, None, 1321182.0, 52627362.0, None, None, None], ['2017-12-01', 39.545, 39.845, 39.35, 39.44, None, 1495815.0, 59136311.0, None, None, None], ['2017-11-30', 38.95, 39.7, 38.915, 39.545, None, 3040962.0, 120157342.0, None, None, None], ['2017-11-29', 39.95, 40.025, 38.91, 39.025, None, 1493605.0, 58739775.0, None, None, None], ['2017-11-28', 39.825, 39.905, 39.5, 39.7, None, 1018883.0, 40423811.0, None, None, None], ['2017-11-27', 39.7, 40.04, 39.63, 39.8, None, 1095660.0, 43654747.0, None, None, None], ['2017-11-24', 39.595, 39.92, 39.355, 39.65, None, 999933.0, 39641078.0, None, None, None], ['2017-11-23', 39.275, 39.62, 39.21, 39.52, None, 1161907.0, 45849993.0, None, None, None], ['2017-11-22', 39.955, 40.03, 39.365, 39.365, None, 985055.0, 39043700.0, None, None, None], ['2017-11-21', 39.445, 40.23, 39.33, 39.93, None, 1531366.0, 61107977.0, None, None, None], ['2017-11-20', 39.245, 39.43, 39.14, 39.3, None, 1057105.0, 41546170.0, None, None, None], ['2017-11-17', 39.7, 39.79, 39.375, 39.375, None, 1048127.0, 41459027.0, None, None, None], ['2017-11-16', 39.45, 39.785, 39.3, 39.705, None, 1010748.0, 40046253.0, None, None, None], ['2017-11-15', 39.495, 39.495, 38.77, 39.265, None, 1408279.0, 55104780.0, None, None, None], ['2017-11-14', 39.53, 39.63, 39.285, 39.5, None, 1103999.0, 43589611.0, None, None, None], ['2017-11-13', 39.26, 39.465, 39.01, 39.43, None, 1423857.0, 55975814.0, None, None, None], ['2017-11-10', 39.24, 39.445, 38.935, 39.145, None, 2133301.0, 83564952.0, None, None, None], ['2017-11-09', 39.245, 39.29, 38.805, 39.115, None, 1762497.0, 68815373.0, None, None, None], ['2017-11-08', 39.22, 39.54, 38.205, 39.165, None, 1841312.0, 72049610.0, None, None, None], ['2017-11-07', 39.0, 39.165, 38.73, 39.05, None, 1378274.0, 53770377.0, None, None, None], ['2017-11-06', 38.8, 38.975, 38.68, 38.81, None, 773139.0, 30002877.0, None, None, None], ['2017-11-03', 38.72, 38.815, 38.55, 38.73, None, 1147296.0, 44421907.0, None, None, None], ['2017-11-02', 38.165, 38.69, 38.145, 38.49, None, 1744271.0, 67156177.0, None, None, None], ['2017-11-01', 38.1, 38.315, 37.54, 38.2, None, 1810355.0, 69008167.0, None, None, None], ['2017-10-30', 37.32, 37.76, 37.25, 37.76, None, 1259359.0, 47379195.0, None, None, None], ['2017-10-27', 36.9, 37.33, 36.79, 37.18, None, 1362626.0, 50636915.0, None, None, None], ['2017-10-26', 36.425, 36.775, 36.355, 36.67, None, 1773417.0, 64876374.0, None, None, None], ['2017-10-25', 36.5, 36.54, 36.21, 36.28, None, 1146901.0, 41641699.0, None, None, None], ['2017-10-24', 36.755, 37.1, 36.515, 36.64, None, 1182044.0, 43411836.0, None, None, None], ['2017-10-23', 37.63, 37.635, 36.855, 36.875, None, 1281333.0, 47497515.0, None, None, None], ['2017-10-20', 37.93, 37.96, 37.27, 37.45, None, 1180003.0, 44288477.0, None, None, None], ['2017-10-19', 37.885, 38.13, 37.55, 37.77, None, 1481919.0, 55992823.0, None, None, None], ['2017-10-18', 37.285, 37.835, 37.2, 37.685, None, 1179431.0, 44414462.0, None, None, None], ['2017-10-17', 37.19, 37.25, 36.99, 37.125, None, 959055.0, 35623810.0, None, None, None], ['2017-10-16', 36.91, 37.145, 36.695, 37.12, None, 796432.0, 29483832.0, None, None, None], ['2017-10-13', 36.93, 36.955, 36.665, 36.77, None, 1030081.0, 37900999.0, None, None, None], ['2017-10-12', 36.5, 36.995, 36.425, 36.88, None, 1131777.0, 41704147.0, None, None, None], ['2017-10-11', 36.28, 36.49, 36.095, 36.45, None, 741342.0, 26962219.0, None, None, None], ['2017-10-10', 36.36, 36.5, 36.08, 36.31, None, 1184571.0, 43063747.0, None, None, None], ['2017-10-09', 36.045, 36.145, 35.895, 36.125, None, 798410.0, 28795537.0, None, None, None], ['2017-10-06', 36.55, 36.585, 35.885, 35.97, None, 1780610.0, 64285160.0, None, None, None], ['2017-10-05', 36.82, 36.84, 36.35, 36.56, None, 1088678.0, 39791298.0, None, None, None], ['2017-10-04', 36.435, 36.945, 36.135, 36.745, None, 2021500.0, 74201081.0, None, None, None], ['2017-10-02', 36.17, 36.325, 36.0, 36.235, None, 981385.0, 35516802.0, None, None, None], ['2017-09-29', 35.845, 36.01, 35.75, 36.0, None, 1574374.0, 56587390.0, None, None, None], ['2017-09-28', 35.85, 35.885, 35.455, 35.805, None, 1391082.0, 49641573.0, None, None, None], ['2017-09-27', 36.4, 36.4, 35.675, 35.7, None, 1265947.0, 45369154.0, None, None, None], ['2017-09-26', 35.82, 36.515, 35.805, 36.25, None, 1461266.0, 53049635.0, None, None, None], ['2017-09-25', 35.505, 35.93, 35.45, 35.795, None, 864934.0, 30942056.0, None, None, None], ['2017-09-22', 35.41, 35.66, 35.32, 35.505, None, 848527.0, 30112639.0, None, None, None], ['2017-09-21', 35.815, 35.815, 35.35, 35.45, None, 1169809.0, 41477784.0, None, None, None], ['2017-09-20', 35.91, 36.01, 35.7, 35.91, None, 772531.0, 27712890.0, None, None, None], ['2017-09-19', 36.215, 36.26, 35.915, 35.97, None, 867630.0, 31271571.0, None, None, None], ['2017-09-18', 36.635, 36.69, 36.2, 36.22, None, 897147.0, 32668669.0, None, None, None], ['2017-09-15', 36.5, 36.52, 36.125, 36.435, None, 3900972.0, 142003486.0, None, None, None], ['2017-09-14', 36.395, 36.625, 36.275, 36.41, None, 1326481.0, 48313680.0, None, None, None], ['2017-09-13', 36.365, 36.575, 36.25, 36.48, None, 1222826.0, 44582558.0, None, None, None], ['2017-09-12', 36.48, 36.595, 36.36, 36.475, None, 1132496.0, 41307182.0, None, None, None], ['2017-09-11', 36.375, 36.52, 36.255, 36.4, None, 873615.0, 31805844.0, None, None, None], ['2017-09-08', 35.935, 36.305, 35.935, 36.195, None, 980317.0, 35462482.0, None, None, None], ['2017-09-07', 35.8, 35.995, 35.585, 35.935, None, 1244383.0, 44616052.0, None, None, None], ['2017-09-06', 35.0, 35.675, 34.925, 35.55, None, 1262464.0, 44764575.0, None, None, None], ['2017-09-05', 35.425, 35.455, 35.01, 35.195, None, 843906.0, 29727013.0, None, None, None], ['2017-09-04', 35.13, 35.385, 35.1, 35.3, None, 556925.0, 19645220.0, None, None, None], ['2017-09-01', 35.605, 35.685, 35.36, 35.42, None, 786143.0, 27887648.0, None, None, None], ['2017-08-31', 35.435, 35.69, 35.435, 35.505, None, 1190945.0, 42323783.0, None, None, None], ['2017-08-30', 35.16, 35.5, 35.005, 35.285, None, 1117782.0, 39481349.0, None, None, None], ['2017-08-29', 34.885, 35.07, 34.76, 34.945, None, 1153084.0, 40294995.0, None, None, None], ['2017-08-28', 35.02, 35.095, 34.765, 35.035, None, 575476.0, 20128131.0, None, None, None], ['2017-08-25', 35.25, 35.31, 34.985, 35.065, None, 978790.0, 34347195.0, None, None, None], ['2017-08-24', 35.25, 35.525, 35.21, 35.21, None, 808758.0, 28566900.0, None, None, None], ['2017-08-23', 35.445, 35.49, 35.185, 35.265, None, 762435.0, 26899770.0, None, None, None], ['2017-08-22', 35.45, 35.605, 35.4, 35.405, None, 765764.0, 27158693.0, None, None, None], ['2017-08-21', 35.115, 35.36, 34.97, 35.305, None, 778364.0, 27429654.0, None, None, None], ['2017-08-18', 35.305, 35.48, 35.19, 35.255, None, 1156950.0, 40858779.0, None, None, None], ['2017-08-17', 35.425, 35.81, 35.425, 35.49, None, 948061.0, 33743508.0, None, None, None], ['2017-08-16', 35.73, 35.925, 35.41, 35.47, None, 912185.0, 32414293.0, None, None, None], ['2017-08-15', 35.76, 35.885, 35.445, 35.605, None, 1031791.0, 36719404.0, None, None, None], ['2017-08-14', 35.275, 35.89, 35.2, 35.7, None, 1268298.0, 45247331.0, None, None, None], ['2017-08-11', 35.5, 35.64, 34.88, 35.09, None, 1376672.0, 48398546.0, None, None, None], ['2017-08-10', 35.64, 35.7, 35.315, 35.55, None, 954629.0, 33905737.0, None, None, None], ['2017-08-09', 35.54, 35.81, 35.415, 35.64, None, 1032164.0, 36780128.0, None, None, None], ['2017-08-08', 35.565, 35.79, 35.405, 35.71, None, 813306.0, 28992490.0, None, None, None], ['2017-08-07', 36.0, 36.0, 35.4, 35.625, None, 993748.0, 35384039.0, None, None, None], ['2017-08-04', 35.58, 36.005, 35.56, 35.9, None, 1048069.0, 37610121.0, None, None, None], ['2017-08-03', 35.4, 35.845, 35.335, 35.585, None, 1232461.0, 43873041.0, None, None, None], ['2017-08-02', 35.5, 35.77, 35.23, 35.44, None, 2159905.0, 76652742.0, None, None, None], ['2017-08-01', 34.185, 35.03, 34.185, 35.015, None, 1428589.0, 49719043.0, None, None, None], ['2017-07-31', 34.525, 34.625, 34.255, 34.255, None, 1226265.0, 42149590.0, None, None, None], ['2017-07-28', 34.91, 34.91, 34.32, 34.56, None, 1291761.0, 44621693.0, None, None, None], ['2017-07-27', 34.48, 35.345, 34.48, 35.005, None, 1345183.0, 47108133.0, None, None, None], ['2017-07-26', 34.315, 34.55, 34.19, 34.49, None, 1100747.0, 37890368.0, None, None, None], ['2017-07-25', 34.465, 34.57, 34.275, 34.39, None, 831703.0, 28627354.0, None, None, None], ['2017-07-24', 34.475, 34.705, 34.295, 34.38, None, 1065404.0, 36708290.0, None, None, None], ['2017-07-21', 34.42, 34.65, 34.275, 34.465, None, 1219659.0, 42017779.0, None, None, None], ['2017-07-20', 34.67, 34.845, 34.38, 34.43, None, 1120392.0, 38692096.0, None, None, None], ['2017-07-19', 34.585, 34.675, 34.425, 34.555, None, 933429.0, 32231381.0, None, None, None], ['2017-07-18', 34.575, 34.78, 34.48, 34.595, None, 1178023.0, 40774008.0, None, None, None], ['2017-07-17', 35.05, 35.125, 34.55, 34.65, None, 994306.0, 34508852.0, None, None, None], ['2017-07-14', 34.9, 35.175, 34.715, 35.01, None, 1164391.0, 40704830.0, None, None, None], ['2017-07-13', 34.87, 34.995, 34.7, 34.84, None, 909972.0, 31695835.0, None, None, None], ['2017-07-12', 34.16, 34.92, 34.13, 34.815, None, 1203034.0, 41655881.0, None, None, None], ['2017-07-11', 34.59, 34.59, 33.96, 34.17, None, 1193468.0, 40775450.0, None, None, None], ['2017-07-10', 34.145, 34.585, 34.145, 34.43, None, 1113906.0, 38372776.0, None, None, None], ['2017-07-07', 34.07, 34.08, 33.78, 33.95, None, 1155041.0, 39171093.0, None, None, None], ['2017-07-06', 34.525, 34.59, 33.74, 34.1, None, 1661288.0, 56571459.0, None, None, None], ['2017-07-05', 34.34, 34.45, 34.055, 34.445, None, 907138.0, 31133385.0, None, None, None], ['2017-07-04', 34.415, 34.54, 34.25, 34.405, None, 929186.0, 31955883.0, None, None, None], ['2017-07-03', 34.895, 34.91, 34.3, 34.53, None, 1081145.0, 37334057.0, None, None, None], ['2017-06-30', 34.49, 34.83, 34.205, 34.765, None, 1743689.0, 60419168.0, None, None, None], ['2017-06-29', 34.92, 35.215, 34.215, 34.545, None, 1702233.0, 58941623.0, None, None, None], ['2017-06-28', 34.96, 35.15, 34.6, 34.8, None, 1352427.0, 47155417.0, None, None, None], ['2017-06-27', 35.5, 35.59, 35.04, 35.125, None, 971323.0, 34191541.0, None, None, None], ['2017-06-26', 35.64, 35.78, 35.45, 35.5, None, 711806.0, 25324155.0, None, None, None], ['2017-06-23', 35.375, 35.74, 35.365, 35.6, None, 605987.0, 21578659.0, None, None, None], ['2017-06-22', 35.52, 35.555, 34.55, 35.4, None, 1133172.0, 40077360.0, None, None, None], ['2017-06-21', 35.995, 35.995, 35.42, 35.5, None, 1109333.0, 39488323.0, None, None, None], ['2017-06-20', 36.38, 36.385, 35.86, 35.965, None, 1102387.0, 39733201.0, None, None, None], ['2017-06-19', 36.45, 36.565, 36.155, 36.27, None, 751509.0, 27310028.0, None, None, None], ['2017-06-16', 36.285, 36.495, 36.035, 36.35, None, 2708923.0, 98420026.0, None, None, None], ['2017-06-15', 36.345, 36.7, 36.125, 36.185, None, 1394942.0, 50666215.0, None, None, None], ['2017-06-14', 35.95, 36.47, 35.81, 36.275, None, 1474349.0, 53508257.0, None, None, None], ['2017-06-13', 35.775, 36.085, 35.65, 35.83, None, 899809.0, 32285012.0, None, None, None], ['2017-06-12', 35.905, 36.0, 35.405, 35.61, None, 964494.0, 34340062.0, None, None, None], ['2017-06-09', 35.8, 36.03, 35.67, 35.995, None, 855293.0, 30725496.0, None, None, None], ['2017-06-08', 36.26, 36.43, 35.855, 35.89, None, 910894.0, 32860828.0, None, None, None], ['2017-06-07', 36.165, 36.56, 36.06, 36.28, None, 1522772.0, 55358099.0, None, None, None], ['2017-06-06', 35.87, 36.25, 35.535, 36.18, None, 2249405.0, 80988781.0, None, None, None], ['2017-06-02', 35.4, 35.915, 35.32, 35.905, None, 1509212.0, 53890609.0, None, None, None], ['2017-06-01', 34.805, 35.625, 34.635, 35.4, None, 2670943.0, 94268991.0, None, None, None], ['2017-05-31', 34.97, 35.275, 34.895, 34.975, None, 1606543.0, 56280617.0, None, None, None], ['2017-05-30', 34.815, 35.245, 34.745, 35.03, None, 1040767.0, 36479165.0, None, None, None], ['2017-05-29', 35.05, 35.065, 34.77, 34.85, None, 479585.0, 16721712.0, None, None, None], ['2017-05-26', 34.99, 35.28, 34.81, 34.98, None, 1060107.0, 37132136.0, None, None, None], ['2017-05-25', 35.1, 35.25, 34.835, 34.965, None, 744523.0, 26040310.0, None, None, None], ['2017-05-24', 34.955, 35.015, 34.305, 34.92, None, 1710780.0, 59474808.0, None, None, None], ['2017-05-23', 34.83, 34.87, 34.28, 34.495, None, 1399576.0, 48264736.0, None, None, None], ['2017-05-22', 34.39, 34.94, 34.38, 34.825, None, 1222210.0, 42488151.0, None, None, None], ['2017-05-19', 34.37, 34.73, 34.27, 34.35, None, 1819807.0, 62695579.0, None, None, None], ['2017-05-18', 34.45, 34.82, 34.185, 34.34, None, 2155789.0, 74159697.0, None, None, None], ['2017-05-17', 34.57, 34.78, 34.255, 34.66, None, 1915980.0, 66259874.0, None, None, None], ['2017-05-16', 35.655, 35.965, 35.54, 35.865, None, 1829267.0, 65483151.0, None, None, None], ['2017-05-15', 36.1, 36.185, 35.445, 35.655, None, 1621456.0, 57963632.0, None, None, None], ['2017-05-12', 35.55, 35.95, 35.505, 35.95, None, 2399764.0, 86010930.0, None, None, None], ['2017-05-11', 34.82, 35.765, 34.78, 35.55, None, 3126178.0, 110720040.0, None, None, None], ['2017-05-10', 34.65, 34.785, 34.415, 34.785, None, 1419844.0, 49222455.0, None, None, None], ['2017-05-09', 34.48, 34.97, 34.35, 34.64, None, 1750992.0, 60807785.0, None, None, None], ['2017-05-08', 34.15, 34.775, 34.15, 34.47, None, 1968354.0, 67951441.0, None, None, None], ['2017-05-05', 33.83, 34.145, 33.675, 34.085, None, 1485165.0, 50496085.0, None, None, None], ['2017-05-04', 33.685, 33.99, 33.42, 33.835, None, 1603664.0, 54226513.0, None, None, None], ['2017-05-03', 33.595, 33.765, 33.465, 33.59, None, 1248177.0, 41940157.0, None, None, None], ['2017-05-02', 33.39, 33.64, 33.045, 33.57, None, 2020909.0, 67578132.0, None, None, None], ['2017-04-28', 33.965, 33.965, 33.125, 33.235, None, 2250037.0, 74945444.0, None, None, None], ['2017-04-27', 33.75, 34.0, 33.615, 33.85, None, 1189265.0, 40232795.0, None, None, None], ['2017-04-26', 33.775, 33.985, 33.44, 33.89, None, 1173019.0, 39739022.0, None, None, None], ['2017-04-25', 33.43, 34.135, 33.33, 33.89, None, 1668864.0, 56484780.0, None, None, None], ['2017-04-24', 33.505, 33.61, 33.225, 33.38, None, 2505690.0, 83631889.0, None, None, None], ['2017-04-21', 33.645, 33.755, 33.195, 33.505, None, 1830004.0, 61197812.0, None, None, None], ['2017-04-20', 34.125, 34.175, 33.66, 33.7, None, 1464324.0, 49521743.0, None, None, None], ['2017-04-19', 34.315, 34.34, 33.98, 34.16, None, 1497935.0, 51127941.0, None, None, None], ['2017-04-18', 34.42, 34.585, 34.105, 34.375, None, 1456744.0, 49993484.0, None, None, None], ['2017-04-13', 34.3, 34.55, 34.25, 34.55, None, 1130793.0, 39005532.0, None, None, None], ['2017-04-12', 34.155, 34.525, 34.1, 34.355, None, 1418600.0, 48742545.0, None, None, None], ['2017-04-11', 33.905, 34.175, 33.89, 34.15, None, 1334812.0, 45501164.0, None, None, None], ['2017-04-10', 33.9, 33.95, 33.605, 33.945, None, 976008.0, 33022431.0, None, None, None], ['2017-04-07', 33.555, 33.89, 33.55, 33.81, None, 1245354.0, 42058867.0, None, None, None], ['2017-04-06', 33.44, 33.88, 33.44, 33.655, None, 1279422.0, 43062063.0, None, None, None], ['2017-04-05', 33.595, 33.67, 33.405, 33.51, None, 1247907.0, 41841367.0, None, None, None], ['2017-04-04', 33.14, 33.625, 33.12, 33.52, None, 1412273.0, 47301542.0, None, None, None], ['2017-04-03', 33.2, 33.2, 32.95, 33.185, None, 1098924.0, 36377790.0, None, None, None], ['2017-03-31', 32.585, 33.045, 32.55, 33.03, None, 1400053.0, 46049974.0, None, None, None], ['2017-03-30', 32.8, 32.805, 32.555, 32.715, None, 1138883.0, 37212643.0, None, None, None], ['2017-03-29', 32.45, 32.765, 32.295, 32.765, None, 1366373.0, 44540644.0, None, None, None], ['2017-03-28', 32.67, 32.765, 32.32, 32.46, None, 1358644.0, 44132290.0, None, None, None], ['2017-03-27', 32.6, 32.77, 32.405, 32.595, None, 990944.0, 32283093.0, None, None, None], ['2017-03-24', 32.52, 32.76, 32.485, 32.68, None, 948258.0, 30996490.0, None, None, None], ['2017-03-23', 32.445, 32.59, 32.32, 32.59, None, 1372593.0, 44624296.0, None, None, None], ['2017-03-22', 32.395, 32.61, 32.395, 32.445, None, 1331064.0, 43221125.0, None, None, None], ['2017-03-21', 32.58, 32.58, 32.4, 32.505, None, 1034376.0, 33593372.0, None, None, None], ['2017-03-20', 32.645, 32.745, 32.52, 32.55, None, 933804.0, 30443315.0, None, None, None], ['2017-03-17', 32.525, 32.745, 32.38, 32.71, None, 2486474.0, 81149012.0, None, None, None], ['2017-03-16', 32.49, 32.65, 32.43, 32.585, None, 2091661.0, 68106355.0, None, None, None], ['2017-03-15', 32.27, 32.27, 31.985, 32.215, None, 1154450.0, 37132114.0, None, None, None], ['2017-03-14', 32.025, 32.29, 31.92, 32.185, None, 1367474.0, 43883777.0, None, None, None], ['2017-03-13', 32.0, 32.28, 32.0, 32.1, None, 1344172.0, 43149844.0, None, None, None], ['2017-03-10', 32.765, 32.765, 32.005, 32.05, None, 2805533.0, 90397453.0, None, None, None], ['2017-03-09', 32.55, 32.87, 32.43, 32.655, None, 1521825.0, 49731230.0, None, None, None], ['2017-03-08', 32.59, 32.59, 32.27, 32.55, None, 1583434.0, 51386372.0, None, None, None], ['2017-03-07', 32.8, 33.18, 32.435, 32.62, None, 2264252.0, 74099675.0, None, None, None], ['2017-03-06', 32.665, 32.905, 32.575, 32.895, None, 1485150.0, 48649782.0, None, None, None], ['2017-03-03', 33.025, 33.04, 32.66, 32.82, None, 1780099.0, 58419579.0, None, None, None], ['2017-03-02', 33.095, 33.15, 32.89, 33.1, None, 1392995.0, 46026980.0, None, None, None], ['2017-03-01', 33.0, 33.09, 32.81, 33.06, None, 1587643.0, 52361412.0, None, None, None], ['2017-02-28', 33.025, 33.18, 32.625, 32.89, None, 2165586.0, 71214194.0, None, None, None], ['2017-02-27', 33.31, 33.315, 32.87, 33.04, None, 1242571.0, 41015807.0, None, None, None], ['2017-02-24', 33.35, 33.46, 33.085, 33.25, None, 1569880.0, 52174520.0, None, None, None], ['2017-02-23', 33.345, 33.405, 33.15, 33.35, None, 1112515.0, 37041481.0, None, None, None], ['2017-02-22', 33.0, 33.485, 32.97, 33.31, None, 1981963.0, 65992846.0, None, None, None], ['2017-02-21', 32.78, 33.075, 32.75, 32.95, None, 1321345.0, 43526332.0, None, None, None], ['2017-02-20', 33.0, 33.05, 32.835, 32.86, None, 701112.0, 23076010.0, None, None, None], ['2017-02-17', 32.83, 33.065, 32.62, 32.88, None, 1609227.0, 52901994.0, None, None, None], ['2017-02-16', 32.76, 32.94, 32.6, 32.865, None, 1368754.0, 44911948.0, None, None, None], ['2017-02-15', 32.615, 32.885, 32.535, 32.86, None, 1999129.0, 65480253.0, None, None, None], ['2017-02-14', 32.35, 32.515, 32.145, 32.505, None, 1588415.0, 51460458.0, None, None, None], ['2017-02-13', 32.355, 32.395, 32.15, 32.18, None, 1471864.0, 47486838.0, None, None, None], ['2017-02-10', 32.255, 32.29, 32.06, 32.29, None, 1471607.0, 47422355.0, None, None, None], ['2017-02-09', 32.365, 32.385, 31.935, 32.2, None, 2312232.0, 74509222.0, None, None, None], ['2017-02-08', 31.32, 32.32, 31.215, 32.2, None, 2809351.0, 89874852.0, None, None, None], ['2017-02-07', 30.67, 31.375, 30.59, 31.355, None, 1724119.0, 53663330.0, None, None, None], ['2017-02-06', 30.665, 30.835, 30.55, 30.58, None, 1514442.0, 46432461.0, None, None, None], ['2017-02-03', 30.795, 31.015, 30.66, 30.78, None, 1105674.0, 34038970.0, None, None, None], ['2017-02-02', 30.765, 30.915, 30.605, 30.665, None, 1362135.0, 41892577.0, None, None, None], ['2017-02-01', 30.63, 30.95, 30.505, 30.755, None, 1953175.0, 60079315.0, None, None, None], ['2017-01-31', 30.01, 30.365, 29.905, 30.27, None, 1571973.0, 47483499.0, None, None, None], ['2017-01-30', 30.05, 30.19, 29.745, 30.06, None, 1261362.0, 37810228.0, None, None, None], ['2017-01-27', 30.045, 30.08, 29.73, 30.015, None, 1361939.0, 40718988.0, None, None, None], ['2017-01-26', 30.07, 30.12, 29.81, 29.985, None, 1881781.0, 56384464.0, None, None, None], ['2017-01-25', 30.11, 30.145, 29.825, 29.955, None, 1918842.0, 57497812.0, None, None, None], ['2017-01-24', 30.46, 30.515, 30.05, 30.05, None, 1782575.0, 53883315.0, None, None, None], ['2017-01-23', 30.445, 30.555, 30.15, 30.385, None, 1923439.0, 58375436.0, None, None, None], ['2017-01-20', 30.42, 30.54, 30.005, 30.38, None, 1727697.0, 52422042.0, None, None, None], ['2017-01-19', 30.955, 30.955, 30.345, 30.45, None, 1737477.0, 53047844.0, None, None, None], ['2017-01-18', 30.95, 31.065, 30.775, 30.995, None, 1194228.0, 36964666.0, None, None, None], ['2017-01-17', 31.165, 31.17, 30.79, 30.9, None, 1208729.0, 37359507.0, None, None, None], ['2017-01-16', 30.93, 31.35, 30.93, 31.19, None, 920478.0, 28727634.0, None, None, None], ['2017-01-13', 31.215, 31.38, 30.88, 30.95, None, 1134887.0, 35256121.0, None, None, None], ['2017-01-12', 31.4, 31.44, 31.095, 31.16, None, 1269233.0, 39595118.0, None, None, None], ['2017-01-11', 31.39, 31.535, 31.255, 31.4, None, 1181293.0, 37089422.0, None, None, None], ['2017-01-10', 31.09, 31.525, 31.02, 31.475, None, 1241573.0, 38995926.0, None, None, None], ['2017-01-09', 31.38, 31.475, 31.025, 31.025, None, 1007257.0, 31355905.0, None, None, None], ['2017-01-06', 31.425, 31.75, 31.175, 31.25, None, 1236453.0, 38846256.0, None, None, None], ['2017-01-05', 31.065, 31.45, 31.03, 31.405, None, 1652789.0, 51686972.0, None, None, None], ['2017-01-04', 30.85, 30.96, 30.44, 30.8, None, 1265640.0, 38936241.0, None, None, None], ['2017-01-03', 31.48, 31.48, 30.745, 30.8, None, 1613584.0, 49922671.0, None, None, None], ['2017-01-02', 31.05, 31.48, 30.865, 31.35, None, 574317.0, 17953577.0, None, None, None]]\n" + ] + } + ], + "source": [ + "dataset = json['dataset']['data']\n", + "print(dataset)" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, "outputs": [], - "metadata": {} + "source": [ + "#3. Calculate what the highest and lowest opening prices were for the stock in this period.\n", + "open_prices = {}\n", + "for data in dataset:\n", + " open_prices[data[0]] = data[1]\n", + "open_max = max(open_prices, key=open_prices.get), ':', max(open_prices.values())\n", + "open_min = min(open_prices, key=open_prices.get), ':', min(open_prices.values())" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('2017-12-19', ':', 41.95)\n", + "('2017-01-31', ':', 30.01)\n" + ] + } + ], + "source": [ + "print(open_max)\n", + "print(open_min)" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('2017-11-08', ':', 1.3350000000000009)\n" + ] + } + ], + "source": [ + "#4. What was the largest change in any one day (based on High and Low price)?\n", + "change_in_day = {}\n", + "for data in dataset:\n", + " change_in_day[data[0]] = data[2] - data[3]\n", + "max_change_in_day = max(change_in_day, key=change_in_day.get), ':', max(change_in_day.values())\n", + "print(max_change_in_day)" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(('2017-05-17', 'to', '2017-05-16'), ':', 1.2050000000000054)\n" + ] + } + ], + "source": [ + "#5. What was the largest change between any two days (based on Closing Price)?\n", + "change_btw_days = {}\n", + "for i in range(len(dataset) - 1):\n", + " change_btw_days[dataset[i][0], 'to', dataset[i+1][0]] = abs(dataset[i][4] - dataset[i+1][4])\n", + "max_change_btw_days = max(change_btw_days, key=change_btw_days.get), \":\", max(change_btw_days.values())\n", + "print(max_change_btw_days)" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1356351.1746031747\n" + ] + } + ], + "source": [ + "#6. What was the average daily trading volume during this year?\n", + "volumes = []\n", + "for data in dataset:\n", + " volumes.append(data[6])\n", + "total_vol = sum(volumes)\n", + "trading_days = len(volumes)\n", + "average_vol = total_vol / trading_days\n", + "print(average_vol)" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1253768.0\n" + ] + } + ], + "source": [ + "#7. Optional) What was the median trading volume during this year. (Note: you may need to implement your own function for calculating the median.)\n", + "volumes.sort()\n", + "median = (volumes[int(len(volumes)/ 2)] + volumes[int(len(volumes) / 2) - 1]) / 2\n", + "print(median)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[479585.0,\n", + " 556925.0,\n", + " 574317.0,\n", + " 575476.0,\n", + " 601057.0,\n", + " 605987.0,\n", + " 608053.0,\n", + " 701112.0,\n", + " 711806.0,\n", + " 732911.0,\n", + " 741342.0,\n", + " 744523.0,\n", + " 751509.0,\n", + " 762435.0,\n", + " 765764.0,\n", + " 772531.0,\n", + " 773139.0,\n", + " 778364.0,\n", + " 786143.0,\n", + " 796432.0,\n", + " 798410.0,\n", + " 808758.0,\n", + " 813306.0,\n", + " 831703.0,\n", + " 843468.0,\n", + " 843906.0,\n", + " 848527.0,\n", + " 855293.0,\n", + " 864934.0,\n", + " 867630.0,\n", + " 873615.0,\n", + " 897147.0,\n", + " 899809.0,\n", + " 907138.0,\n", + " 909972.0,\n", + " 910894.0,\n", + " 912185.0,\n", + " 920478.0,\n", + " 929186.0,\n", + " 933429.0,\n", + " 933804.0,\n", + " 948061.0,\n", + " 948258.0,\n", + " 954629.0,\n", + " 959055.0,\n", + " 964494.0,\n", + " 971323.0,\n", + " 976008.0,\n", + " 978790.0,\n", + " 980317.0,\n", + " 981385.0,\n", + " 985055.0,\n", + " 990944.0,\n", + " 993748.0,\n", + " 994306.0,\n", + " 999933.0,\n", + " 1007257.0,\n", + " 1010748.0,\n", + " 1018883.0,\n", + " 1030081.0,\n", + " 1031791.0,\n", + " 1032164.0,\n", + " 1034376.0,\n", + " 1036110.0,\n", + " 1040767.0,\n", + " 1043727.0,\n", + " 1048069.0,\n", + " 1048127.0,\n", + " 1057105.0,\n", + " 1060107.0,\n", + " 1065404.0,\n", + " 1081145.0,\n", + " 1088678.0,\n", + " 1095660.0,\n", + " 1098924.0,\n", + " 1100747.0,\n", + " 1102387.0,\n", + " 1103999.0,\n", + " 1105674.0,\n", + " 1109333.0,\n", + " 1112515.0,\n", + " 1113906.0,\n", + " 1117782.0,\n", + " 1120392.0,\n", + " 1130793.0,\n", + " 1131777.0,\n", + " 1132496.0,\n", + " 1133172.0,\n", + " 1134887.0,\n", + " 1138883.0,\n", + " 1146901.0,\n", + " 1147296.0,\n", + " 1153084.0,\n", + " 1154450.0,\n", + " 1155041.0,\n", + " 1156950.0,\n", + " 1161907.0,\n", + " 1164391.0,\n", + " 1169809.0,\n", + " 1173019.0,\n", + " 1178023.0,\n", + " 1179431.0,\n", + " 1180003.0,\n", + " 1181293.0,\n", + " 1182044.0,\n", + " 1184571.0,\n", + " 1189265.0,\n", + " 1190945.0,\n", + " 1193468.0,\n", + " 1194228.0,\n", + " 1203034.0,\n", + " 1205912.0,\n", + " 1208729.0,\n", + " 1219659.0,\n", + " 1222210.0,\n", + " 1222826.0,\n", + " 1226265.0,\n", + " 1232461.0,\n", + " 1236453.0,\n", + " 1241573.0,\n", + " 1242571.0,\n", + " 1243035.0,\n", + " 1244383.0,\n", + " 1245354.0,\n", + " 1247907.0,\n", + " 1248177.0,\n", + " 1259359.0,\n", + " 1261362.0,\n", + " 1262464.0,\n", + " 1265640.0,\n", + " 1265947.0,\n", + " 1268298.0,\n", + " 1269233.0,\n", + " 1279422.0,\n", + " 1281333.0,\n", + " 1289642.0,\n", + " 1291761.0,\n", + " 1314959.0,\n", + " 1321182.0,\n", + " 1321345.0,\n", + " 1326481.0,\n", + " 1331064.0,\n", + " 1334812.0,\n", + " 1344172.0,\n", + " 1345183.0,\n", + " 1352427.0,\n", + " 1358644.0,\n", + " 1361939.0,\n", + " 1362135.0,\n", + " 1362626.0,\n", + " 1366373.0,\n", + " 1367474.0,\n", + " 1368754.0,\n", + " 1372593.0,\n", + " 1376033.0,\n", + " 1376672.0,\n", + " 1378274.0,\n", + " 1384516.0,\n", + " 1391082.0,\n", + " 1392995.0,\n", + " 1394942.0,\n", + " 1399576.0,\n", + " 1400053.0,\n", + " 1408279.0,\n", + " 1411562.0,\n", + " 1412273.0,\n", + " 1418600.0,\n", + " 1419844.0,\n", + " 1423857.0,\n", + " 1428589.0,\n", + " 1456744.0,\n", + " 1461266.0,\n", + " 1464324.0,\n", + " 1471607.0,\n", + " 1471864.0,\n", + " 1474349.0,\n", + " 1477381.0,\n", + " 1481919.0,\n", + " 1485150.0,\n", + " 1485165.0,\n", + " 1493605.0,\n", + " 1495815.0,\n", + " 1497935.0,\n", + " 1509212.0,\n", + " 1514442.0,\n", + " 1521825.0,\n", + " 1522772.0,\n", + " 1531366.0,\n", + " 1569880.0,\n", + " 1571973.0,\n", + " 1574374.0,\n", + " 1583434.0,\n", + " 1587643.0,\n", + " 1588415.0,\n", + " 1603664.0,\n", + " 1606543.0,\n", + " 1609227.0,\n", + " 1613584.0,\n", + " 1621456.0,\n", + " 1652789.0,\n", + " 1661288.0,\n", + " 1668864.0,\n", + " 1702233.0,\n", + " 1710780.0,\n", + " 1724119.0,\n", + " 1727697.0,\n", + " 1737477.0,\n", + " 1743689.0,\n", + " 1744271.0,\n", + " 1750992.0,\n", + " 1762497.0,\n", + " 1773417.0,\n", + " 1780099.0,\n", + " 1780610.0,\n", + " 1782575.0,\n", + " 1810355.0,\n", + " 1819807.0,\n", + " 1829267.0,\n", + " 1830004.0,\n", + " 1841312.0,\n", + " 1881781.0,\n", + " 1915980.0,\n", + " 1918842.0,\n", + " 1923439.0,\n", + " 1948545.0,\n", + " 1953175.0,\n", + " 1968354.0,\n", + " 1981963.0,\n", + " 1999129.0,\n", + " 2020909.0,\n", + " 2021500.0,\n", + " 2091661.0,\n", + " 2098187.0,\n", + " 2133301.0,\n", + " 2155789.0,\n", + " 2159905.0,\n", + " 2165586.0,\n", + " 2249405.0,\n", + " 2250037.0,\n", + " 2264252.0,\n", + " 2312232.0,\n", + " 2399764.0,\n", + " 2486474.0,\n", + " 2505690.0,\n", + " 2670943.0,\n", + " 2708923.0,\n", + " 2733044.0,\n", + " 2805533.0,\n", + " 2809351.0,\n", + " 3040962.0,\n", + " 3126178.0,\n", + " 3900972.0]" + ] + }, + "execution_count": 117, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] }, { "cell_type": "code", "execution_count": null, - "source": [], + "metadata": {}, "outputs": [], - "metadata": {} + "source": [] } ], "metadata": { + "interpreter": { + "hash": "4885f37acae9217c235118400878352aafa7b76e66df698a1f601374f86939a7" + }, "kernelspec": { - "name": "python3", - "display_name": "Python 3.7.9 64-bit ('springboard': conda)" + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -186,12 +611,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" - }, - "interpreter": { - "hash": "4885f37acae9217c235118400878352aafa7b76e66df698a1f601374f86939a7" + "version": "3.10.6" } }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/mec-3.4.1-api-mini-project/python.gitignore b/mec-3.4.1-api-mini-project/python.gitignore new file mode 100644 index 00000000..1c22fb78 --- /dev/null +++ b/mec-3.4.1-api-mini-project/python.gitignore @@ -0,0 +1,160 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# py +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ \ No newline at end of file From 0e1a6e3a647c2fcd61d01b1cdc3f0d46f3626b99 Mon Sep 17 00:00:00 2001 From: csmitty3 Date: Tue, 18 Oct 2022 19:06:46 -0400 Subject: [PATCH 2/7] Update .env --- mec-3.4.1-api-mini-project/.env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mec-3.4.1-api-mini-project/.env b/mec-3.4.1-api-mini-project/.env index 5080b71a..8b137891 100644 --- a/mec-3.4.1-api-mini-project/.env +++ b/mec-3.4.1-api-mini-project/.env @@ -1 +1 @@ -API_KEY='7MadrSm5uJz-31r7rF4z' \ No newline at end of file + From 5d746f14954de9724c76dbf8c4c80c59cd265f8e Mon Sep 17 00:00:00 2001 From: Conor Smith Date: Mon, 24 Oct 2022 07:34:46 -0400 Subject: [PATCH 3/7] Mostly Finished --- .../Mini_Project_Data_Wrangling_Pandas.ipynb | 2026 +++++++++++++++-- 1 file changed, 1869 insertions(+), 157 deletions(-) diff --git a/mec-5.3.10-data-wranging-with-pandas-mini-project/Mini_Project_Data_Wrangling_Pandas.ipynb b/mec-5.3.10-data-wranging-with-pandas-mini-project/Mini_Project_Data_Wrangling_Pandas.ipynb index ed51607a..4c8beee7 100755 --- a/mec-5.3.10-data-wranging-with-pandas-mini-project/Mini_Project_Data_Wrangling_Pandas.ipynb +++ b/mec-5.3.10-data-wranging-with-pandas-mini-project/Mini_Project_Data_Wrangling_Pandas.ipynb @@ -36,14 +36,14 @@ "metadata": {}, "outputs": [ { - "output_type": "execute_result", "data": { "text/plain": [ - "'0.25.3'" + "'1.4.4'" ] }, + "execution_count": 2, "metadata": {}, - "execution_count": 2 + "output_type": "execute_result" } ], "source": [ @@ -162,6 +162,13 @@ "movies.head()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "metadata": {}, @@ -176,14 +183,26 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "\nRangeIndex: 3786176 entries, 0 to 3786175\nData columns (total 6 columns):\ntitle object\nyear int64\nname object\ntype object\ncharacter object\nn float64\ndtypes: float64(1), int64(1), object(4)\nmemory usage: 173.3+ MB\n" + "\n", + "RangeIndex: 3786176 entries, 0 to 3786175\n", + "Data columns (total 6 columns):\n", + " # Column Dtype \n", + "--- ------ ----- \n", + " 0 title object \n", + " 1 year int64 \n", + " 2 name object \n", + " 3 type object \n", + " 4 character object \n", + " 5 n float64\n", + "dtypes: float64(1), int64(1), object(4)\n", + "memory usage: 173.3+ MB\n" ] } ], @@ -379,7 +398,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -407,7 +426,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -486,7 +505,7 @@ "4 #Ewankosau saranghaeyo 2015 Philippines 2015-01-21" ] }, - "execution_count": 8, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -511,9 +530,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "244914" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "len(movies)" ] @@ -527,9 +557,67 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total Batman Movies: 2\n" + ] + }, + { + "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", + "
titleyear
52734Batman1943
150621Batman1989
\n", + "
" + ], + "text/plain": [ + " title year\n", + "52734 Batman 1943\n", + "150621 Batman 1989" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "batman_df = movies[movies.title == 'Batman']\n", "print('Total Batman Movies:', len(batman_df))\n", @@ -545,9 +633,115 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Total Batman Movies: 35\n" + ] + }, + { + "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", + "
titleyear
16813Batman: Anarchy2016
30236Batman Forever1995
31674Batman Untold2010
31711Scooby-Doo & Batman: the Brave and the Bold2018
41881Batman the Rise of Red Hood2018
43484Batman: Return of the Caped Crusaders2016
46333Batman & Robin1997
51811Batman Revealed2012
52734Batman1943
56029Batman Beyond: Rising Knight2014
\n", + "
" + ], + "text/plain": [ + " title year\n", + "16813 Batman: Anarchy 2016\n", + "30236 Batman Forever 1995\n", + "31674 Batman Untold 2010\n", + "31711 Scooby-Doo & Batman: the Brave and the Bold 2018\n", + "41881 Batman the Rise of Red Hood 2018\n", + "43484 Batman: Return of the Caped Crusaders 2016\n", + "46333 Batman & Robin 1997\n", + "51811 Batman Revealed 2012\n", + "52734 Batman 1943\n", + "56029 Batman Beyond: Rising Knight 2014" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "batman_df = movies[movies.title.str.contains('Batman', case=False)]\n", "print('Total Batman Movies:', len(batman_df))\n", @@ -563,9 +757,138 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "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", + "
titleyear
52734Batman1943
100056Batman and Robin1949
161439Batman Dracula1964
84327Alyas Batman at Robin1965
68364James Batman1966
161527Batman: The Movie1966
56159Batman Fights Dracula1967
168504Fight! Batman, Fight!1973
150621Batman1989
156239Alyas Batman en Robin1991
156755Batman Returns1992
63366Batman: Mask of the Phantasm1993
30236Batman Forever1995
46333Batman & Robin1997
208220Batman Begins2005
\n", + "
" + ], + "text/plain": [ + " title year\n", + "52734 Batman 1943\n", + "100056 Batman and Robin 1949\n", + "161439 Batman Dracula 1964\n", + "84327 Alyas Batman at Robin 1965\n", + "68364 James Batman 1966\n", + "161527 Batman: The Movie 1966\n", + "56159 Batman Fights Dracula 1967\n", + "168504 Fight! Batman, Fight! 1973\n", + "150621 Batman 1989\n", + "156239 Alyas Batman en Robin 1991\n", + "156755 Batman Returns 1992\n", + "63366 Batman: Mask of the Phantasm 1993\n", + "30236 Batman Forever 1995\n", + "46333 Batman & Robin 1997\n", + "208220 Batman Begins 2005" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "batman_df.sort_values(by=['year'], ascending=True).iloc[:15]" ] @@ -579,55 +902,182 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### How many movies were made in the year 2017?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "len(movies[movies.year == 2017])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Section I - Q2 : How many movies were made in the year 2015?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "markdown", + "execution_count": 12, "metadata": {}, - "source": [ + "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", + "
titleyear
143147Harry Potter and the Deathly Hallows: Part 22011
152831Harry Potter and the Deathly Hallows: Part 12010
109213Harry Potter and the Half-Blood Prince2009
50581Harry Potter and the Order of the Phoenix2007
187926Harry Potter and the Goblet of Fire2005
61957Harry Potter and the Prisoner of Azkaban2004
82791Harry Potter and the Chamber of Secrets2002
223087Harry Potter and the Sorcerer's Stone2001
\n", + "
" + ], + "text/plain": [ + " title year\n", + "143147 Harry Potter and the Deathly Hallows: Part 2 2011\n", + "152831 Harry Potter and the Deathly Hallows: Part 1 2010\n", + "109213 Harry Potter and the Half-Blood Prince 2009\n", + "50581 Harry Potter and the Order of the Phoenix 2007\n", + "187926 Harry Potter and the Goblet of Fire 2005\n", + "61957 Harry Potter and the Prisoner of Azkaban 2004\n", + "82791 Harry Potter and the Chamber of Secrets 2002\n", + "223087 Harry Potter and the Sorcerer's Stone 2001" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "harry_potter_df = movies[movies.title.str.contains('Harry Potter', case=False)].sort_values(by='year', ascending=False)\n", + "harry_potter_df" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### How many movies were made in the year 2017?" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "11474" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(movies[movies.year == 2017])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Section I - Q2 : How many movies were made in the year 2015?" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "8702" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(movies[movies['year'] == 2015])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "### Section I - Q3 : How many movies were made from 2000 till 2018?\n", "- You can chain multiple conditions using OR (`|`) as well as AND (`&`) depending on the condition" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "244914" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(movies[(movies['year'] >= 2000) & movies['year'] <= 2018])" + ] }, { "cell_type": "markdown", @@ -638,10 +1088,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "20" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(movies[movies['title'] == 'Hamlet'])" + ] }, { "cell_type": "markdown", @@ -654,10 +1117,94 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], - "source": [] + "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", + "
titleyear
55639Hamlet2000
1931Hamlet2009
227953Hamlet2011
178290Hamlet2014
186137Hamlet2015
191940Hamlet2016
244747Hamlet2017
\n", + "
" + ], + "text/plain": [ + " title year\n", + "55639 Hamlet 2000\n", + "1931 Hamlet 2009\n", + "227953 Hamlet 2011\n", + "178290 Hamlet 2014\n", + "186137 Hamlet 2015\n", + "191940 Hamlet 2016\n", + "244747 Hamlet 2017" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hamlet_df = movies[(movies['title'] == 'Hamlet') & (movies['year'] >= 2000)].sort_values(by='year')\n", + "hamlet_df" + ] }, { "cell_type": "markdown", @@ -670,10 +1217,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "27" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(cast[(cast['title'] == 'Inception') & (cast['n'].isna())])" + ] }, { "cell_type": "markdown", @@ -685,10 +1245,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "51" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(cast[(cast['title'] == 'Inception') & cast['n']])" + ] }, { "cell_type": "markdown", @@ -701,37 +1274,422 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, - "outputs": [], - "source": [] + "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", + "
titleyearnametypecharactern
590576Inception2010Leonardo DiCaprioactorCobb1.0
859993Inception2010Joseph Gordon-LevittactorArthur2.0
3387147Inception2010Ellen PageactressAriadne3.0
940923Inception2010Tom HardyactorEames4.0
2406531Inception2010Ken WatanabeactorSaito5.0
1876301Inception2010Dileep RaoactorYusuf6.0
1615709Inception2010Cillian MurphyactorRobert Fischer7.0
183937Inception2010Tom BerengeractorBrowning8.0
2765969Inception2010Marion CotillardactressMal9.0
1826027Inception2010Pete PostlethwaiteactorMaurice Fischer10.0
\n", + "
" + ], + "text/plain": [ + " title year name type character n\n", + "590576 Inception 2010 Leonardo DiCaprio actor Cobb 1.0\n", + "859993 Inception 2010 Joseph Gordon-Levitt actor Arthur 2.0\n", + "3387147 Inception 2010 Ellen Page actress Ariadne 3.0\n", + "940923 Inception 2010 Tom Hardy actor Eames 4.0\n", + "2406531 Inception 2010 Ken Watanabe actor Saito 5.0\n", + "1876301 Inception 2010 Dileep Rao actor Yusuf 6.0\n", + "1615709 Inception 2010 Cillian Murphy actor Robert Fischer 7.0\n", + "183937 Inception 2010 Tom Berenger actor Browning 8.0\n", + "2765969 Inception 2010 Marion Cotillard actress Mal 9.0\n", + "1826027 Inception 2010 Pete Postlethwaite actor Maurice Fischer 10.0" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "topten_inception = cast[(cast['title'] == 'Inception')].sort_values(by='n').iloc[:10]\n", + "topten_inception" + ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Section I - Q9:\n", - "\n", - "(A) List all movies where there was a character 'Albus Dumbledore' \n", - "\n", - "(B) Now modify the above to show only the actors who played the character 'Albus Dumbledore'\n", - "- For Part (B) remember the same actor might play the same role in multiple movies" + "### Section I - Q9:\n", + "\n", + "(A) List all movies where there was a character 'Albus Dumbledore' \n", + "\n", + "(B) Now modify the above to show only the actors who played the character 'Albus Dumbledore'\n", + "- For Part (B) remember the same actor might play the same role in multiple movies" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "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", + "
titleyearnametypecharactern
704984Epic Movie2007Dane FarwellactorAlbus Dumbledore17.0
792421Harry Potter and the Goblet of Fire2005Michael GambonactorAlbus Dumbledore37.0
792423Harry Potter and the Order of the Phoenix2007Michael GambonactorAlbus Dumbledore36.0
792424Harry Potter and the Prisoner of Azkaban2004Michael GambonactorAlbus Dumbledore27.0
947789Harry Potter and the Chamber of Secrets2002Richard HarrisactorAlbus Dumbledore32.0
947790Harry Potter and the Sorcerer's Stone2001Richard HarrisactorAlbus Dumbledore1.0
1685537Ultimate Hero Project2013George (X) O'ConnoractorAlbus DumbledoreNaN
2248085Potter2015Timothy TedmansonactorAlbus DumbledoreNaN
\n", + "
" + ], + "text/plain": [ + " title year name \\\n", + "704984 Epic Movie 2007 Dane Farwell \n", + "792421 Harry Potter and the Goblet of Fire 2005 Michael Gambon \n", + "792423 Harry Potter and the Order of the Phoenix 2007 Michael Gambon \n", + "792424 Harry Potter and the Prisoner of Azkaban 2004 Michael Gambon \n", + "947789 Harry Potter and the Chamber of Secrets 2002 Richard Harris \n", + "947790 Harry Potter and the Sorcerer's Stone 2001 Richard Harris \n", + "1685537 Ultimate Hero Project 2013 George (X) O'Connor \n", + "2248085 Potter 2015 Timothy Tedmanson \n", + "\n", + " type character n \n", + "704984 actor Albus Dumbledore 17.0 \n", + "792421 actor Albus Dumbledore 37.0 \n", + "792423 actor Albus Dumbledore 36.0 \n", + "792424 actor Albus Dumbledore 27.0 \n", + "947789 actor Albus Dumbledore 32.0 \n", + "947790 actor Albus Dumbledore 1.0 \n", + "1685537 actor Albus Dumbledore NaN \n", + "2248085 actor Albus Dumbledore NaN " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dumbledore = cast[cast['character'] == 'Albus Dumbledore']\n", + "dumbledore" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "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", + "
titleyearnametypecharactern
792421Harry Potter and the Goblet of Fire2005Michael GambonactorAlbus Dumbledore37.0
792423Harry Potter and the Order of the Phoenix2007Michael GambonactorAlbus Dumbledore36.0
792424Harry Potter and the Prisoner of Azkaban2004Michael GambonactorAlbus Dumbledore27.0
947789Harry Potter and the Chamber of Secrets2002Richard HarrisactorAlbus Dumbledore32.0
947790Harry Potter and the Sorcerer's Stone2001Richard HarrisactorAlbus Dumbledore1.0
\n", + "
" + ], + "text/plain": [ + " title year name \\\n", + "792421 Harry Potter and the Goblet of Fire 2005 Michael Gambon \n", + "792423 Harry Potter and the Order of the Phoenix 2007 Michael Gambon \n", + "792424 Harry Potter and the Prisoner of Azkaban 2004 Michael Gambon \n", + "947789 Harry Potter and the Chamber of Secrets 2002 Richard Harris \n", + "947790 Harry Potter and the Sorcerer's Stone 2001 Richard Harris \n", + "\n", + " type character n \n", + "792421 actor Albus Dumbledore 37.0 \n", + "792423 actor Albus Dumbledore 36.0 \n", + "792424 actor Albus Dumbledore 27.0 \n", + "947789 actor Albus Dumbledore 32.0 \n", + "947790 actor Albus Dumbledore 1.0 " + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hp_dumbledore = dumbledore[dumbledore['title'].str.contains('Harry Potter', case=False)]\n", + "hp_dumbledore" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, { "cell_type": "markdown", "metadata": {}, @@ -745,17 +1703,243 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "62" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(cast[cast['name'] == 'Keanu Reeves'])" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, - "outputs": [], - "source": [] + "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", + "
titleyearnametypecharactern
1892390The Matrix1999Keanu ReevesactorNeo1.0
1892397The Replacements2000Keanu ReevesactorShane Falco1.0
1892358Hard Ball2001Keanu ReevesactorConor O'Neill1.0
1892383Sweet November2001Keanu ReevesactorNelson Moss1.0
1892348Constantine2005Keanu ReevesactorJohn Constantine1.0
1892388The Lake House2006Keanu ReevesactorAlex Wyler1.0
1892382Street Kings2008Keanu ReevesactorDetective Tom Ludlow1.0
1892385The Day the Earth Stood Still2008Keanu ReevesactorKlaatu1.0
1892359Henry's Crime2010Keanu ReevesactorHenry Torne1.0
189234247 Ronin2013Keanu ReevesactorKai1.0
1892361John Wick2014Keanu ReevesactorJohn Wick1.0
1892366Knock Knock2015Keanu ReevesactorEvan1.0
1892399The Whole Truth2016Keanu ReevesactorRamsey1.0
1892362John Wick: Chapter 22017Keanu ReevesactorJohn Wick1.0
1892378Siberia2018Keanu ReevesactorLucas Hill1.0
\n", + "
" + ], + "text/plain": [ + " title year name type \\\n", + "1892390 The Matrix 1999 Keanu Reeves actor \n", + "1892397 The Replacements 2000 Keanu Reeves actor \n", + "1892358 Hard Ball 2001 Keanu Reeves actor \n", + "1892383 Sweet November 2001 Keanu Reeves actor \n", + "1892348 Constantine 2005 Keanu Reeves actor \n", + "1892388 The Lake House 2006 Keanu Reeves actor \n", + "1892382 Street Kings 2008 Keanu Reeves actor \n", + "1892385 The Day the Earth Stood Still 2008 Keanu Reeves actor \n", + "1892359 Henry's Crime 2010 Keanu Reeves actor \n", + "1892342 47 Ronin 2013 Keanu Reeves actor \n", + "1892361 John Wick 2014 Keanu Reeves actor \n", + "1892366 Knock Knock 2015 Keanu Reeves actor \n", + "1892399 The Whole Truth 2016 Keanu Reeves actor \n", + "1892362 John Wick: Chapter 2 2017 Keanu Reeves actor \n", + "1892378 Siberia 2018 Keanu Reeves actor \n", + "\n", + " character n \n", + "1892390 Neo 1.0 \n", + "1892397 Shane Falco 1.0 \n", + "1892358 Conor O'Neill 1.0 \n", + "1892383 Nelson Moss 1.0 \n", + "1892348 John Constantine 1.0 \n", + "1892388 Alex Wyler 1.0 \n", + "1892382 Detective Tom Ludlow 1.0 \n", + "1892385 Klaatu 1.0 \n", + "1892359 Henry Torne 1.0 \n", + "1892342 Kai 1.0 \n", + "1892361 John Wick 1.0 \n", + "1892366 Evan 1.0 \n", + "1892399 Ramsey 1.0 \n", + "1892362 John Wick 1.0 \n", + "1892378 Lucas Hill 1.0 " + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "keanu_reeves = cast[(cast['name'] == 'Keanu Reeves') & (cast['year'] >= 1999) & (cast['n']) & (cast['n'] == 1.0)].sort_values(by='year')\n", + "keanu_reeves" + ] }, { "cell_type": "markdown", @@ -770,17 +1954,45 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "234635" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "fifties = cast[(cast['year'] >= 1950) & (cast['year'] <= 1960)]\n", + "len(fifties[(fifties['type'] == 'actress') | (fifties['type'] == 'actor')])" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 49, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "1452413" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tenyears = cast[(cast['year'] >= 2007) & (cast['year'] <= 2017)]\n", + "len(tenyears[(tenyears['type'] == 'actress') | (tenyears['type'] == 'actor')])" + ] }, { "cell_type": "markdown", @@ -797,24 +2009,64 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 56, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "153233" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "millenium = cast[cast['year'] >= 200]\n", + "len(millenium[millenium['n'] == 1.0])" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 59, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "2174370" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(millenium[(millenium['n'].notnull()) & (millenium['n'] != 1.0)])" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 60, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "1458573" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(millenium[millenium['n'].isna()])" + ] }, { "cell_type": "markdown", @@ -832,9 +2084,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 61, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Hamlet 20\n", + "Carmen 17\n", + "Macbeth 16\n", + "Maya 12\n", + "Temptation 12\n", + "The Outsider 12\n", + "Freedom 11\n", + "The Three Musketeers 11\n", + "Honeymoon 11\n", + "Othello 11\n", + "Name: title, dtype: int64" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "top_ten = movies.title.value_counts()[:10]\n", "top_ten" @@ -849,9 +2122,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 62, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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09NTAQEBevfdd23bcmYzly9frnbt2snFxUWLFy+WJMXFxSk4OFguLi6qX7++5syZY1fDzz//rF69eqlChQqqVKmSIiIiCjXrOXDgQMXFxdmti4+P18CBA3Ot++tl+VWrVslisdje79q1S+3bt5enp6e8vLzUrFkz7dixI8/jnjt3Tvfcc48efvhhXblyRYZh6JVXXlHt2rXl6uqqxo0b6+OPP7b9XNq3by9JqlChgt0seEH75di3b5+6dOkiDw8PVatWTf3799fZs2dt29u1a6fhw4drzJgxqly5sjp06CBJio6OVkBAgKxWq/z8/DRy5Mib/jwBAEDpVyw3RD333HMaN26ckpOTFRQUpN69e+v69euSpN27dys8PFw9evTQjz/+qGXLlmnTpk0aPnz43z7uzJkz1bx5cyUlJWnYsGF6+umntX//frs248eP18iRI5WSkqLw8HDNnz9fzz33nF588UWlpKTopZde0qRJk5SQkCDpRuBt3769PDw8tHHjRm3atEkeHh7q1KnTTWcBH374YZ0/f16bNm2SJG3atEm//fabunXrdstj69u3r2rUqKHt27dr586dmjBhgsqVK5er3U8//aQ2bdqofv36WrlypVxcXPT8888rLi5Oc+fO1d69ezV69Gj169dPGzZskL+/v1asWCFJOnDggN0seEH7STdm09u2basmTZpox44dWrNmjX799Vf17NnTrqaEhASVLVtWmzdvVmxsrD7++GO9/vrrio2NVWpqqlatWqXQ0NB8x56ZmamMjAy7BQAAlE7F8hD+cePGqWvXGw9GjomJUcOGDXXo0CHVr19fr776qvr06aNRo0ZJku666y699dZbatu2rebOnSsXF5fbPm6XLl00bNgwSTdC6Ouvv67ExETVr1/f1mbUqFHq0aOH7f20adM0c+ZM27patWpp3759io2N1cCBA7V06VI5OTlpwYIFtpnMuLg4lS9fXomJierYsWO+9ZQrV079+vXTwoULdd9992nhwoXq169fnqHyZk6cOKH/9//+n20sd911V642Bw8eVIcOHRQREaE333xTFotFFy9e1KxZs/TNN9+oVatWkqTatWtr06ZNio2NVdu2bVWxYkVJUtWqVW0zuIXZb+7cuQoLC9NLL71kq2HhwoXy9/fXwYMHFRQUJEmqW7euXnnlFVubL774Qj4+PvrXv/6l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V872Omd7Xuuys7Nt/33qqaeUnJxsW3bt2qXU1FTVqVMnz35z+snpIy9Wq1VeXl52CwAAKJ24W99BVaxYUeHh4XrnnXc0cuTIXN87vXDhgnbs2KHr169r5syZtrvvly9fXmw1hYWFae/evapbt26xHQMAAJRuzJw6sDlz5igrK0v33HOPVqxYodTUVKWkpOitt95Sq1atVKdOHV2/fl1vv/22jhw5okWLFmnevHnFVs/48eO1detWRUVFKTk5Wampqfr00081YsSIYjsmAAAoXQinDqxWrVr64Ycf1L59e40dO1YhISHq0KGD1q1bp7lz56pJkyaaNWuWXn75ZYWEhGjJkiWaPn16sdXTqFEjbdiwQampqWrTpo2aNm2qSZMmydfXt9iOCQAAShfu1ofDybnbj7v1AQC3g7v1SwZ36wMAAMDhEE4BAABgGtytD4e1Jyacx0oBAFDKMHMKAAAA0yCcAgAAwDQIpwAAADANwikAAABMg3AKAAAA0yCcAgAAwDQIpwAAADANwikAAABMg3AKAAAA0yCcAgAAwDQIpwAAADANwikAAABMg3AKAAAA0yCcAgAAwDQIpwAAADANwikAAABMg3AKAAAA0yCcAgAAwDTKlnQBwO0KmbJWTla3ki4DAIBS49iMriVdAjOnAAAAMA/CKQAAAEyDcAoAAADTIJyiSCQmJspisejChQslXQoAAHBghNNSJDIyUt27d8+13qzBMTAwUG+88UZJlwEAAEyEcAoAAADTIJz+w5w7d069e/dWjRo15ObmptDQUH344Yd2bdq1a6cRI0Zo1KhRqlChgqpVq6Z3331XFy9e1BNPPCFPT0/VqVNH//d//1fgsbZs2aL7779frq6u8vf318iRI3Xx4kXbMY4fP67Ro0fLYrHIYrEU25gBAIDjIJz+w1y5ckXNmjXT559/rj179ug///mP+vfvr++++86uXUJCgipXrqzvv/9eI0aM0NNPP63HHntM9957r3744QeFh4erf//+unTpUp7H2b17t8LDw9WjRw/9+OOPWrZsmTZt2qThw4dLklauXKkaNWpo6tSpSktLU1paWr41Z2ZmKiMjw24BAAClk8UwDKOki0DRiIyM1OLFi+Xi4mK3PisrS1euXNH58+dVvnz5XPt17dpVwcHBeu211yTdmNXMysrSt99+a9vf29tbPXr00Pvvvy9JOnXqlHx9fbV161a1bNlSiYmJat++ve0YAwYMkKurq2JjY23H2bRpk9q2bauLFy/KxcVFgYGBGjVqlEaNGlXguKKjoxUTE5Nrvf+o5TyEHwCAIlScD+HPyMiQt7e30tPT5eXllW87/oWoUqZ9+/aaO3eu3brvvvtO/fr1k3QjaM6YMUPLli3Tzz//rMzMTGVmZsrd3d1un0aNGtlelylTRpUqVVJoaKhtXbVq1SRJp0+fzrOOnTt36tChQ1qyZIltnWEYys7O1tGjRxUcHFzoMU2cOFFjxoyxvc/IyJC/v3+h9wcAAI6DcFrKuLu7q27dunbrfvrpJ9vrmTNn6vXXX9cbb7yh0NBQubu7a9SoUbp69ardPuXKlbN7b7FY7NblfEc0Ozs7zzqys7P11FNPaeTIkbm2BQQE3NKYrFarrFbrLe0DAAAcE+H0H+bbb79VRESEbSY1OztbqamptzSTWRhhYWHau3dvrqD8Z87OzsrKyirS4wIAAMfGDVH/MHXr1tVXX32lLVu2KCUlRU899ZROnTpV5McZP368tm7dqqioKCUnJys1NVWffvqpRowYYWsTGBiojRs36ueff9bZs2eLvAYAAOB4CKf/MJMmTVJYWJjCw8PVrl07+fj45Png/r+rUaNG2rBhg1JTU9WmTRs1bdpUkyZNkq+vr63N1KlTdezYMdWpU0dVqlQp8hoAAIDj4W59OJycu/24Wx8AgKJlhrv1mTkFAACAaRBOAQAAYBrcrQ+HtScmvMDLAgAAwPEwcwoAAADTIJwCAADANAinAAAAMA3CKQAAAEyDcAoAAADTIJwCAADANAinAAAAMA2ecwqHk/Mv7mZkZJRwJQAAoLByfm/n/B7PD+EUDufcuXOSJH9//xKuBAAA3Krff/9d3t7e+W4nnMLhVKxYUZJ04sSJAv9wlwYZGRny9/fXyZMnS/2/hsVYSyfGWjox1tKpuMdqGIZ+//13+fn5FdiOcAqH4+R046vS3t7epf5/FDm8vLwYaynEWEsnxlo6MdaiUZhJJW6IAgAAgGkQTgEAAGAahFM4HKvVqilTpshqtZZ0KcWOsZZOjLV0YqylE2O98yzGze7nBwAAAO4QZk4BAABgGoRTAAAAmAbhFAAAAKZBOAUAAIBpEE5hOnPmzFGtWrXk4uKiZs2a6dtvvy2w/YYNG9SsWTO5uLiodu3amjdv3h2q9O+ZPn267r77bnl6eqpq1arq3r27Dhw4UOA+iYmJslgsuZb9+/ffoapvT3R0dK6afXx8CtzHUc9rYGBgnucoKioqz/aOdE43btyobt26yc/PTxaLRatWrbLbbhiGoqOj5efnJ1dXV7Vr10579+69ab8rVqxQgwYNZLVa1aBBA/3vf/8rphEUXkFjvXbtmsaPH6/Q0FC5u7vLz89PAwYM0C+//FJgn/Hx8Xme6ytXrhTzaAp2s/MaGRmZq+aWLVvetF9HO6+S8jw/FotFr776ar59mvG8Fub3i5k/r4RTmMqyZcs0atQoPffcc0pKSlKbNm3UuXNnnThxIs/2R48eVZcuXdSmTRslJSXpv//9r0aOHKkVK1bc4cpv3YYNGxQVFaVt27bpq6++0vXr19WxY0ddvHjxpvseOHBAaWlptuWuu+66AxX/PQ0bNrSreffu3fm2deTzun37drtxfvXVV5Kkxx57rMD9HOGcXrx4UY0bN9bs2bPz3P7KK69o1qxZmj17trZv3y4fHx916NBBv//+e759bt26Vb169VL//v21a9cu9e/fXz179tR3331XXMMolILGeunSJf3www+aNGmSfvjhB61cuVIHDx7Uww8/fNN+vby87M5zWlqaXFxcimMIhXaz8ypJnTp1sqv5iy++KLBPRzyvknKdm4ULF8pisejRRx8tsF+zndfC/H4x9efVAEzknnvuMYYOHWq3rn79+saECRPybP/ss88a9evXt1v31FNPGS1btiy2GovL6dOnDUnGhg0b8m2zfv16Q5Jx/vz5O1dYEZgyZYrRuHHjQrcvTef1mWeeMerUqWNkZ2fnud1Rz6kk43//+5/tfXZ2tuHj42PMmDHDtu7KlSuGt7e3MW/evHz76dmzp9GpUye7deHh4cbjjz9e5DXfrr+ONS/ff/+9Ick4fvx4vm3i4uIMb2/voi2uiOU11oEDBxoRERG31E9pOa8RERHGAw88UGAbRzivf/39YvbPKzOnMI2rV69q586d6tixo936jh07asuWLXnus3Xr1lztw8PDtWPHDl27dq3Yai0O6enpkqSKFSvetG3Tpk3l6+urBx98UOvXry/u0opEamqq/Pz8VKtWLT3++OM6cuRIvm1Ly3m9evWqFi9erEGDBslisRTY1hHP6Z8dPXpUp06dsjtvVqtVbdu2zffzK+V/rgvax4zS09NlsVhUvnz5Atv98ccfqlmzpmrUqKGHHnpISUlJd6bAvykxMVFVq1ZVUFCQhgwZotOnTxfYvjSc119//VWrV6/Wk08+edO2Zj+vf/39YvbPK+EUpnH27FllZWWpWrVqduurVaumU6dO5bnPqVOn8mx//fp1nT17tthqLWqGYWjMmDG67777FBISkm87X19fvfvuu1qxYoVWrlypevXq6cEHH9TGjRvvYLW3rkWLFnr//fe1du1azZ8/X6dOndK9996rc+fO5dm+tJzXVatW6cKFC4qMjMy3jaOe07/K+Yzeyuc3Z79b3cdsrly5ogkTJqhPnz7y8vLKt139+vUVHx+vTz/9VB9++KFcXFzUunVrpaam3sFqb13nzp21ZMkSffPNN5o5c6a2b9+uBx54QJmZmfnuUxrOa0JCgjw9PdWjR48C25n9vOb1+8Xsn9eyRdobUAT+OsNkGEaBs055tc9rvZkNHz5cP/74ozZt2lRgu3r16qlevXq2961atdLJkyf12muv6f777y/uMm9b586dba9DQ0PVqlUr1alTRwkJCRozZkye+5SG8/ree++pc+fO8vPzy7eNo57T/Nzq5/d29zGLa9eu6fHHH1d2drbmzJlTYNuWLVva3UjUunVrhYWF6e2339Zbb71V3KXetl69etleh4SEqHnz5qpZs6ZWr15dYHBz5PMqSQsXLlTfvn1v+t1Rs5/Xgn6/mPXzyswpTKNy5coqU6ZMrr+BnT59Otff1HL4+Pjk2b5s2bKqVKlSsdValEaMGKFPP/1U69evV40aNW55/5YtW5rmb+iF5e7urtDQ0HzrLg3n9fjx4/r66681ePDgW97XEc9pztMXbuXzm7Pfre5jFteuXVPPnj119OhRffXVVwXOmubFyclJd999t8Oda19fX9WsWbPAuh35vErSt99+qwMHDtzW59dM5zW/3y9m/7wSTmEazs7Oatasme3u5hxfffWV7r333jz3adWqVa72X375pZo3b65y5coVW61FwTAMDR8+XCtXrtQ333yjWrVq3VY/SUlJ8vX1LeLqildmZqZSUlLyrduRz2uOuLg4Va1aVV27dr3lfR3xnNaqVUs+Pj525+3q1avasGFDvp9fKf9zXdA+ZpATTFNTU/X111/f1l+aDMNQcnKyw53rc+fO6eTJkwXW7ajnNcd7772nZs2aqXHjxre8rxnO681+v5j+81qkt1cBf9PSpUuNcuXKGe+9956xb98+Y9SoUYa7u7tx7NgxwzAMY8KECUb//v1t7Y8cOWK4ubkZo0ePNvbt22e89957Rrly5YyPP/64pIZQaE8//bTh7e1tJCYmGmlpabbl0qVLtjZ/He/rr79u/O9//zMOHjxo7Nmzx5gwYYIhyVixYkVJDKHQxo4dayQmJhpHjhwxtm3bZjz00EOGp6dnqTyvhmEYWVlZRkBAgDF+/Phc2xz5nP7+++9GUlKSkZSUZEgyZs2aZSQlJdnuUJ8xY4bh7e1trFy50ti9e7fRu3dvw9fX18jIyLD10b9/f7unb2zevNkoU6aMMWPGDCMlJcWYMWOGUbZsWWPbtm13fHx/VtBYr127Zjz88MNGjRo1jOTkZLvPb2Zmpq2Pv441OjraWLNmjXH48GEjKSnJeOKJJ4yyZcsa3333XUkM0aagsf7+++/G2LFjjS1bthhHjx411q9fb7Rq1cqoXr16qTuvOdLT0w03Nzdj7ty5efbhCOe1ML9fzPx5JZzCdN555x2jZs2ahrOzsxEWFmb3aKWBAwcabdu2tWufmJhoNG3a1HB2djYCAwPz/R+K2UjKc4mLi7O1+et4X375ZaNOnTqGi4uLUaFCBeO+++4zVq9efeeLv0W9evUyfH19jXLlyhl+fn5Gjx49jL1799q2l6bzahiGsXbtWkOSceDAgVzbHPmc5jz26q/LwIEDDcO48XiaKVOmGD4+PobVajXuv/9+Y/fu3XZ9tG3b1tY+x0cffWTUq1fPKFeunFG/fn1TBPOCxnr06NF8P7/r16+39fHXsY4aNcoICAgwnJ2djSpVqhgdO3Y0tmzZcucH9xcFjfXSpUtGx44djSpVqhjlypUzAgICjIEDBxonTpyw66M0nNccsbGxhqurq3HhwoU8+3CE81qY3y9m/rxa/v9BAAAAACWO75wCAADANAinAAAAMA3CKQAAAEyDcAoAAADTIJwCAADANAinAAAAMA3CKQAAAEyDcAoAAADTIJwCAADANAinAAAAMA3CKQAAAEyDcAoAAADT+P8AzTGLui7yKKkAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "top_ten.plot(kind='barh')" ] @@ -865,10 +2159,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 70, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "year\n", + "2009 6125\n", + "2008 5151\n", + "2007 4467\n", + "Name: year, dtype: int64" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "top3 = movies[(movies['year'] >= 2000) & (movies['year'] <= 2009)].groupby('year')['year'].count().sort_values(ascending=False).iloc[:3]\n", + "top3" + ] }, { "cell_type": "markdown", @@ -881,10 +2193,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 75, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "ename": "TypeError", + "evalue": "cannot convert the series to ", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "Input \u001b[0;32mIn [75]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mmath\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m movies[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdecade\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m math\u001b[38;5;241m.\u001b[39mfloor(\u001b[38;5;28;43mfloat\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mmovies\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43myear\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;241m/\u001b[39m \u001b[38;5;241m10\u001b[39m)\n\u001b[1;32m 3\u001b[0m movies\u001b[38;5;241m.\u001b[39mhead()\n", + "File \u001b[0;32m~/Desktop/mec-mini-projects/mec-5.3.10-data-wranging-with-pandas-mini-project/env/lib/python3.10/site-packages/pandas/core/series.py:191\u001b[0m, in \u001b[0;36m_coerce_method..wrapper\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m 190\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m converter(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39miloc[\u001b[38;5;241m0\u001b[39m])\n\u001b[0;32m--> 191\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcannot convert the series to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mconverter\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", + "\u001b[0;31mTypeError\u001b[0m: cannot convert the series to " + ] + } + ], + "source": [ + "import math\n", + "\n", + "movies['decade'] = math.floor(float(movies['year']) / 10)\n", + "movies.head()" + ] }, { "cell_type": "markdown", @@ -901,24 +2231,96 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 79, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "character\n", + "Himself 20746\n", + "Dancer 12477\n", + "Extra 11948\n", + "Reporter 8434\n", + "Student 7773\n", + "Doctor 7669\n", + "Party Guest 7245\n", + "Policeman 7029\n", + "Nurse 6999\n", + "Bartender 6802\n", + "Name: character, dtype: int64" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cast.groupby('character')['character'].count().sort_values(ascending=False).iloc[:10]" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 85, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "character name name \n", + "Herself Queen Elizabeth II Queen Elizabeth II 12\n", + " Joyce Brothers Joyce Brothers 9\n", + " Luisa Horga Luisa Horga 9\n", + " Mar?a Luisa (V) Mart?n Mar?a Luisa (V) Mart?n 9\n", + " Hillary Clinton Hillary Clinton 8\n", + " Margaret Thatcher Margaret Thatcher 8\n", + " In?s J. Southern In?s J. Southern 6\n", + " Marta Berrocal Marta Berrocal 6\n", + " Oprah Winfrey Oprah Winfrey 6\n", + " Marilyn Monroe Marilyn Monroe 6\n", + "Name: name, dtype: int64" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cast[cast['character'] == 'Herself'].groupby(['character', 'name'])['name'].value_counts().sort_values(ascending=False).iloc[:10]" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 86, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "character name name \n", + "Himself Adolf Hitler Adolf Hitler 99\n", + " Richard Nixon Richard Nixon 44\n", + " Ronald Reagan Ronald Reagan 41\n", + " John F. Kennedy John F. Kennedy 37\n", + " George W. Bush George W. Bush 25\n", + " Winston Churchill Winston Churchill 24\n", + " Martin Luther King Martin Luther King 23\n", + " Bill Clinton Bill Clinton 22\n", + " Ron Jeremy Ron Jeremy 22\n", + " Franklin D. Roosevelt Franklin D. Roosevelt 21\n", + "Name: name, dtype: int64" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cast[cast['character'] == 'Himself'].groupby(['character', 'name'])['name'].value_counts().sort_values(ascending=False).iloc[:10]" + ] }, { "cell_type": "markdown", @@ -935,17 +2337,65 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 88, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "character\n", + "Zombie 6264\n", + "Zombie Horde 206\n", + "Zombie - Protestor - Victim 78\n", + "Zombie Extra 70\n", + "Zombie Dancer 43\n", + "Zombie Girl 36\n", + "Zombie #1 36\n", + "Zombie #2 31\n", + "Zombie Vampire 25\n", + "Zombie Victim 22\n", + "Name: character, dtype: int64" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cast[cast['character'].str.startswith('Zombie')].groupby('character')['character'].count().sort_values(ascending=False).iloc[:10]" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 89, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "character\n", + "Policeman 7029\n", + "Police Officer 4808\n", + "Police Inspector 742\n", + "Police Sergeant 674\n", + "Police officer 539\n", + "Police 456\n", + "Policewoman 415\n", + "Police Chief 410\n", + "Police Captain 387\n", + "Police Commissioner 337\n", + "Name: character, dtype: int64" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cast[cast['character'].str.startswith('Police')].groupby('character')['character'].count().sort_values(ascending=False).iloc[:10]" + ] }, { "cell_type": "markdown", @@ -956,10 +2406,53 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 92, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "year\n", + "1985 1\n", + "1986 3\n", + "1988 4\n", + "1989 2\n", + "1990 2\n", + "1991 3\n", + "1992 1\n", + "1993 4\n", + "1994 1\n", + "1995 2\n", + "1996 2\n", + "1997 2\n", + "1999 3\n", + "2000 3\n", + "2001 2\n", + "2003 3\n", + "2005 3\n", + "2006 2\n", + "2008 2\n", + "2009 1\n", + "2010 1\n", + "2012 1\n", + "2013 2\n", + "2014 1\n", + "2015 1\n", + "2016 5\n", + "2017 3\n", + "2018 1\n", + "2019 1\n", + "Name: year, dtype: int64" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cast[cast['name'] == 'Keanu Reeves'].groupby('year')['year'].count()" + ] }, { "cell_type": "markdown", @@ -970,10 +2463,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 100, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "image/png": "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/5j0EJFdaNq0KRYsWIDJkycjIyMDIoIxY8agV69e6NKlC/r374969eohMDAQI0aMwJ9//qnMm5KSgvvuuw/169eHv78/BgwYgF9//VV5/8yZM9BoNFi7di2ioqLg4eGBFStW2GI1iciG+OwtIrIrDz30EK5cuYJHHnkEr732GtLT09G5c2c888wzGDlyJK5fv44pU6agqKgIaWlpAIDPP/8cGo0Gbdu2xdWrVzF9+nScOXMGhw8fhlarxZkzZxAWFobQ0FC89dZbuPvuu6HT6RAcHGzjtSUia2LSQ0R2JTs7G+Hh4bh06RI+++wzHDp0CN9//z22bt2qtPn999/RtGlTnDx5En/729/MPuPixYsICAjAkSNHEB4eriQ98+fPx8SJE625OkRkR3h6i4jsSkBAAJ599lm0bt0aDz/8MH744Qds374d9erVU16tWrUCAOUU1q+//ophw4ahefPm8PX1RVhYGACYXfzcuXNn664MEdkVV1sHQER0K1dXV7i63tw8lZSUIDY2Fm+88YZZu6CgIABAbGwsmjZtiiVLliA4OBglJSUIDw9HYWGhSXtvb++6D56I7BaTHiKyax07dsTnn3+O0NBQJREq69KlS/j555/x/vvvo3v37gCAb7/91tphEpED4OktIrJr48ePR05ODoYOHYr9+/fj9OnT2LZtG5566ikUFxejQYMG8Pf3xwcffIBTp04hLS0NkyZNsnXYRGSHmPQQkV0LDg7Gd999h+LiYvTp0wfh4eGYOHEi9Ho9tFottFotVq9ejR9++AHh4eH45z//iTfffNPWYRORHWL1FhEREakCj/QQERGRKjDpISIiIlVg0kNERESqwKSHiIiIVIFJDxEREakCkx4iIiJSBSY9REREpApMeoiIiEgVmPQQERGRKjDpISIiIlVg0kNERESqwKSHiIiIVOH/AbTg2DCqk9LQAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "keanu_reeves = cast[cast['name'] == 'Keanu Reeves']\n", + "plt.scatter(x=keanu_reeves['year'], y=keanu_reeves['n'])\n", + "plt.xlabel('Year')\n", + "plt.ylabel('N')\n", + "plt.title('Keanu Reeves cast postions through his career over the years')\n", + "plt.show()" + ] }, { "cell_type": "markdown", @@ -1025,10 +2536,181 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 120, "metadata": {}, - "outputs": [], - "source": [] + "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", + "
titleyearnametypecharactern
1723645The Muppet Movie1979Frank OzactorMiss Piggy2.0
1723652The Muppet Movie1979Frank OzactorMotorcycle Guy2.0
1723651The Muppet Movie1979Frank OzactorSwedish Chef (assistant)2.0
1723650The Muppet Movie1979Frank OzactorMarvin Suggs2.0
1723649The Muppet Movie1979Frank OzactorDoc Hopper's Men2.0
.....................
1723661Zathura: A Space Adventure2005Frank OzactorRobot6.0
1723616Sesame Street: C is for Cookie Monster2010Frank OzactorCookie MonsterNaN
1723605Inside Out2015Frank OzactorSubconscious Guard Dave14.0
1723631The Great Gilly Hopkins2015Frank OzactorCookie Monster20.0
1723623Star Wars: Episode VII - The Force Awakens2015Frank OzactorYodaNaN
\n", + "

64 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " title year name type \\\n", + "1723645 The Muppet Movie 1979 Frank Oz actor \n", + "1723652 The Muppet Movie 1979 Frank Oz actor \n", + "1723651 The Muppet Movie 1979 Frank Oz actor \n", + "1723650 The Muppet Movie 1979 Frank Oz actor \n", + "1723649 The Muppet Movie 1979 Frank Oz actor \n", + "... ... ... ... ... \n", + "1723661 Zathura: A Space Adventure 2005 Frank Oz actor \n", + "1723616 Sesame Street: C is for Cookie Monster 2010 Frank Oz actor \n", + "1723605 Inside Out 2015 Frank Oz actor \n", + "1723631 The Great Gilly Hopkins 2015 Frank Oz actor \n", + "1723623 Star Wars: Episode VII - The Force Awakens 2015 Frank Oz actor \n", + "\n", + " character n \n", + "1723645 Miss Piggy 2.0 \n", + "1723652 Motorcycle Guy 2.0 \n", + "1723651 Swedish Chef (assistant) 2.0 \n", + "1723650 Marvin Suggs 2.0 \n", + "1723649 Doc Hopper's Men 2.0 \n", + "... ... ... \n", + "1723661 Robot 6.0 \n", + "1723616 Cookie Monster NaN \n", + "1723605 Subconscious Guard Dave 14.0 \n", + "1723631 Cookie Monster 20.0 \n", + "1723623 Yoda NaN \n", + "\n", + "[64 rows x 6 columns]" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cast[cast['name'] == 'Frank Oz'].sort_values(by='year')" + ] }, { "cell_type": "markdown", @@ -1083,10 +2765,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 131, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGdCAYAAAAxCSikAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAhvklEQVR4nO3de3BU9d3H8c8CukEmWRo0yS4ECEwUuRQREAg3KSUYEKWioCjEodUyogIZKkRlBGdkwdswGITBApFSgXbCJRpsCQUSKahACLUWIYyRpJA0g5VdwIclkPP84bg15gILu+xv4/s1c2Y8Z885+e6OmvecnN21WZZlCQAAwGDNwj0AAADA5RAsAADAeAQLAAAwHsECAACMR7AAAADjESwAAMB4BAsAADAewQIAAIzXItwDBEtNTY1Onjyp6Oho2Wy2cI8DAACugGVZOnPmjFwul5o1a/g6SpMJlpMnTyoxMTHcYwAAgKtQXl6udu3aNfh4kwmW6OhoSd894ZiYmDBPAwAAroTX61ViYqL/93hDmkywfP9noJiYGIIFAIAIc7nbObjpFgAAGI9gAQAAxiNYAACA8QgWAABgPIIFAAAYj2ABAADGI1gAAIDxCBYAAGA8ggUAABiPYAEAAMYjWAAAgPEIFgAAYDyCBQAAGI9gAQAAxmsR7gEA4Ep0nJMX7hEC9tXC0eEeAWgyuMICAACMR7AAAADjESwAAMB4BAsAADAewQIAAIwXcLAUFhZqzJgxcrlcstls2rx5c63HbTZbvctrr73W4Dmzs7PrPeb8+fMBPyEAAND0BBws586dU8+ePZWVlVXv4xUVFbWWVatWyWazady4cY2eNyYmps6xUVFRgY4HAACaoIA/hyUtLU1paWkNPp6QkFBrfcuWLRo2bJg6derU6HltNludYwEAAKQQ38Pyn//8R3l5efr1r3992X3Pnj2rDh06qF27drr33nt18ODBRvf3+Xzyer21FgAA0DSFNFjeffddRUdH64EHHmh0vy5duig7O1u5ublat26doqKiNHDgQJWUlDR4jNvtlsPh8C+JiYnBHh8AABgipMGyatUqPfroo5e9F6V///567LHH1LNnTw0ePFh/+tOfdOutt+qtt95q8JjMzEx5PB7/Ul5eHuzxAQCAIUL2XUIfffSRjhw5og0bNgR8bLNmzdS3b99Gr7DY7XbZ7fZrGREAAESIkF1hWblypXr37q2ePXsGfKxlWSouLpbT6QzBZAAAINIEfIXl7NmzOnbsmH+9tLRUxcXFio2NVfv27SVJXq9Xf/7zn/XGG2/Ue47Jkyerbdu2crvdkqT58+erf//+Sk5Oltfr1ZIlS1RcXKylS5dezXMCAABNTMDBsn//fg0bNsy/npGRIUlKT09Xdna2JGn9+vWyLEuPPPJIvecoKytTs2b/u7hz+vRpPfnkk6qsrJTD4VCvXr1UWFiou+66K9DxAABAE2SzLMsK9xDB4PV65XA45PF4FBMTE+5xAARZxzl54R4hYF8tHB3uEQDjXenvb75LCAAAGI9gAQAAxiNYAACA8QgWAABgPIIFAAAYj2ABAADGI1gAAIDxCBYAAGA8ggUAABiPYAEAAMYjWAAAgPEIFgAAYDyCBQAAGI9gAQAAxiNYAACA8QgWAABgPIIFAAAYj2ABAADGI1gAAIDxCBYAAGA8ggUAABiPYAEAAMYjWAAAgPEIFgAAYDyCBQAAGI9gAQAAxiNYAACA8QgWAABgPIIFAAAYj2ABAADGI1gAAIDxCBYAAGA8ggUAABiPYAEAAMYjWAAAgPEIFgAAYDyCBQAAGI9gAQAAxgs4WAoLCzVmzBi5XC7ZbDZt3ry51uOPP/64bDZbraV///6XPW9OTo66du0qu92url27atOmTYGOBgAAmqiAg+XcuXPq2bOnsrKyGtznnnvuUUVFhX/ZunVro+fcu3evJkyYoEmTJunQoUOaNGmSxo8fr08++STQ8QAAQBPUItAD0tLSlJaW1ug+drtdCQkJV3zOxYsXa8SIEcrMzJQkZWZmqqCgQIsXL9a6desCHREAADQxIbmHZdeuXYqLi9Ott96qJ554QlVVVY3uv3fvXqWmptbaNnLkSO3Zs6fBY3w+n7xeb60FAAA0TUEPlrS0NP3xj3/Ujh079MYbb2jfvn36xS9+IZ/P1+AxlZWVio+Pr7UtPj5elZWVDR7jdrvlcDj8S2JiYtCeAwAAMEvAfxK6nAkTJvj/uXv37urTp486dOigvLw8PfDAAw0eZ7PZaq1bllVn2w9lZmYqIyPDv+71eokWAACaqKAHy485nU516NBBJSUlDe6TkJBQ52pKVVVVnasuP2S322W324M2JwAAMFfIP4fl66+/Vnl5uZxOZ4P7DBgwQPn5+bW2bdu2TSkpKaEeDwAARICAr7CcPXtWx44d86+XlpaquLhYsbGxio2N1bx58zRu3Dg5nU599dVXev7553XzzTfrV7/6lf+YyZMnq23btnK73ZKk6dOna8iQIVq0aJHuv/9+bdmyRdu3b9fu3buD8BQBAECkCzhY9u/fr2HDhvnXv7+PJD09XcuWLdNnn32mNWvW6PTp03I6nRo2bJg2bNig6Oho/zFlZWVq1ux/F3dSUlK0fv16vfjii5o7d646d+6sDRs2qF+/ftfy3AAAQBNhsyzLCvcQweD1euVwOOTxeBQTExPucQAEWcc5eeEeIWBfLRwd7hEA413p72++SwgAABiPYAEAAMYjWAAAgPEIFgAAYDyCBQAAGI9gAQAAxiNYAACA8QgWAABgPIIFAAAYj2ABAADGI1gAAIDxCBYAAGA8ggUAABiPYAEAAMYjWAAAgPEIFgAAYDyCBQAAGI9gAQAAxiNYAACA8QgWAABgPIIFAAAYj2ABAADGI1gAAIDxCBYAAGA8ggUAABiPYAEAAMYjWAAAgPEIFgAAYDyCBQAAGI9gAQAAxiNYAACA8QgWAABgPIIFAAAYj2ABAADGI1gAAIDxCBYAAGA8ggUAABiPYAEAAMYLOFgKCws1ZswYuVwu2Ww2bd682f9YdXW1Zs+erR49eqhVq1ZyuVyaPHmyTp482eg5s7OzZbPZ6iznz58P+AkBAICmJ+BgOXfunHr27KmsrKw6j3377bcqKirS3LlzVVRUpI0bN+ro0aO67777LnvemJgYVVRU1FqioqICHQ8AADRBLQI9IC0tTWlpafU+5nA4lJ+fX2vbW2+9pbvuuktlZWVq3759g+e12WxKSEgIdBwAAPATEPJ7WDwej2w2m1q3bt3ofmfPnlWHDh3Url073XvvvTp48GCj+/t8Pnm93loLAABomkIaLOfPn9ecOXM0ceJExcTENLhfly5dlJ2drdzcXK1bt05RUVEaOHCgSkpKGjzG7XbL4XD4l8TExFA8BQAAYACbZVnWVR9ss2nTpk0aO3Zsnceqq6v10EMPqaysTLt27Wo0WH6spqZGd955p4YMGaIlS5bUu4/P55PP5/Ove71eJSYmyuPxBPSzAESGjnPywj1CwL5aODrcIwDG83q9cjgcl/39HfA9LFeiurpa48ePV2lpqXbs2BFwQDRr1kx9+/Zt9AqL3W6X3W6/1lEBAEAECPqfhL6PlZKSEm3fvl1t2rQJ+ByWZam4uFhOpzPY4wEAgAgU8BWWs2fP6tixY/710tJSFRcXKzY2Vi6XSw8++KCKior0wQcf6NKlS6qsrJQkxcbG6sYbb5QkTZ48WW3btpXb7ZYkzZ8/X/3791dycrK8Xq+WLFmi4uJiLV26NBjPEQAARLiAg2X//v0aNmyYfz0jI0OSlJ6ernnz5ik3N1eSdMcdd9Q6bufOnbr77rslSWVlZWrW7H8Xd06fPq0nn3xSlZWVcjgc6tWrlwoLC3XXXXcFOh4AAGiCrummW5Nc6U07ACITN90CTdOV/v7mu4QAAIDxCBYAAGA8ggUAABiPYAEAAMYjWAAAgPEIFgAAYDyCBQAAGI9gAQAAxiNYAACA8QgWAABgPIIFAAAYj2ABAADGI1gAAIDxCBYAAGA8ggUAABiPYAEAAMYjWAAAgPEIFgAAYDyCBQAAGI9gAQAAxiNYAACA8QgWAABgPIIFAAAYj2ABAADGI1gAAIDxCBYAAGA8ggUAABiPYAEAAMYjWAAAgPEIFgAAYDyCBQAAGI9gAQAAxiNYAACA8QgWAABgPIIFAAAYj2ABAADGI1gAAIDxCBYAAGC8gIOlsLBQY8aMkcvlks1m0+bNm2s9blmW5s2bJ5fLpZYtW+ruu+/W559/ftnz5uTkqGvXrrLb7eratas2bdoU6GgAAKCJCjhYzp07p549eyorK6vex1999VW9+eabysrK0r59+5SQkKARI0bozJkzDZ5z7969mjBhgiZNmqRDhw5p0qRJGj9+vD755JNAxwMAAE2QzbIs66oPttm0adMmjR07VtJ3V1dcLpdmzJih2bNnS5J8Pp/i4+O1aNEi/fa3v633PBMmTJDX69WHH37o33bPPffoZz/7mdatW3dFs3i9XjkcDnk8HsXExFztUwJgqI5z8sI9QsC+Wjg63CMAxrvS399BvYeltLRUlZWVSk1N9W+z2+0aOnSo9uzZ0+Bxe/furXWMJI0cObLRY3w+n7xeb60FAAA0TS2CebLKykpJUnx8fK3t8fHxOn78eKPH1XfM9+erj9vt1vz5869hWuCnKxKvVgD4aQvJu4RsNlutdcuy6my71mMyMzPl8Xj8S3l5+dUPDAAAjBbUKywJCQmSvrti4nQ6/durqqrqXEH58XE/vppyuWPsdrvsdvs1TgwAACJBUK+wJCUlKSEhQfn5+f5tFy5cUEFBgVJSUho8bsCAAbWOkaRt27Y1egwAAPjpCPgKy9mzZ3Xs2DH/emlpqYqLixUbG6v27dtrxowZWrBggZKTk5WcnKwFCxbopptu0sSJE/3HTJ48WW3btpXb7ZYkTZ8+XUOGDNGiRYt0//33a8uWLdq+fbt2794dhKcIAAAiXcDBsn//fg0bNsy/npGRIUlKT09Xdna2nnvuOf3f//2fnnrqKX3zzTfq16+ftm3bpujoaP8xZWVlatbsfxd3UlJStH79er344ouaO3euOnfurA0bNqhfv37X8twAAEATcU2fw2ISPocFuHK8S+j64HNYgMsLy+ewAAAAhALBAgAAjEewAAAA4xEsAADAeAQLAAAwHsECAACMR7AAAADjESwAAMB4BAsAADAewQIAAIxHsAAAAOMRLAAAwHgBf1szAAC4NpH4BaTh/jJPrrAAAADjESwAAMB4BAsAADAewQIAAIxHsAAAAOMRLAAAwHgECwAAMB7BAgAAjEewAAAA4xEsAADAeAQLAAAwHsECAACMR7AAAADjESwAAMB4BAsAADAewQIAAIxHsAAAAOMRLAAAwHgECwAAMF6LcA8QCTrOyQv3CAH7auHocI8AAEDQcIUFAAAYj2ABAADGI1gAAIDxCBYAAGC8oAdLx44dZbPZ6izTpk2rd/9du3bVu/8XX3wR7NEAAECECvq7hPbt26dLly751//5z39qxIgReuihhxo97siRI4qJifGv33LLLcEeDQAARKigB8uPQ2PhwoXq3Lmzhg4d2uhxcXFxat26dbDHAQAATUBI72G5cOGC1q5dqylTpshmszW6b69eveR0OjV8+HDt3LkzlGMBAIAIE9IPjtu8ebNOnz6txx9/vMF9nE6nVqxYod69e8vn8+kPf/iDhg8frl27dmnIkCENHufz+eTz+fzrXq83mKMDAACDhDRYVq5cqbS0NLlcrgb3ue2223Tbbbf51wcMGKDy8nK9/vrrjQaL2+3W/PnzgzovAAAwU8j+JHT8+HFt375dv/nNbwI+tn///iopKWl0n8zMTHk8Hv9SXl5+taMCAADDhewKy+rVqxUXF6fRowP/TpuDBw/K6XQ2uo/dbpfdbr/a8QAAQAQJSbDU1NRo9erVSk9PV4sWtX9EZmamTpw4oTVr1kiSFi9erI4dO6pbt27+m3RzcnKUk5MTitEAAEAECkmwbN++XWVlZZoyZUqdxyoqKlRWVuZfv3DhgmbNmqUTJ06oZcuW6tatm/Ly8jRq1KhQjAYAACJQSIIlNTVVlmXV+1h2dnat9eeee07PPfdcKMYAAABNBN8lBAAAjEewAAAA4xEsAADAeCH94DgAAEKt45y8cI+A64ArLAAAwHgECwAAMB7BAgAAjEewAAAA4xEsAADAeAQLAAAwHsECAACMR7AAAADjESwAAMB4BAsAADAewQIAAIxHsAAAAOMRLAAAwHgECwAAMB7BAgAAjEewAAAA4xEsAADAeAQLAAAwHsECAACMR7AAAADjESwAAMB4BAsAADAewQIAAIxHsAAAAOMRLAAAwHgECwAAMB7BAgAAjEewAAAA4xEsAADAeAQLAAAwHsECAACMR7AAAADjESwAAMB4BAsAADBe0INl3rx5stlstZaEhIRGjykoKFDv3r0VFRWlTp06afny5cEeCwAARLAWoThpt27dtH37dv968+bNG9y3tLRUo0aN0hNPPKG1a9fq73//u5566indcsstGjduXCjGAwAAESYkwdKiRYvLXlX53vLly9W+fXstXrxYknT77bdr//79ev311wkWAAAgKUT3sJSUlMjlcikpKUkPP/ywvvzyywb33bt3r1JTU2ttGzlypPbv36/q6upQjAcAACJM0IOlX79+WrNmjf7617/qnXfeUWVlpVJSUvT111/Xu39lZaXi4+NrbYuPj9fFixd16tSpBn+Oz+eT1+uttQAAgKYp6H8SSktL8/9zjx49NGDAAHXu3FnvvvuuMjIy6j3GZrPVWrcsq97tP+R2uzV//vwgTAxcm45z8sI9AgzFvxtA8IT8bc2tWrVSjx49VFJSUu/jCQkJqqysrLWtqqpKLVq0UJs2bRo8b2Zmpjwej38pLy8P6twAAMAcIbnp9od8Pp8OHz6swYMH1/v4gAED9P7779fatm3bNvXp00c33HBDg+e12+2y2+1BnRUAAJgp6FdYZs2apYKCApWWluqTTz7Rgw8+KK/Xq/T0dEnfXRmZPHmyf/+pU6fq+PHjysjI0OHDh7Vq1SqtXLlSs2bNCvZoAAAgQgX9Csu///1vPfLIIzp16pRuueUW9e/fXx9//LE6dOggSaqoqFBZWZl//6SkJG3dulUzZ87U0qVL5XK5tGTJEt7SDAAA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ql27duEeJ6IcOHBAVVVV6t27t3/bpUuXVFhYqKysLPl8PjVv3jyME0YOp9Oprl271tp2++23KycnJ0wTRabf/e53mjNnjh5++GFJUo8ePXT8+HG53W6C5SolJCRI+u5Ki9Pp9G+vqqqqc9UFl1ddXa3x48ertLRUO3bsuC5XVyTeJRTRLMvS008/rY0bN2rHjh1KSkoK90gRZ/jw4frss89UXFzsX/r06aNHH31UxcXFxEoABg4cWOdt9UePHvV/6SmuzLfffqtmzWr/r7l58+a8rfkaJCUlKSEhQfn5+f5tFy5cUEFBgVJSUsI4WeT5PlZKSkq0fft2tWnT5rr9bK6wRLBp06bpvffe05YtWxQdHe3/O63D4VDLli3DPF1kiI6OrnPPT6tWrdSmTRvuBQrQzJkzlZKSogULFmj8+PH69NNPtWLFCq1YsSLco0WUMWPG6JVXXlH79u3VrVs3HTx4UG+++aamTJkS7tGMdvbsWR07dsy/XlpaquLiYsXGxqp9+/aaMWOGFixYoOTkZCUnJ2vBggW66aabNHHixDBObZ7GXkeXy6UHH3xQRUVF+uCDD3Tp0iX/753Y2FjdeOONoR0u5O9DQshIqndZvXp1uEeLaLyt+eq9//77Vvfu3S273W516dLFWrFiRbhHijher9eaPn261b59eysqKsrq1KmT9cILL1g+ny/coxlt586d9f7/MD093bKs797a/NJLL1kJCQmW3W63hgwZYn322WfhHdpAjb2OpaWlDf7e2blzZ8hns1mWZYU2iQAAAK4N97AAAADjESwAAMB4BAsAADAewQIAAIxHsAAAAOMRLAAAwHgECwAAMB7BAgAAjEewAAAA4xEsAADAeAQLAAAwHsECAACM9/8/fovCs7I6NAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "summer = release_dates[(release_dates['title'].str.contains('Summer', case=False)) & (release_dates['country'] == 'USA')]\n", + "plt.hist(x=summer['date'].dt.month)\n", + "plt.show()" + ] }, { "cell_type": "markdown", @@ -1100,10 +2797,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 135, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "image/png": "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OTO+9KUvxZe//OU4/vjjY9asWdHY2Bhz5sypxHwAQBWpzXPwu+++GytXrozp06d32T9+/Pj4wx/+sNNzSqVSlEql8uOOjo6IiOjs7Mw764faXno7+a8JANWkEv++/vevm2XZBx6XKyzeeOON2LZtWxx++OFd9h9++OHx2muv7fScYrEYra2tO+xvbGzMc2kA4COon1XZX3/Lli1RX1+/y+dzhcX7ampqujzOsmyHfe9raWmJ5ubm8uPt27fHv/71rxgwYMAuz/lfnZ2d0djYGO3t7dG/f//ujMwuWNvKsbaVY20rw7pWzt6wtlmWxZYtW6KhoeEDj8sVFh//+MejT58+O9yd2Lx58w53Md5XKBSiUCh02XfwwQfnuWxZ//79q/Z/SG9nbSvH2laOta0M61o51b62H3Sn4n253rzZt2/fGDt2bCxatKjL/kWLFsVpp52WbzoAYK+T+6WQ5ubmuPLKK2PcuHHR1NQUc+fOjY0bN8a1115bifkAgCqSOywuvfTS+Oc//xm33nprbNq0KUaOHBm/+c1vYujQoZWYLyL+83LKzTffvMNLKvScta0ca1s51rYyrGvl7EtrW5N92OdGAAA+It8VAgAkIywAgGSEBQCQjLAAAJKpirDwNe09t3Tp0pg0aVI0NDRETU1NPPLII12ez7IsbrnllmhoaIgDDzwwzj777FizZs2eGbaKFIvFOPnkk6Ouri4GDhwYF198cbz44otdjrG23TNnzpwYPXp0+QcKNTU1xeOPP15+3rqmUSwWo6amJqZNm1beZ22755Zbbomampou26BBg8rP7yvr2uvDwte0p7F169YYM2ZMzJ49e6fP/+AHP4iZM2fG7NmzY/ny5TFo0KC44IILYsuWLbt50uqyZMmSmDJlSixbtiwWLVoU7733XowfPz62bt1aPsbads+QIUNixowZsWLFilixYkWce+65cdFFF5X/IrauPbd8+fKYO3dujB49ust+a9t9I0aMiE2bNpW3tra28nP7zLpmvdynPvWp7Nprr+2y77jjjsumT5++hyaqfhGRLVy4sPx4+/bt2aBBg7IZM2aU973zzjtZfX19dvfdd++BCavX5s2bs4jIlixZkmWZtU3tkEMOyX7+859b1wS2bNmSfeITn8gWLVqUnXXWWdnUqVOzLPN7tiduvvnmbMyYMTt9bl9a1159x+L9r2kfP358l/0f9DXt5Ld+/fp47bXXuqxzoVCIs846yzrn1NHRERERhx56aERY21S2bdsWCxYsiK1bt0ZTU5N1TWDKlCkxceLEOP/887vst7Y9s3bt2mhoaIjhw4fHZZddFuvWrYuIfWtdu/XtprtLd76mnfzeX8udrfOGDRv2xEhVKcuyaG5ujjPOOCNGjhwZEda2p9ra2qKpqSneeeedOOigg2LhwoVxwgknlP8itq7ds2DBgnj22Wdj+fLlOzzn92z3nXLKKXHffffFMcccE6+//nrcdtttcdppp8WaNWv2qXXt1WHxvjxf0073Weeeuf766+O5556LZ555ZofnrG33HHvssbF69ep4880341e/+lVMnjw5lixZUn7euubX3t4eU6dOjSeffDIOOOCAXR5nbfObMGFC+b9HjRoVTU1NcdRRR8X8+fPj1FNPjYh9Y1179Ush3fmadvJ7/13L1rn7brjhhnj00Ufj6aefjiFDhpT3W9ue6du3bxx99NExbty4KBaLMWbMmLjrrrusaw+sXLkyNm/eHGPHjo3a2tqora2NJUuWxI9+9KOora0tr5+17bl+/frFqFGjYu3atfvU79leHRa+pn33GD58eAwaNKjLOr/77ruxZMkS6/whsiyL66+/Ph5++OH43e9+F8OHD+/yvLVNK8uyKJVK1rUHzjvvvGhra4vVq1eXt3HjxsUVV1wRq1evjiOPPNLaJlIqleKFF16IwYMH71u/Z/fY20Y/ogULFmT7779/du+992bPP/98Nm3atKxfv37ZK6+8sqdHqypbtmzJVq1ala1atSqLiGzmzJnZqlWrsg0bNmRZlmUzZszI6uvrs4cffjhra2vLLr/88mzw4MFZZ2fnHp68d7vuuuuy+vr6bPHixdmmTZvK29tvv10+xtp2T0tLS7Z06dJs/fr12XPPPZfddNNN2X777Zc9+eSTWZZZ15T++1MhWWZtu+sb3/hGtnjx4mzdunXZsmXLsgsvvDCrq6sr/3u1r6xrrw+LLMuyn/zkJ9nQoUOzvn37ZieddFL5o3x8dE8//XQWETtskydPzrLsPx+Fuvnmm7NBgwZlhUIhO/PMM7O2trY9O3QV2NmaRkQ2b9688jHWtnuuvvrq8p/7ww47LDvvvPPKUZFl1jWl/w0La9s9l156aTZ48OBs//33zxoaGrLPfOYz2Zo1a8rP7yvr6mvTAYBkevV7LACA6iIsAIBkhAUAkIywAACSERYAQDLCAgBIRlgAAMkICwAgGWEBACQjLACAZIQFAJCMsAAAkvl/8pvBQZBJt3EAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "action = release_dates[(release_dates['title'].str.contains('Action', case=False)) & (release_dates['country'] == 'USA')]\n", + "plt.hist(x=action['date'].dt.isocalendar().week)\n", + "plt.show()" + ] }, { "cell_type": "markdown", @@ -1153,7 +2865,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -1167,9 +2879,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.6-final" + "version": "3.10.6" } }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} From d0e02ba862a97510e38d85fb0661f7f5bf7044b6 Mon Sep 17 00:00:00 2001 From: Conor Smith Date: Mon, 24 Oct 2022 12:57:59 -0400 Subject: [PATCH 4/7] Completed Project --- .../Mini_Project_Data_Wrangling_Pandas.ipynb | 880 +++++++++++++----- 1 file changed, 662 insertions(+), 218 deletions(-) diff --git a/mec-5.3.10-data-wranging-with-pandas-mini-project/Mini_Project_Data_Wrangling_Pandas.ipynb b/mec-5.3.10-data-wranging-with-pandas-mini-project/Mini_Project_Data_Wrangling_Pandas.ipynb index 4c8beee7..0b20583e 100755 --- a/mec-5.3.10-data-wranging-with-pandas-mini-project/Mini_Project_Data_Wrangling_Pandas.ipynb +++ b/mec-5.3.10-data-wranging-with-pandas-mini-project/Mini_Project_Data_Wrangling_Pandas.ipynb @@ -398,7 +398,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "metadata": {}, "outputs": [ { @@ -426,7 +426,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -505,7 +505,7 @@ "4 #Ewankosau saranghaeyo 2015 Philippines 2015-01-21" ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -530,7 +530,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -539,7 +539,7 @@ "244914" ] }, - "execution_count": 8, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -557,7 +557,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -613,7 +613,7 @@ "150621 Batman 1989" ] }, - "execution_count": 9, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -633,7 +633,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -737,7 +737,7 @@ "56029 Batman Beyond: Rising Knight 2014" ] }, - "execution_count": 10, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -757,7 +757,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -884,7 +884,7 @@ "208220 Batman Begins 2005" ] }, - "execution_count": 11, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -902,7 +902,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -987,7 +987,7 @@ "223087 Harry Potter and the Sorcerer's Stone 2001" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -1006,7 +1006,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -1015,7 +1015,7 @@ "11474" ] }, - "execution_count": 13, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -1033,7 +1033,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -1042,7 +1042,7 @@ "8702" ] }, - "execution_count": 14, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -1061,7 +1061,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -1070,7 +1070,7 @@ "244914" ] }, - "execution_count": 15, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -1088,7 +1088,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -1097,7 +1097,7 @@ "20" ] }, - "execution_count": 16, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -1117,7 +1117,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -1196,7 +1196,7 @@ "244747 Hamlet 2017" ] }, - "execution_count": 23, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -1217,7 +1217,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 19, "metadata": {}, "outputs": [ { @@ -1226,7 +1226,7 @@ "27" ] }, - "execution_count": 26, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -1245,7 +1245,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -1254,7 +1254,7 @@ "51" ] }, - "execution_count": 27, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -1274,7 +1274,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -1415,7 +1415,7 @@ "1826027 Inception 2010 Pete Postlethwaite actor Maurice Fischer 10.0" ] }, - "execution_count": 29, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -1439,7 +1439,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -1570,7 +1570,7 @@ "2248085 actor Albus Dumbledore NaN " ] }, - "execution_count": 31, + "execution_count": 22, "metadata": {}, "output_type": "execute_result" } @@ -1582,7 +1582,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -1680,7 +1680,7 @@ "947790 actor Albus Dumbledore 1.0 " ] }, - "execution_count": 33, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -1703,7 +1703,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -1712,7 +1712,7 @@ "62" ] }, - "execution_count": 34, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -1723,7 +1723,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 25, "metadata": {}, "outputs": [ { @@ -1931,7 +1931,7 @@ "1892378 Lucas Hill 1.0 " ] }, - "execution_count": 37, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -1954,7 +1954,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 26, "metadata": {}, "outputs": [ { @@ -1963,7 +1963,7 @@ "234635" ] }, - "execution_count": 48, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -1975,7 +1975,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -1984,7 +1984,7 @@ "1452413" ] }, - "execution_count": 49, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -2009,7 +2009,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -2018,7 +2018,7 @@ "153233" ] }, - "execution_count": 56, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -2030,7 +2030,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -2039,7 +2039,7 @@ "2174370" ] }, - "execution_count": 59, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -2050,7 +2050,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -2059,7 +2059,7 @@ "1458573" ] }, - "execution_count": 60, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -2084,7 +2084,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 31, "metadata": {}, "outputs": [ { @@ -2103,7 +2103,7 @@ "Name: title, dtype: int64" ] }, - "execution_count": 61, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -2122,7 +2122,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 32, "metadata": {}, "outputs": [ { @@ -2131,7 +2131,7 @@ "" ] }, - "execution_count": 62, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" }, @@ -2159,7 +2159,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -2172,7 +2172,7 @@ "Name: year, dtype: int64" ] }, - "execution_count": 70, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -2193,27 +2193,33 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 60, "metadata": {}, "outputs": [ { - "ename": "TypeError", - "evalue": "cannot convert the series to ", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "Input \u001b[0;32mIn [75]\u001b[0m, in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mmath\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m movies[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdecade\u001b[39m\u001b[38;5;124m'\u001b[39m] \u001b[38;5;241m=\u001b[39m math\u001b[38;5;241m.\u001b[39mfloor(\u001b[38;5;28;43mfloat\u001b[39;49m\u001b[43m(\u001b[49m\u001b[43mmovies\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[38;5;124;43myear\u001b[39;49m\u001b[38;5;124;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;241m/\u001b[39m \u001b[38;5;241m10\u001b[39m)\n\u001b[1;32m 3\u001b[0m movies\u001b[38;5;241m.\u001b[39mhead()\n", - "File \u001b[0;32m~/Desktop/mec-mini-projects/mec-5.3.10-data-wranging-with-pandas-mini-project/env/lib/python3.10/site-packages/pandas/core/series.py:191\u001b[0m, in \u001b[0;36m_coerce_method..wrapper\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mself\u001b[39m) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m 190\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m converter(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39miloc[\u001b[38;5;241m0\u001b[39m])\n\u001b[0;32m--> 191\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mcannot convert the series to \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mconverter\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n", - "\u001b[0;31mTypeError\u001b[0m: cannot convert the series to " - ] + "data": { + "image/png": "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hBDV1dVCo9GI+Ph4uc9vv/0mJEkSq1atEkIIUVxcLMzMzMT69evlPr/88ovo0KGDSE1NFUIIcfLkSQFAZGRkyH3S09MFAJGdnd2guen1egFA6PX6+66TiIiIWkZDv79NjZrG7qLX6wEAdnZ2AIBz584hPz8f/v7+ch+1Wo1hw4YhLS0N06ZNw6FDh3D79m2DPlqtFh4eHkhLS0NAQADS09MhSRK8vLzkPt7e3pAkCWlpaXBzc6s1l/LycpSXl8vLJSUlAACP2K3ooLZq3sKJyGjOxwcZewpE1Aq0mouqhRCIjo7G0KFD4eHhAQDIz88HADg6Ohr0dXR0lNfl5+fD3NwcnTt3vmcfBweHWtt0cHCQ+9wtLi5Ovt5IkiQ4OzvfX4FERETUarWaI0QzZ87EsWPHsG/fvlrrVCqVwbIQolbb3e7uU1f/e40TExOD6OhoebmkpATOzs7IWhwAW1vbe26biIiI2pZWcYRo1qxZSElJwa5du9CtWze5XaPRAECtozhXr16VjxppNBpUVFSgqKjonn0KCgpqbbewsLDW0acaarUatra2Bi8iIiJqn4waiIQQmDlzJr7++mvs3LkTPXr0MFjfo0cPaDQabN++XW6rqKjAnj174OvrCwAYNGgQzMzMDPrk5eUhKytL7uPj4wO9Xo8DBw7Iffbv3w+9Xi/3ISIiIuUy6imzGTNm4KuvvsKWLVtgY2MjHwmSJAmWlpZQqVSYM2cOli5dit69e6N3795YunQprKysEBYWJvedNGkS5s2bhy5dusDOzg7z589H//794efnBwBwd3dHYGAgpkyZgoSEBADA1KlTERwcXOcF1URERKQsRg1EK1euBAAMHz7coH316tWIjIwEAPz973/HrVu38Le//Q1FRUXw8vLCtm3bYGNjI/d///33YWpqimeffRa3bt3CqFGjkJiYCBMTE7nP2rVrERUVJd+NFhISghUrVjzYAomIiKhNUAkhhLEn0RaUlJRAkiTo9XpeT0RERNRGNPT7u1VcVE1ERERkTAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHimxp5AW+MRuxUd1FbGnga1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2XBzc2vQ/EpKSiBJEvR6PWxtbe+/YCIiInrgGvr9bdqCc2qU8vJyAICFhYXcZmJiAnNzc+zbt6/eQFRTsKnpndLS09MhSZIchgDA29sbkiQhLS2t3kBUXl4uzwG4s0MBwCN2Kzqore6vuFbqfHyQsadARERkFK32ouo+ffrA1dUVMTExKCoqQkVFBeLj45Gfn4+8vLw633Pt2jUsWbIE06ZNk9vy8/Ph4OBQq6+DgwPy8/Pr3X5cXJx8zZEkSXB2dr7/ooiIiKhVarVHiMzMzLB582ZMmjQJdnZ2MDExgZ+fH8aMGVNn/5KSEgQFBaFv376IjY01WKdSqWr1F0LU2V4jJiYG0dHRBuM7Ozsja3EAT5kRERG1M602EAHAoEGDoNPpoNfrUVFRAXt7e3h5eWHw4MEG/W7cuIHAwEB07NgRSUlJMDMzk9dpNBoUFBTUGruwsBCOjo71blutVkOtVjdfMURERNRqtdpTZr8nSRLs7e2Rm5uLzMxMjBs3Tl5XUlICf39/mJubIyUlxeCaIwDw8fGBXq/HgQMH5Lb9+/dDr9fD19e3xWogIiKi1suoR4hKS0tx+vRpefncuXPQ6XSws7ODi4sLNm7cCHt7e7i4uOD48eOYPXs2QkND4e/vD+DOkSF/f3/cvHkTX375JUpKSuSLn+3t7WFiYgJ3d3cEBgZiypQpSEhIAABMnToVwcHBDb7DjIiIiNo3owaizMxMjBgxQl6uuWYnIiICiYmJyMvLQ3R0NAoKCuDk5IQJEyZg4cKFcv9Dhw5h//79AIBevXoZjH3u3Dl0794dALB27VpERUXJQSokJKTOZx8RERGRMrWa5xC1dnwOERERUdvT0O/vNnENEREREdGDxEBEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREisdARERERIrHQERERESKx0BEREREimdq7Am0NR6xW9FBbWXsadzT+fggY0+BiIioTeERIiIiIlI8HiFqpKzFAbC1tTX2NIiIiKgZ8QgRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxEREREpHgMRERERKR4DERERESkeAxER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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ "import math\n", - "\n", - "movies['decade'] = math.floor(float(movies['year']) / 10)\n", - "movies.head()" + "decade = []\n", + "for year in movies['year']:\n", + " decade.append(math.floor(year/10) * 10)\n", + "movies['decade'] = decade\n", + "decade_df = pd.DataFrame(movies.groupby('decade')['title'].count())\n", + "plt.barh(y=decade_df.index, width=decade_df['title'])\n", + "plt.xlabel('Number of Films')\n", + "plt.ylabel('Decade')\n", + "plt.ylim(1880, 2030)\n", + "plt.title('Number of films released per decade')\n", + "plt.show()" ] }, { @@ -2231,7 +2237,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -2251,7 +2257,7 @@ "Name: character, dtype: int64" ] }, - "execution_count": 79, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -2262,7 +2268,7 @@ }, { "cell_type": "code", - "execution_count": 85, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -2282,7 +2288,7 @@ "Name: name, dtype: int64" ] }, - "execution_count": 85, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -2293,7 +2299,7 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -2313,7 +2319,7 @@ "Name: name, dtype: int64" ] }, - "execution_count": 86, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -2337,7 +2343,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 38, "metadata": {}, "outputs": [ { @@ -2357,7 +2363,7 @@ "Name: character, dtype: int64" ] }, - "execution_count": 88, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -2368,7 +2374,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -2388,7 +2394,7 @@ "Name: character, dtype: int64" ] }, - "execution_count": 89, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -2406,7 +2412,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -2445,7 +2451,7 @@ "Name: year, dtype: int64" ] }, - "execution_count": 92, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -2463,7 +2469,7 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 41, "metadata": {}, "outputs": [ { @@ -2495,10 +2501,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 69, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkQAAAHFCAYAAAAT5Oa6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABEA0lEQVR4nO3de1xVVf7/8feRqyAcRblICjpaeCMsLUEtvAuKl181VjqIpWbz1dRwmrTJUes3idV0mTRz+pbWjDmOee0ymOUtE7wNmJfEezolaIqgWCKyfn/080xHLgKCgPv1fDzO4+Fee+21P+vsczrv9tmbYzPGGAEAAFhYneouAAAAoLoRiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiAAAgOURiFCrLViwQDabTdu3by92fVxcnJo1a3Zji/r/rtR29OjRcm+7efNmTZ8+XWfPni3zNm+88YZatmwpd3d32Ww2nT17ViNGjCgy/2bNmmnEiBHlrulmNH36dNlstkof74cffqi0MWuKo0ePymaz6eWXX67Uca/nfXIjrF+/XjabTevXr6/uUlDFCERADbR582bNmDGjzIEoPT1d48ePV/fu3bV27VqlpKTIx8dHU6dO1fLly6u2WAC4CbhWdwEArt+ePXskSaNHj9bdd9/taG/RokV1lQQAtQpniGA5c+bM0b333quAgAB5e3srPDxcL774oi5duuTUr1u3bmrXrp1SUlLUuXNn1a1bV82aNdP8+fMlSZ988onuvPNOeXl5KTw8XMnJyWXa/+eff66ePXvK19dXXl5e6tKli7744gvH+unTp+upp56SJDVv3lw2m63UU/bdunXTb37zG0lSp06dZLPZHF+JFfeV2dWufCXwwQcf6Omnn1bjxo1Vr149DRgwQFlZWTp37pwee+wxNWrUSI0aNdIjjzyi8+fPO42xZMkSderUSXa7XV5eXvrVr36lRx999JrPhc1m07hx4zR//nyFhYWpbt266tixo1JTU2WM0UsvvaTmzZurXr166tGjhw4ePOi0/Zo1azRo0CA1adJEnp6eatmypcaMGVPsV1affPKJ2rdvLw8PDzVv3rzEr36MMXrzzTfVvn171a1bVw0aNNADDzygw4cPX3M+Vxw/flz33XeffH19Zbfb9Zvf/EanTp1yrB85cqT8/Px0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ERERTtsPHTrUabmmv49RcVxUjZtC69at1bFjxyLtdrtdx48fdywfO3ZM99xzj8LCwvT666+rWbNm8vT01NatWzV27Fj9+OOPTtv7+fkVGdPd3b1Iu7u7uyTpp59+KrHGrKwsSdIDDzxQYp8zZ844hYMbqaQ5lTbXevXq6d5779WKFSv0l7/8RcOHD9fFixfVtm1b/eEPf9DDDz9cJfuVpMLCQvXp00fff/+9pk6dqvDwcHl7e6uwsFCRkZGOY5mdna3CwkIFBQUV2ffVbVlZWTLGOH1o/9KvfvWra86nuHFdXV3VsGFDnT592tE2aNAgNWvWTHPmzFGXLl20YMEC5eXlaezYsaWOXZ7XUWJioubMmaOnn35a0dHRatCggerUqaNRo0Y5vdZPnTqlkJCQMs2tYcOGTsseHh6SVOS9c7XTp0+X+RhI/w3aV6tTp46jZklq0qRJqfst63Nw+vRpNW/evMz11dT3MSqOQARLWbFihfLy8rRs2TLHmQTp59vWq1qjRo0k/fz3giIjI4vtU9IHcU03aNAgDRo0SBcvXlRqaqpmzpypoUOHqlmzZoqKiqqSfe7evVs7d+7UggULlJCQ4Gi/+sLrBg0ayGazKTMzs8gYV7c1atRINptNX375peOD/peKaytOZmambrnlFsdyQUGBTp8+7RQm6tSpo7Fjx+qZZ57Rn//8Z7355pvq2bOnwsLCSh27PK+jv//97xo+fLheeOEFp/U//PCD6tev71j29/fXf/7znzLNraIaNmxY5mMgSR9++KHTe/Rq/v7+knTNusv6HJS3vpvxfWx1BCJYypWvYH75wWaM0dtvv13l++7SpYvq16+vvXv3aty4caX2Lev/ddc0Hh4eio6OVv369bV69WqlpaVVWSAq7lhK0rx585yWvb29dffdd2vZsmV66aWXHF+vnDt3Th999JFT37i4OCUlJem7777TkCFDKlzbwoULnb5q/ec//6mCggJ169bNqd+oUaM0ffp0DRs2TBkZGZo1a9Y1xy7P68hmsxV5fj755BN99913atmypaMtNjZWf/zjH7V27Vr16NGjDDMsv+7du2vVqlXKyspyBIbLly9r8eLFTv369u0rV1dXHTp0SPfff3+J4912221q0aKF3n33XSUmJpYYVsv6HHTv3l0vvviidu7c6fS12QcffOC0bXmef9QuBCJYSu/eveXu7q6HH35Yv//97/XTTz9p7ty5ys7OrvJ916tXT2+88YYSEhJ05swZPfDAAwoICNCpU6e0c+dOnTp1SnPnzpUkhYeHS5Jef/11JSQkyM3NTWFhYfLx8anyOsvrj3/8o/7zn/+oZ8+eatKkic6ePavXX39dbm5uio6OrrL9tmrVSi1atNDkyZNljJGfn58++ugjrVmzpkjf559/XjExMerdu7cmTZqky5cva9asWfL29taZM2cc/bp06aLHHntMjzzyiLZv3657771X3t7eOnHihDZt2qTw8HD99re/vWZty5Ytk6urq3r37q09e/Zo6tSpioiIKBKy6tevr+HDh2vu3LkKDQ0tck1TccrzOoqLi9OCBQvUqlUr3X777dqxY4deeumlIl8zTZw4UYsXL9agQYM0efJk3X333frxxx+1YcMGxcXFqXv37tes61qeffZZrVq1Sj169NAf//hHeXl5ac6cOUWut2nWrJmee+45/eEPf9Dhw4cVExOjBg0aKCsrS1u3bpW3t7dmzJgh6ec/oTFgwABFRkbqySefVEhIiI4dO6bVq1dr4cKF5X4O3n33XfXv31//9//+XwUGBmrhwoVF/uxAeZ5/1DLVfFE3cF1Kurvqiv79+xe5y+qjjz4yERERxtPT09xyyy3mqaeeMv/617+K3FobHR1t2rZtW2TM0NBQ079//yLtkszYsWOL1Hb1nWIbNmww/fv3N35+fsbNzc3ccsstpn///mbJkiVO/aZMmWKCg4NNnTp1itRW1uehPHeZXb3/ksa8cifVqVOnjDHGfPzxxyY2Ntbccsstxt3d3QQEBJh+/fqZL7/8ssR6r7j6OTPmv3czvfTSS07txdW5d+9e07t3b+Pj42MaNGhgfv3rX5tjx44ZSWbatGlO269atcrcfvvtxt3d3YSEhJikpCTHXK727rvvmk6dOhlvb29Tt25d06JFCzN8+HCnOw6Lc2W8HTt2mAEDBph69eoZHx8f8/DDD5usrKxit1m/fr2RZJKSkkod+2pleR1lZ2ebkSNHmoCAAOPl5WW6du1qvvzySxMdHW2io6OdxsvOzjYTJkwwISEhxs3NzQQEBJj+/fs7bk0v6bgYY4p9vovz1VdfOf5ERVBQkHnqqafMX//612LfJytWrDDdu3c3vr6+xsPDw4SGhpoHHnigyG3tKSkpJjY21tjtduPh4WFatGjhdPdYeZ6DK68nT09P4+fnZ0aOHGlWrlxZ7PuvrO9j1B42Y4y5sREMAHDFpEmTNHfuXB0/frzIBcsAbhy+MgOAapCamqr9+/frzTff1JgxYwhDQDXjDBEAVAObzSYvLy/169dP8+fPL/VvDwGoepwhAoBqwP+LAjULf6kaAABYHoEIAABYHoEIAABYHtcQlVFhYaG+//57+fj4OP3gJAAAqLmMMTp37pyCg4Mdv4VXHAJRGX3//fdq2rRpdZcBAAAq4Pjx46X+GDCBqIyu/GTC8ePH5evrW83VAACAssjNzVXTpk2v+dNHBKIyuvI1ma+vL4EIAIBa5lqXu3BRNQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDwCEQAAsDzX6i6gtmk3bbXqeHhVdxkAANw0jib1r+4SOEMEAABAIAIAAJbHV2bltHtGX/n6+lZ3GQAAoBJxhggAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFgegQgAAFhetQaimTNn6q677pKPj48CAgI0ePBgZWRkOPUxxmj69OkKDg5W3bp11a1bN+3Zs8epz8WLF/XEE0+oUaNG8vb21sCBA/Wf//zHqU92drbi4+Nlt9tlt9sVHx+vs2fPVvUUAQBALVCtgWjDhg0aO3asUlNTtWbNGhUUFKhPnz7Ky8tz9HnxxRf1yiuvaPbs2dq2bZuCgoLUu3dvnTt3ztFn4sSJWr58uf7xj39o06ZNOn/+vOLi4nT58mVHn6FDhyo9PV3JyclKTk5Wenq64uPjb+h8AQBADWVqkJMnTxpJZsOGDcYYYwoLC01QUJBJSkpy9Pnpp5+M3W43b731ljHGmLNnzxo3Nzfzj3/8w9Hnu+++M3Xq1DHJycnGGGP27t1rJJnU1FRHn5SUFCPJ7Nu3r0y15eTkGEkmJyfnuucJAABujLJ+frtWaxq7Sk5OjiTJz89PknTkyBFlZmaqT58+jj4eHh6Kjo7W5s2bNWbMGO3YsUOXLl1y6hMcHKx27dpp8+bN6tu3r1JSUmS329WpUydHn8jISNntdm3evFlhYWFlrrHdtNWq4+F1vVMFgFrraFL/6i4BqHQ1JhAZY5SYmKiuXbuqXbt2kqTMzExJUmBgoFPfwMBAffvtt44+7u7uatCgQZE+V7bPzMxUQEBAkX0GBAQ4+lzt4sWLunjxomM5Nze3gjMDAAA1XY25y2zcuHH6+uuvtWjRoiLrbDab07Ixpkjb1a7uU1z/0saZOXOm4wJsu92upk2blmUaAACgFqoRZ4ieeOIJrVq1Shs3blSTJk0c7UFBQZJ+PsPTuHFjR/vJkycdZ42CgoKUn5+v7Oxsp7NEJ0+eVOfOnR19srKyiuz31KlTRc4+XTFlyhQlJiY6lnNzc9W0aVPtntFXvr6+1zFbAABQ01TrGSJjjMaNG6dly5Zp7dq1at68udP65s2bKygoSGvWrHG05efna8OGDY6w06FDB7m5uTn1OXHihHbv3u3oExUVpZycHG3dutXRZ8uWLcrJyXH0uZqHh4d8fX2dHgAA4OZUrWeIxo4dqw8++EArV66Uj4+P43oeu92uunXrymazaeLEiXrhhRd066236tZbb9ULL7wgLy8vDR061NF35MiRmjRpkho2bCg/Pz/97ne/U3h4uHr16iVJat26tWJiYjR69GjNmzdPkvTYY48pLi6uXBdUAwCAm1O1BqK5c+dKkrp16+bUPn/+fI0YMUKS9Pvf/14//vij/ud//kfZ2dnq1KmTPvvsM/n4+Dj6v/rqq3J1ddWQIUP0448/qmfPnlqwYIFcXFwcfRYuXKjx48c77kYbOHCgZs+eXbUTBAAAtYLNGGOqu4jaIDc3V3a7XTk5OXx9BgBALVHWz+8ac5cZAABAdSEQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAy3Ot7gJqm3bTVquOh1d1l4GbxNGk/tVdAgBAnCECAADgDFF57Z7RV76+vtVdBgAAqEScIQIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZHIAIAAJZXrYFo48aNGjBggIKDg2Wz2bRixQqn9VlZWRoxYoSCg4Pl5eWlmJgYHThwwKlPZmam4uPjFRQUJG9vb91555368MMPnfpkZ2crPj5edrtddrtd8fHxOnv2bBXPDgAA1BbVGojy8vIUERGh2bNnF1lnjNHgwYN1+PBhrVy5UmlpaQoNDVWvXr2Ul5fn6BcfH6+MjAytWrVKu3bt0n333acHH3xQaWlpjj5Dhw5Venq6kpOTlZycrPT0dMXHx9+QOQIAgFrA1BCSzPLlyx3LGRkZRpLZvXu3o62goMD4+fmZt99+29Hm7e1t3n//faex/Pz8zP/+7/8aY4zZu3evkWRSU1Md61NSUowks2/fvjLXl5OTYySZnJyc8k4NAABUk7J+frtWZxgrzcWLFyVJnp6ejjYXFxe5u7tr06ZNGjVqlCSpa9euWrx4sfr376/69evrn//8py5evKhu3bpJklJSUmS329WpUyfHOJGRkbLb7dq8ebPCwsJK3P+VGiQpNzdXktRu2mrV8fCq1LnebI4m9a/uEgAAKJcae1F1q1atFBoaqilTpig7O1v5+flKSkpSZmamTpw44ei3ePFiFRQUqGHDhvLw8NCYMWO0fPlytWjRQtLP1xgFBAQUGT8gIECZmZkl7n/mzJmOa47sdruaNm1a+ZMEAAA1Qo0NRG5ublq6dKn2798vPz8/eXl5af369YqNjZWLi4uj37PPPqvs7Gx9/vnn2r59uxITE/XrX/9au3btcvSx2WxFxjfGFNt+xZQpU5STk+N4HD9+vHInCAAAaowa+5WZJHXo0EHp6enKyclRfn6+/P391alTJ3Xs2FGSdOjQIc2ePVu7d+9W27ZtJUkRERH68ssvNWfOHL311lsKCgpSVlZWkbFPnTqlwMDAEvft4eEhDw+PIu27Z/SVr69vJc0QAADUBDX2DNEv2e12+fv768CBA9q+fbsGDRokSbpw4YIkqU4d52m4uLiosLBQkhQVFaWcnBxt3brVsX7Lli3KyclR586db9AMAABATVatZ4jOnz+vgwcPOpaPHDmi9PR0+fn5KSQkREuWLJG/v79CQkK0a9cuTZgwQYMHD1afPn0k/XydUcuWLTVmzBi9/PLLatiwoVasWKE1a9bo448/liS1bt1aMTExGj16tObNmydJeuyxxxQXF1fiBdUAAMBaqjUQbd++Xd27d3csJyYmSpISEhK0YMECnThxQomJicrKylLjxo01fPhwTZ061dHfzc1Nn376qSZPnqwBAwbo/Pnzatmypd577z3169fP0W/hwoUaP368I0gNHDiw2L99BAAArMlmjDHVXURtkJubK7vdrpycHK4hAgCglijr53etuIYIAACgKhGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5RGIAACA5blWdwG1Tbtpq1XHw6u6y7C8o0n9q7sEAMBNhDNEAADA8ghEAADA8vjKrJx2z+grX1/f6i4DAABUIs4QAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAyyMQAQAAy7uuQJSfn6+MjAwVFBRUVj0AAAA3XIUC0YULFzRy5Eh5eXmpbdu2OnbsmCRp/PjxSkpKqtQCAQAAqlqFAtGUKVO0c+dOrV+/Xp6eno72Xr16afHixZVWHAAAwI1Qod8yW7FihRYvXqzIyEjZbDZHe5s2bXTo0KFKKw4AAOBGqNAZolOnTikgIKBIe15enlNAAgAAqA0qFIjuuusuffLJJ47lKyHo7bffVlRUVOVUBgAAcINU6CuzmTNnKiYmRnv37lVBQYFef/117dmzRykpKdqwYUNl1wgAAFClKnSGqHPnzvrqq6904cIFtWjRQp999pkCAwOVkpKiDh06VHaNAAAAVcpmjDHVXURtkJubK7vdrpycHPn6+lZ3OQAAoAzK+vld5q/McnNzy7xzAgMAAKhNyhyI6tevX+Y7yC5fvlzhggAAAG60MgeidevWOf599OhRTZ48WSNGjHDcVZaSkqL33ntPM2fOrPwqAQAAqlCFriHq2bOnRo0apYcfftip/YMPPtBf//pXrV+/vrLqqzG4hggAgNqnrJ/fFbrLLCUlRR07dizS3rFjR23durUiQwIAAFSbCgWipk2b6q233irSPm/ePDVt2vS6iwIAALiRKvSHGV999VXdf//9Wr16tSIjIyVJqampOnTokJYuXVqpBQIAAFS1Cp0h6tevnw4cOKCBAwfqzJkzOn36tAYNGqT9+/erX79+lV0jAABAleIPM5YRF1UDAFD7VPofZizOhQsXdOzYMeXn5zu133777dczLAAAwA1Voa/MTp06pbi4OPn4+Kht27a64447nB5ltXHjRg0YMEDBwcGy2WxasWKF0/qsrCyNGDFCwcHB8vLyUkxMjA4cOFBknJSUFPXo0UPe3t6qX7++unXrph9//NGxPjs7W/Hx8bLb7bLb7YqPj9fZs2crMnUAAHATqlAgmjhxorKzs5Wamqq6desqOTlZ7733nm699VatWrWqzOPk5eUpIiJCs2fPLrLOGKPBgwfr8OHDWrlypdLS0hQaGqpevXopLy/P0S8lJUUxMTHq06ePtm7dqm3btmncuHGqU+e/Uxs6dKjS09OVnJys5ORkpaenKz4+viJTBwAANyNTAUFBQWbLli3GGGN8fHxMRkaGMcaYlStXmi5dulRkSCPJLF++3LGckZFhJJndu3c72goKCoyfn595++23HW2dOnUyzz77bInj7t2710gyqampjraUlBQjyezbt6/M9eXk5BhJJicnp8zbAACA6lXWz+8KXUOUl5engIAASZKfn59OnTql2267TeHh4fr3v/9dKUHt4sWLkiRPT09Hm4uLi9zd3bVp0yaNGjVKJ0+e1JYtWzRs2DB17txZhw4dUqtWrfSnP/1JXbt2lfTzGSS73a5OnTo5xomMjJTdbtfmzZsVFhZW4v6v1CD998dt201brToeXpUyx5vV0aT+1V0CAADlUqGvzMLCwpSRkSFJat++vebNm6fvvvtOb731lho3blwphbVq1UqhoaGaMmWKsrOzlZ+fr6SkJGVmZurEiROSpMOHD0uSpk+frtGjRys5OVl33nmnevbs6bjWKDMz0xHefikgIECZmZkl7n/mzJmOa47sdjt/cBIAgJtYhc4QTZw40RFKpk2bpr59+2rhwoVyd3fXggULKqUwNzc3LV26VCNHjpSfn59cXFzUq1cvxcbGOvoUFhZK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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "hamlet_df = pd.DataFrame(movies[movies['title'].str.contains('Hamlet', case=False)].groupby('decade')['title'].count())\n", + "plt.barh(y=hamlet_df.index, width=hamlet_df['title'])\n", + "plt.title('Hamlet films made by each decade')\n", + "plt.xlabel('Number of Films')\n", + "plt.ylabel('Decade')\n", + "plt.show()" + ] }, { "cell_type": "markdown", @@ -2515,17 +2539,43 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 71, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "11823" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(cast[(cast['year'] >= 1960) & (cast['year'] <= 1969) & (cast['n'] == 1.0) & (cast['type'].isin(['actor', 'actress']))])" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 72, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "26344" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(cast[(cast['year'] >= 2000) & (cast['year'] <= 2009) & (cast['n'] == 1.0) & (cast['type'].isin(['actor', 'actress']))])" + ] }, { "cell_type": "markdown", @@ -2536,7 +2586,7 @@ }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 82, "metadata": {}, "outputs": [ { @@ -2560,156 +2610,94 @@ " \n", " \n", " \n", + " \n", + " character\n", + " \n", + " \n", " title\n", " year\n", - " name\n", - " type\n", - " character\n", - " n\n", + " \n", " \n", " \n", " \n", " \n", - " 1723645\n", - " The Muppet Movie\n", - " 1979\n", - " Frank Oz\n", - " actor\n", - " Miss Piggy\n", - " 2.0\n", + " The Muppet Movie\n", + " 1979\n", + " 8\n", " \n", " \n", - " 1723652\n", - " The Muppet Movie\n", - " 1979\n", - " Frank Oz\n", - " actor\n", - " Motorcycle Guy\n", - " 2.0\n", + " An American Werewolf in London\n", + " 1981\n", + " 2\n", " \n", " \n", - " 1723651\n", - " The Muppet Movie\n", - " 1979\n", - " Frank Oz\n", - " actor\n", - " Swedish Chef (assistant)\n", - " 2.0\n", + " The Great Muppet Caper\n", + " 1981\n", + " 6\n", " \n", " \n", - " 1723650\n", - " The Muppet Movie\n", - " 1979\n", - " Frank Oz\n", - " actor\n", - " Marvin Suggs\n", - " 2.0\n", + " The Dark Crystal\n", + " 1982\n", + " 2\n", " \n", " \n", - " 1723649\n", - " The Muppet Movie\n", - " 1979\n", - " Frank Oz\n", - " actor\n", - " Doc Hopper's Men\n", - " 2.0\n", + " The Muppets Take Manhattan\n", + " 1984\n", + " 7\n", " \n", " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", + " Follow That Bird\n", + " 1985\n", + " 3\n", " \n", " \n", - " 1723661\n", - " Zathura: A Space Adventure\n", - " 2005\n", - " Frank Oz\n", - " actor\n", - " Robot\n", - " 6.0\n", + " The Muppet Christmas Carol\n", + " 1992\n", + " 7\n", " \n", " \n", - " 1723616\n", - " Sesame Street: C is for Cookie Monster\n", - " 2010\n", - " Frank Oz\n", - " actor\n", - " Cookie Monster\n", - " NaN\n", + " Muppet Treasure Island\n", + " 1996\n", + " 4\n", " \n", " \n", - " 1723605\n", - " Inside Out\n", - " 2015\n", - " Frank Oz\n", - " actor\n", - " Subconscious Guard Dave\n", - " 14.0\n", + " Muppets from Space\n", + " 1999\n", + " 4\n", " \n", " \n", - " 1723631\n", - " The Great Gilly Hopkins\n", - " 2015\n", - " Frank Oz\n", - " actor\n", - " Cookie Monster\n", - " 20.0\n", - " \n", - " \n", - " 1723623\n", - " Star Wars: Episode VII - The Force Awakens\n", - " 2015\n", - " Frank Oz\n", - " actor\n", - " Yoda\n", - " NaN\n", + " The Adventures of Elmo in Grouchland\n", + " 1999\n", + " 3\n", " \n", " \n", "\n", - "

64 rows × 6 columns

\n", "" ], "text/plain": [ - " title year name type \\\n", - "1723645 The Muppet Movie 1979 Frank Oz actor \n", - "1723652 The Muppet Movie 1979 Frank Oz actor \n", - "1723651 The Muppet Movie 1979 Frank Oz actor \n", - "1723650 The Muppet Movie 1979 Frank Oz actor \n", - "1723649 The Muppet Movie 1979 Frank Oz actor \n", - "... ... ... ... ... \n", - "1723661 Zathura: A Space Adventure 2005 Frank Oz actor \n", - "1723616 Sesame Street: C is for Cookie Monster 2010 Frank Oz actor \n", - "1723605 Inside Out 2015 Frank Oz actor \n", - "1723631 The Great Gilly Hopkins 2015 Frank Oz actor \n", - "1723623 Star Wars: Episode VII - The Force Awakens 2015 Frank Oz actor \n", - "\n", - " character n \n", - "1723645 Miss Piggy 2.0 \n", - "1723652 Motorcycle Guy 2.0 \n", - "1723651 Swedish Chef (assistant) 2.0 \n", - "1723650 Marvin Suggs 2.0 \n", - "1723649 Doc Hopper's Men 2.0 \n", - "... ... ... \n", - "1723661 Robot 6.0 \n", - "1723616 Cookie Monster NaN \n", - "1723605 Subconscious Guard Dave 14.0 \n", - "1723631 Cookie Monster 20.0 \n", - "1723623 Yoda NaN \n", - "\n", - "[64 rows x 6 columns]" + " character\n", + "title year \n", + "The Muppet Movie 1979 8\n", + "An American Werewolf in London 1981 2\n", + "The Great Muppet Caper 1981 6\n", + "The Dark Crystal 1982 2\n", + "The Muppets Take Manhattan 1984 7\n", + "Follow That Bird 1985 3\n", + "The Muppet Christmas Carol 1992 7\n", + "Muppet Treasure Island 1996 4\n", + "Muppets from Space 1999 4\n", + "The Adventures of Elmo in Grouchland 1999 3" ] }, - "execution_count": 120, + "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "cast[cast['name'] == 'Frank Oz'].sort_values(by='year')" + "frank_oz = cast[cast['name'] == 'Frank Oz']\n", + "frank_oz_more_than_one = pd.DataFrame(frank_oz.groupby(['title', 'year'])['character'].count())\n", + "frank_oz_more_than_one[frank_oz_more_than_one['character'] > 1].sort_index(axis='index', level='year')" ] }, { @@ -2721,10 +2709,96 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 85, "metadata": {}, - "outputs": [], - "source": [] + "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", + "
title
character
Animal6
Bert3
Cookie Monster5
Fozzie Bear4
Grover2
Miss Piggy6
Sam the Eagle5
Yoda6
\n", + "
" + ], + "text/plain": [ + " title\n", + "character \n", + "Animal 6\n", + "Bert 3\n", + "Cookie Monster 5\n", + "Fozzie Bear 4\n", + "Grover 2\n", + "Miss Piggy 6\n", + "Sam the Eagle 5\n", + "Yoda 6" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "frank_oz_twice = pd.DataFrame(frank_oz.groupby('character')['title'].count())\n", + "frank_oz_twice[frank_oz_twice['title'] >= 2]" + ] }, { "cell_type": "markdown", @@ -2745,9 +2819,30 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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hsIaIobGOobCGiKsYzAUUjqR18QAAAwMbywHAGQlPgCArMQHAJCV+KDsPO0I4O1l0F7tAieqWCzG008/HZdeemm5R4Gy2bVrV9xzzz3xgx/8IHbt2hXDhw+PxsbGuO666+LGG2+M4cOHl3tEGDBe7RIRHR0dsXTp0viHf/iHco9yTAcOHIgtW7bEOeecE+9973v7nXvttdfiG9/4RsydO7dM0x3fm/+M/pvdfffd8elPfzrGjBkTERErV67MOdYp27NnT6xZsya2bdsWY8eOjXnz5kVDQ0O5xzquz33uc/GJT3wiPvjBD5Z7lFPy5S9/OTZv3hzXXHNNfOITn4ivfe1rsXz58jh06FDMnj077rjjjqiqOr1/ztq8eXN86EMfisbGxqiuro4f/vCH8alPfSp6e3vj8ccfj0svvTQef/zxqKmpKfeoMDAG4L3kKt5TTz2Vhg0bVu4xjumnP/1pGj9+fCoUCmnYsGFp2rRpaefOnX3nOzs7T/s1FAqFdNlll6Xm5uZ+W6FQSFdccUVqbm5OV111VbnHPK6xY8eml156KaWU0nPPPZfq6upSXV1damlpSePGjUujR49OP/nJT8o85fEd/lpqampKd955Z9q1a1e5RyrZHXfckWpqatJHP/rRVFdXl+688840ZsyYtGzZstTW1pbOO++89Jd/+ZflHvO4fuM3fiO1trb27X/ta19LkydPTiml9Morr6TLLrss/emf/mm5xivJq6++mu6999504403pt/5nd9JM2bMSDfeeGP6yle+kl599dVyjzcgOjs70+23317uMU5IR0dH6u7uPuJ4b29vWr9+fRkmesPbIj6+/e1vH3P767/+69P+G/d1112Xrr322vQ///M/adu2bWnmzJmpsbEx7dixI6VUGfHR1taWGhsb03e/+91+x6uqqtLWrVvLNFXpCoVCevHFF1NKKV1//fWpubk57du3L6WU0muvvZauvfba9LGPfaycI56QQqGQvvOd76Rbb701nXvuuemMM85IH/7wh9PDDz+cDh48WO7xTshFF12UvvnNb6aU3vghYvjw4em+++7rO/+tb30rXXzxxeUa74RVV1enX/ziF337Bw8eTGeccUbq7OxMKaW0bt26VF9fX67xTtjWrVtTfX19Ouuss9KsWbPSH//xH6fPfOYzadasWemss85Kv/Irv1JR/9bfSiX8wLpz5850xRVXpGHDhqXhw4enuXPn9ouQcn/PeFvEx+Gf8AqFwltup/sX0vnnn5+eeeaZfsfmz5+fLrjggvSLX/yi7F9IJ+o///M/0yWXXJL+7M/+LPX29qaUKjs+jhZTGzduTOPGjSvHaCV58zp6e3vTAw88kH77t387DR8+PNXX16cvfvGLadu2bWWe8tiqq6v7AjyllM4444z0X//1X337zz//fBoxYkQ5RivJ+PHj0w9+8IO+/Z07d6ZCoZD279+fUkpp+/bt6cwzzyzXeCesubk5XX/99amnp+eIcz09PemTn/xkam5uLsNkpXn66aePuT3wwAOn/X9v586dm6688sq0adOm1N7eni6//PI0adKk9Morr6SU3oiPQqFQtvneFvFRX1+fHnzwwbc8/6Mf/ei0/0KqqalJP/7xj484fsstt6Rx48alJ5544rRfw2Hd3d1p7ty5aeLEiemZZ55JZ5xxRsXFx+7du1NKb3xtvfmbXUpvfKMoFovlGK0kb46PN9uxY0daunRpGj9+/Gn/NdXY2JgeffTRlFJKP/vZz9KwYcPSN77xjb7zjzzySLrwwgvLNd4Ju/XWW9OECRPSo48+mr73ve+lq666qt836cceeyy9613vKuOEJ6a6uvqY/5afffbZVF1dnXGik3OsH1gPHz/d/23U19enH/7wh337r732Wpo1a1a67LLL0ssvv1z2H1hP72dhDZBJkybFk08+Gdddd91RzxcKhdP+5Z7vec97YvPmzUe8IuTLX/5ypJTiwx/+cJkmK93IkSNjzZo1cf/990dLS0scPHiw3COV7Oqrr46qqqro6uqKn/3sZ/G+972v79wLL7wQ5557bhmnOzUXXHBBtLa2xtKlS+M73/lOucc5pjlz5sTcuXNj1qxZ8d3vfjcWLVoUn//85+Pll1+OQqEQX/rSl+JjH/tYucc8rmXLlsWuXbti5syZcfDgwZgyZUrcd999fecLhUIsX768jBOemLPPPju2bdt2xBPiD/v5z38eZ599duapSjdmzJi466674uqrrz7q+a1bt8bMmTMzT1WavXv39vv/ulgsxr/8y7/Exz/+8bjqqqv6fX2Vw9siPv78z/889u3b95bnL7744vj3f//3jBOV7iMf+Uh8/etfjxtuuOGIc6tXr45Dhw7F3/3d35VhspN3/fXXxwc+8IHYsmVLRb3j8dKlS/vtjxgxot/+ww8/XBGvIBk/fvwxX75ZKBSipaUl40Slu/3226O6ujo2btwYN910UyxatCgmTpwYCxcujP3798fMmTPjr/7qr8o95nGNHDkyHnjggXjttdfi9ddfj5EjR/Y7P3369DJNVprPfOYzMW/evPiLv/iLaGlpidra2igUCtHZ2Rnt7e3R1tYWCxYsKPeYxzVp0qTYuXPnW/536X//939P+x9YL7roonjmmWeiqamp71hVVVX88z//c3z84x+Pa6+9tozTeaktAAPorrvuirvvvjs6OzujUChExBt/SLCuri4WLFgQCxcuLPOEx/fggw/Gvn374tOf/vRRz+/ZsyceeuihmDdvXubJTtyiRYviqaeeiscff/yIc6+//np89KMfjYcffjgOHTpUhunEBwCDYPv27dHZ2RkREXV1ddHY2Fjmid5eXn/99di/f3+MGjXqqOcPHjwYv/zlL8t219mfVwdgwDU2NsaUKVNiypQpfeHR0dERf/AHf1DmyU5dJayjqqrqLcMjImLnzp1x++23Z5yoP3c+AMji6aefjl//9V+vyCeZv9lQWEe51/C2eMIpAIPvoYceOub55557LtMkp2YorON0X4M7HwAMiGHDhh33TxcUCoXT/o7BUFjH6b4Gz/kAYECMHTs2vvnNb8ahQ4eOuj355JPlHvGEDIV1nO5rEB8ADIjDf9DxrVTCH3SMGBrrON3X4DkfAAyIofAHHSOGxjpO9zV4zgcAkJVfuwAAWYkPACAr8QEAZCU+AICsxAcAkJX4AACyEh8AQFbiAwDI6v8BM6oxaKrvWUwAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "christmas = release_dates[(release_dates.title.str.contains('Christmas')) & (release_dates.country == 'USA')]\n", "christmas.date.dt.month.value_counts().sort_index().plot(kind='bar')" @@ -2765,12 +2860,12 @@ }, { "cell_type": "code", - "execution_count": 131, + "execution_count": 86, "metadata": {}, "outputs": [ { "data": { - "image/png": "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m3RzcnKUk5MTitEAAEAECkmwbN++XWVlZZoyZUqdxyoqKlRWVuZfv3DhgmbNmqUTJ06oZcuW6tatm/Ly8jRq1KhQjAYAACJQSIIlNTVVlmXV+1h2dnat9eeee07PPfdcKMYAAABNBN8lBAAAjEewAAAA4xEsAADAeCH94DgAAEKt45y8cI+A64ArLAAAwHgECwAAMB7BAgAAjEewAAAA4xEsAADAeAQLAAAwHsECAACMR7AAAADjESwAAMB4BAsAADAewQIAAIxHsAAAAOMRLAAAwHgECwAAMB7BAgAAjEewAAAA4xEsAADAeAQLAAAwHsECAACMR7AAAADjESwAAMB4BAsAADAewQIAAIxHsAAAAOMRLAAAwHgECwAAMB7BAgAAjEewAAAA4xEsAADAeAQLAAAwHsECAACMR7AAAADjESwAAMB4BAsAADBe0INl3rx5stlstZaEhIRGjykoKFDv3r0VFRWlTp06afny5cEeCwAARLAWoThpt27dtH37dv968+bNG9y3tLRUo0aN0hNPPKG1a9fq73//u5566indcsstGjduXCjGAwAAESYkwdKiRYvLXlX53vLly9W+fXstXrxYknT77bdr//79ev311wkWAAAgKUT3sJSUlMjlcikpKUkPP/ywvvzyywb33bt3r1JTU2ttGzlypPbv36/q6upQjAcAACJM0IOlX79+WrNmjf7617/qnXfeUWVlpVJSUvT111/Xu39lZaXi4+NrbYuPj9fFixd16tSpBn+Oz+eT1+uttQAAgKYp6H8SSktL8/9zjx49NGDAAHXu3FnvvvuuMjIy6j3GZrPVWrcsq97tP+R2uzV//vwgTAxcm45z8sI9AgzFvxtA8IT8bc2tWrVSjx49VFJSUu/jCQkJqqysrLWtqqpKLVq0UJs2bRo8b2Zmpjwej38pLy8P6twAAMAcIbnp9od8Pp8OHz6swYMH1/v4gAED9P7779fatm3bNvXp00c33HBDg+e12+2y2+1BnRUAAJgp6FdYZs2apYKCApWWluqTTz7Rgw8+KK/Xq/T0dEnfXRmZPHmyf/+pU6fq+PHjysjI0OHDh7Vq1SqtXLlSs2bNCvZoAAAgQgX9Csu///1vPfLIIzp16pRuueUW9e/fXx9//LE6dOggSaqoqFBZWZl//6SkJG3dulUzZ87U0qVL5XK5tGTJEt7SDAAA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ql27duEeJ6IcOHBAVVVV6t27t3/bpUuXVFhYqKysLPl8PjVv3jyME0YOp9Oprl271tp2++23KycnJ0wTRabf/e53mjNnjh5++GFJUo8ePXT8+HG53W6C5SolJCRI+u5Ki9Pp9G+vqqqqc9UFl1ddXa3x48ertLRUO3bsuC5XVyTeJRTRLMvS008/rY0bN2rHjh1KSkoK90gRZ/jw4frss89UXFzsX/r06aNHH31UxcXFxEoABg4cWOdt9UePHvV/6SmuzLfffqtmzWr/r7l58+a8rfkaJCUlKSEhQfn5+f5tFy5cUEFBgVJSUsI4WeT5PlZKSkq0fft2tWnT5rr9bK6wRLBp06bpvffe05YtWxQdHe3/O63D4VDLli3DPF1kiI6OrnPPT6tWrdSmTRvuBQrQzJkzlZKSogULFmj8+PH69NNPtWLFCq1YsSLco0WUMWPG6JVXXlH79u3VrVs3HTx4UG+++aamTJkS7tGMdvbsWR07dsy/XlpaquLiYsXGxqp9+/aaMWOGFixYoOTkZCUnJ2vBggW66aabNHHixDBObZ7GXkeXy6UHH3xQRUVF+uCDD3Tp0iX/753Y2FjdeOONoR0u5O9DQshIqndZvXp1uEeLaLyt+eq9//77Vvfu3S273W516dLFWrFiRbhHijher9eaPn261b59eysqKsrq1KmT9cILL1g+ny/coxlt586d9f7/MD093bKs797a/NJLL1kJCQmW3W63hgwZYn322WfhHdpAjb2OpaWlDf7e2blzZ8hns1mWZYU2iQAAAK4N97AAAADjESwAAMB4BAsAADAewQIAAIxHsAAAAOMRLAAAwHgECwAAMB7BAgAAjEewAAAA4xEsAADAeAQLAAAwHsECAACM9/8/fovCs7I6NAAAAABJRU5ErkJggg==\n", + "image/png": "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e3X//ffb/8d2Kxo3bix/f3/NmTNHjz76aLYbQt26ddW4cWNNmTJFP/74o5555hn5+PjkeF6ffPKJwymQTz/9VKmpqRnuonzqqac0fvx4Pf744zp8+LCmTJmS6+XKLR8fHzVo0EBRUVGaPn26/ZEWaWlpWrx4scqWLat7770319O9/n+At3utt6pVq1aaOnWqFi9erJdeesnevmLFCiUmJmZ4nNPAgQP1/PPPa8eOHVqzZo1GjBjhcPo0M506ddKkSZNUsmTJHO+0PDw81Lx5cxUvXlxfffWV9u7de9PgeaNb2fZy09dms8nd3d1hO4yPj8/0rvZ0WS1fTtdVRESEpk6dqk8++cThGcZLlizJ8TLmt1vdbipXrqxKlSpp//79mjRpUq77e3p6qkmTJlq9erWmTp3qcKQrKSlJq1evVtOmTR326zabLdPLgdIvkUg/G7FkyRL98ccfevPNN9W0adMM4z/yyCP6+OOPsw2e0p+n0MeMGSNfX1/76XQfHx81bNhQ7777rs6cOZOj0+wFsY+6mdysr/S78A8cOODwn4XVq1cXfKG5lJf90+3q+iOjeXnEU37kldx8N3NTb35+TpYEz7vuukvvvvuu+vfvrwsXLqhnz54KDAzUr7/+qv379+vXX3/V7NmzJUlvvvmm2rVrp9atW2vkyJG6du2apkyZIh8fH124cME+TZvNpieeeEIff/yx7r77btWsWVPfffddpjv+t99+W02bNtWDDz6o559/XuHh4bp8+bKOHTumNWvW2K+zy83yvPXWW3rqqaf00EMP6emnn1ZQUJCOHTum/fv3a9asWQ7jDxs2TL1795bNZrvpjvFGUVFRcnV1VevWrXXw4EGNHTtWNWvWVK9evRzGK168uPr166fZs2crLCwsz9fE5lZkZKRat26tiIgIjRo1Su7u7nr//ff1448/aunSpXn632mNGjW0bNkyLV++XBUrVpSnp6dq1KhxW9Z6q1q3bq22bdtq9OjRSkhIUJMmTXTgwAGNGzdOtWvXVt++fR3Gf+yxxzRixAg99thjSk5OztFflhg+fLhWrFihZs2a6aWXXtL999+vtLQ0nTx5UuvXr9fIkSPVoEED/f3vf9fPP/+sVq1aqWzZsrp48aLefvttubm55fkB+rey7eW0b6dOnRQVFaXBgwerZ8+eOnXqlN58802FhITo6NGj9unl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NWqUnnjiCaWkpPxZjKurnnzySU2bNs1ZZQEAAKCAOC14ent76/3339e0adP0008/yRije+65Rz4+Ps4qCQAAAAXIaafa08XFxSkuLk733nuvfHx8ZIxxdkkAAAAoAE4LnufPn1erVq107733qkOHDoqLi5MkPfXUUzxKCQAAoAhyWvB86aWX5ObmppMnT8rb29ve3rt3b61bt85ZZQEAAKCAOO0az/Xr1+urr75S2bJlHdorVaqkEydOOKkqAAAAFBSnHfFMTEx0ONKZ7ty5c/Lw8HBCRQAAAChITguezZo108KFC+3DNptNaWlpmjZtmiIiIpxVFgAAAAqI0061T5s2TS1atNDu3bt19epVvfLKKzp48KAuXLignTt3OqssAAAAFBCnHfGsWrWqDhw4oPr166t169ZKTExU9+7dtXfvXt19993OKgsAAAAFxClHPFNSUtSmTRt98MEHmjBhgjNKAAAAgMWccsTTzc1NP/74o2w2mzNmDwAAACdw2jWe/fr109y5czV58mRnlVCohb8a7ewScu345I7OLgEAADiR04Ln1atX9c9//lMbNmxQvXr1MvyN9hkzZjipMgAAABQEy4Pn//73P4WHh+vHH39UnTp1JElHjhxxGIdT8AAAAEWP5cGzUqVKiouL05YtWyT9+Scy33nnHQUFBVldCgAAACxk+c1FxhiH4S+//FKJiYlWlwEAAACLOe05nuluDKIAAAAomiwPnjabLcM1nAV9TWd4eLh9vte/hgwZkun4W7duzXT8//73vwVaJwAAQFFm+TWexhgNGDBAHh4ekqSkpCQ999xzGe5qj4qKyrd57tq1S9euXbMP//jjj2rdurUeeeSRbPsdPnxYfn5+9uHSpUvnW00AAAB3GsuDZ//+/R2Gn3jiiQKf542BcfLkybr77rvVvHnzbPsFBgaqePHiBVgZAADAncPy4Dlv3jyrZ+ng6tWrWrx4sUaMGHHTU/y1a9dWUlKSqlatqtdff10RERFZjpucnKzk5GT7cEJCQr7VDAAAUBQ4/eYiq61atUoXL17UgAEDshwnJCREH374oVasWKGoqChVrlxZrVq10vbt27PsExkZKX9/f/urXLlyBVA9AABA4eW0v1zkLHPnzlX79u0VGhqa5TiVK1dW5cqV7cONGjXSqVOnNH36dDVr1izTPmPGjNGIESPswwkJCYRP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u7u76tatqw0bNqhbt2729g0bNqhLly6Z9mnUqJHWrFnj0LZ+/XrVq1dPbm5umfbx8PCQh4eHQ1vx4sVvrfgiwM/Pjx1rPmA95g/WY/5gPeYP1mP+KIj1yJHOglPkby6SpBEjRuif//ynPv74Yx06dEgvvfSSTp48qeeee07Sn0cr+/XrZx//ueee04kTJzRixAgdOnRIH3/8sebOnatRo0Y5axEAAAAKvSJ/xFOSevfurfPnz+uNN95QXFycqlevrrVr1yosLEySFBcX5/BMzwoVKmjt2rV66aWX9N577yk0NFTvvPOOevTo4axFAAAAKPTuiOApSYMHD9bgwYMzfW/+/PkZ2po3b649e/YUcFVFl4eHh8aNG5fh8gPkDusxf7Ae8wfrMX+wHvMH67FwuiMeIA8AAADnuyOu8QQAAIDzETwBAABgCYInAAAALEHwBAAAgCUInsg3kZGReuCBB+Tr66vAwEB17dpVhw8fdnZZhV5kZKRsNpuGDx/u7FIKndOnT+uJJ55QyZIl5e3trVq1aun77793dlmFSmpqql5//XVVqFBBXl5eqlixot544w2lpaU5u7Tb2vbt29W5c2eFhobKZrNp1apVDu8bYzR+/HiFhobKy8tLLVq00MGDB51T7G0su/WYkpKi0aNHq0aNGvLx8VFoaKj69eunM2fOOK9g3BTBE/lm27ZtGjJkiL799ltt2LBBqampatOmjRITE51dWqG1a9cuffjhh7r//vudXUqh89tvv6lJkyZyc3PTl19+qf/85z966623+ItiuTRlyhTNmTNHs2bN0qFDhzR16lRNmzZN7777rrNLu60lJiaqZs2amjVrVqbvT506VTNmzNCsWbO0a9cuBQcHq3Xr1rp8+bLFld7esluPv//+u/bs2aOxY8dqz549ioqK0pEjR/Twww87oVLkFI9TQoH59ddfFRgYqG3btqlZs2bOLqfQuXLliurUqaP3339fEydOVK1atTRz5kxnl1VovPrqq9q5c6e+/vprZ5dSqHXq1ElBQUGaO3euva1Hjx7y9vbWokWLnFhZ4WGz2bRy5Up17dpV0p9HO0NDQzV8+HCNHj1akpScnKygoCBNmTJFzz77rBOrvX3duB4zs2vXLtWvX18nTpxQ+fLlrSsOOcYRTxSYS5cuSZICAgKcXEnhNGTIEHXs2FEPPfSQs0splFav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\n", "text/plain": [ "
" ] @@ -2782,6 +2877,9 @@ "source": [ "summer = release_dates[(release_dates['title'].str.contains('Summer', case=False)) & (release_dates['country'] == 'USA')]\n", "plt.hist(x=summer['date'].dt.month)\n", + "plt.title('Frequency by month of movies released in the USA with \"Summer\" in the title')\n", + "plt.ylabel('Frequency')\n", + "plt.xlabel('Month Number')\n", "plt.show()" ] }, @@ -2797,12 +2895,12 @@ }, { "cell_type": "code", - "execution_count": 135, + "execution_count": 87, "metadata": {}, "outputs": [ { "data": { - "image/png": "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OTO+9KUvxZe//OU4/vjjY9asWdHY2Bhz5sypxHwAQBWpzXPwu+++GytXrozp06d32T9+/Pj4wx/+sNNzSqVSlEql8uOOjo6IiOjs7Mw764faXno7+a8JANWkEv++/vevm2XZBx6XKyzeeOON2LZtWxx++OFd9h9++OHx2muv7fScYrEYra2tO+xvbGzMc2kA4COon1XZX3/Lli1RX1+/y+dzhcX7ampqujzOsmyHfe9raWmJ5ubm8uPt27fHv/71rxgwYMAuz/lfnZ2d0djYGO3t7dG/f//ujMwuWNvKsbaVY20rw7pWzt6wtlmWxZYtW6KhoeEDj8sVFh//+MejT58+O9yd2Lx58w53Md5XKBSiUCh02XfwwQfnuWxZ//79q/Z/SG9nbSvH2laOta0M61o51b62H3Sn4n253rzZt2/fGDt2bCxatKjL/kWLFsVpp52WbzoAYK+T+6WQ5ubmuPLKK2PcuHHR1NQUc+fOjY0bN8a1115bifkAgCqSOywuvfTS+Oc//xm33nprbNq0KUaOHBm/+c1vYujQoZWYLyL+83LKzTffvMNLKvScta0ca1s51rYyrGvl7EtrW5N92OdGAAA+It8VAgAkIywAgGSEBQCQjLAAAJKpirDwNe09t3Tp0pg0aVI0NDRETU1NPPLII12ez7IsbrnllmhoaIgDDzwwzj777FizZs2eGbaKFIvFOPnkk6Ouri4GDhwYF198cbz44otdjrG23TNnzpwYPXp0+QcKNTU1xeOPP15+3rqmUSwWo6amJqZNm1beZ22755Zbbomampou26BBg8rP7yvr2uvDwte0p7F169YYM2ZMzJ49e6fP/+AHP4iZM2fG7NmzY/ny5TFo0KC44IILYsuWLbt50uqyZMmSmDJlSixbtiwWLVoU7733XowfPz62bt1aPsbads+QIUNixowZsWLFilixYkWce+65cdFFF5X/IrauPbd8+fKYO3dujB49ust+a9t9I0aMiE2bNpW3tra28nP7zLpmvdynPvWp7Nprr+2y77jjjsumT5++hyaqfhGRLVy4sPx4+/bt2aBBg7IZM2aU973zzjtZfX19dvfdd++BCavX5s2bs4jIlixZkmWZtU3tkEMOyX7+859b1wS2bNmSfeITn8gWLVqUnXXWWdnUqVOzLPN7tiduvvnmbMyYMTt9bl9a1159x+L9r2kfP358l/0f9DXt5Ld+/fp47bXXuqxzoVCIs846yzrn1NHRERERhx56aERY21S2bdsWCxYsiK1bt0ZTU5N1TWDKlCkxceLEOP/887vst7Y9s3bt2mhoaIjhw4fHZZddFuvWrYuIfWtdu/XtprtLd76mnfzeX8udrfOGDRv2xEhVKcuyaG5ujjPOOCNGjhwZEda2p9ra2qKpqSneeeedOOigg2LhwoVxwgknlP8itq7ds2DBgnj22Wdj+fLlOzzn92z3nXLKKXHffffFMcccE6+//nrcdtttcdppp8WaNWv2qXXt1WHxvjxf0073Weeeuf766+O5556LZ555ZofnrG33HHvssbF69ep4880341e/+lVMnjw5lixZUn7euubX3t4eU6dOjSeffDIOOOCAXR5nbfObMGFC+b9HjRoVTU1NcdRRR8X8+fPj1FNPjYh9Y1179Ush3fmadvJ7/13L1rn7brjhhnj00Ufj6aefjiFDhpT3W9ue6du3bxx99NExbty4KBaLMWbMmLjrrrusaw+sXLkyNm/eHGPHjo3a2tqora2NJUuWxI9+9KOora0tr5+17bl+/frFqFGjYu3atfvU79leHRa+pn33GD58eAwaNKjLOr/77ruxZMkS6/whsiyL66+/Ph5++OH43e9+F8OHD+/yvLVNK8uyKJVK1rUHzjvvvGhra4vVq1eXt3HjxsUVV1wRq1evjiOPPNLaJlIqleKFF16IwYMH71u/Z/fY20Y/ogULFmT7779/du+992bPP/98Nm3atKxfv37ZK6+8sqdHqypbtmzJVq1ala1atSqLiGzmzJnZqlWrsg0bNmRZlmUzZszI6uvrs4cffjhra2vLLr/88mzw4MFZZ2fnHp68d7vuuuuy+vr6bPHixdmmTZvK29tvv10+xtp2T0tLS7Z06dJs/fr12XPPPZfddNNN2X777Zc9+eSTWZZZ15T++1MhWWZtu+sb3/hGtnjx4mzdunXZsmXLsgsvvDCrq6sr/3u1r6xrrw+LLMuyn/zkJ9nQoUOzvn37ZieddFL5o3x8dE8//XQWETtskydPzrLsPx+Fuvnmm7NBgwZlhUIhO/PMM7O2trY9O3QV2NmaRkQ2b9688jHWtnuuvvrq8p/7ww47LDvvvPPKUZFl1jWl/w0La9s9l156aTZ48OBs//33zxoaGrLPfOYz2Zo1a8rP7yvr6mvTAYBkevV7LACA6iIsAIBkhAUAkIywAACSERYAQDLCAgBIRlgAAMkICwAgGWEBACQjLACAZIQFAJCMsAAAkvl/8pvBQZBJt3EAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoEAAAHFCAYAAACNciNfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAABIWElEQVR4nO3dd3RU1d7G8WdIGSAkoZlAKEmk9ypIE0LoRQQV5SJVvSggIHBVbICiAZFcFAQsGEClCioKUiIBqUoHuUpReu/BACFlv3+4Mi9DEhIgYcKc72etWStnzym/szNzzpPTYjPGGAEAAMBScrm6AAAAANx9hEAAAAALIgQCAABYECEQAADAggiBAAAAFkQIBAAAsCBCIAAAgAURAgEAACyIEAgAAGBBtxQCp02bJpvNluZr6NCh2VWjJY0YMUI2m01nzpxxdSl3Rc+ePZUvX75sX86cOXNUqVIl5cmTRzabTdu2bcv2ZWYVm82mESNGuLqMW7Jy5UrZbDatXLnS1aXckQMHDshms2natGk3HS871nfSpElpLjdlWV9//XWWLSstGS2nf//+stlsTm1xcXEaM2aMqlWrJj8/P/n6+qpUqVLq3LmzVq1aleZ8zpw5I7vdLpvNpk2bNmX5etyoSZMmatKkiWP48uXLGjFiRJq/uzvdHvfs2dOxrBEjRigkJCTN8RISElSkSJE7/r3OnDlT48ePT/O9u7Edyez63jhNZsbLrGPHjmnEiBFpbuPv1v5m8eLF6fZ1SEiIevbs6Ri+Wb0pn7/s4Hk7E0VFRal8+fJObUFBQVlSEJBdTp8+rW7duqlVq1aaNGmS7Ha7ypYt6+qyMm39+vUqXry4q8vATdSsWVPr169XxYoVs2yekyZNUuHChZ12GDlZUlKSWrRooZ07d+o///mP6tSpI0nau3evvv/+e61evVqNGzdONd0XX3yha9euSZKmTp2q2rVrZ2udkyZNchq+fPmyRo4cKUlO4fBu+uGHH3Ty5ElJ//TBY489dlvzmTlzpn777TcNGjQo1Xs5dTvyxhtvaODAgVk2v2PHjmnkyJEKCQlR9erVs2y+t2Lx4sX66KOP0gyC33zzjfz8/BzDrqr3tkJg5cqVM/0FTUhIkM1mk6fnbS0KyDJ79uxRQkKCnnrqqTR3Qjndgw8+6OoSlJSUpMTERNntdleXkiP5+fnliN+TK/38889at26dPv/8c/Xq1cvR3rJlS/Xv31/JyclpTvf5558rICBAwcHBmjVrliIjI5UnT55sqzMrg3pWmTp1qry9vdW4cWMtW7ZMR44cyfLAllM/n6VKlXJ1CXdVjRo1XF2CpCy+JjDltMEXX3yhIUOGqFixYrLb7dq3b58kKTo6WuHh4fLz81PevHnVoEED/fTTT6nms2jRIlWvXl12u12hoaF6//33Ux0OvdnpmbQOd+/du1f/+te/FBAQILvdrgoVKuijjz5Ks/5Zs2bptddeU1BQkPz8/NSsWTPt3r071XKWLFmi8PBw+fv7K2/evKpQoYIiIiIk/fNXrc1m0/r161NN99Zbb8nLy0vHjh3LsE8PHz6sTp06yc/PT/7+/nrqqad0+vRpx/tPP/20ChYsqMuXL6eatmnTpqpUqVK68/7oo4+UK1cunTp1ytE2btw42Ww29evXz9GWnJysAgUKaMiQIY62a9euadSoUSpfvrzsdrvuu+8+9erVy6m2FHPmzFG9evXk4+OjfPnyqWXLltq6dWuG67527VoVLlxY7dq1U1xc3E3HXbhwoerVq6e8efPK19dXzZs3d+r7nj17qmHDhpKkJ554Qjab7aZ/7adc+rBixQo9++yzKlSokPz8/NS9e3fFxcXpxIkT6ty5s/Lnz6+iRYtq6NChSkhIcJrHuXPn1LdvXxUrVkze3t66//779dprryk+Pt4xTo0aNdSoUaNUy09KSlKxYsXUqVMnR1tan+sTJ06oT58+Kl68uLy9vRUaGqqRI0cqMTHRabzJkyerWrVqypcvn3x9fVW+fHm9+uqrN+3TlO/Ye++9p1GjRik0NFR2u10xMTGSpE2bNunhhx9WwYIFlTt3btWoUUNz58696TxTZGba06dPq2/fvqpYsaLy5cungIAANW3aVKtXr041v8ysX2b76tixY+rcubN8fX3l7++vJ554QidOnMjUeqV1Ojjl1NO+ffvUpk0b5cuXTyVKlNCQIUOcPgtpCQkJ0a5du7Rq1SrHpTc3njJLSEjI1PYqs9vfO3X27FlJUtGiRdN8P1eu1LudX375Rb/99pu6deumZ599VhcvXtT8+fMzXNauXbtks9k0b948R9vmzZtls9lSbfsefvhh1apVyzF8/engAwcO6L777pMkjRw50tHXNx59PXnypLp06SJ/f38FBgaqd+/eunjx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WMak/lz36dPH5MuXz/F7SvH+++87dqjG/PM5z58/f4brfKOU71ipUqUcf3SkKF++vKlRo4ZTfcYY065dO1O0aFHH7yKtUJTZaW+UmJhoEhISTHh4uOnYsaOjPTPrl9m+mjx5spFkvvvuO6fxUkLK7YbAtD4Lbdq0MeXKlbvp/IwxplKlSo6wktayMtpe3cr292brlNkQaIwxU6dONfny5XPsH4oWLWq6d+9ufv7551TTx8XFGT8/P/Pggw862nr06GFsNpsjhN3MU089Ze6//37HcLNmzcyzzz5rChQoYKZPn26MMWbt2rVO3ztjnEOgMcacPn061XcsRcr2+L333nNq79u3r8mdO/dN9wOZkZycbEqXLm2KFSvmCFMpy/zpp58c4/3111/Gw8Mj1cGFG7Vt2zZVoEpx4zo++eSTxm63m0OHDjmN17p1a5M3b15z4cIFY0zmP2+3K70QGBgYaGJjYx1tJ06cMLly5TIRERE3nV/K/iit72xmv5OZ3delJ63vRorrQ2BG9d4YAm9l35qR2zodPGPGDG3cuNHpdf01f48++qjT+OvWrdO5c+fUo0cPJSYmOl7Jyclq1aqVNm7cqLi4OMXFxWnjxo3q1KmTcufO7Zje19dX7du3v51SdfXqVf3000/q2LGj8ubN67T8Nm3a6OrVq9qwYYPTNA8//LDTcNWqVSVJBw8edKxPbGys+vbte9M7dp5//nlJ0qeffupomzhxoqpUqaKHHnooU/V37drVabhz587y9PR0nJKTpIEDB2rbtm1au3atJCk2NlZffPGFevTokeEdUOHh4YqOjnas1+XLlzV48GAVLlxYy5cvl/TPaaSUQ87SPxcv58+fX+3bt3fqz+rVq6tIkSKOU2FLly5VYmKiunfv7jRe7ty51bhx41R34Rlj1KdPHw0fPlwzZ87USy+9lGH/7N69W8eOHVO3bt2cTjPly5dPjz76qDZs2JDmqfLMateundNwhQoVJElt27ZN1Z7y+ZCkFStWyMfHJ9WF3SmH/1NOwxUqVEjt27fX9OnTHddKnT9/Xt999526d+9+02tpf/jhB4WFhSkoKMipf1u3bi1Jjrsw69SpowsXLqhLly767rvvbvkOx4cfflheXl6O4X379umPP/5wfDZv/E4dP3483dNDtzrtlClTVLNmTeXOnVuenp7y8vLSTz/9pN9//90x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7gDTW7/M9lVYWJjmzp2rhQsXOp32mjlz5i2sZda606Memd3+pqdMmTIKDg7WvHnz9OKLLzpt706fPq2YmBinyx7Onj0rX1/fNLe1f/zxh6T/D90pR8A+/fRTlS5d2mncK1euqEOHDvr8889vGgKlf44Gzp07VyVKlHBcqlG2bFmVLFlSb775phISEpz+kE1Ldh/RSs/MmTN15coVvf3222mern788cf1+eefq2/fvmrRooU8PDw0efJk1atXL9153spnJjw8XN98842OHTvm9IfjjBkzlDdv3hz7SJmMZMXvM7P7uszUkNFR6Fup93b2rem5KyEwX758mjBhgnr06KFz587pscceU0BAgE6fPq3t27fr9OnTjr/23377bbVq1UrNmzfXkCFDlJSUpDFjxsjHx8fplIXNZtNTTz2lzz//XKVKlVK1atX066+/prmx/uCDD9SwYUM1atRIzz//vEJCQnTp0iXt27dP33//vVasWHHL6zNu3Dg988wzatasmZ599lkFBgZq37592r59uyZOnOg0/sCBAx2PJUk55ZVZCxYskKenp5o3b65du3bpjTfeULVq1dS5c2en8fLnz6/u3btr8uTJCg4OvqVrKMPDwzVhwgTlyZNHDRo0kPTP0dHQ0FAtW7ZMDz/8sNPpnieffFJfffWV2rRpo4EDB6pOnTry8vLSkSNHFBMTow4dOqhjx44KCQnRW2+9pddee01//fWXWrVqpQIFCujkyZP69ddf5ePjk+Zf5xUqVNDq1avVrFkzPfTQQ4qOjk739EeuXLn03nvvqWvXrmrXrp369Omj+Ph4jR07VhcuXNDo0aMz3Q9ZqXv37vroo4/Uo0cPHThwQFWqVNGaNWv07rvvqk2bNql2SL1799aYMWP0r3/9S3ny5NETTzyR4TLeeustLV++XPXr19eAAQNUrlw5Xb16VQcOHNDixYs1ZcoUFS9eXM8++6zjd1u0aFGdOHFCERER8vf3T/fIQ0Y+/vhjtW7dWi1btlTPnj1VrFgxnTt3Tr///ru2bNni9MiO2522Xbt2evvttzV8+HA1btxYu3fv1ltvvaXQ0FCnx7pkZv0y21fdu3fXf//7X3Xv3l3vvPOOypQpo8WLF2vp0qW31U9ZoUqVKpo9e7bmzJmj+++/X7lz51aVKlUyPf2tbH/T8/7776tz584KDw/Xs88+qyJF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aU6T1pHAEiVK6OLFi/Lz88vS+giBAABkj9jYWPn7+2fL/ttduPWRwMuXLytXLufLHj08PG76iBi73S673Z7dpQEAALiUW4fA9u3b65133lHJkiVVqVIlbd26VZGRkerdu7erSwMAAHAptw6BEyZM0BtvvKG+ffvq1KlTCgoKUp8+ffTmm2+6ujQAAACXcusQ6Ovrq/Hjx2v8+PGuLgUAACBHcevnBAIAACBthEAAAAALIgQCAABYECEQAADAggiBAAAAFkQIBAAAsCBCIAAAgAURAgEAACyIEAgAAGBBhEAAAAALIgQCAABYECEQAADAggiBAAAAFkQIBAAAsCBCIAAAgAURAgEAACyIEAgAAGBBhEAAAAALIgQCAABYECEQAADAggiBAAAAFkQIBAAAsCBCIAAAgAURAgEAACyIEAgAAGBBhEAAAAALIgQCAABYECEQAADAggiBAAAAFkQIBAAAsCBCIAAAgAURAgEAACyIEAgAAGBBbh0CQ0JCZLPZUr369evn6tIAAABcytPVBWSnjRs3KikpyTH822+/qXnz5nr88cddWBUAAIDruXUIvO+++5yGR48erVKlSqlx48YuqggAACBncOvTwde7du2avvzyS/Xu3Vs2m83V5QAAALiUWx8JvN63336rCxcuqGfPnjcdLz4+XvHx8Y7h2NjYbK4MAADg7rPMkcCpU6eqdevWCgoKuul4ERER8vf3d7xKlChxlyoEAAC4eywRAg8ePKjo6Gg988wzGY47bNgwXbx40fE6fPjwXagQAADg7rLE6eCoqCgFBASobdu2GY5rt9tlt9vvQlUAAACu4/ZHApOTkxUVFaUePXrI09MSmRcAACBDbh8Co6OjdejQIfXu3dvVpQAAAOQYbn9orEWLFjLGuLoMAACAHMXtjwQCAAAgNUIgAACABRECAQAALIgQCAAAYEGEQAAAAAsiBAIAAFgQIRAAAMCCCIEAAAAWRAgEAACwIEIgAACABRECAQAALIgQCAAAYEGEQAAAAAsiBAIAAFgQIRAAAMCCCIEAAAAWRAgEAACwIEIgAACABRECAQAALIgQCAAAYEGEQAAAAAsiBAIAAFgQIRAAAMCCCIEAAAAWRAgEAACwIEIgAACABRECAQAALIgQCAAAYEGEQAAAAAsiBAIAAFgQIRAAAMCCCIEAAAAWRAgEAACwILcPgUeP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gQO1bNky5c6dO93x6Nvb07p1a8fPVapUUb169VSqVClNnz5dDz74oCT61p1xOjgLFS5cWB4eHqmO+p06dSrVX1K4fSl3rtHPt++FF17QwoULFRMTo+LFizva6ds74+3trdKlS6t27dqKiIhQtWrV9MEHH9Cvd2Dz5s06deqUatWqJU9PT3l6emrVqlX68MMP5enp6eg/+jZr+Pj4qEqVKtq7dy+fWwsgBGYhb29v1apVS8uXL3dqX758uerXr++iqtxPaGioihQp4tTP165d06pVq+jnDBhj1L9/fy1YsEArVqxQaGio0/v0bdYyxig+Pp5+vQPh4eHauXOntm3b5njVrl1bXbt21bZt23T//ffTt1koPj5ev//+u4oWLcrn1gpcdkuKm5o9e7bx8vIyU6dONf/73//MoEGDjI+Pjzlw4ICrS7unXLp0yWzdutVs3brVSDKRkZFm69at5uDBg8YYY0aPHm38/f3NggULzM6dO02XLl1M0aJFTWxsrIsrz9mef/554+/vb1auXGmOHz/ueF2+fNkxDn17e4YNG2Z+/vlns3//frNjxw7z6quvmly5cplly5YZY+jXrHT93cHG0Ld3YsiQIWblypXmr7/+Mhs2bDDt2rUzvr6+jn0WfeveCIHZ4KOPPjLBwcHG29vb1KxZ0/H4DWReTEyMkZTq1aNHD2PMP48uGD58uClSpIix2+3moYceMjt37nRt0feAtPpUkomKinKMQ9/ent69ezu+9/fdd58JDw93BEBj6NesdGMIpG9v3xNPPGGKFi1qvLy8TFBQkOnUqZPZtWuX43361r3ZjDHGNccgAQAA4CpcEwgAAGBBhEAAAAALIgQCAABYECEQAADAggiBAAAAFkQIBAAAsCBCIAAAgAURAgHck0JCQjR+/HhXl3FLmjRpokGDBrm6DACQRAgEcAemTJkiX19fJSYmOtr+/vtveXl5qVGjRk7jrl69WjabTXv27LnbZUqSVq5cKZvNpsqVKyspKcnpvfz582vatGkuqQsAXIUQCOC2hYWF6e+//9amTZscbatXr1aRIkW0ceNGXb582dG+cuVKBQUFqWzZsq4o1eHPP//UjBkzXFpDVkpKSlJycrKrywBwDyIEArht5cqVU1BQkFauXOloW7lypTp06KBSpUpp3bp1Tu1hYWGSpGvXrumll15SsWLF5OPjo7p16zrNQ5LWrVunhx56SHny5FGJEiU0YMAAxcXFpVtLVFSU/P39tXz58pvW/MILL2j48OG6evVqmu8fOHBANptN27Ztc7RduHBBNpvNUWPKUcWlS5eqRo0aypMnj5o2bapTp07pxx9/VIUKFeTn56cuXbo4BWFJSkxMVP/+/ZU/f34VKlRIr7/+uq7/750Z9c20adOUP39+/fDDD6pYsaLsdrsOHjx403UGgLQQAgHckSZNmigmJsYxHBMToyZNmqhx48aO9mvXrmn9+vWOENirVy+tXbtWs2fP1o4dO/T444+rVatW2rt3ryRp586datmypTp16qQdO3Zozpw5WrNmjfr3759mDe+//76GDh2qpUuXqnnz5jetd9CgQUpMTNTEiRPveN1HjBihiRMnat26dTp8+LA6d+6s8ePHa+bMmVq0aJGWL1+uCRMmOE0zffp0eXp66pdfftGHH36o//73v/rss88c72fUN5J0+fJlRURE6LPPPtOuXbsUEBBwx+sCwIIMANyBTz75xPj4+JiEhAQTGxtrPD09zcmTJ83s2bNN/fr1jTHGrFq1ykgyf/75p9m3b5+x2Wzm6NGjTvMJDw83w4YNM8YY061bN/Pvf//b6f3Vq1ebXLlymStXrhhjjAkODjb//e9/zSuvvGKKFi1qduzYcdM6Y2JijCRz/vx5M2XKFFOwYEFz4cIFY4wx/v7+JioqyhhjzP79+40ks3XrVse058+fN5JMTEyM07yio6Md40RERDjWMUWfPn1My5YtHcONGzc2FSpUMMnJyY62l19+2VSoUMEYYzLVN1FRUUaS2bZt203XFwAy4unC/AnADYSFhSkuLk4bN27U+fPnVbZsWQUEBKhx48bq1q2b4uLitHLlSpUsWVL333+/5s2bJ2NMqmsD4+PjVahQIUnS5s2btW/fPn311VeO940xSk5O1v79+1WhQgVJ0rhx4xQXF6dNmzbp/vvvz3TNTz/9tCIjIzVmzBi9++67t73uVatWdfwcGBiovHnzOtURGBioX3/91WmaBx98UDabzTFcr149jRs3TklJSdqyZUuGfSNJ3t7eTssGgNtBCARwR0qXLq3ixYsrJiZG58+fV+PGjSVJRYoUUWhoqNauXauYmBg1bdpUkpScnCwPDw9t3rxZHh4eTvPKly+fY5w+ffpowIABqZZXsmRJx8+NGjXSokWLNHfuXL3yyiuZrtnT01OjRo1Sz549U51izpXrn6tkzHXX6SUkJKQ5Hy8vL8fPNpvNaTil7VZu2shM30hSnjx5nIIkANwOQiCAOxYWFqaVK1fq/Pnz+s9//uNob9y4sZYuXaoNGzaoV69ekqQaNWooKSlJp06dSvUYmRQ1a9bUrl27VLp06Zsut06dOnrhhRfUsmVLeXh4OC07I48//rjGjh2rkSNHOrXfd999kqTjx4+rRo0akuR0k8id2rBhQ6rhMmXKyMPDI1N9AwBZhRAI4I6FhYWpX79+SkhIcBwJlP4Jgc8//7yuXr3quCmkbNmy6tq1q7p3765x48apRo0aOnPmjFasWKEqVaqoTZs2evnll/Xggw+qX79+evbZZ+Xj46Pff/89zRst6tWrpx9//FGtWrWSp6enXnzxxUzXPXr0aLVs2dKpLU+ePHrwwQc1evRohYSE6MyZM3r99dfvoHecHT58WIMHD1afPn20ZcsWTZgwQePGjZOUub4BgKzC3cEA7lhYWJiuXLmi0qVLKzAw0NHeuHFjXbp0SaVKlVKJEiUc7VFRUerevbuGDBmicuXK6eGHH9Yvv/ziGKdq1apatWqV9u7dq0aNGqlGjRp64403VLRo0TSX36BBAy1atEhvvPGGPvzww0zX3bRpUzVt2tTpYdeS9PnnnyshIUG1a9fWwIEDNWrUqFvpjpvq3r27rly5ojp16qhfv3564YUX9O9//9vxfkZ9AwBZxWauv/AFAAAAlsCRQAAAAAsiBAIAAFgQIRAAAMCCCIEAAAAWRAgEAACwIEIgAACABRECAQAALIgQCAAAYEGEQAAAAAsiBAIAAFgQIRAAAMCCCIEAAAAW9H9iNJEoK22tsAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] @@ -2814,6 +2912,9 @@ "source": [ "action = release_dates[(release_dates['title'].str.contains('Action', case=False)) & (release_dates['country'] == 'USA')]\n", "plt.hist(x=action['date'].dt.isocalendar().week)\n", + "plt.title('Frequency by week of movies released in the USA with \"Action\" in the title')\n", + "plt.ylabel('Frequency')\n", + "plt.xlabel('Week Number')\n", "plt.show()" ] }, @@ -2827,11 +2928,291 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 98, "metadata": {}, - "outputs": [], + "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", + "
titlenamencountrydate
17SpeedKeanu Reeves1.0USA1922-10-22
18SpeedKeanu Reeves1.0USA1936-05-08
21Sweet NovemberKeanu Reeves1.0USA1968-02-08
27The Night BeforeKeanu Reeves1.0USA1988-04-15
3Bill & Ted's Excellent AdventureKeanu Reeves1.0USA1989-02-17
2Bill & Ted's Bogus JourneyKeanu Reeves1.0USA1991-07-19
14Little BuddhaKeanu Reeves1.0USA1994-05-25
19SpeedKeanu Reeves1.0USA1994-06-10
11Johnny MnemonicKeanu Reeves1.0USA1995-05-26
1A Walk in the CloudsKeanu Reeves1.0USA1995-08-11
4Chain ReactionKeanu Reeves1.0USA1996-08-02
6Feeling MinnesotaKeanu Reeves1.0USA1996-09-13
24The Devil's AdvocateKeanu Reeves1.0USA1997-10-17
26The MatrixKeanu Reeves1.0USA1999-03-31
28The ReplacementsKeanu Reeves1.0USA2000-08-11
22Sweet NovemberKeanu Reeves1.0USA2001-02-16
7Hard BallKeanu Reeves1.0USA2001-09-14
5ConstantineKeanu Reeves1.0USA2005-02-18
25The Lake HouseKeanu Reeves1.0USA2006-06-16
20Street KingsKeanu Reeves1.0USA2008-04-11
23The Day the Earth Stood StillKeanu Reeves1.0USA2008-12-12
047 RoninKeanu Reeves1.0USA2013-12-25
9John WickKeanu Reeves1.0USA2014-10-24
12Knock KnockKeanu Reeves1.0USA2015-10-09
10John Wick: Chapter 2Keanu Reeves1.0USA2017-02-10
13Knock KnockKeanu Reeves1.0USA2017-10-06
\n", + "
" + ], + "text/plain": [ + " title name n country date\n", + "17 Speed Keanu Reeves 1.0 USA 1922-10-22\n", + "18 Speed Keanu Reeves 1.0 USA 1936-05-08\n", + "21 Sweet November Keanu Reeves 1.0 USA 1968-02-08\n", + "27 The Night Before Keanu Reeves 1.0 USA 1988-04-15\n", + "3 Bill & Ted's Excellent Adventure Keanu Reeves 1.0 USA 1989-02-17\n", + "2 Bill & Ted's Bogus Journey Keanu Reeves 1.0 USA 1991-07-19\n", + "14 Little Buddha Keanu Reeves 1.0 USA 1994-05-25\n", + "19 Speed Keanu Reeves 1.0 USA 1994-06-10\n", + "11 Johnny Mnemonic Keanu Reeves 1.0 USA 1995-05-26\n", + "1 A Walk in the Clouds Keanu Reeves 1.0 USA 1995-08-11\n", + "4 Chain Reaction Keanu Reeves 1.0 USA 1996-08-02\n", + "6 Feeling Minnesota Keanu Reeves 1.0 USA 1996-09-13\n", + "24 The Devil's Advocate Keanu Reeves 1.0 USA 1997-10-17\n", + "26 The Matrix Keanu Reeves 1.0 USA 1999-03-31\n", + "28 The Replacements Keanu Reeves 1.0 USA 2000-08-11\n", + "22 Sweet November Keanu Reeves 1.0 USA 2001-02-16\n", + "7 Hard Ball Keanu Reeves 1.0 USA 2001-09-14\n", + "5 Constantine Keanu Reeves 1.0 USA 2005-02-18\n", + "25 The Lake House Keanu Reeves 1.0 USA 2006-06-16\n", + "20 Street Kings Keanu Reeves 1.0 USA 2008-04-11\n", + "23 The Day the Earth Stood Still Keanu Reeves 1.0 USA 2008-12-12\n", + "0 47 Ronin Keanu Reeves 1.0 USA 2013-12-25\n", + "9 John Wick Keanu Reeves 1.0 USA 2014-10-24\n", + "12 Knock Knock Keanu Reeves 1.0 USA 2015-10-09\n", + "10 John Wick: Chapter 2 Keanu Reeves 1.0 USA 2017-02-10\n", + "13 Knock Knock Keanu Reeves 1.0 USA 2017-10-06" + ] + }, + "execution_count": 98, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - " " + "keanu_lead = cast[(cast['name'] == 'Keanu Reeves') & (cast['n'] == 1.0)]\n", + "usa = release_dates[release_dates['country'] == 'USA']\n", + "keanu_merge = pd.merge(keanu_lead, usa, how='left', on='title')\n", + "keanu_merge_usa = keanu_merge[keanu_merge['country'] == 'USA']\n", + "keanu_merge_usa[['title', 'name', 'n', 'country', 'date']].sort_values(by='date')" ] }, { @@ -2843,10 +3224,44 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 110, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/var/folders/b6/4qc_2zbx4bg37ybn_70yv7xc0000gn/T/ipykernel_27695/3150025360.py:4: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " keanu_movies_usa['month'] = keanu_movies_usa['date'].dt.month\n" + ] + }, + { + "data": { + "image/png": "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jvHXrFljJJmIiAjTqlUrs2zZMvPBBx+YMmXKmPz585uff/7ZMezXX39tfHx8zP33328WLVpkVq5cabp165au1rTlLVasmHnqqafMihUrzMcff2yuXLmSYf8kJiaaYsWKmUKFCpk333zTrFy50vTt29dIMr179zbGGJOUlGQ2bNhgwsLCTFRUlNmwYYPZsGGDuXTp0nX7PTIy0jRu3Ni0a9fO2Gw28+qrr2Y4XI8ePYy3t7d55plnzMqVK838+fNN+fLlTZEiRczJkycdw82cOdPExcWZpUuXmoSEBDNv3jxTtWpVU65cOXP58uUM35NRo0aZ+Ph4M3XqVGO3201MTIxjOHfe54ykjT958mSn9j179hhJpl+/fo62EydOmIiICBMZGWneeust89VXX5kXX3zR2O12061bN8dwV69eNU2bNjUBAQFmzJgxJj4+3rzzzjumWLFi5q677jIXL140xhjz2WefGUkmPj7ead779+83ksz06dPd6t/z58+b0NBQU6tWLfPf//7XJCQkmEWLFplevXqZffv23bAf6tWrZ0JDQ025cuXMu+++a1atWmWaN29uJJkxY8aYypUrmwULFpgvvvjC3HvvvcZut5vjx487xl+7dq3x9vY2NWvWNIsWLTJLliwxjRs3NjabzSxcuNAxXPXq1U1UVFS6+T/22GOmcOHCJiUlxRjzf+v/oUOHHMO8//77xmazmdatW5vFixebZcuWmebNmxsvLy/z1VdfOYZr0qSJKVSokJk1a5ZZu3atWbJkiRk1apRTHRlJW+ciIyPN0KFDTXx8vFmyZInL/W+MMV27djWRkZFO083qbcOV5XO1rzKS0Tbl6vaYkb1795qoqCgTFhbm+MzZsGGD07xKlixpmjZtapYsWWKWLFliKleubIKDg82ff/7pmI6rn503WqZrt/M0kydPdlrfzp8/bwoUKGDCwsLMW2+95bQeXs9LL71kJJnly5eb1NRUExkZaUqVKmVSU1NvOm7a+h4REWG6d+9uVqxYYWbNmmUKFy5sIiIizJkzZ4wxxvz222/GbrebkSNHOo3/xx9/GD8/PzN48OAbzqdr167Gx8fHVKhQwbz66qtO+7Thw4ebO++8M932v2XLFsf4P/zwgwkMDDSlS5c27733nlm+fLlp3769kWQmTpzoGC5tn1iyZEnTsWNHs3z5crNgwQJTokQJ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00Z//vmn/vzzTwUFBalu3br65JNP9Oeff7rUDzfbh0hS9erVdf/99+uNN96Q9Hd4Pnz4cLqwdT3X26ddb/v/577O3f1MVqwvWbXO5ei7otLYbDZNnDhRjRo10qxZs9K9nvbGXXux7a3s4G8mow/OkydPOt6YggULSpKGDx+uRx55JMNplCtXzum5q3cdhYaG6sSJE+naf/31V6d5Z1apUqW0du1aNWjQQE2aNNHKlStVp04dx7RtNpu+/fZbx0r3T2lte/bs0c6dOzV37lx17drV8frBgwczXVdWvc/Fixd3XDAcFRWlsLAwderUSaNHj9brr78u6e/lrFKlil566aUMp5G2cRcsWFChoaEZXmArSYGBgY6/046yzZkzRz179tScOXMUHh6uxo0bO4ZxtX8lqXLlylq4cKGMMdq1a5fmzp2rsWPHys/PT8OGDXOrT1wVHBysPHnyuLz+xcTE6KOPPlJ8fLxKlCihzZs3a+bMmTecR9r4r7322nXv2ClSpIhj2GnTpmnatGk6evSoli5dqmHDhikxMfG678k/XbvNudP/GdWd1dvGzZbPnb7KLTLz2Xnt+F5eXjp+/HiGrx8/flxeXl7pdqLXKlGihJ566ikNHDhQe/fuVcWKFZWUlKRPPvlEknT33XdnON78+fMdAexGrrcPKVOmjFNb//791bZtW23btk2vv/667rzzTjVq1Oim079V2b2fyU65IthI0kMPPaRGjRpp7Nix6Q6NFSlSRL6+vtq1a5dT+2effZZt9SxYsECxsbGOD8YjR45o/fr16tKli6S/N7yyZctq586dGj9+fJbOu2HDhoqLi9O2bduc7qZ57733ZLPZ1KBBg1ueR8mSJR3hpmnTplqxYoWioqLUvHlzTZgwQcePH9djjz123fHT+uXaD/i33nor0zVl1/vcsWNHvfPOO3r77bc1ePBgRUZGqnnz5vriiy9UunRpBQcHX3fc5s2ba+HChbp69aruueeem84rJiZGvXv31rp167Rs2TLFxsY6HXp1tX//yWazqWrVqnrllVc0d+5cbdu2zaXxMiMgIED33HOPFi9erClTpsjPz0/S30chPvjgAxUvXlx33nmnY/jGjRurWLFimjNnjkqUKCFfX1+1b9/+hvOIiopSgQIFtG/fPpf/M5X+3hH17dtXq1ev1nfffZep5ctM/7s7bma3jYyWL7N9lZ3sdvstHdW51c9OX19fRUVFaenSpZo0aZLTEYtLly5p6dKlqlu3rqP93LlzstlsTqdW06SdFkz7R2b+/Pn666+/9OKLL6pu3brphm/btq1mz57tUrD58MMPnU6Frl+/XkeOHNGTTz7pNFybNm1UokQJPfPMM0pISNArr7xyW756o2HDhvr000/166+/Op2efu+99+Tv75+prwm41XXDVbkm2EjSxIkTVbNmTSUmJjodyk47rz179myVLl1aVatW1aZNmzR//vxsqyUxMVFt2rRRjx49lJSUpNGjR8vX11fDhw93DPPWW2/p4YcfVpMmTdStWzcVK1ZMp0+f1v79+7Vt2zbHeVN3DRo0SO+9956io6M1duxYRUZGavny5ZoxY4Z69+7ttGO5FZGRkU7h5osvvtD999+vp556SjExMdqyZYseeOABBQQE6MSJE1q3bp0qV66s3r17q3z58ipdurSGDRsmY4xCQkK0bNkyxcfHZ7qe7HyfJ06cqHvuuUcvvvii3nnnHY0dO1bx8fGqU6eO+vfvr3LlyunSpUs6fPiwvvjiC7355psqXry42rVrpw8//FDNmjXTgAEDVLt2bXl7e+t///uf1qxZo1atWqlNmzaO+bRv316xsbFq3769kpOT1a1bN6c6oqKiXOrfzz//XDNmzFDr1q11xx13yBijxYsX688//8z2/+bi4uLUqFEjNWjQQM8++6x8fHw0Y8YM7dmzRwsWLHD60PXy8lKXLl00depU5c+fX4888oiCgoJuOP18+fLptddeU9euXXX69Gk9+uijKly4sE6dOqWdO3fq1KlTmjlzppKSktSgQQN16NBB5cuXV2BgoDZv3qyVK1de9z/9m3G1/29lXFe3DVeWz9W+up0qV66sxYsXa+bMmapZs6by5MnjOELqqlv97JwwYYIaNGig++67TwMHDlSJEiV09OhRTZs2Tb/99pvjdLAk/fjjj2rSpInatWunevXqqWjRojpz5oyWL1+uWbNmqX79+o4j1u+++66Cg4P17LPPZvhlpWnr+s6dO2/63WtbtmzRk08+qbZt2+rYsWMaOXKkihUrli4UeXl5qU+fPho6dKgCAgLSfWZkl9GjRzuuNRw1apRCQkL04Ycfavny5Zo0adJNt+OMZMW64RK3LjW+Tf55V9S1OnToYCQ53RVlzN+3Nz/55JOmSJEi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ni4A7is5bLlH5nt4QrRH5gsAgKs4YgMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACyDYAMAACzD7WCzbds27d692/H8s88+U+vWrTVixAhdvnw5S4sDAABwh9vBpmfPnjpw4IAk6ZdfflG7du3k7++vjz76SEOGDHG7gOPHj6tTp04KDQ2Vv7+/qlWrpq1bt7o9HQAAALeDzYEDB1StWjVJ0kcffaQHHnhA8+fP19y5c/XJJ5+4Na0zZ84oKipK3t7eWrFihfbt26eXX35ZBQoUcLcsAAAA5XV3BGOMUlNTJUlfffWVmjdvLkmKiIjQ77//7ta0Jk6cqIiICM2ZM8fRVrJkSXdLAgAAkJSJIza1atXSuHHj9P777yshIUHR0dGSpEOHDqlIkSJuTWvp0qWqVauW2rZtq8KFC6t69ep6++23rzt8cnKyzp496/QAAABI4/YRm2nTpqljx45asmSJRo4cqTJlykiSPv74Y9WpU8etaf3yyy+aOXOmYmNjNWLECG3atEn9+/eX3W5Xly5d0g0fFxenMWPGuFsy/uVKDlvusXkfnhDtsXkDOZmntku2SetzO9hUqVLF6a6oNJMnT5aXl5db00pNTVWtWrU0fvx4SVL16tW1d+9ezZw5M8NgM3z4cMXGxjqenz17VhEREW4uAQAAsCq3g80/nT9/3nG9TRpvb2+Xxy9atKjuuusup7YKFSpc9yJku90uu93ufqEAAOBfwe1rbA4dOqTo6GgFBAQoKChIwcHBCg4OVoECBRQcHOzWtKKiovTjjz86tR04cECRkZHulgUAAOD+EZuOHTtKkmbPnq0iRYrIZrNleuaDBg1SnTp1NH78eD322GPatGmTZs2apVmzZmV6mgAA4N/L7WCza9cubd26VeXKlbvlmd9999369NNPNXz4cI0dO1alSpVyXJwMAADgLreDzd13361jx45lSbCRpObNmzu+CwcAAOBWuB1s3nnn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Uclhyz0y38MToj0yXwCZ46nPConPi6zG537uxxEbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGQQbAABgGR4NNnFxcbr77rsVGBiowoULq3Xr1vrxxx89WRIAAMjFPBpsEhIS1KdPH23cuFHx8fG6cuWKGjdurAsXLniyLAAAkEvl9eTMV65c6fR8zpw5Kly4sLZu3aoHHnjAQ1UBAIDcKkddY5OUlCRJCgkJ8XAlAAAgN/LoEZt/MsYoNjZWdevWVaVKlTIcJjk5WcnJyY7nZ8+evV3lAQCAXCDHHLHp27evdu3apQULFlx3mLi4OAUFBTkeERERt7FCAACQ0+WIYNOvXz8tXbpUa9asUfHixa873PDhw5WUlOR4HDt27DZWCQAAcjqPnooyxqhfv3769NNPtXbtWpUqVeqGw9vtdtnt9ttUHQAAyG08Gmz69Omj+fPn67PPPlNgYKBOnjwpSQoKCpKfn58nSwMAALmQR09FzZw5U0lJSapfv76KFi3qeCxatMiTZQEAgFzK46eiAAAAskqOuHgYAAAgKxBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZRBsAACAZeT1dAGwjpLDlnts3ocnRHts3gCAnIMjNgAAwDIINgAAwDIINgAAwDIINgAAwDIINgAAwDIINgAAwDIINgAAwDIINgAAwDIINgAAwDIINgAAwDIINgAAwDIINgAAwDIINgAAwDIINgAAwDIINgAAwDIINgAAwDIINgAAwDII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W7ZsUd68eR3Tevzxx/XMM8+oYsWKOnHihE6cOKHHH3/cMd6YMWP02GOPadeuXWrWrJk6duyYbtrXyp8/v0aMGKGxY8c6hYXMmDdvngoWLKhNmzapX79+6t27t9q2bas6depo27ZtatKkiTp37qyLFy86jTd48GBNmTJFmzdvVuHChdWyZUvHEaTdu3erSZMmeuSRR7Rr1y4tWrRI69atU9++fZ2mMXnyZFWqVElbt27V888/f0vLAcBFnv4VTgBZq2vXrqZVq1bm1KlTxm63m0OHDpnDhw8bX19fc+rUKdOqVSvHLySfP3/eeHt7mw8//NAx/uXLl014eLiZNGmSMeb/fjX4q6++cgyzfPlyI8n89ddfxhhjRo8ebapWrZquFknmueeeczw/f/68sdlsZsWKFdetP+2X1C9dumQiIyPN2LFjjTHGvPLKKyYyMjLdcv7TgAEDTL169ZymVbduXcfzK1eumICAANO5c2dH24kTJ4wks2HDBqflXbhwoWOYP/74w/j5+ZlFixYZY4zp3Lmzeeqpp5zm/e2335o8efI4+iQyMtK0bt36ussJIHvk9WiqApBtChYsqOjoaM2bN0/GGEVHR6tgwYJOw/z8889KSUlRVFSUo83b21u1a9fW/v37nYatUqWK4++iRYtKkhITE296zc4/xwsICFBgYKASExNvWr/dbtfYsWPVt29f9e7d+6bDuzJ/Ly8vhYaGqnLlyo62IkWKSFK6mu677z7H3yEhISpXrpyjT7Zu3aqDBw/qww8/dAxjjFFqaqoOHTqkChUqSJJq1aqV6boBZA7BBrCw7t27O06PvPHGG+leN8ZI+vu27Gvbr23z9vZ2/J32Wmpq6k1r+Od4aeO6Mp4kderUSVOmTNG4cePS3RGVJ08eR/1pMrrYOKP5Z3ZZ/jlsz5491b9//3TD/DPoBQQE3HSaALIW19gAFta0aVNdvnxZly9fVpMmTdK9XqZMGfn4+GjdunWOtpSUFG3ZssVx1MEVPj4+unr1apbU/E958uRRXFycZs6cqcOHDzu9VqhQIZ04ccKpbceOHVk2740bNzr+PnPmjA4cOKDy5ctL+vvi7L1796pMmTLpHj4+PllWAwD3EWwAC/Py8tL+/fu1f/9+eXl5pXs9ICBAvXv31uDBg7Vy5Urt27dPPXr00MWLF/XEE0+4PJ+SJUvq0KFD2rFjh37//XclJydn2TJER0frnnvu0VtvveXU/uCDD2rLli1677339NNPP2n06NHas2dPls137NixWr16tfbs2aNu3bqpYMGCjruwhg4dqg0bNqhPnz7asWOHfvrpJy1dulT9+vXLsvkDyByCDWBx+fPnV/78+a/7+oQJE/Sf//xHnTt3Vo0aNXTw4EGtWrVKwcHBLs/jP//5j5o2baoGDRqoUKFCWrBgQVaU7jBx4kRdunTJqa1JkyZ6/vnnNWTIEN199906d+6cunTpkmXznDBhggYMGKCaNWvqxIkTWrp0qeNoTJUqVZSQkKCffvpJ999/v6pXr67nn3/ece0RAM+xmWtPUgMAAORSHLEBAACWQbABAACWQbABAACWQbABAACWQbABAACWQbABAACWQbABAACWQbABAACWQbABAACWQbABAACWQbABAACWQbABAACW8f8AH1loFfwamLgAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "keanu = cast[cast['name'] == 'Keanu Reeves']\n", + "keanu_movies = pd.merge(keanu, release_dates, how='left', on='title')\n", + "keanu_movies_usa = keanu_movies[keanu_movies['country'] == 'USA']\n", + "keanu_movies_usa['month'] = keanu_movies_usa['date'].dt.month\n", + "keanu_month_df = pd.DataFrame(keanu_movies_usa.groupby('month')['title'].count())\n", + "plt.bar(x=keanu_month_df.index, height=keanu_month_df['title'])\n", + "plt.title('Number of Keanu Reeves movies release in the USA by month')\n", + "plt.xlabel('Month Number')\n", + "plt.ylabel('Number of Films')\n", + "plt.show()" + ] }, { "cell_type": "markdown", @@ -2855,6 +3270,35 @@ "### Section III - Q5: Make a bar plot showing the years in which movies with Ian McKellen tend to be released in the USA?" ] }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjAAAAHFCAYAAADsRsNYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA+gklEQVR4nO3dd3RU1f7+8WdCkkmDQBASQgm5IKGEKoKASlM6iqgUEWkqCCgSUUC5FMELVxRREbwqRUUB6Xy5GIoUGx0ioEgLYEB6CzWQZP/+4Je5DpnADCQZjrxfa81anDP77PM5e87MPJwysRljjAAAACzEx9sFAAAAeIoAAwAALIcAAwAALIcAAwAALIcAAwAALIcAAwAALIcAAwAALIcAAwAALIcAAwAALOeODTAtWrRQ/vz5lZSUlOm5kydPqkiRIqpTp47S09O9UF3O6ty5s0JCQrxdhhObzabevXvn+nr37dsnm80mm82moUOHumzTtWtXRxtP1atXT7GxsbdY5VUrV66UzWbTypUrHfOGDh16U3X9HTEWN+fvMm5TpkyRzWbTvn37rtsuu7f3woULGjp0qNP78tp1HT9+PNvW58qN1hMbG6t69eo5zUtKSlLPnj1VpkwZBQYGKiwsTBUrVtRzzz3n8ntRkhYsWCCbzaaCBQsqJSUluzfDY3dsgPnss8/k6+urZ599NtNzvXv31tmzZ/X555/Lx+eOHaI7St68eTVlypRMgfXcuXOaOXOm8uXL56XK4K5nn31Wq1ev9nYZuM1l935y4cIFDRs2zGWAuV0dOHBA1apV09KlSxUXF6dFixZp0qRJat++vdavX6/ExESXy02cOFHS1f/kz5s3Lxcrdu2O/XaOiIjQ+PHjtWTJEv3nP/9xzJ87d66mTZum0aNHq3Tp0jlaQ1pa2m2RYiG1bdtW+/fv13fffec0f8aMGUpLS9MjjzzipcrgrmLFium+++7zdhluu3jxonLiT9HlVL9/F1bbT3LCp59+quPHj2vJkiXq0aOH6tevr1atWun1119XQkKCHnjggUzLHD58WIsWLVKDBg0UEBDgCDPedMcGGElq06aN2rVrp379+mnfvn06ceKEevTooYcfflgvvPCCNmzYoEceeURhYWEKCAhQ1apV9c033zj1cezYMfXs2VPly5dXSEiIChcurAYNGuiHH35wapdxquLtt9/WiBEjFB0dLbvdrhUrVig9PV0jRoxQTEyMAgMDlT9/flWqVEnvv/9+lrUbYxQeHq5evXo55qWlpalAgQLy8fHRkSNHHPPHjBkjX19fnT592qmP3bt3q1mzZgoJCVHx4sX1yiuvZApUly9f1ogRI1S2bFnZ7XYVKlRIXbp00bFjx5zalSxZUi1atFB8fLyqVaumwMBAlS1bVpMmTXLrtbjWpUuX9Morr6hKlSoKDQ1VWFiYatWqpfnz52dqm3H66csvv1S5cuUUFBSkypUra+HChW6vLyYmRrVr185U76RJk9S6dWuFhoa6XO7rr79WrVq1FBISopCQEFWpUuWGb+y5c+cqKChIzz77rFJTUyXJrX3NEzNmzFCtWrUUHByskJAQNW7cWJs3b3Zqk3Eq0Z39wJWM13zhwoWqWrWqAgMDVa5cOce4T5kyReXKlVNwcLBq1KihDRs2ZOpjwYIFqlWrloKCgpQ3b149/PDDTv87njdvnmw2W6ZgKUkTJkyQzWbTli1bJGV9asCdsUhMTFS7du0UGRkpu92u8PBwNWzYUAkJCdcdgw0bNqhdu3YqWbKkAgMDVbJkSbVv31779+93apdxemPJkiXq2rWrChUqpKCgIMc4u1OjKznVr7vLurv9Fy5cUL9+/RQdHa2AgACFhYWpevXqmjZtWqb+3HkfrFmzRnXq1FFAQIAiIyM1cOBAXblyxa3tcrWf3Ozn1759+1SoUCFJ0rBhwxynmjt37uzU7siRI2rfvr1CQ0MVHh6url276syZM05tjDEaP368qlSposDAQBUoUEBPPPFElkdDbsWJEyfk4+OjwoULu3ze1ZmHzz//XKmpqerbt69at26t7777LtPrnOvMHe7EiROmSJEipn79+qZNmzYmf/78JikpySxfvtz4+/ubBx54wMyYMcPEx8ebzp07G0lm8uTJjuV///1388ILL5jp06eblStXmoULF5pu3boZHx8fs2LFCke7vXv3GkmmaNGipn79+mbWrFlmyZIlZu/evWbkyJEmT548ZsiQIea7774z8fHxZuzYsWbo0KHXrb1du3amTJkyjuk1a9YYSSYwMNB89dVXjvlNmzY1NWrUcEx36tTJ+Pv7m3Llypl33nnHLFu2zAwePNjYbDYzbNgwR7u0tDTTpEkTExwcbIYNG2aWLl1qPvvsM1O0aFFTvnx5c+HCBUfbqKgoU6xYMVO+fHnzxRdfmMWLF5snn3zSSDKrVq264esgyfTq1csxffr0adO5c2fz5ZdfmuXLl5v4+HjTr18/4+PjYz7//PNMy5YsWdLUqFHDfPPNN2bRokWmXr16xtfX1+zZs+e66814XUaPHm0mTpxoAgICzMmTJ40xV19bSWb58uWmV69e5tq3yz//+U8jybRu3drMnDnTLFmyxIwZM8b885//dLSpW7euqVChgmN6zJgxJk+ePGb48OGOee7uaytWrDCSnParIUOGZKrrrbfeMjabzXTt2tUsXLjQzJkzx9SqVcsEBwebX3/91dHO3f0gKxmveWxsrJk2bZpZtGiRqVmzpvHz8zODBw82derUMXPmzDFz5841ZcqUMeHh4U77zFdffWUkmUaNGpl58+aZGTNmmHvuucf4+/ubH374wRhjzJUrV0zhwoVNhw4dMq2/Ro0aplq1atkyFjExMaZ06dLmyy+/NKtWrTKzZ882r7zyitNYuzJz5kwzePBgM3fuXLNq1Sozffp0U7duXVOoUCFz7NgxR7vJkyc73v/PP/+8+fbbb82sWbNMamqq2zW6kh393sq4ubv93bt3N0FBQWbMmDFmxYoVZuHChWbUqFHmww8/dLRx933w66+/mqCgIFO+fHkzbdo0M3/+fNO4cWNTokQJI8ns3bv3umPmantv9vPr0qVLJj4+3kgy3bp1M6tXrzarV682u3fvdlpXTEyMGTx4sFm6dKkZM2aMsdvtpkuXLk59Pffcc8bPz8+88sorJj4+3nz99dembNmyJjw83Bw+fNitbfrrmP9VhQoVTN26dR3TU6dOdbz34uPjzZkzZ67bvzHGlClTxhQpUsSkpqaaZcuWGUk3/I7KaXd8gDHGmEWLFhlJRpL58ssvjTHGlC1b1lStWtVcuXLFqW2LFi1MkSJFTFpamsu+UlNTzZUrV0zDhg3NY4895pif8UVZqlQpc/ny5Ux9VqlSxeO6P/vsMyPJ/PHHH8YYY0aMGGHKli1rHnnkEceb4/LlyyY4ONi8/vrrjuU6depkJJlvvvnGqb9mzZqZmJgYx/S0adOMJDN79mynduvXrzeSzPjx4x3zoqKiTEBAgNm/f79j3sWLF01YWJjp3r37Dbfl2gBzrYxx7datm6latWqmZcPDw01ycrJj3uHDh42Pj48ZOXLkddf71wBz9uxZExISYsaNG2eMMebVV1810dHRJj09PVOASUxMNHny5HH5xfpXGQEmLS3N9O7d2/j7+5upU6c6tXF3X3MnwPzxxx/G19fXvPjii059nT171kRERJg2bdo45rm7H2QlKirKBAYGmgMHDjjmJSQkGEmmSJEi5vz584758+bNM5LMggULjDFXw3FkZKSpWLGi03vp7NmzpnDhwqZ27dqOeXFxcSYwMNCcPn3aMe+3334zkpy+AG92LI4fP24kmbFjx95wm28kNTXVnDt3zgQHB5v333/fMT8jaDzzzDNO7T15vVzJjn5vZR9yd/tjY2NNq1atrrst7r4P2rZtawIDA52+1FNTU03ZsmVvKcDc7OfXsWPHjCQzZMiQLNf19ttvO83v2bOnCQgIMOnp6cYYY1avXm0kmXfffdepXVJSkgkMDDSvvfaaW9vkboBJT0833bt3Nz4+PkaSsdlsply5cqZv374ux+/77783ksyAAQMcy0dHR5uoqCjHNnjDHX0KKUPTpk1133336e6779bTTz+t3bt36/fff1eHDh0kSampqY5Hs2bNdOjQIe3YscOx/Mcff6xq1aopICBAvr6+8vPz03fffaft27dnWtcjjzwiPz8/p3k1atTQL7/8op49e2rx4sVKTk52q+6HHnpIkrRs2TJJ0tKlS/Xwww/roYce0tKlSyVJq1ev1vnz5x1tM9hsNrVs2dJpXqVKlZwOCS5cuFD58+dXy5YtncagSpUqioiIyHTRWpUqVVSiRAnHdEBAgMqUKXPThxlnzpypOnXqKCQkxDGuEydOdDmu9evXV968eR3T4eHhKly4sEfrDgkJ0ZNPPqlJkyYpNTVVX3zxhbp06eLytMTSpUuVlpbmdAovK5cuXVKrVq301VdfacmSJY79SpLH+9qNLF68WKmpqXrmmWec+goICFDdunUzvWbu7AfXU6VKFRUtWtQxXa5cOUlX774KCgrKND+j3x07dujPP/9Ux44dnQ5Xh4SE6PHHH9eaNWt04cIFSVfvArt48aJmzJjhaDd58mTZ7XY99dRTtzwWYWFhKlWqlEaPHq0xY8Zo8+bNbt99eO7cOfXv31+lS5eWr6+vfH19FRISovPnz7vcTx9//PGbqvFGsrNfT5Z1d/tr1Kihb7/9VgMGDNDKlSt18eJFp3V68j5YsWKFGjZsqPDwcMfyefLkUdu2bd0aq6xk9+fXX117DV2lSpV06dIlHT16VNLVz1qbzaann37aadsjIiJUuXLlbL9A2Gaz6eOPP1ZiYqLGjx+vLl266MqVK3rvvfdUoUIFrVq1yql9xmnxrl27Opbv3Lmzy+sGcxMB5v+z2+3y9/eXJMf1I/369ZOfn5/To2fPnpLkuF1tzJgxeuGFF1SzZk3Nnj1ba9as0fr169WkSZNMb1JJKlKkSKZ5AwcO1DvvvKM1a9aoadOmKliwoBo2bOjymoG/ioqKUqlSpbRs2TJduHBBq1evdgSYAwcOaMeOHVq2bJkCAwNVu3Ztp2WDgoIUEBCQaQwuXbrkmD5y5IhOnz4tf3//TONw+PDhTLfsFSxY0OW4uhqHG5kzZ47atGmjokWLaurUqVq9erXWr1+vrl27OtWY3evu1q2bNm3apLfeekvHjh3LdC47Q8Y1QMWKFbthn0ePHtXixYtVq1atTK+DJ/uaOzL6u/feezP1N2PGjEx9ubMfXE9YWJjTdMZ7KKv5Gf2eOHFCkuv3Q2RkpNLT03Xq1ClJUoUKFXTvvfdq8uTJkq5e6zV16lQ9+uijmdbzV+6ORcY1No0bN9bbb7+tatWqqVChQnrppZd09uzZ627/U089pXHjxunZZ5/V4sWLtW7dOq1fv16FChVy6/3v6euVlezs15Nl3d3+Dz74QP3799e8efNUv359hYWFqVWrVtq1a5fTOt15H5w4cUIRERGZ6nY1zxPZ+fl1o77tdrskOfo+cuSI47rGa7d/zZo1N9wPfH19JV19b7iSmpqa6T/O0tXvkBdeeEETJ07Url27NGPGDF26dEmvvvqqo83Zs2c1c+ZM1ahRQ4UKFdLp06d1+vRpPfbYY7LZbF69mNfXa2u+jd11112SrgaL1q1bu2wTExMjSZo6darq1aunCRMmOD2f1Qefq//N+/r6Ki4uTnFxcTp9+rSWLVum119/XY0bN1ZSUpLT/2Sv1bBhQ82fP1+rVq1Senq66tWrp7x58yoyMlJLly7VsmXL9MADDzjeMJ646667VLBgQcXHx7t8/q9HPLLb1KlTFR0drRkzZjiNWU7ftVWnTh3FxMTozTff1MMPP6zixYu7bJdx4d6BAweybJOhRIkSGjNmjB577DG1bt1aM2fOdIQGT/Y1d2T0N2vWLEVFRbm9XG7L+EA/dOhQpuf+/PNP+fj4qECBAo55Xbp0Uc+ePbV9+3YlJibq0KFD6tKly3XX4clYREVFOT6Id+7cqW+++UZDhw7V5cuX9fHHH7tc5syZM1q4cKGGDBmiAQMGOOanpKTo5MmTLpe59v2fXa9Xdvbr7rKebH9wcLCGDRumYcOG6ciRI46jMS1bttTvv//u0fugYMGCOnz4cKbnXc2zirvuuks2m00//PCDy8/qG31+ZxyNOnjwoNORKenqxcGHDh1S9erVb1hHmzZtNHLkSG3bts0xb9q0abpw4YLWrVvn9J7MMHfuXJ06dcrlczmNAONCTEyM7r77bv3yyy/617/+dd22Npst0861ZcsWrV69+oZfbK7kz59fTzzxhA4ePKiXX35Z+/btU/ny5bNs/9BDD+mTTz7R2LFjdd999zlCRcOGDTV37lytX7/+htuQlRYtWmj69OlKS0tTzZo1b6qPm2Wz2eTv7+/0wXz48GGXdyFlt0GDBmnWrFnXPT3UqFEj5cmTRxMmTFCtWrVu2GejRo20ePFiNW/eXC1atND8+fMVHBzs0b7mjsaNG8vX11d79uzJdFrhdhITE6OiRYvq66+/Vr9+/Ryv8/nz5zV79mzHnUkZ2rdvr7i4OE2ZMkWJiYkqWrSoGjVqdN113OxYlClTRoMGDdLs2bO1adOmLNvZbDYZYzK9/z/77LMs/yecXTXmZL/uLnuz2x8eHq7OnTvrl19+0dixY3XhwgWP3gf169fXggULdOTIEceXdVpamtMpxtx07dGUm9GiRQuNGjVKBw8eVJs2bTxevkGDBrLZbJoxY4aqVavm9Fx8fLySk5OdLiM4dOiQy6Of586dU1JSkiIjIx3zJk6cqLx582revHmZ7k7asGGDXn31VX311Vde+SFSAkwW/vOf/6hp06Zq3LixOnfurKJFi+rkyZPavn27Nm3apJkzZ0q6uuMNHz5cQ4YMUd26dbVjxw69+eabio6OdtwieyMtW7ZUbGysqlevrkKFCmn//v0aO3asoqKidPfdd1932Ywdd8mSJRo2bJhj/kMPPaROnTo5/n0z2rVrp6+++krNmjVTnz59VKNGDfn5+enAgQNasWKFHn30UT322GM31feNtGjRQnPmzFHPnj31xBNPKCkpScOHD1eRIkUch51zytNPP62nn376um1Kliyp119/XcOHD9fFixcdt0j+9ttvOn78uNNrkeH+++/Xd999pyZNmqhRo0ZatGiRQkND3d7X3FGyZEm9+eabeuONN5SYmKgmTZqoQIECOnLkiNatW+f4n7C3+fj46O2331aHDh3UokULde/eXSkpKRo9erROnz6tUaNGObXPnz+/HnvsMU2ZMkWnT59Wv379bvgjk+6OxZYtW9S7d289+eSTuvvuu+Xv76/ly5dry5YtTkcWrpUvXz49+OCDGj16tO666y6VLFlSq1at0sSJE5U/f363xiGnXq9b6dfdZT3Z/po1a6pFixaqVKmSChQooO3bt+vLL790Cqruvg8GDRqkBQsWqEGDBho8eLCCgoL00Ucf6fz58x6PU3bImzevoqKiNH/+fDVs2FBhYWGO8XBXnTp19Pzzz6tLly7asGGDHnzwQQUHB+vQoUP68ccfVbFiRb3wwgtZLl+qVCn17t3b8f5p1qyZAgMDtX79eo0aNUrVq1d3ul7srbfe0k8//aS2bds6btveu3evxo0bpxMnTmj06NGSpG3btmndunV64YUX1KBBA5d1v/vuu5o4caJXAgx3If1/197uaowxv/zyi2nTpo0pXLiw8fPzMxEREaZBgwbm448/drRJSUkx/fr1M0WLFjUBAQGmWrVqZt68eaZTp04mKirK0e6vd7tc69133zW1a9c2d911l/H39zclSpQw3bp1M/v27XOr9qpVqxpJ5qeffnLMO3jwoJFkChYsmOkq8U6dOpng4OBM/bi6Ov/KlSvmnXfeMZUrVzYBAQEmJCTElC1b1nTv3t3s2rXL0S4qKso0b948U59169Z1uvo9K3JxF9KoUaNMyZIljd1uN+XKlTOffvqpyxpdLZtRU6dOna673uu9Ln/l6jZqY4z54osvzL333usYm6pVqzrd8ulqv9q2bZuJiIgw1apVc9w14M6+5u5t1MZcveunfv36Jl++fMZut5uoqCjzxBNPmGXLljnaeLIfuJLVa+7q9chqnOfNm2dq1qxpAgICTHBwsGnYsKHTfvxXS5YscdwtuHPnTrfrvtFYHDlyxHTu3NmULVvWBAcHm5CQEFOpUiXz3nvvmdTU1OuOwYEDB8zjjz9uChQoYPLmzWuaNGlitm3blmnfy7hbaP369S77cef1ciU7+r2Vfcjd7R8wYICpXr26KVCggLHb7eYf//iH6du3rzl+/LjTOt15HxhjzE8//WTuu+8+Y7fbTUREhHn11VfNJ598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OnRIoaGhqlSpkuLj4/Xwww/fct8AAODvy+0AM3ny5Gxf+cSJE7O9TwAA8Pfn9Yt4AQAAPEWAAQAAlkOAAQAAlkOAAQAAluNWgKlWrZpOnTolSXrzzTd14cKFHC0KAADgetwKMNu3b9f58+clScOGDdO5c+dytCgAAIDrces26ipVqqhLly66//77ZYzRO++8o5CQEJdtBw8enK0FAgAAXMutADNlyhQNGTJECxculM1m07fffitf38yL2mw2AgwAAMhxbgWYmJgYTZ8+XZLk4+Oj7777ToULF87RwgAAALLi9i/xZkhPT8+JOgAAANzmcYCRpD179mjs2LHavn27bDabypUrpz59+qhUqVLZXR8AAEAmHv8OzOLFi1W+fHmtW7dOlSpVUmxsrNauXasKFSpo6dKlOVEjAACAE4+PwAwYMEB9+/bVqFGjMs3v378/f0kaAADkOI+PwGzfvl3dunXLNL9r16767bffsqUoAACA6/E4wBQqVEgJCQmZ5ickJHBnEgAAyBUen0J67rnn9PzzzysxMVG1a9eWzWbTjz/+qH//+9965ZVXcqJGAAAAJx4HmH/+85/Kmzev3n33XQ0cOFCSFBkZqaFDh+qll17K9gIBAACu5XGAsdls6tu3r/r27auzZ89KkvLmzZvthQEAAGTlpn4HJgPBBQAAeIPHF/ECAAB4GwEGAABYDgEGAABYjkcB5sqVK6pfv7527tyZU/UAAADckEcBxs/PT9u2bZPNZsupegAAAG7I41NIzzzzjCZOnJgTtQAAALjF49uoL1++rM8++0xLly5V9erVFRwc7PT8mDFjsq04AAAAVzwOMNu2bVO1atUkKdO1MJxaAgAAucHjALNixYqcqAMAAMBtN30b9e7du7V48WJdvHhRkmSMybaiAAAArsfjAHPixAk1bNhQZcqUUbNmzXTo0CFJ0rPPPstfowYAALnC4wDTt29f+fn56Y8//lBQUJBjftu2bRUfH5+txQEAALji8TUwS5Ys0eLFi1WsWDGn+Xfffbf279+fbYUBAABkxeMjMOfPn3c68pLh+PHjstvt2VIUAADA9XgcYB588EF98cUXjmmbzab09HSNHj1a9evXz9biAAAAXPH4FNLo0aNVr149bdiwQZcvX9Zrr72mX3/9VSdPntRPP/2UEzUCAAA48fgITPny5bVlyxbVqFFDDz/8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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ian_df = cast[cast['name'] == 'Ian McKellen']\n", + "ian_merge = pd.merge(ian_df, release_dates, how='left', on='title')\n", + "ian_usa = ian_merge[ian_merge['country'] == 'USA']\n", + "ian_usa\n", + "ian_year_df = pd.DataFrame(ian_usa.groupby('year_y')['title'].count())\n", + "plt.bar(x=ian_year_df.index, height=ian_year_df['title'])\n", + "plt.title('Years when Ian Mckellen movies are released in the USA')\n", + "plt.xlabel('Years')\n", + "plt.ylabel('Number of Films')\n", + "plt.show()" + ] + }, { "cell_type": "code", "execution_count": null, From e9becc9b54b679e8ba9f4a3f97364b6a557155df Mon Sep 17 00:00:00 2001 From: Conor Smith Date: Tue, 1 Nov 2022 05:55:00 -0400 Subject: [PATCH 5/7] Completed Project after deleting previously --- ...Mini_Project_Wrangling_Json_Exercise.ipynb | 742 +++++++++++++++++- 1 file changed, 721 insertions(+), 21 deletions(-) diff --git a/mec-5.4.4-json-data-wrangling-mini-project/Mini_Project_Wrangling_Json_Exercise.ipynb b/mec-5.4.4-json-data-wrangling-mini-project/Mini_Project_Wrangling_Json_Exercise.ipynb index a8bfea9e..5ccdabb4 100755 --- a/mec-5.4.4-json-data-wrangling-mini-project/Mini_Project_Wrangling_Json_Exercise.ipynb +++ b/mec-5.4.4-json-data-wrangling-mini-project/Mini_Project_Wrangling_Json_Exercise.ipynb @@ -80,9 +80,7 @@ { "cell_type": "code", "execution_count": 7, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -148,9 +146,7 @@ { "cell_type": "code", "execution_count": 8, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -246,9 +242,7 @@ { "cell_type": "code", "execution_count": 9, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -433,9 +427,7 @@ { "cell_type": "code", "execution_count": 10, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [ { "data": { @@ -586,35 +578,743 @@ "3. In 2. above you will notice that some entries have only the code and the name is missing. Create a dataframe with the missing names filled in." ] }, + { + "cell_type": "code", + "execution_count": 3, + "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", + "
sectorsupplementprojectflgprojectfinancialtypeprodlinemjthemeidacommamtimpagencyproject_namemjthemecodeclosingdate...majorsector_percentboard_approval_monththeme_namecodecountrynameurlsourceprojectstatusdisplayibrdcommamtsector_namecode_id
0[{'Name': 'Primary education'}, {'Name': 'Seco...NIDAPE[Human development]130000000MINISTRY OF EDUCATIONEthiopia General Education Quality Improvement...8,112018-07-07T00:00:00Z...[{'Percent': 46, 'Name': 'Education'}, {'Perce...November[{'code': '65', 'name': 'Education for all'}]Federal Democratic Republic of Ethiopiahttp://www.worldbank.org/projects/P129828/ethi...IBRDActive0[{'code': 'EP', 'name': 'Primary education'}, ...{'$oid': '52b213b38594d8a2be17c780'}
1[{'Name': 'Public administration- Other social...NOTHERRE[Economic management, Social protection and ri...0MINISTRY OF FINANCETN: DTF Social Protection Reforms Support1,6NaN...[{'Percent': 70, 'Name': 'Public Administratio...November[{'code': '24', 'name': 'Other economic manage...Republic of Tunisiahttp://www.worldbank.org/projects/P144674?lang=enIBRDActive0[{'code': 'BS', 'name': 'Public administration...{'$oid': '52b213b38594d8a2be17c781'}
2[{'Name': 'Rural and Inter-Urban Roads and Hig...YIDAPE[Trade and integration, Public sector governan...6060000MINISTRY OF TRANSPORT AND COMMUNICATIONSTuvalu Aviation Investment Project - Additiona...5,2,11,6NaN...[{'Percent': 100, 'Name': 'Transportation'}]November[{'code': '47', 'name': 'Regional integration'...Tuvaluhttp://www.worldbank.org/projects/P145310?lang=enIBRDActive0[{'code': 'TI', 'name': 'Rural and Inter-Urban...{'$oid': '52b213b38594d8a2be17c782'}
3[{'Name': 'Other social services'}]NOTHERRE[Social dev/gender/inclusion, Social dev/gende...0LABOR INTENSIVE PUBLIC WORKS PROJECT PMUGov't and Civil Society Organization Partnership7,7NaN...[{'Percent': 100, 'Name': 'Health and other so...October[{'code': '57', 'name': 'Participation and civ...Republic of Yemenhttp://www.worldbank.org/projects/P144665?lang=enIBRDActive0[{'code': 'JB', 'name': 'Other social services'}]{'$oid': '52b213b38594d8a2be17c783'}
4[{'Name': 'General industry and trade sector'}...NIDAPE[Trade and integration, Financial and private ...13100000MINISTRY OF TRADE AND INDUSTRYSecond Private Sector Competitiveness and Econ...5,42019-04-30T00:00:00Z...[{'Percent': 50, 'Name': 'Industry and trade'}...October[{'code': '45', 'name': 'Export development an...Kingdom of Lesothohttp://www.worldbank.org/projects/P144933/seco...IBRDActive0[{'code': 'YZ', 'name': 'General industry and ...{'$oid': '52b213b38594d8a2be17c784'}
\n", + "

5 rows × 50 columns

\n", + "
" + ], + "text/plain": [ + " sector supplementprojectflg \\\n", + "0 [{'Name': 'Primary education'}, {'Name': 'Seco... N \n", + "1 [{'Name': 'Public administration- Other social... N \n", + "2 [{'Name': 'Rural and Inter-Urban Roads and Hig... Y \n", + "3 [{'Name': 'Other social services'}] N \n", + "4 [{'Name': 'General industry and trade sector'}... N \n", + "\n", + " projectfinancialtype prodline \\\n", + "0 IDA PE \n", + "1 OTHER RE \n", + "2 IDA PE \n", + "3 OTHER RE \n", + "4 IDA PE \n", + "\n", + " mjtheme idacommamt \\\n", + "0 [Human development] 130000000 \n", + "1 [Economic management, Social protection and ri... 0 \n", + "2 [Trade and integration, Public sector governan... 6060000 \n", + "3 [Social dev/gender/inclusion, Social dev/gende... 0 \n", + "4 [Trade and integration, Financial and private ... 13100000 \n", + "\n", + " impagency \\\n", + "0 MINISTRY OF EDUCATION \n", + "1 MINISTRY OF FINANCE \n", + "2 MINISTRY OF TRANSPORT AND COMMUNICATIONS \n", + "3 LABOR INTENSIVE PUBLIC WORKS PROJECT PMU \n", + "4 MINISTRY OF TRADE AND INDUSTRY \n", + "\n", + " project_name mjthemecode \\\n", + "0 Ethiopia General Education Quality Improvement... 8,11 \n", + "1 TN: DTF Social Protection Reforms Support 1,6 \n", + "2 Tuvalu Aviation Investment Project - Additiona... 5,2,11,6 \n", + "3 Gov't and Civil Society Organization Partnership 7,7 \n", + "4 Second Private Sector Competitiveness and Econ... 5,4 \n", + "\n", + " closingdate ... \\\n", + "0 2018-07-07T00:00:00Z ... \n", + "1 NaN ... \n", + "2 NaN ... \n", + "3 NaN ... \n", + "4 2019-04-30T00:00:00Z ... \n", + "\n", + " majorsector_percent board_approval_month \\\n", + "0 [{'Percent': 46, 'Name': 'Education'}, {'Perce... November \n", + "1 [{'Percent': 70, 'Name': 'Public Administratio... November \n", + "2 [{'Percent': 100, 'Name': 'Transportation'}] November \n", + "3 [{'Percent': 100, 'Name': 'Health and other so... October \n", + "4 [{'Percent': 50, 'Name': 'Industry and trade'}... October \n", + "\n", + " theme_namecode \\\n", + "0 [{'code': '65', 'name': 'Education for all'}] \n", + "1 [{'code': '24', 'name': 'Other economic manage... \n", + "2 [{'code': '47', 'name': 'Regional integration'... \n", + "3 [{'code': '57', 'name': 'Participation and civ... \n", + "4 [{'code': '45', 'name': 'Export development an... \n", + "\n", + " countryname \\\n", + "0 Federal Democratic Republic of Ethiopia \n", + "1 Republic of Tunisia \n", + "2 Tuvalu \n", + "3 Republic of Yemen \n", + "4 Kingdom of Lesotho \n", + "\n", + " url source \\\n", + "0 http://www.worldbank.org/projects/P129828/ethi... IBRD \n", + "1 http://www.worldbank.org/projects/P144674?lang=en IBRD \n", + "2 http://www.worldbank.org/projects/P145310?lang=en IBRD \n", + "3 http://www.worldbank.org/projects/P144665?lang=en IBRD \n", + "4 http://www.worldbank.org/projects/P144933/seco... IBRD \n", + "\n", + " projectstatusdisplay ibrdcommamt \\\n", + "0 Active 0 \n", + "1 Active 0 \n", + "2 Active 0 \n", + "3 Active 0 \n", + "4 Active 0 \n", + "\n", + " sector_namecode \\\n", + "0 [{'code': 'EP', 'name': 'Primary education'}, ... \n", + "1 [{'code': 'BS', 'name': 'Public administration... \n", + "2 [{'code': 'TI', 'name': 'Rural and Inter-Urban... \n", + "3 [{'code': 'JB', 'name': 'Other social services'}] \n", + "4 [{'code': 'YZ', 'name': 'General industry and ... \n", + "\n", + " _id \n", + "0 {'$oid': '52b213b38594d8a2be17c780'} \n", + "1 {'$oid': '52b213b38594d8a2be17c781'} \n", + "2 {'$oid': '52b213b38594d8a2be17c782'} \n", + "3 {'$oid': '52b213b38594d8a2be17c783'} \n", + "4 {'$oid': '52b213b38594d8a2be17c784'} \n", + "\n", + "[5 rows x 50 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import json\n", + "from pandas.io.json import json_normalize\n", + "\n", + "data = pd.read_json('data/world_bank_projects.json')\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'sector': [{'Name': 'Primary education'},\n", + " {'Name': 'Secondary education'},\n", + " {'Name': 'Public administration- Other social services'},\n", + " {'Name': 'Tertiary education'}],\n", + " 'supplementprojectflg': 'N',\n", + " 'projectfinancialtype': 'IDA',\n", + " 'prodline': 'PE',\n", + " 'mjtheme': ['Human development'],\n", + " 'idacommamt': 130000000,\n", + " 'impagency': 'MINISTRY OF EDUCATION',\n", + " 'project_name': 'Ethiopia General Education Quality Improvement Project II',\n", + " 'mjthemecode': '8,11',\n", + " 'closingdate': '2018-07-07T00:00:00Z',\n", + " 'totalcommamt': 130000000,\n", + " 'id': 'P129828',\n", + " 'mjsector_namecode': [{'code': 'EX', 'name': 'Education'},\n", + " {'code': 'EX', 'name': 'Education'},\n", + " {'code': 'BX', 'name': 'Public Administration, Law, and Justice'},\n", + " {'code': 'EX', 'name': 'Education'}],\n", + " 'docty': 'Project Information Document,Indigenous Peoples Plan,Project Information Document',\n", + " 'sector1': {'Percent': 46, 'Name': 'Primary education'},\n", + " 'lendinginstr': 'Investment Project Financing',\n", + " 'countrycode': 'ET',\n", + " 'sector2': {'Percent': 26, 'Name': 'Secondary education'},\n", + " 'totalamt': 130000000,\n", + " 'mjtheme_namecode': [{'code': '8', 'name': 'Human development'},\n", + " {'code': '11', 'name': ''}],\n", + " 'boardapprovaldate': '2013-11-12T00:00:00Z',\n", + " 'countryshortname': 'Ethiopia',\n", + " 'sector4': {'Percent': 12, 'Name': 'Tertiary education'},\n", + " 'prodlinetext': 'IBRD/IDA',\n", + " 'productlinetype': 'L',\n", + " 'regionname': 'Africa',\n", + " 'status': 'Active',\n", + " 'country_namecode': 'Federal Democratic Republic of Ethiopia!$!ET',\n", + " 'envassesmentcategorycode': 'C',\n", + " 'project_abstract': {'cdata': 'The development objective of the Second Phase of General Education Quality Improvement Project for Ethiopia is to improve learning conditions in primary and secondary schools and strengthen institutions at different levels of educational administration. The project has six components. The first component is curriculum, textbooks, assessment, examinations, and inspection. This component will support improvement of learning conditions in grades KG-12 by providing increased access to teaching and learning materials and through improvements to the curriculum by assessing the strengths and weaknesses of the current curriculum. This component has following four sub-components: (i) curriculum reform and implementation; (ii) teaching and learning materials; (iii) assessment and examinations; and (iv) inspection. The second component is teacher development program (TDP). This component will support improvements in learning conditions in both primary and secondary schools by advancing the quality of teaching in general education through: (a) enhancing the training of pre-service teachers in teacher education institutions; and (b) improving the quality of in-service teacher training. This component has following three sub-components: (i) pre-service teacher training; (ii) in-service teacher training; and (iii) licensing and relicensing of teachers and school leaders. The third component is school improvement plan. This component will support the strengthening of school planning in order to improve learning outcomes, and to partly fund the school improvement plans through school grants. It has following two sub-components: (i) school improvement plan; and (ii) school grants. The fourth component is management and capacity building, including education management information systems (EMIS). This component will support management and capacity building aspect of the project. This component has following three sub-components: (i) capacity building for education planning and management; (ii) capacity building for school planning and management; and (iii) EMIS. The fifth component is improving the quality of learning and teaching in secondary schools and universities through the use of information and communications technology (ICT). It has following five sub-components: (i) national policy and institution for ICT in general education; (ii) national ICT infrastructure improvement plan for general education; (iii) develop an integrated monitoring, evaluation, and learning system specifically for the ICT component; (iv) teacher professional development in the use of ICT; and (v) provision of limited number of e-Braille display readers with the possibility to scale up to all secondary education schools based on the successful implementation and usage of the readers. The sixth component is program coordination, monitoring and evaluation, and communication. It will support institutional strengthening by developing capacities in all aspects of program coordination, monitoring and evaluation; a new sub-component on communications will support information sharing for better management and accountability. It has following three sub-components: (i) program coordination; (ii) monitoring and evaluation (M and E); and (iii) communication.'},\n", + " 'approvalfy': 1999,\n", + " 'projectdocs': [{'DocDate': '28-AUG-2013',\n", + " 'EntityID': '090224b081e545fb_1_0',\n", + " 'DocURL': 'http://www-wds.worldbank.org/servlet/WDSServlet?pcont=details&eid=090224b081e545fb_1_0',\n", + " 'DocType': 'PID',\n", + " 'DocTypeDesc': 'Project Information Document (PID), Vol.'},\n", + " {'DocDate': '01-JUL-2013',\n", + " 'EntityID': '000442464_20130920111729',\n", + " 'DocURL': 'http://www-wds.worldbank.org/servlet/WDSServlet?pcont=details&eid=000442464_20130920111729',\n", + " 'DocType': 'IP',\n", + " 'DocTypeDesc': 'Indigenous Peoples Plan (IP), Vol.1 of 1'},\n", + " {'DocDate': '22-NOV-2012',\n", + " 'EntityID': '090224b0817b19e2_1_0',\n", + " 'DocURL': 'http://www-wds.worldbank.org/servlet/WDSServlet?pcont=details&eid=090224b0817b19e2_1_0',\n", + " 'DocType': 'PID',\n", + " 'DocTypeDesc': 'Project Information Document (PID), Vol.'}],\n", + " 'lendprojectcost': 550000000,\n", + " 'lendinginstrtype': 'IN',\n", + " 'theme1': {'Percent': 100, 'Name': 'Education for all'},\n", + " 'grantamt': 0,\n", + " 'themecode': '65',\n", + " 'borrower': 'FEDERAL DEMOCRATIC REPUBLIC OF ETHIOPIA',\n", + " 'sectorcode': 'ET,BS,ES,EP',\n", + " 'sector3': {'Percent': 16,\n", + " 'Name': 'Public administration- Other social services'},\n", + " 'majorsector_percent': [{'Percent': 46, 'Name': 'Education'},\n", + " {'Percent': 26, 'Name': 'Education'},\n", + " {'Percent': 16, 'Name': 'Public Administration, Law, and Justice'},\n", + " {'Percent': 12, 'Name': 'Education'}],\n", + " 'board_approval_month': 'November',\n", + " 'theme_namecode': [{'code': '65', 'name': 'Education for all'}],\n", + " 'countryname': 'Federal Democratic Republic of Ethiopia',\n", + " 'url': 'http://www.worldbank.org/projects/P129828/ethiopia-general-education-quality-improvement-project-ii?lang=en',\n", + " 'source': 'IBRD',\n", + " 'projectstatusdisplay': 'Active',\n", + " 'ibrdcommamt': 0,\n", + " 'sector_namecode': [{'code': 'EP', 'name': 'Primary education'},\n", + " {'code': 'ES', 'name': 'Secondary education'},\n", + " {'code': 'BS', 'name': 'Public administration- Other social services'},\n", + " {'code': 'ET', 'name': 'Tertiary education'}],\n", + " '_id': {'$oid': '52b213b38594d8a2be17c780'}}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "raw_data = json.load((open('data/world_bank_projects.json')))\n", + "raw_data[0]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Task 1: Find Top 10 Countries with most projects" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "countryname\n", + "People's Republic of China 19\n", + "Republic of Indonesia 19\n", + "Socialist Republic of Vietnam 17\n", + "Republic of India 16\n", + "Republic of Yemen 13\n", + "People's Republic of Bangladesh 12\n", + "Nepal 12\n", + "Kingdom of Morocco 12\n", + "Republic of Mozambique 11\n", + "Africa 11\n", + "Name: project_name, dtype: int64" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Top 10 countries with most projects\n", + "data.groupby('countryname')['project_name'].count().sort_values(ascending=False).head(10" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Task2: Find the top 10 major project themes (using column 'mjtheme_namecode')" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "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", + "
codename
08Human development
111
21Economic management
36Social protection and risk management
45Trade and integration
.........
149410Rural development
14959Urban development
14968Human development
14975Trade and integration
14984Financial and private sector development
\n", + "

1499 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " code name\n", + "0 8 Human development\n", + "1 11 \n", + "2 1 Economic management\n", + "3 6 Social protection and risk management\n", + "4 5 Trade and integration\n", + "... ... ...\n", + "1494 10 Rural development\n", + "1495 9 Urban development\n", + "1496 8 Human development\n", + "1497 5 Trade and integration\n", + "1498 4 Financial and private sector development\n", + "\n", + "[1499 rows x 2 columns]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mjtheme = pd.json_normalize(raw_data, 'mjtheme_namecode')\n", + "mjtheme" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'8': 'Human development',\n", + " '1': 'Economic management',\n", + " '6': 'Social protection and risk management',\n", + " '5': 'Trade and integration',\n", + " '2': 'Public sector governance',\n", + " '11': 'Environment and natural resources management',\n", + " '7': 'Social dev/gender/inclusion',\n", + " '4': 'Financial and private sector development',\n", + " '10': 'Rural development',\n", + " '9': 'Urban development',\n", + " '3': 'Rule of law'}" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Creating dictionary to reference values\n", + "mjtheme_subset = mjtheme[mjtheme['name'] != '']\n", + "project_dict = {}\n", + "mjtheme['code'][0], mjtheme['name'][0]\n", + "for i in range(len(mjtheme['code'])):\n", + " if mjtheme['name'][i] != '':\n", + " project_dict[mjtheme['code'][i]] = mjtheme['name'][i]\n", + " i += 1\n", + "project_dict" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 Human development\n", + "1 \n", + "2 Economic management\n", + "3 Social protection and risk management\n", + "4 Trade and integration\n", + " ... \n", + "1494 Rural development\n", + "1495 Urban development\n", + "1496 Human development\n", + "1497 Trade and integration\n", + "1498 Financial and private sector development\n", + "Name: name, Length: 1499, dtype: object" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mjtheme['name']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. In 2. above you will notice that some entries have only the code and the name is missing. Create a dataframe with the missing names filled in." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 Human development\n", + "1 Environment and natural resources management\n", + "2 Economic management\n", + "3 Social protection and risk management\n", + "4 Trade and integration\n", + " ... \n", + "1494 Rural development\n", + "1495 Urban development\n", + "1496 Human development\n", + "1497 Trade and integration\n", + "1498 Financial and private sector development\n", + "Name: name, Length: 1499, dtype: object" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#adding values back in with reference to dicitonary of values\n", + "for i in range(len(mjtheme['name'])):\n", + " if mjtheme['name'][i] == '':\n", + " mjtheme['name'][i] = project_dict[mjtheme['code'][i]]\n", + "mjtheme['name']" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mjtheme['name'].isna().any()" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "name\n", + "Environment and natural resources management 250\n", + "Rural development 216\n", + "Human development 210\n", + "Public sector governance 199\n", + "Social protection and risk management 168\n", + "Financial and private sector development 146\n", + "Social dev/gender/inclusion 130\n", + "Trade and integration 77\n", + "Urban development 50\n", + "Economic management 38\n", + "Name: code, dtype: int64" + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Top Projects below\n", + "top_projects = mjtheme.groupby('name')['code'].count().sort_values(ascending=False).head(10)\n", + "top_projects" + ] + }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.9" + "pygments_lexer": "ipython3", + "version": "3.10.6" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 1 } From 68c9d677055ef00166d7046408d473b463dd971f Mon Sep 17 00:00:00 2001 From: Conor Smith Date: Tue, 8 Nov 2022 06:30:52 -0500 Subject: [PATCH 6/7] Completed Databricks --- Mini_Project_SQL_with_Spark 5.6.ipynb | 1 + 1 file changed, 1 insertion(+) create mode 100644 Mini_Project_SQL_with_Spark 5.6.ipynb diff --git a/Mini_Project_SQL_with_Spark 5.6.ipynb b/Mini_Project_SQL_with_Spark 5.6.ipynb new file mode 100644 index 00000000..5369b254 --- /dev/null +++ b/Mini_Project_SQL_with_Spark 5.6.ipynb @@ -0,0 +1 @@ +{"cells":[{"cell_type":"markdown","source":["## SQL at Scale with Spark SQL\n\nWelcome to the SQL mini project. For this project, you will use the Databricks Platform and work through a series of exercises using Spark SQL. The dataset size may not be too big but the intent here is to familiarize yourself with the Spark SQL interface which scales easily to huge datasets, without you having to worry about changing your SQL queries. \n\nThe data you need is present in the mini-project folder in the form of three CSV files. This data will be imported in Databricks to create the following tables under the __`country_club`__ database.\n\n
\n1. The __`bookings`__ table,\n2. The __`facilities`__ table, and\n3. The __`members`__ table.\n\nYou will be uploading these datasets shortly into the Databricks platform to understand how to create a database within minutes! Once the database and the tables are populated, you will be focusing on the mini-project questions.\n\nIn the mini project, you'll be asked a series of questions. You can solve them using the databricks platform, but for the final deliverable,\nplease download this notebook as an IPython notebook (__`File -> Export -> IPython Notebook`__) and upload it to your GitHub."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"7dc8cef6-8322-4e3a-950b-757de959bbd7","inputWidgets":{},"title":""}}},{"cell_type":"markdown","source":["### Creating the Database\n\nWe will first create our database in which we will be creating our three tables of interest"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"3bd664ca-d7cc-4b4d-9c35-9957dd665c78","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql \ndrop database if exists country_club cascade;\ncreate database country_club;\nshow databases;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"98ba3faa-c4e8-48ef-9cc8-e2226e31582d","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["country_club"],["default"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"databaseName","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
databaseName
country_club
default
"]}}],"execution_count":0},{"cell_type":"markdown","source":["### Creating the Tables\n\nIn this section, we will be creating the three tables of interest and populate them with the data from the CSV files already available to you. \nTo get started, first upload the three CSV files to the DBFS as depicted in the following figure\n\n![](https://i.imgur.com/QcCruBr.png)\n\n\nOnce you have done this, please remember to execute the following code to build the dataframes which will be saved as tables in our database"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"89fe2dd6-f130-4979-abff-3cfd7eefc14f","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["# File location and type\nfile_location_bookings = \"/FileStore/tables/Bookings.csv\"\nfile_location_facilities = \"/FileStore/tables/Facilities.csv\"\nfile_location_members = \"/FileStore/tables/Members.csv\"\n\nfile_type = \"csv\"\n\n# CSV options\ninfer_schema = \"true\"\nfirst_row_is_header = \"true\"\ndelimiter = \",\"\n\n# The applied options are for CSV files. For other file types, these will be ignored.\nbookings_df = (spark.read.format(file_type) \n .option(\"inferSchema\", infer_schema) \n .option(\"header\", first_row_is_header) \n .option(\"sep\", delimiter) \n .load(file_location_bookings))\n\nfacilities_df = (spark.read.format(file_type) \n .option(\"inferSchema\", infer_schema) \n .option(\"header\", first_row_is_header) \n .option(\"sep\", delimiter) \n .load(file_location_facilities))\n\nmembers_df = (spark.read.format(file_type) \n .option(\"inferSchema\", infer_schema) \n .option(\"header\", first_row_is_header) \n .option(\"sep\", delimiter) \n .load(file_location_members))"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"936f355f-a485-4d3c-9a04-87bb55965d65","inputWidgets":{},"title":""}},"outputs":[],"execution_count":0},{"cell_type":"markdown","source":["### Viewing the dataframe schemas\n\nWe can take a look at the schemas of our potential tables to be written to our database soon"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"f10ed1f5-65a6-4bc3-a902-606102a12222","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["print('Bookings Schema')\nbookings_df.printSchema()\nprint('Facilities Schema')\nfacilities_df.printSchema()\nprint('Members Schema')\nmembers_df.printSchema()"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"45dd3bb9-3cc9-415b-a0a7-891c8a0ade8c","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"Bookings Schema\nroot\n |-- bookid: integer (nullable = true)\n |-- facid: integer (nullable = true)\n |-- memid: integer (nullable = true)\n |-- starttime: timestamp (nullable = true)\n |-- slots: integer (nullable = true)\n\nFacilities Schema\nroot\n |-- facid: integer (nullable = true)\n |-- name: string (nullable = true)\n |-- membercost: double (nullable = true)\n |-- guestcost: double (nullable = true)\n |-- initialoutlay: integer (nullable = true)\n |-- monthlymaintenance: integer (nullable = true)\n\nMembers Schema\nroot\n |-- memid: integer (nullable = true)\n |-- surname: string (nullable = true)\n |-- firstname: string (nullable = true)\n |-- address: string (nullable = true)\n |-- zipcode: integer (nullable = true)\n |-- telephone: string (nullable = true)\n |-- recommendedby: integer (nullable = true)\n |-- joindate: timestamp (nullable = true)\n\n","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"ansi","arguments":{}}},"output_type":"display_data","data":{"text/plain":["Bookings Schema\nroot\n |-- bookid: integer (nullable = true)\n |-- facid: integer (nullable = true)\n |-- memid: integer (nullable = true)\n |-- starttime: timestamp (nullable = true)\n |-- slots: integer (nullable = true)\n\nFacilities Schema\nroot\n |-- facid: integer (nullable = true)\n |-- name: string (nullable = true)\n |-- membercost: double (nullable = true)\n |-- guestcost: double (nullable = true)\n |-- initialoutlay: integer (nullable = true)\n |-- monthlymaintenance: integer (nullable = true)\n\nMembers Schema\nroot\n |-- memid: integer (nullable = true)\n |-- surname: string (nullable = true)\n |-- firstname: string (nullable = true)\n |-- address: string (nullable = true)\n |-- zipcode: integer (nullable = true)\n |-- telephone: string (nullable = true)\n |-- recommendedby: integer (nullable = true)\n |-- joindate: timestamp (nullable = true)\n\n"]}}],"execution_count":0},{"cell_type":"markdown","source":["### Create permanent tables\nWe will be creating three permanent tables here in our __`country_club`__ database as we discussed previously with the following code"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"8766081c-ff5f-4bfa-870c-dcb7f9d1698c","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["permanent_table_name_bookings = \"country_club.Bookings1\"\nbookings_df.write.format(\"parquet\").saveAsTable(permanent_table_name_bookings)\n\npermanent_table_name_facilities = \"country_club.Facilities1\"\nfacilities_df.write.format(\"parquet\").saveAsTable(permanent_table_name_facilities)\n\npermanent_table_name_members = \"country_club.Members1\"\nmembers_df.write.format(\"parquet\").saveAsTable(permanent_table_name_members)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"a989021a-29b8-4159-9a8d-5f3a707379e3","inputWidgets":{},"title":""}},"outputs":[],"execution_count":0},{"cell_type":"markdown","source":["### Refresh tables and check them"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"a8d01df0-94bc-4097-845e-02e7e1637e4f","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nuse country_club;\nREFRESH table bookings1;\nREFRESH table facilities1;\nREFRESH table members1;\nshow tables;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"11600185-2386-4341-89cb-66d50b9a29ee","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["country_club","bookings1",false],["country_club","facilities1",false],["country_club","members1",false]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"database","type":"\"string\"","metadata":"{}"},{"name":"tableName","type":"\"string\"","metadata":"{}"},{"name":"isTemporary","type":"\"boolean\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
databasetableNameisTemporary
country_clubbookings1false
country_clubfacilities1false
country_clubmembers1false
"]}}],"execution_count":0},{"cell_type":"markdown","source":["### Test a sample SQL query\n\n__Note:__ You can use __`%sql`__ at the beginning of a cell and write SQL queries directly as seen in the following cell. Neat isn't it!"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"fdae66bd-5e7a-48f5-b715-ac4f761050ae","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nselect * from bookings1 limit 3"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"4339b5ab-b006-4458-aad5-b1f0a5c1ec87","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[[0,3,1,"2012-07-03T11:00:00.000+0000",2],[1,4,1,"2012-07-03T08:00:00.000+0000",2],[2,6,0,"2012-07-03T18:00:00.000+0000",2]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"bookid","type":"\"integer\"","metadata":"{}"},{"name":"facid","type":"\"integer\"","metadata":"{}"},{"name":"memid","type":"\"integer\"","metadata":"{}"},{"name":"starttime","type":"\"timestamp\"","metadata":"{}"},{"name":"slots","type":"\"integer\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
bookidfacidmemidstarttimeslots
0312012-07-03T11:00:00.000+00002
1412012-07-03T08:00:00.000+00002
2602012-07-03T18:00:00.000+00002
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q1: Some of the facilities charge a fee to members, but some do not. Please list the names of the facilities that do."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"17c520af-243e-4a39-8a24-ea6aa3b6a368","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT name FROM facilities1 WHERE membercost = 0;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"21f137b3-edf7-4c65-853a-42b836fa3481","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Badminton Court"],["Table Tennis"],["Snooker Table"],["Pool Table"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"name","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
name
Badminton Court
Table Tennis
Snooker Table
Pool Table
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q2: How many facilities do not charge a fee to members?"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"79bf7b92-87d8-4efb-ba7d-f0edcb59cc4b","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT COUNT(*) AS Count FROM facilities1 WHERE membercost = 0;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"0b10a941-41e4-4145-b853-801859a6bfa5","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[[4]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"Count","type":"\"long\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
Count
4
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q3: How can you produce a list of facilities that charge a fee to members, where the fee is less than 20% of the facility's monthly maintenance cost? \n#### Return the facid, facility name, member cost, and monthly maintenance of the facilities in question."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"bc6cd845-0be6-4c95-ade4-7d52c3a13cc8","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT facid, name, membercost, monthlymaintenance FROM facilities1 WHERE (membercost > 0) AND (membercost < monthlymaintenance * .2)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"d35a57f8-07ea-42dc-9f4f-53694daefff1","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[[0,"Tennis Court 1",5.0,200],[1,"Tennis Court 2",5.0,200],[4,"Massage Room 1",9.9,3000],[5,"Massage Room 2",9.9,3000],[6,"Squash Court",3.5,80]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"facid","type":"\"integer\"","metadata":"{}"},{"name":"name","type":"\"string\"","metadata":"{}"},{"name":"membercost","type":"\"double\"","metadata":"{}"},{"name":"monthlymaintenance","type":"\"integer\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
facidnamemembercostmonthlymaintenance
0Tennis Court 15.0200
1Tennis Court 25.0200
4Massage Room 19.93000
5Massage Room 29.93000
6Squash Court3.580
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q4: How can you retrieve the details of facilities with ID 1 and 5? Write the query without using the OR operator."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"9bc31a3f-ab2c-413c-9b99-46581023ae0c","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT * FROM facilities1 WHERE facid IN (1, 5)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"cb034b10-5840-43e9-a25a-62503daa7c09","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[[1,"Tennis Court 2",5.0,25.0,8000,200],[5,"Massage Room 2",9.9,80.0,4000,3000]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"facid","type":"\"integer\"","metadata":"{}"},{"name":"name","type":"\"string\"","metadata":"{}"},{"name":"membercost","type":"\"double\"","metadata":"{}"},{"name":"guestcost","type":"\"double\"","metadata":"{}"},{"name":"initialoutlay","type":"\"integer\"","metadata":"{}"},{"name":"monthlymaintenance","type":"\"integer\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
facidnamemembercostguestcostinitialoutlaymonthlymaintenance
1Tennis Court 25.025.08000200
5Massage Room 29.980.040003000
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q5: How can you produce a list of facilities, with each labelled as 'cheap' or 'expensive', depending on if their monthly maintenance cost is more than $100? \n#### Return the name and monthly maintenance of the facilities in question."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"0e0302a2-2911-41be-9599-e12323e7f23c","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT name, monthlymaintenance, CASE WHEN monthlymaintenance > 100 THEN \"expensive\" ELSE \"cheap\" END AS value FROM facilities1;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"41373ea4-9038-4c8f-842f-8aae7b074809","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Tennis Court 1",200,"expensive"],["Tennis Court 2",200,"expensive"],["Badminton Court",50,"cheap"],["Table Tennis",10,"cheap"],["Massage Room 1",3000,"expensive"],["Massage Room 2",3000,"expensive"],["Squash Court",80,"cheap"],["Snooker Table",15,"cheap"],["Pool Table",15,"cheap"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"name","type":"\"string\"","metadata":"{}"},{"name":"monthlymaintenance","type":"\"integer\"","metadata":"{}"},{"name":"value","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
namemonthlymaintenancevalue
Tennis Court 1200expensive
Tennis Court 2200expensive
Badminton Court50cheap
Table Tennis10cheap
Massage Room 13000expensive
Massage Room 23000expensive
Squash Court80cheap
Snooker Table15cheap
Pool Table15cheap
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q6: You'd like to get the first and last name of the last member(s) who signed up. Do not use the LIMIT clause for your solution."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"30f9e29f-9608-4c5d-a371-fc4cb22f9ea2","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT firstname, surname FROM members1 WHERE joindate in (SELECT MAX(joindate) FROM members1)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"74bf3f5b-924d-4d90-b978-ffd456c22f43","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Darren","Smith"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"firstname","type":"\"string\"","metadata":"{}"},{"name":"surname","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
firstnamesurname
DarrenSmith
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q7: How can you produce a list of all members who have used a tennis court?\n- Include in your output the name of the court, and the name of the member formatted as a single column. \n- Ensure no duplicate data\n- Also order by the member name."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"ded40971-9804-46e8-a647-5b9cefce363e","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT DISTINCT facilities1.name AS Court_Name, CONCAT(members1.firstname, \" \", members1.surname) AS Member_Name FROM ((bookings1 INNER JOIN members1 ON bookings1.memid = members1.memid) INNER JOIN facilities1 ON bookings1.facid = facilities1.facid) WHERE facilities1.name LIKE \"Tennis Court%\" ORDER BY Member_Name;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"879ff42d-7f1d-47e6-a828-5cd82775c0ee","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Tennis Court 2","Anne Baker"],["Tennis Court 1","Anne Baker"],["Tennis Court 2","Burton Tracy"],["Tennis Court 1","Burton Tracy"],["Tennis Court 1","Charles Owen"],["Tennis Court 2","Charles Owen"],["Tennis Court 2","Darren Smith"],["Tennis Court 2","David Farrell"],["Tennis Court 1","David Farrell"],["Tennis Court 2","David Jones"],["Tennis Court 1","David Jones"],["Tennis Court 1","David Pinker"],["Tennis Court 1","Douglas Jones"],["Tennis Court 1","Erica Crumpet"],["Tennis Court 1","Florence Bader"],["Tennis Court 2","Florence Bader"],["Tennis Court 1","GUEST GUEST"],["Tennis Court 2","GUEST GUEST"],["Tennis Court 2","Gerald Butters"],["Tennis Court 1","Gerald Butters"],["Tennis Court 2","Henrietta Rumney"],["Tennis Court 1","Jack Smith"],["Tennis Court 2","Jack Smith"],["Tennis Court 2","Janice Joplette"],["Tennis Court 1","Janice Joplette"],["Tennis Court 2","Jemima Farrell"],["Tennis Court 1","Jemima Farrell"],["Tennis Court 1","Joan Coplin"],["Tennis Court 1","John Hunt"],["Tennis Court 2","John Hunt"],["Tennis Court 1","Matthew Genting"],["Tennis Court 2","Millicent Purview"],["Tennis Court 2","Nancy Dare"],["Tennis Court 1","Nancy Dare"],["Tennis Court 1","Ponder Stibbons"],["Tennis Court 2","Ponder Stibbons"],["Tennis Court 1","Ramnaresh Sarwin"],["Tennis Court 2","Ramnaresh Sarwin"],["Tennis Court 1","Tim Boothe"],["Tennis Court 2","Tim Boothe"],["Tennis Court 2","Tim Rownam"],["Tennis Court 1","Tim Rownam"],["Tennis Court 2","Timothy Baker"],["Tennis Court 1","Timothy Baker"],["Tennis Court 2","Tracy Smith"],["Tennis Court 1","Tracy Smith"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"Court_Name","type":"\"string\"","metadata":"{}"},{"name":"Member_Name","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
Court_NameMember_Name
Tennis Court 2Anne Baker
Tennis Court 1Anne Baker
Tennis Court 2Burton Tracy
Tennis Court 1Burton Tracy
Tennis Court 1Charles Owen
Tennis Court 2Charles Owen
Tennis Court 2Darren Smith
Tennis Court 2David Farrell
Tennis Court 1David Farrell
Tennis Court 2David Jones
Tennis Court 1David Jones
Tennis Court 1David Pinker
Tennis Court 1Douglas Jones
Tennis Court 1Erica Crumpet
Tennis Court 1Florence Bader
Tennis Court 2Florence Bader
Tennis Court 1GUEST GUEST
Tennis Court 2GUEST GUEST
Tennis Court 2Gerald Butters
Tennis Court 1Gerald Butters
Tennis Court 2Henrietta Rumney
Tennis Court 1Jack Smith
Tennis Court 2Jack Smith
Tennis Court 2Janice Joplette
Tennis Court 1Janice Joplette
Tennis Court 2Jemima Farrell
Tennis Court 1Jemima Farrell
Tennis Court 1Joan Coplin
Tennis Court 1John Hunt
Tennis Court 2John Hunt
Tennis Court 1Matthew Genting
Tennis Court 2Millicent Purview
Tennis Court 2Nancy Dare
Tennis Court 1Nancy Dare
Tennis Court 1Ponder Stibbons
Tennis Court 2Ponder Stibbons
Tennis Court 1Ramnaresh Sarwin
Tennis Court 2Ramnaresh Sarwin
Tennis Court 1Tim Boothe
Tennis Court 2Tim Boothe
Tennis Court 2Tim Rownam
Tennis Court 1Tim Rownam
Tennis Court 2Timothy Baker
Tennis Court 1Timothy Baker
Tennis Court 2Tracy Smith
Tennis Court 1Tracy Smith
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q8: How can you produce a list of bookings on the day of 2012-09-14 which will cost the member (or guest) more than $30? \n\n- Remember that guests have different costs to members (the listed costs are per half-hour 'slot')\n- The guest user's ID is always 0. \n\n#### Include in your output the name of the facility, the name of the member formatted as a single column, and the cost.\n\n- Order by descending cost, and do not use any subqueries."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"eb23ed45-ca1c-46b3-9371-ccf3d2904fb9","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT facilities1.name AS Facility_Name, CONCAT(members1.firstname, \" \", members1.surname) AS Member_Name, CASE WHEN bookings1.memid = 0 THEN facilities1.guestcost * bookings1.slots ELSE facilities1.membercost * bookings1.slots END AS Total_Cost FROM ((bookings1 INNER JOIN facilities1 ON bookings1.facid = facilities1.facid) INNER JOIN members1 ON bookings1.memid = members1.memid) WHERE bookings1.starttime LIKE \"2012-09-14%\" AND CASE WHEN bookings1.memid = 0 THEN facilities1.guestcost * bookings1.slots > 30 ELSE facilities1.membercost * bookings1.slots > 30 END ORDER BY Total_Cost desc;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"3ec2175c-8f0f-45fd-ae9a-414a6fb3ce28","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Massage Room 2","GUEST GUEST",320.0],["Massage Room 1","GUEST GUEST",160.0],["Massage Room 1","GUEST GUEST",160.0],["Massage Room 1","GUEST GUEST",160.0],["Tennis Court 2","GUEST GUEST",150.0],["Tennis Court 2","GUEST GUEST",75.0],["Tennis Court 1","GUEST GUEST",75.0],["Tennis Court 1","GUEST GUEST",75.0],["Squash Court","GUEST GUEST",70.0],["Massage Room 1","Jemima Farrell",39.6],["Squash Court","GUEST GUEST",35.0],["Squash Court","GUEST GUEST",35.0]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"Facility_Name","type":"\"string\"","metadata":"{}"},{"name":"Member_Name","type":"\"string\"","metadata":"{}"},{"name":"Total_Cost","type":"\"double\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
Facility_NameMember_NameTotal_Cost
Massage Room 2GUEST GUEST320.0
Massage Room 1GUEST GUEST160.0
Massage Room 1GUEST GUEST160.0
Massage Room 1GUEST GUEST160.0
Tennis Court 2GUEST GUEST150.0
Tennis Court 2GUEST GUEST75.0
Tennis Court 1GUEST GUEST75.0
Tennis Court 1GUEST GUEST75.0
Squash CourtGUEST GUEST70.0
Massage Room 1Jemima Farrell39.6
Squash CourtGUEST GUEST35.0
Squash CourtGUEST GUEST35.0
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q9: This time, produce the same result as in Q8, but using a subquery."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"757c6468-3d07-42e2-b2b9-59e82b96350a","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT facilities1.name AS Facility_Name, CONCAT(members1.firstname, \" \", members1.surname) AS Member_Name, CASE WHEN booking.memid = 0 THEN facilities1.guestcost * booking.slots ELSE facilities1.membercost * booking.slots END AS Total_Cost FROM (((SELECT * FROM bookings1 WHERE starttime LIKE \"2012-09-14%\") AS booking INNER JOIN facilities1 ON booking.facid = facilities1.facid) INNER JOIN members1 ON booking.memid = members1.memid) WHERE CASE WHEN booking.memid = 0 THEN facilities1.guestcost * booking.slots > 30 ELSE facilities1.membercost * booking.slots > 30 END ORDER BY Total_Cost desc;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"72f9d8b6-2d51-4af1-9fa1-d183a0369d30","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Massage Room 2","GUEST GUEST",320.0],["Massage Room 1","GUEST GUEST",160.0],["Massage Room 1","GUEST GUEST",160.0],["Massage Room 1","GUEST GUEST",160.0],["Tennis Court 2","GUEST GUEST",150.0],["Tennis Court 2","GUEST GUEST",75.0],["Tennis Court 1","GUEST GUEST",75.0],["Tennis Court 1","GUEST GUEST",75.0],["Squash Court","GUEST GUEST",70.0],["Massage Room 1","Jemima Farrell",39.6],["Squash Court","GUEST GUEST",35.0],["Squash Court","GUEST GUEST",35.0]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"Facility_Name","type":"\"string\"","metadata":"{}"},{"name":"Member_Name","type":"\"string\"","metadata":"{}"},{"name":"Total_Cost","type":"\"double\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
Facility_NameMember_NameTotal_Cost
Massage Room 2GUEST GUEST320.0
Massage Room 1GUEST GUEST160.0
Massage Room 1GUEST GUEST160.0
Massage Room 1GUEST GUEST160.0
Tennis Court 2GUEST GUEST150.0
Tennis Court 2GUEST GUEST75.0
Tennis Court 1GUEST GUEST75.0
Tennis Court 1GUEST GUEST75.0
Squash CourtGUEST GUEST70.0
Massage Room 1Jemima Farrell39.6
Squash CourtGUEST GUEST35.0
Squash CourtGUEST GUEST35.0
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q10: Produce a list of facilities with a total revenue less than 1000.\n- The output should have facility name and total revenue, sorted by revenue. \n- Remember that there's a different cost for guests and members!"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"dc14e8de-3daa-4339-b78c-2a8d78e599d1","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT facilities1.name, SUM(CASE WHEN bookings1.memid = 0 THEN facilities1.guestcost * bookings1.slots ELSE facilities1.membercost * bookings1.slots END) AS Total_Revenue FROM ((bookings1 INNER JOIN facilities1 ON bookings1.facid = facilities1.facid) INNER JOIN members1 ON bookings1.memid = members1.memid) GROUP BY facilities1.name HAVING SUM(CASE WHEN bookings1.memid = 0 THEN facilities1.guestcost * bookings1.slots ELSE facilities1.membercost * bookings1.slots END) < 1000 ORDER BY Total_Revenue;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"53422808-236b-4ebd-af5f-abc9c1bb70de","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Table Tennis",180.0],["Snooker Table",240.0],["Pool Table",270.0]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"name","type":"\"string\"","metadata":"{}"},{"name":"Total_Revenue","type":"\"double\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
nameTotal_Revenue
Table Tennis180.0
Snooker Table240.0
Pool Table270.0
"]}}],"execution_count":0},{"cell_type":"code","source":[""],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"1ff7e759-05a7-4e6f-8e4f-9cc05a74316c","inputWidgets":{},"title":""}},"outputs":[],"execution_count":0}],"metadata":{"name":"Mini_Project_SQL_with_Spark","notebookId":1931807081501742,"application/vnd.databricks.v1+notebook":{"notebookName":"Mini_Project_SQL_with_Spark","dashboards":[],"notebookMetadata":{"pythonIndentUnit":4,"mostRecentlyExecutedCommandWithImplicitDF":{"commandId":551598812990966,"dataframes":["_sqldf"]}},"language":"python","widgets":{},"notebookOrigID":551598812990935}},"nbformat":4,"nbformat_minor":0} From 7f1076b00b784427384403f4783638f07f96129a Mon Sep 17 00:00:00 2001 From: Conor Smith Date: Tue, 8 Nov 2022 06:43:23 -0500 Subject: [PATCH 7/7] Reformatted --- Mini_Project_SQL_with_Spark 5.6.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mini_Project_SQL_with_Spark 5.6.ipynb b/Mini_Project_SQL_with_Spark 5.6.ipynb index 5369b254..e1bd71e6 100644 --- a/Mini_Project_SQL_with_Spark 5.6.ipynb +++ b/Mini_Project_SQL_with_Spark 5.6.ipynb @@ -1 +1 @@ -{"cells":[{"cell_type":"markdown","source":["## SQL at Scale with Spark SQL\n\nWelcome to the SQL mini project. For this project, you will use the Databricks Platform and work through a series of exercises using Spark SQL. The dataset size may not be too big but the intent here is to familiarize yourself with the Spark SQL interface which scales easily to huge datasets, without you having to worry about changing your SQL queries. \n\nThe data you need is present in the mini-project folder in the form of three CSV files. This data will be imported in Databricks to create the following tables under the __`country_club`__ database.\n\n
\n1. The __`bookings`__ table,\n2. The __`facilities`__ table, and\n3. The __`members`__ table.\n\nYou will be uploading these datasets shortly into the Databricks platform to understand how to create a database within minutes! Once the database and the tables are populated, you will be focusing on the mini-project questions.\n\nIn the mini project, you'll be asked a series of questions. You can solve them using the databricks platform, but for the final deliverable,\nplease download this notebook as an IPython notebook (__`File -> Export -> IPython Notebook`__) and upload it to your GitHub."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"7dc8cef6-8322-4e3a-950b-757de959bbd7","inputWidgets":{},"title":""}}},{"cell_type":"markdown","source":["### Creating the Database\n\nWe will first create our database in which we will be creating our three tables of interest"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"3bd664ca-d7cc-4b4d-9c35-9957dd665c78","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql \ndrop database if exists country_club cascade;\ncreate database country_club;\nshow databases;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"98ba3faa-c4e8-48ef-9cc8-e2226e31582d","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["country_club"],["default"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"databaseName","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
databaseName
country_club
default
"]}}],"execution_count":0},{"cell_type":"markdown","source":["### Creating the Tables\n\nIn this section, we will be creating the three tables of interest and populate them with the data from the CSV files already available to you. \nTo get started, first upload the three CSV files to the DBFS as depicted in the following figure\n\n![](https://i.imgur.com/QcCruBr.png)\n\n\nOnce you have done this, please remember to execute the following code to build the dataframes which will be saved as tables in our database"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"89fe2dd6-f130-4979-abff-3cfd7eefc14f","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["# File location and type\nfile_location_bookings = \"/FileStore/tables/Bookings.csv\"\nfile_location_facilities = \"/FileStore/tables/Facilities.csv\"\nfile_location_members = \"/FileStore/tables/Members.csv\"\n\nfile_type = \"csv\"\n\n# CSV options\ninfer_schema = \"true\"\nfirst_row_is_header = \"true\"\ndelimiter = \",\"\n\n# The applied options are for CSV files. For other file types, these will be ignored.\nbookings_df = (spark.read.format(file_type) \n .option(\"inferSchema\", infer_schema) \n .option(\"header\", first_row_is_header) \n .option(\"sep\", delimiter) \n .load(file_location_bookings))\n\nfacilities_df = (spark.read.format(file_type) \n .option(\"inferSchema\", infer_schema) \n .option(\"header\", first_row_is_header) \n .option(\"sep\", delimiter) \n .load(file_location_facilities))\n\nmembers_df = (spark.read.format(file_type) \n .option(\"inferSchema\", infer_schema) \n .option(\"header\", first_row_is_header) \n .option(\"sep\", delimiter) \n .load(file_location_members))"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"936f355f-a485-4d3c-9a04-87bb55965d65","inputWidgets":{},"title":""}},"outputs":[],"execution_count":0},{"cell_type":"markdown","source":["### Viewing the dataframe schemas\n\nWe can take a look at the schemas of our potential tables to be written to our database soon"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"f10ed1f5-65a6-4bc3-a902-606102a12222","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["print('Bookings Schema')\nbookings_df.printSchema()\nprint('Facilities Schema')\nfacilities_df.printSchema()\nprint('Members Schema')\nmembers_df.printSchema()"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"45dd3bb9-3cc9-415b-a0a7-891c8a0ade8c","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"Bookings Schema\nroot\n |-- bookid: integer (nullable = true)\n |-- facid: integer (nullable = true)\n |-- memid: integer (nullable = true)\n |-- starttime: timestamp (nullable = true)\n |-- slots: integer (nullable = true)\n\nFacilities Schema\nroot\n |-- facid: integer (nullable = true)\n |-- name: string (nullable = true)\n |-- membercost: double (nullable = true)\n |-- guestcost: double (nullable = true)\n |-- initialoutlay: integer (nullable = true)\n |-- monthlymaintenance: integer (nullable = true)\n\nMembers Schema\nroot\n |-- memid: integer (nullable = true)\n |-- surname: string (nullable = true)\n |-- firstname: string (nullable = true)\n |-- address: string (nullable = true)\n |-- zipcode: integer (nullable = true)\n |-- telephone: string (nullable = true)\n |-- recommendedby: integer (nullable = true)\n |-- joindate: timestamp (nullable = true)\n\n","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"ansi","arguments":{}}},"output_type":"display_data","data":{"text/plain":["Bookings Schema\nroot\n |-- bookid: integer (nullable = true)\n |-- facid: integer (nullable = true)\n |-- memid: integer (nullable = true)\n |-- starttime: timestamp (nullable = true)\n |-- slots: integer (nullable = true)\n\nFacilities Schema\nroot\n |-- facid: integer (nullable = true)\n |-- name: string (nullable = true)\n |-- membercost: double (nullable = true)\n |-- guestcost: double (nullable = true)\n |-- initialoutlay: integer (nullable = true)\n |-- monthlymaintenance: integer (nullable = true)\n\nMembers Schema\nroot\n |-- memid: integer (nullable = true)\n |-- surname: string (nullable = true)\n |-- firstname: string (nullable = true)\n |-- address: string (nullable = true)\n |-- zipcode: integer (nullable = true)\n |-- telephone: string (nullable = true)\n |-- recommendedby: integer (nullable = true)\n |-- joindate: timestamp (nullable = true)\n\n"]}}],"execution_count":0},{"cell_type":"markdown","source":["### Create permanent tables\nWe will be creating three permanent tables here in our __`country_club`__ database as we discussed previously with the following code"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"8766081c-ff5f-4bfa-870c-dcb7f9d1698c","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["permanent_table_name_bookings = \"country_club.Bookings1\"\nbookings_df.write.format(\"parquet\").saveAsTable(permanent_table_name_bookings)\n\npermanent_table_name_facilities = \"country_club.Facilities1\"\nfacilities_df.write.format(\"parquet\").saveAsTable(permanent_table_name_facilities)\n\npermanent_table_name_members = \"country_club.Members1\"\nmembers_df.write.format(\"parquet\").saveAsTable(permanent_table_name_members)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"a989021a-29b8-4159-9a8d-5f3a707379e3","inputWidgets":{},"title":""}},"outputs":[],"execution_count":0},{"cell_type":"markdown","source":["### Refresh tables and check them"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"a8d01df0-94bc-4097-845e-02e7e1637e4f","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nuse country_club;\nREFRESH table bookings1;\nREFRESH table facilities1;\nREFRESH table members1;\nshow tables;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"11600185-2386-4341-89cb-66d50b9a29ee","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["country_club","bookings1",false],["country_club","facilities1",false],["country_club","members1",false]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"database","type":"\"string\"","metadata":"{}"},{"name":"tableName","type":"\"string\"","metadata":"{}"},{"name":"isTemporary","type":"\"boolean\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
databasetableNameisTemporary
country_clubbookings1false
country_clubfacilities1false
country_clubmembers1false
"]}}],"execution_count":0},{"cell_type":"markdown","source":["### Test a sample SQL query\n\n__Note:__ You can use __`%sql`__ at the beginning of a cell and write SQL queries directly as seen in the following cell. Neat isn't it!"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"fdae66bd-5e7a-48f5-b715-ac4f761050ae","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nselect * from bookings1 limit 3"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"4339b5ab-b006-4458-aad5-b1f0a5c1ec87","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[[0,3,1,"2012-07-03T11:00:00.000+0000",2],[1,4,1,"2012-07-03T08:00:00.000+0000",2],[2,6,0,"2012-07-03T18:00:00.000+0000",2]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"bookid","type":"\"integer\"","metadata":"{}"},{"name":"facid","type":"\"integer\"","metadata":"{}"},{"name":"memid","type":"\"integer\"","metadata":"{}"},{"name":"starttime","type":"\"timestamp\"","metadata":"{}"},{"name":"slots","type":"\"integer\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
bookidfacidmemidstarttimeslots
0312012-07-03T11:00:00.000+00002
1412012-07-03T08:00:00.000+00002
2602012-07-03T18:00:00.000+00002
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q1: Some of the facilities charge a fee to members, but some do not. Please list the names of the facilities that do."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"17c520af-243e-4a39-8a24-ea6aa3b6a368","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT name FROM facilities1 WHERE membercost = 0;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"21f137b3-edf7-4c65-853a-42b836fa3481","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Badminton Court"],["Table Tennis"],["Snooker Table"],["Pool Table"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"name","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
name
Badminton Court
Table Tennis
Snooker Table
Pool Table
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q2: How many facilities do not charge a fee to members?"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"79bf7b92-87d8-4efb-ba7d-f0edcb59cc4b","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT COUNT(*) AS Count FROM facilities1 WHERE membercost = 0;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"0b10a941-41e4-4145-b853-801859a6bfa5","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[[4]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"Count","type":"\"long\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
Count
4
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q3: How can you produce a list of facilities that charge a fee to members, where the fee is less than 20% of the facility's monthly maintenance cost? \n#### Return the facid, facility name, member cost, and monthly maintenance of the facilities in question."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"bc6cd845-0be6-4c95-ade4-7d52c3a13cc8","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT facid, name, membercost, monthlymaintenance FROM facilities1 WHERE (membercost > 0) AND (membercost < monthlymaintenance * .2)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"d35a57f8-07ea-42dc-9f4f-53694daefff1","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[[0,"Tennis Court 1",5.0,200],[1,"Tennis Court 2",5.0,200],[4,"Massage Room 1",9.9,3000],[5,"Massage Room 2",9.9,3000],[6,"Squash Court",3.5,80]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"facid","type":"\"integer\"","metadata":"{}"},{"name":"name","type":"\"string\"","metadata":"{}"},{"name":"membercost","type":"\"double\"","metadata":"{}"},{"name":"monthlymaintenance","type":"\"integer\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
facidnamemembercostmonthlymaintenance
0Tennis Court 15.0200
1Tennis Court 25.0200
4Massage Room 19.93000
5Massage Room 29.93000
6Squash Court3.580
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q4: How can you retrieve the details of facilities with ID 1 and 5? Write the query without using the OR operator."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"9bc31a3f-ab2c-413c-9b99-46581023ae0c","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT * FROM facilities1 WHERE facid IN (1, 5)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"cb034b10-5840-43e9-a25a-62503daa7c09","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[[1,"Tennis Court 2",5.0,25.0,8000,200],[5,"Massage Room 2",9.9,80.0,4000,3000]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"facid","type":"\"integer\"","metadata":"{}"},{"name":"name","type":"\"string\"","metadata":"{}"},{"name":"membercost","type":"\"double\"","metadata":"{}"},{"name":"guestcost","type":"\"double\"","metadata":"{}"},{"name":"initialoutlay","type":"\"integer\"","metadata":"{}"},{"name":"monthlymaintenance","type":"\"integer\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
facidnamemembercostguestcostinitialoutlaymonthlymaintenance
1Tennis Court 25.025.08000200
5Massage Room 29.980.040003000
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q5: How can you produce a list of facilities, with each labelled as 'cheap' or 'expensive', depending on if their monthly maintenance cost is more than $100? \n#### Return the name and monthly maintenance of the facilities in question."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"0e0302a2-2911-41be-9599-e12323e7f23c","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT name, monthlymaintenance, CASE WHEN monthlymaintenance > 100 THEN \"expensive\" ELSE \"cheap\" END AS value FROM facilities1;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"41373ea4-9038-4c8f-842f-8aae7b074809","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Tennis Court 1",200,"expensive"],["Tennis Court 2",200,"expensive"],["Badminton Court",50,"cheap"],["Table Tennis",10,"cheap"],["Massage Room 1",3000,"expensive"],["Massage Room 2",3000,"expensive"],["Squash Court",80,"cheap"],["Snooker Table",15,"cheap"],["Pool Table",15,"cheap"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"name","type":"\"string\"","metadata":"{}"},{"name":"monthlymaintenance","type":"\"integer\"","metadata":"{}"},{"name":"value","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
namemonthlymaintenancevalue
Tennis Court 1200expensive
Tennis Court 2200expensive
Badminton Court50cheap
Table Tennis10cheap
Massage Room 13000expensive
Massage Room 23000expensive
Squash Court80cheap
Snooker Table15cheap
Pool Table15cheap
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q6: You'd like to get the first and last name of the last member(s) who signed up. Do not use the LIMIT clause for your solution."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"30f9e29f-9608-4c5d-a371-fc4cb22f9ea2","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT firstname, surname FROM members1 WHERE joindate in (SELECT MAX(joindate) FROM members1)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"74bf3f5b-924d-4d90-b978-ffd456c22f43","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Darren","Smith"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"firstname","type":"\"string\"","metadata":"{}"},{"name":"surname","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
firstnamesurname
DarrenSmith
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q7: How can you produce a list of all members who have used a tennis court?\n- Include in your output the name of the court, and the name of the member formatted as a single column. \n- Ensure no duplicate data\n- Also order by the member name."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"ded40971-9804-46e8-a647-5b9cefce363e","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT DISTINCT facilities1.name AS Court_Name, CONCAT(members1.firstname, \" \", members1.surname) AS Member_Name FROM ((bookings1 INNER JOIN members1 ON bookings1.memid = members1.memid) INNER JOIN facilities1 ON bookings1.facid = facilities1.facid) WHERE facilities1.name LIKE \"Tennis Court%\" ORDER BY Member_Name;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"879ff42d-7f1d-47e6-a828-5cd82775c0ee","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Tennis Court 2","Anne Baker"],["Tennis Court 1","Anne Baker"],["Tennis Court 2","Burton Tracy"],["Tennis Court 1","Burton Tracy"],["Tennis Court 1","Charles Owen"],["Tennis Court 2","Charles Owen"],["Tennis Court 2","Darren Smith"],["Tennis Court 2","David Farrell"],["Tennis Court 1","David Farrell"],["Tennis Court 2","David Jones"],["Tennis Court 1","David Jones"],["Tennis Court 1","David Pinker"],["Tennis Court 1","Douglas Jones"],["Tennis Court 1","Erica Crumpet"],["Tennis Court 1","Florence Bader"],["Tennis Court 2","Florence Bader"],["Tennis Court 1","GUEST GUEST"],["Tennis Court 2","GUEST GUEST"],["Tennis Court 2","Gerald Butters"],["Tennis Court 1","Gerald Butters"],["Tennis Court 2","Henrietta Rumney"],["Tennis Court 1","Jack Smith"],["Tennis Court 2","Jack Smith"],["Tennis Court 2","Janice Joplette"],["Tennis Court 1","Janice Joplette"],["Tennis Court 2","Jemima Farrell"],["Tennis Court 1","Jemima Farrell"],["Tennis Court 1","Joan Coplin"],["Tennis Court 1","John Hunt"],["Tennis Court 2","John Hunt"],["Tennis Court 1","Matthew Genting"],["Tennis Court 2","Millicent Purview"],["Tennis Court 2","Nancy Dare"],["Tennis Court 1","Nancy Dare"],["Tennis Court 1","Ponder Stibbons"],["Tennis Court 2","Ponder Stibbons"],["Tennis Court 1","Ramnaresh Sarwin"],["Tennis Court 2","Ramnaresh Sarwin"],["Tennis Court 1","Tim Boothe"],["Tennis Court 2","Tim Boothe"],["Tennis Court 2","Tim Rownam"],["Tennis Court 1","Tim Rownam"],["Tennis Court 2","Timothy Baker"],["Tennis Court 1","Timothy Baker"],["Tennis Court 2","Tracy Smith"],["Tennis Court 1","Tracy Smith"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"Court_Name","type":"\"string\"","metadata":"{}"},{"name":"Member_Name","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
Court_NameMember_Name
Tennis Court 2Anne Baker
Tennis Court 1Anne Baker
Tennis Court 2Burton Tracy
Tennis Court 1Burton Tracy
Tennis Court 1Charles Owen
Tennis Court 2Charles Owen
Tennis Court 2Darren Smith
Tennis Court 2David Farrell
Tennis Court 1David Farrell
Tennis Court 2David Jones
Tennis Court 1David Jones
Tennis Court 1David Pinker
Tennis Court 1Douglas Jones
Tennis Court 1Erica Crumpet
Tennis Court 1Florence Bader
Tennis Court 2Florence Bader
Tennis Court 1GUEST GUEST
Tennis Court 2GUEST GUEST
Tennis Court 2Gerald Butters
Tennis Court 1Gerald Butters
Tennis Court 2Henrietta Rumney
Tennis Court 1Jack Smith
Tennis Court 2Jack Smith
Tennis Court 2Janice Joplette
Tennis Court 1Janice Joplette
Tennis Court 2Jemima Farrell
Tennis Court 1Jemima Farrell
Tennis Court 1Joan Coplin
Tennis Court 1John Hunt
Tennis Court 2John Hunt
Tennis Court 1Matthew Genting
Tennis Court 2Millicent Purview
Tennis Court 2Nancy Dare
Tennis Court 1Nancy Dare
Tennis Court 1Ponder Stibbons
Tennis Court 2Ponder Stibbons
Tennis Court 1Ramnaresh Sarwin
Tennis Court 2Ramnaresh Sarwin
Tennis Court 1Tim Boothe
Tennis Court 2Tim Boothe
Tennis Court 2Tim Rownam
Tennis Court 1Tim Rownam
Tennis Court 2Timothy Baker
Tennis Court 1Timothy Baker
Tennis Court 2Tracy Smith
Tennis Court 1Tracy Smith
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q8: How can you produce a list of bookings on the day of 2012-09-14 which will cost the member (or guest) more than $30? \n\n- Remember that guests have different costs to members (the listed costs are per half-hour 'slot')\n- The guest user's ID is always 0. \n\n#### Include in your output the name of the facility, the name of the member formatted as a single column, and the cost.\n\n- Order by descending cost, and do not use any subqueries."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"eb23ed45-ca1c-46b3-9371-ccf3d2904fb9","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT facilities1.name AS Facility_Name, CONCAT(members1.firstname, \" \", members1.surname) AS Member_Name, CASE WHEN bookings1.memid = 0 THEN facilities1.guestcost * bookings1.slots ELSE facilities1.membercost * bookings1.slots END AS Total_Cost FROM ((bookings1 INNER JOIN facilities1 ON bookings1.facid = facilities1.facid) INNER JOIN members1 ON bookings1.memid = members1.memid) WHERE bookings1.starttime LIKE \"2012-09-14%\" AND CASE WHEN bookings1.memid = 0 THEN facilities1.guestcost * bookings1.slots > 30 ELSE facilities1.membercost * bookings1.slots > 30 END ORDER BY Total_Cost desc;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"3ec2175c-8f0f-45fd-ae9a-414a6fb3ce28","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Massage Room 2","GUEST GUEST",320.0],["Massage Room 1","GUEST GUEST",160.0],["Massage Room 1","GUEST GUEST",160.0],["Massage Room 1","GUEST GUEST",160.0],["Tennis Court 2","GUEST GUEST",150.0],["Tennis Court 2","GUEST GUEST",75.0],["Tennis Court 1","GUEST GUEST",75.0],["Tennis Court 1","GUEST GUEST",75.0],["Squash Court","GUEST GUEST",70.0],["Massage Room 1","Jemima Farrell",39.6],["Squash Court","GUEST GUEST",35.0],["Squash Court","GUEST GUEST",35.0]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"Facility_Name","type":"\"string\"","metadata":"{}"},{"name":"Member_Name","type":"\"string\"","metadata":"{}"},{"name":"Total_Cost","type":"\"double\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
Facility_NameMember_NameTotal_Cost
Massage Room 2GUEST GUEST320.0
Massage Room 1GUEST GUEST160.0
Massage Room 1GUEST GUEST160.0
Massage Room 1GUEST GUEST160.0
Tennis Court 2GUEST GUEST150.0
Tennis Court 2GUEST GUEST75.0
Tennis Court 1GUEST GUEST75.0
Tennis Court 1GUEST GUEST75.0
Squash CourtGUEST GUEST70.0
Massage Room 1Jemima Farrell39.6
Squash CourtGUEST GUEST35.0
Squash CourtGUEST GUEST35.0
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q9: This time, produce the same result as in Q8, but using a subquery."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"757c6468-3d07-42e2-b2b9-59e82b96350a","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT facilities1.name AS Facility_Name, CONCAT(members1.firstname, \" \", members1.surname) AS Member_Name, CASE WHEN booking.memid = 0 THEN facilities1.guestcost * booking.slots ELSE facilities1.membercost * booking.slots END AS Total_Cost FROM (((SELECT * FROM bookings1 WHERE starttime LIKE \"2012-09-14%\") AS booking INNER JOIN facilities1 ON booking.facid = facilities1.facid) INNER JOIN members1 ON booking.memid = members1.memid) WHERE CASE WHEN booking.memid = 0 THEN facilities1.guestcost * booking.slots > 30 ELSE facilities1.membercost * booking.slots > 30 END ORDER BY Total_Cost desc;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"72f9d8b6-2d51-4af1-9fa1-d183a0369d30","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Massage Room 2","GUEST GUEST",320.0],["Massage Room 1","GUEST GUEST",160.0],["Massage Room 1","GUEST GUEST",160.0],["Massage Room 1","GUEST GUEST",160.0],["Tennis Court 2","GUEST GUEST",150.0],["Tennis Court 2","GUEST GUEST",75.0],["Tennis Court 1","GUEST GUEST",75.0],["Tennis Court 1","GUEST GUEST",75.0],["Squash Court","GUEST GUEST",70.0],["Massage Room 1","Jemima Farrell",39.6],["Squash Court","GUEST GUEST",35.0],["Squash Court","GUEST GUEST",35.0]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"Facility_Name","type":"\"string\"","metadata":"{}"},{"name":"Member_Name","type":"\"string\"","metadata":"{}"},{"name":"Total_Cost","type":"\"double\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
Facility_NameMember_NameTotal_Cost
Massage Room 2GUEST GUEST320.0
Massage Room 1GUEST GUEST160.0
Massage Room 1GUEST GUEST160.0
Massage Room 1GUEST GUEST160.0
Tennis Court 2GUEST GUEST150.0
Tennis Court 2GUEST GUEST75.0
Tennis Court 1GUEST GUEST75.0
Tennis Court 1GUEST GUEST75.0
Squash CourtGUEST GUEST70.0
Massage Room 1Jemima Farrell39.6
Squash CourtGUEST GUEST35.0
Squash CourtGUEST GUEST35.0
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q10: Produce a list of facilities with a total revenue less than 1000.\n- The output should have facility name and total revenue, sorted by revenue. \n- Remember that there's a different cost for guests and members!"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"dc14e8de-3daa-4339-b78c-2a8d78e599d1","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT facilities1.name, SUM(CASE WHEN bookings1.memid = 0 THEN facilities1.guestcost * bookings1.slots ELSE facilities1.membercost * bookings1.slots END) AS Total_Revenue FROM ((bookings1 INNER JOIN facilities1 ON bookings1.facid = facilities1.facid) INNER JOIN members1 ON bookings1.memid = members1.memid) GROUP BY facilities1.name HAVING SUM(CASE WHEN bookings1.memid = 0 THEN facilities1.guestcost * bookings1.slots ELSE facilities1.membercost * bookings1.slots END) < 1000 ORDER BY Total_Revenue;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"53422808-236b-4ebd-af5f-abc9c1bb70de","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Table Tennis",180.0],["Snooker Table",240.0],["Pool Table",270.0]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"name","type":"\"string\"","metadata":"{}"},{"name":"Total_Revenue","type":"\"double\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
nameTotal_Revenue
Table Tennis180.0
Snooker Table240.0
Pool Table270.0
"]}}],"execution_count":0},{"cell_type":"code","source":[""],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"1ff7e759-05a7-4e6f-8e4f-9cc05a74316c","inputWidgets":{},"title":""}},"outputs":[],"execution_count":0}],"metadata":{"name":"Mini_Project_SQL_with_Spark","notebookId":1931807081501742,"application/vnd.databricks.v1+notebook":{"notebookName":"Mini_Project_SQL_with_Spark","dashboards":[],"notebookMetadata":{"pythonIndentUnit":4,"mostRecentlyExecutedCommandWithImplicitDF":{"commandId":551598812990966,"dataframes":["_sqldf"]}},"language":"python","widgets":{},"notebookOrigID":551598812990935}},"nbformat":4,"nbformat_minor":0} +{"cells":[{"cell_type":"markdown","source":["## SQL at Scale with Spark SQL\n\nWelcome to the SQL mini project. For this project, you will use the Databricks Platform and work through a series of exercises using Spark SQL. The dataset size may not be too big but the intent here is to familiarize yourself with the Spark SQL interface which scales easily to huge datasets, without you having to worry about changing your SQL queries. \n\nThe data you need is present in the mini-project folder in the form of three CSV files. This data will be imported in Databricks to create the following tables under the __`country_club`__ database.\n\n
\n1. The __`bookings`__ table,\n2. The __`facilities`__ table, and\n3. The __`members`__ table.\n\nYou will be uploading these datasets shortly into the Databricks platform to understand how to create a database within minutes! Once the database and the tables are populated, you will be focusing on the mini-project questions.\n\nIn the mini project, you'll be asked a series of questions. You can solve them using the databricks platform, but for the final deliverable,\nplease download this notebook as an IPython notebook (__`File -> Export -> IPython Notebook`__) and upload it to your GitHub."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"7dc8cef6-8322-4e3a-950b-757de959bbd7","inputWidgets":{},"title":""}}},{"cell_type":"markdown","source":["### Creating the Database\n\nWe will first create our database in which we will be creating our three tables of interest"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"3bd664ca-d7cc-4b4d-9c35-9957dd665c78","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql \ndrop database if exists country_club cascade;\ncreate database country_club;\nshow databases;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"98ba3faa-c4e8-48ef-9cc8-e2226e31582d","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["country_club"],["default"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"databaseName","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
databaseName
country_club
default
"]}}],"execution_count":0},{"cell_type":"markdown","source":["### Creating the Tables\n\nIn this section, we will be creating the three tables of interest and populate them with the data from the CSV files already available to you. \nTo get started, first upload the three CSV files to the DBFS as depicted in the following figure\n\n![](https://i.imgur.com/QcCruBr.png)\n\n\nOnce you have done this, please remember to execute the following code to build the dataframes which will be saved as tables in our database"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"89fe2dd6-f130-4979-abff-3cfd7eefc14f","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["# File location and type\nfile_location_bookings = \"/FileStore/tables/Bookings.csv\"\nfile_location_facilities = \"/FileStore/tables/Facilities.csv\"\nfile_location_members = \"/FileStore/tables/Members.csv\"\n\nfile_type = \"csv\"\n\n# CSV options\ninfer_schema = \"true\"\nfirst_row_is_header = \"true\"\ndelimiter = \",\"\n\n# The applied options are for CSV files. For other file types, these will be ignored.\nbookings_df = (spark.read.format(file_type) \n .option(\"inferSchema\", infer_schema) \n .option(\"header\", first_row_is_header) \n .option(\"sep\", delimiter) \n .load(file_location_bookings))\n\nfacilities_df = (spark.read.format(file_type) \n .option(\"inferSchema\", infer_schema) \n .option(\"header\", first_row_is_header) \n .option(\"sep\", delimiter) \n .load(file_location_facilities))\n\nmembers_df = (spark.read.format(file_type) \n .option(\"inferSchema\", infer_schema) \n .option(\"header\", first_row_is_header) \n .option(\"sep\", delimiter) \n .load(file_location_members))"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"936f355f-a485-4d3c-9a04-87bb55965d65","inputWidgets":{},"title":""}},"outputs":[],"execution_count":0},{"cell_type":"markdown","source":["### Viewing the dataframe schemas\n\nWe can take a look at the schemas of our potential tables to be written to our database soon"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"f10ed1f5-65a6-4bc3-a902-606102a12222","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["print('Bookings Schema')\nbookings_df.printSchema()\nprint('Facilities Schema')\nfacilities_df.printSchema()\nprint('Members Schema')\nmembers_df.printSchema()"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"45dd3bb9-3cc9-415b-a0a7-891c8a0ade8c","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"datasetInfos":[],"data":"Bookings Schema\nroot\n |-- bookid: integer (nullable = true)\n |-- facid: integer (nullable = true)\n |-- memid: integer (nullable = true)\n |-- starttime: timestamp (nullable = true)\n |-- slots: integer (nullable = true)\n\nFacilities Schema\nroot\n |-- facid: integer (nullable = true)\n |-- name: string (nullable = true)\n |-- membercost: double (nullable = true)\n |-- guestcost: double (nullable = true)\n |-- initialoutlay: integer (nullable = true)\n |-- monthlymaintenance: integer (nullable = true)\n\nMembers Schema\nroot\n |-- memid: integer (nullable = true)\n |-- surname: string (nullable = true)\n |-- firstname: string (nullable = true)\n |-- address: string (nullable = true)\n |-- zipcode: integer (nullable = true)\n |-- telephone: string (nullable = true)\n |-- recommendedby: integer (nullable = true)\n |-- joindate: timestamp (nullable = true)\n\n","removedWidgets":[],"addedWidgets":{},"metadata":{},"type":"ansi","arguments":{}}},"output_type":"display_data","data":{"text/plain":["Bookings Schema\nroot\n |-- bookid: integer (nullable = true)\n |-- facid: integer (nullable = true)\n |-- memid: integer (nullable = true)\n |-- starttime: timestamp (nullable = true)\n |-- slots: integer (nullable = true)\n\nFacilities Schema\nroot\n |-- facid: integer (nullable = true)\n |-- name: string (nullable = true)\n |-- membercost: double (nullable = true)\n |-- guestcost: double (nullable = true)\n |-- initialoutlay: integer (nullable = true)\n |-- monthlymaintenance: integer (nullable = true)\n\nMembers Schema\nroot\n |-- memid: integer (nullable = true)\n |-- surname: string (nullable = true)\n |-- firstname: string (nullable = true)\n |-- address: string (nullable = true)\n |-- zipcode: integer (nullable = true)\n |-- telephone: string (nullable = true)\n |-- recommendedby: integer (nullable = true)\n |-- joindate: timestamp (nullable = true)\n\n"]}}],"execution_count":0},{"cell_type":"markdown","source":["### Create permanent tables\nWe will be creating three permanent tables here in our __`country_club`__ database as we discussed previously with the following code"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"8766081c-ff5f-4bfa-870c-dcb7f9d1698c","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["permanent_table_name_bookings = \"country_club.Bookings1\"\nbookings_df.write.format(\"parquet\").saveAsTable(permanent_table_name_bookings)\n\npermanent_table_name_facilities = \"country_club.Facilities1\"\nfacilities_df.write.format(\"parquet\").saveAsTable(permanent_table_name_facilities)\n\npermanent_table_name_members = \"country_club.Members1\"\nmembers_df.write.format(\"parquet\").saveAsTable(permanent_table_name_members)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"a989021a-29b8-4159-9a8d-5f3a707379e3","inputWidgets":{},"title":""}},"outputs":[],"execution_count":0},{"cell_type":"markdown","source":["### Refresh tables and check them"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"a8d01df0-94bc-4097-845e-02e7e1637e4f","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nuse country_club;\nREFRESH table bookings1;\nREFRESH table facilities1;\nREFRESH table members1;\nshow tables;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"11600185-2386-4341-89cb-66d50b9a29ee","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["country_club","bookings1",false],["country_club","facilities1",false],["country_club","members1",false]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"database","type":"\"string\"","metadata":"{}"},{"name":"tableName","type":"\"string\"","metadata":"{}"},{"name":"isTemporary","type":"\"boolean\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
databasetableNameisTemporary
country_clubbookings1false
country_clubfacilities1false
country_clubmembers1false
"]}}],"execution_count":0},{"cell_type":"markdown","source":["### Test a sample SQL query\n\n__Note:__ You can use __`%sql`__ at the beginning of a cell and write SQL queries directly as seen in the following cell. Neat isn't it!"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"fdae66bd-5e7a-48f5-b715-ac4f761050ae","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nselect * from bookings1 limit 3"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"4339b5ab-b006-4458-aad5-b1f0a5c1ec87","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[[0,3,1,"2012-07-03T11:00:00.000+0000",2],[1,4,1,"2012-07-03T08:00:00.000+0000",2],[2,6,0,"2012-07-03T18:00:00.000+0000",2]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"bookid","type":"\"integer\"","metadata":"{}"},{"name":"facid","type":"\"integer\"","metadata":"{}"},{"name":"memid","type":"\"integer\"","metadata":"{}"},{"name":"starttime","type":"\"timestamp\"","metadata":"{}"},{"name":"slots","type":"\"integer\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
bookidfacidmemidstarttimeslots
0312012-07-03T11:00:00.000+00002
1412012-07-03T08:00:00.000+00002
2602012-07-03T18:00:00.000+00002
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q1: Some of the facilities charge a fee to members, but some do not. Please list the names of the facilities that do."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"17c520af-243e-4a39-8a24-ea6aa3b6a368","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT name \nFROM facilities1 \nWHERE membercost = 0;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"21f137b3-edf7-4c65-853a-42b836fa3481","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Badminton Court"],["Table Tennis"],["Snooker Table"],["Pool Table"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"name","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
name
Badminton Court
Table Tennis
Snooker Table
Pool Table
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q2: How many facilities do not charge a fee to members?"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"79bf7b92-87d8-4efb-ba7d-f0edcb59cc4b","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT COUNT(*) AS Count \nFROM facilities1 \nWHERE membercost = 0;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"0b10a941-41e4-4145-b853-801859a6bfa5","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[[4]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"Count","type":"\"long\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
Count
4
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q3: How can you produce a list of facilities that charge a fee to members, where the fee is less than 20% of the facility's monthly maintenance cost? \n#### Return the facid, facility name, member cost, and monthly maintenance of the facilities in question."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"bc6cd845-0be6-4c95-ade4-7d52c3a13cc8","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT facid, \nname, \nmembercost, \nmonthlymaintenance \nFROM facilities1 \nWHERE (membercost > 0) \nAND (membercost < monthlymaintenance * .2)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"d35a57f8-07ea-42dc-9f4f-53694daefff1","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[[0,"Tennis Court 1",5.0,200],[1,"Tennis Court 2",5.0,200],[4,"Massage Room 1",9.9,3000],[5,"Massage Room 2",9.9,3000],[6,"Squash Court",3.5,80]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"facid","type":"\"integer\"","metadata":"{}"},{"name":"name","type":"\"string\"","metadata":"{}"},{"name":"membercost","type":"\"double\"","metadata":"{}"},{"name":"monthlymaintenance","type":"\"integer\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
facidnamemembercostmonthlymaintenance
0Tennis Court 15.0200
1Tennis Court 25.0200
4Massage Room 19.93000
5Massage Room 29.93000
6Squash Court3.580
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q4: How can you retrieve the details of facilities with ID 1 and 5? Write the query without using the OR operator."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"9bc31a3f-ab2c-413c-9b99-46581023ae0c","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT * \nFROM facilities1 \nWHERE facid IN (1, 5)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"cb034b10-5840-43e9-a25a-62503daa7c09","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[[1,"Tennis Court 2",5.0,25.0,8000,200],[5,"Massage Room 2",9.9,80.0,4000,3000]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"facid","type":"\"integer\"","metadata":"{}"},{"name":"name","type":"\"string\"","metadata":"{}"},{"name":"membercost","type":"\"double\"","metadata":"{}"},{"name":"guestcost","type":"\"double\"","metadata":"{}"},{"name":"initialoutlay","type":"\"integer\"","metadata":"{}"},{"name":"monthlymaintenance","type":"\"integer\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
facidnamemembercostguestcostinitialoutlaymonthlymaintenance
1Tennis Court 25.025.08000200
5Massage Room 29.980.040003000
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q5: How can you produce a list of facilities, with each labelled as 'cheap' or 'expensive', depending on if their monthly maintenance cost is more than $100? \n#### Return the name and monthly maintenance of the facilities in question."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"0e0302a2-2911-41be-9599-e12323e7f23c","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT name, \nmonthlymaintenance, \nCASE WHEN monthlymaintenance > 100 \nTHEN \"expensive\" \nELSE \"cheap\" END AS value \nFROM facilities1;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"41373ea4-9038-4c8f-842f-8aae7b074809","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Tennis Court 1",200,"expensive"],["Tennis Court 2",200,"expensive"],["Badminton Court",50,"cheap"],["Table Tennis",10,"cheap"],["Massage Room 1",3000,"expensive"],["Massage Room 2",3000,"expensive"],["Squash Court",80,"cheap"],["Snooker Table",15,"cheap"],["Pool Table",15,"cheap"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"name","type":"\"string\"","metadata":"{}"},{"name":"monthlymaintenance","type":"\"integer\"","metadata":"{}"},{"name":"value","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
namemonthlymaintenancevalue
Tennis Court 1200expensive
Tennis Court 2200expensive
Badminton Court50cheap
Table Tennis10cheap
Massage Room 13000expensive
Massage Room 23000expensive
Squash Court80cheap
Snooker Table15cheap
Pool Table15cheap
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q6: You'd like to get the first and last name of the last member(s) who signed up. Do not use the LIMIT clause for your solution."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"30f9e29f-9608-4c5d-a371-fc4cb22f9ea2","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT firstname, \nsurname \nFROM members1 \nWHERE joindate in (SELECT MAX(joindate) FROM members1)"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"74bf3f5b-924d-4d90-b978-ffd456c22f43","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Darren","Smith"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"firstname","type":"\"string\"","metadata":"{}"},{"name":"surname","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
firstnamesurname
DarrenSmith
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q7: How can you produce a list of all members who have used a tennis court?\n- Include in your output the name of the court, and the name of the member formatted as a single column. \n- Ensure no duplicate data\n- Also order by the member name."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"ded40971-9804-46e8-a647-5b9cefce363e","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT DISTINCT facilities1.name AS Court_Name, \nCONCAT(members1.firstname, \" \", members1.surname) AS Member_Name \nFROM ((bookings1 \nINNER JOIN members1 \nON bookings1.memid = members1.memid) \nINNER JOIN facilities1 \nON bookings1.facid = facilities1.facid) \nWHERE facilities1.name LIKE \"Tennis Court%\" \nORDER BY Member_Name;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"879ff42d-7f1d-47e6-a828-5cd82775c0ee","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Tennis Court 2","Anne Baker"],["Tennis Court 1","Anne Baker"],["Tennis Court 2","Burton Tracy"],["Tennis Court 1","Burton Tracy"],["Tennis Court 1","Charles Owen"],["Tennis Court 2","Charles Owen"],["Tennis Court 2","Darren Smith"],["Tennis Court 2","David Farrell"],["Tennis Court 1","David Farrell"],["Tennis Court 2","David Jones"],["Tennis Court 1","David Jones"],["Tennis Court 1","David Pinker"],["Tennis Court 1","Douglas Jones"],["Tennis Court 1","Erica Crumpet"],["Tennis Court 1","Florence Bader"],["Tennis Court 2","Florence Bader"],["Tennis Court 1","GUEST GUEST"],["Tennis Court 2","GUEST GUEST"],["Tennis Court 2","Gerald Butters"],["Tennis Court 1","Gerald Butters"],["Tennis Court 2","Henrietta Rumney"],["Tennis Court 1","Jack Smith"],["Tennis Court 2","Jack Smith"],["Tennis Court 2","Janice Joplette"],["Tennis Court 1","Janice Joplette"],["Tennis Court 2","Jemima Farrell"],["Tennis Court 1","Jemima Farrell"],["Tennis Court 1","Joan Coplin"],["Tennis Court 1","John Hunt"],["Tennis Court 2","John Hunt"],["Tennis Court 1","Matthew Genting"],["Tennis Court 2","Millicent Purview"],["Tennis Court 2","Nancy Dare"],["Tennis Court 1","Nancy Dare"],["Tennis Court 1","Ponder Stibbons"],["Tennis Court 2","Ponder Stibbons"],["Tennis Court 1","Ramnaresh Sarwin"],["Tennis Court 2","Ramnaresh Sarwin"],["Tennis Court 1","Tim Boothe"],["Tennis Court 2","Tim Boothe"],["Tennis Court 2","Tim Rownam"],["Tennis Court 1","Tim Rownam"],["Tennis Court 2","Timothy Baker"],["Tennis Court 1","Timothy Baker"],["Tennis Court 2","Tracy Smith"],["Tennis Court 1","Tracy Smith"]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"Court_Name","type":"\"string\"","metadata":"{}"},{"name":"Member_Name","type":"\"string\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
Court_NameMember_Name
Tennis Court 2Anne Baker
Tennis Court 1Anne Baker
Tennis Court 2Burton Tracy
Tennis Court 1Burton Tracy
Tennis Court 1Charles Owen
Tennis Court 2Charles Owen
Tennis Court 2Darren Smith
Tennis Court 2David Farrell
Tennis Court 1David Farrell
Tennis Court 2David Jones
Tennis Court 1David Jones
Tennis Court 1David Pinker
Tennis Court 1Douglas Jones
Tennis Court 1Erica Crumpet
Tennis Court 1Florence Bader
Tennis Court 2Florence Bader
Tennis Court 1GUEST GUEST
Tennis Court 2GUEST GUEST
Tennis Court 2Gerald Butters
Tennis Court 1Gerald Butters
Tennis Court 2Henrietta Rumney
Tennis Court 1Jack Smith
Tennis Court 2Jack Smith
Tennis Court 2Janice Joplette
Tennis Court 1Janice Joplette
Tennis Court 2Jemima Farrell
Tennis Court 1Jemima Farrell
Tennis Court 1Joan Coplin
Tennis Court 1John Hunt
Tennis Court 2John Hunt
Tennis Court 1Matthew Genting
Tennis Court 2Millicent Purview
Tennis Court 2Nancy Dare
Tennis Court 1Nancy Dare
Tennis Court 1Ponder Stibbons
Tennis Court 2Ponder Stibbons
Tennis Court 1Ramnaresh Sarwin
Tennis Court 2Ramnaresh Sarwin
Tennis Court 1Tim Boothe
Tennis Court 2Tim Boothe
Tennis Court 2Tim Rownam
Tennis Court 1Tim Rownam
Tennis Court 2Timothy Baker
Tennis Court 1Timothy Baker
Tennis Court 2Tracy Smith
Tennis Court 1Tracy Smith
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q8: How can you produce a list of bookings on the day of 2012-09-14 which will cost the member (or guest) more than $30? \n\n- Remember that guests have different costs to members (the listed costs are per half-hour 'slot')\n- The guest user's ID is always 0. \n\n#### Include in your output the name of the facility, the name of the member formatted as a single column, and the cost.\n\n- Order by descending cost, and do not use any subqueries."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"eb23ed45-ca1c-46b3-9371-ccf3d2904fb9","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT facilities1.name AS Facility_Name,\nCONCAT(members1.firstname, \" \", members1.surname) AS Member_Name,\nCASE WHEN bookings1.memid = 0 \nTHEN facilities1.guestcost * bookings1.slots \nELSE facilities1.membercost * bookings1.slots END AS Total_Cost \nFROM ((bookings1 \nINNER JOIN facilities1 \nON bookings1.facid = facilities1.facid) \nINNER JOIN members1 \nON bookings1.memid = members1.memid) \nWHERE bookings1.starttime LIKE \"2012-09-14%\" \nAND CASE WHEN bookings1.memid = 0 \nTHEN facilities1.guestcost * bookings1.slots > 30 \nELSE facilities1.membercost * bookings1.slots > 30 END \nORDER BY Total_Cost desc;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"3ec2175c-8f0f-45fd-ae9a-414a6fb3ce28","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Massage Room 2","GUEST GUEST",320.0],["Massage Room 1","GUEST GUEST",160.0],["Massage Room 1","GUEST GUEST",160.0],["Massage Room 1","GUEST GUEST",160.0],["Tennis Court 2","GUEST GUEST",150.0],["Tennis Court 2","GUEST GUEST",75.0],["Tennis Court 1","GUEST GUEST",75.0],["Tennis Court 1","GUEST GUEST",75.0],["Squash Court","GUEST GUEST",70.0],["Massage Room 1","Jemima Farrell",39.6],["Squash Court","GUEST GUEST",35.0],["Squash Court","GUEST GUEST",35.0]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"Facility_Name","type":"\"string\"","metadata":"{}"},{"name":"Member_Name","type":"\"string\"","metadata":"{}"},{"name":"Total_Cost","type":"\"double\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
Facility_NameMember_NameTotal_Cost
Massage Room 2GUEST GUEST320.0
Massage Room 1GUEST GUEST160.0
Massage Room 1GUEST GUEST160.0
Massage Room 1GUEST GUEST160.0
Tennis Court 2GUEST GUEST150.0
Tennis Court 2GUEST GUEST75.0
Tennis Court 1GUEST GUEST75.0
Tennis Court 1GUEST GUEST75.0
Squash CourtGUEST GUEST70.0
Massage Room 1Jemima Farrell39.6
Squash CourtGUEST GUEST35.0
Squash CourtGUEST GUEST35.0
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q9: This time, produce the same result as in Q8, but using a subquery."],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"757c6468-3d07-42e2-b2b9-59e82b96350a","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT facilities1.name AS Facility_Name,\nCONCAT(members1.firstname, \" \",members1.surname) AS Member_Name,\nCASE WHEN booking.memid = 0 \nTHEN facilities1.guestcost * booking.slots \nELSE facilities1.membercost * booking.slots END AS Total_Cost \nFROM \n(((SELECT * \nFROM bookings1 \nWHERE starttime LIKE \"2012-09-14%\") AS booking \nINNER JOIN facilities1 \nON booking.facid = facilities1.facid) \nINNER JOIN members1 \nON booking.memid = members1.memid) \nWHERE CASE WHEN booking.memid = 0 THEN facilities1.guestcost * booking.slots > 30 ELSE facilities1.membercost * booking.slots > 30 END \nORDER BY Total_Cost desc;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"72f9d8b6-2d51-4af1-9fa1-d183a0369d30","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Massage Room 2","GUEST GUEST",320.0],["Massage Room 1","GUEST GUEST",160.0],["Massage Room 1","GUEST GUEST",160.0],["Massage Room 1","GUEST GUEST",160.0],["Tennis Court 2","GUEST GUEST",150.0],["Tennis Court 2","GUEST GUEST",75.0],["Tennis Court 1","GUEST GUEST",75.0],["Tennis Court 1","GUEST GUEST",75.0],["Squash Court","GUEST GUEST",70.0],["Massage Room 1","Jemima Farrell",39.6],["Squash Court","GUEST GUEST",35.0],["Squash Court","GUEST GUEST",35.0]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"Facility_Name","type":"\"string\"","metadata":"{}"},{"name":"Member_Name","type":"\"string\"","metadata":"{}"},{"name":"Total_Cost","type":"\"double\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
Facility_NameMember_NameTotal_Cost
Massage Room 2GUEST GUEST320.0
Massage Room 1GUEST GUEST160.0
Massage Room 1GUEST GUEST160.0
Massage Room 1GUEST GUEST160.0
Tennis Court 2GUEST GUEST150.0
Tennis Court 2GUEST GUEST75.0
Tennis Court 1GUEST GUEST75.0
Tennis Court 1GUEST GUEST75.0
Squash CourtGUEST GUEST70.0
Massage Room 1Jemima Farrell39.6
Squash CourtGUEST GUEST35.0
Squash CourtGUEST GUEST35.0
"]}}],"execution_count":0},{"cell_type":"markdown","source":["#### Q10: Produce a list of facilities with a total revenue less than 1000.\n- The output should have facility name and total revenue, sorted by revenue. \n- Remember that there's a different cost for guests and members!"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"dc14e8de-3daa-4339-b78c-2a8d78e599d1","inputWidgets":{},"title":""}}},{"cell_type":"code","source":["%sql\nSELECT facilities1.name,\nSUM(CASE WHEN bookings1.memid = 0 \nTHEN facilities1.guestcost * bookings1.slots \nELSE facilities1.membercost * bookings1.slots END) AS Total_Revenue \nFROM \n((bookings1 \nINNER JOIN facilities1 \nON bookings1.facid = facilities1.facid) \nINNER JOIN members1 \nON bookings1.memid = members1.memid) \nGROUP BY facilities1.name \nHAVING SUM(CASE WHEN bookings1.memid = 0 THEN facilities1.guestcost * bookings1.slots ELSE facilities1.membercost * bookings1.slots END) < 1000 \nORDER BY Total_Revenue;"],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{"implicitDf":true},"nuid":"53422808-236b-4ebd-af5f-abc9c1bb70de","inputWidgets":{},"title":""}},"outputs":[{"output_type":"display_data","metadata":{"application/vnd.databricks.v1+output":{"overflow":false,"datasetInfos":[],"data":[["Table Tennis",180.0],["Snooker Table",240.0],["Pool Table",270.0]],"plotOptions":{"displayType":"table","customPlotOptions":{},"pivotColumns":null,"pivotAggregation":null,"xColumns":null,"yColumns":null},"columnCustomDisplayInfos":{},"aggType":"","isJsonSchema":true,"removedWidgets":[],"aggSchema":[],"schema":[{"name":"name","type":"\"string\"","metadata":"{}"},{"name":"Total_Revenue","type":"\"double\"","metadata":"{}"}],"aggError":"","aggData":[],"addedWidgets":{},"metadata":{},"dbfsResultPath":null,"type":"table","aggOverflow":false,"aggSeriesLimitReached":false,"arguments":{}}},"output_type":"display_data","data":{"text/html":["
nameTotal_Revenue
Table Tennis180.0
Snooker Table240.0
Pool Table270.0
"]}}],"execution_count":0},{"cell_type":"code","source":[""],"metadata":{"application/vnd.databricks.v1+cell":{"showTitle":false,"cellMetadata":{},"nuid":"1ff7e759-05a7-4e6f-8e4f-9cc05a74316c","inputWidgets":{},"title":""}},"outputs":[],"execution_count":0}],"metadata":{"name":"Mini_Project_SQL_with_Spark","notebookId":1931807081501742,"application/vnd.databricks.v1+notebook":{"notebookName":"Mini_Project_SQL_with_Spark","dashboards":[],"notebookMetadata":{"pythonIndentUnit":4,"mostRecentlyExecutedCommandWithImplicitDF":{"commandId":551598812990950,"dataframes":["_sqldf"]}},"language":"python","widgets":{},"notebookOrigID":551598812990935}},"nbformat":4,"nbformat_minor":0}