diff --git a/s24/Louis_Lecture_Notes/39_Final_Exam_Practice/final_exam_practice.ipynb b/s24/Louis_Lecture_Notes/39_Final_Exam_Practice/final_exam_practice.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..73c8f499c673fce88ab5b2b167ba2d948822b1ad --- /dev/null +++ b/s24/Louis_Lecture_Notes/39_Final_Exam_Practice/final_exam_practice.ipynb @@ -0,0 +1,1718 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "227ea98e-6427-4bbf-bc65-7ac92d137b6c", + "metadata": {}, + "source": [ + "## Fall 2023" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9604c67f-4d2d-46da-b9f5-af6ef234a036", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "import pandas as pd\n", + "\n", + "\n", + "employee_data = {\n", + "\"Employee_ID\": [101, 102, 103, 104, 105],\n", + "\"Name\": [\"Alice\", \"Bob\", \"Charlie\", \"David\", \"Emma\"],\n", + "\"Department\": [\"HR\", \"Engineering\", \"Finance\", \"Engineering\", \"HR\"],\n", + "\"Salary\": [60000, 80000, 75000, 90000, 65000],\n", + "\"Years_Worked\": [2, 5, 3, 7, 1]\n", + "}\n", + "employees = pd.DataFrame(employee_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "56ac506c-3796-4f6f-bf72-9b4e5927b257", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "90000\n", + "90000\n" + ] + } + ], + "source": [ + "# Q1\n", + "print(employees[\"Salary\"].max())\n", + "\n", + "print(employees.loc[employees['Salary'].idxmax(),\"Salary\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "5d5ec5ac-8b9a-4f8d-a1b4-2eb4fd2f15f5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 HR\n", + "1 Engineering\n", + "2 Finance\n", + "3 Engineering\n", + "4 HR\n", + "Name: Department, dtype: object\n", + "0 Business\n", + "1 Tech\n", + "2 Business\n", + "3 Tech\n", + "4 Business\n", + "Name: Department, dtype: object\n" + ] + } + ], + "source": [ + "# Q2\n", + "print(employees['Department'])\n", + "employees[\"Department\"] = employees[\"Department\"].apply(lambda val:\n", + "\"Tech\" if val in [\"Engineering\"] else \"Business\")\n", + "print(employees['Department'])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "383ca6cd-878b-4be8-928e-99153484aae7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Movie_ID</th>\n", + " <th>Title</th>\n", + " <th>Genre</th>\n", + " <th>Rating</th>\n", + " <th>Year</th>\n", + " <th>Director</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>1</td>\n", + " <td>The Matrix</td>\n", + " <td>Action</td>\n", + " <td>4.5</td>\n", + " <td>1999</td>\n", + " <td>Wachowskis</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>2</td>\n", + " <td>Inception</td>\n", + " <td>Sci-Fi</td>\n", + " <td>4.8</td>\n", + " <td>2010</td>\n", + " <td>Christopher Nolan</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>3</td>\n", + " <td>Pulp Fiction</td>\n", + " <td>Crime</td>\n", + " <td>4.2</td>\n", + " <td>1994</td>\n", + " <td>Quentin Tarantino</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>4</td>\n", + " <td>The Shawshank Redemption</td>\n", + " <td>Drama</td>\n", + " <td>4.9</td>\n", + " <td>1994</td>\n", + " <td>Frank Darabont</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>5</td>\n", + " <td>The Dark Knight</td>\n", + " <td>Action</td>\n", + " <td>4.7</td>\n", + " <td>2008</td>\n", + " <td>Christopher Nolan</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Movie_ID Title Genre Rating Year Director\n", + "0 1 The Matrix Action 4.5 1999 Wachowskis\n", + "1 2 Inception Sci-Fi 4.8 2010 Christopher Nolan\n", + "2 3 Pulp Fiction Crime 4.2 1994 Quentin Tarantino\n", + "3 4 The Shawshank Redemption Drama 4.9 1994 Frank Darabont\n", + "4 5 The Dark Knight Action 4.7 2008 Christopher Nolan" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "movies = pd.DataFrame({\n", + "\"Movie_ID\": [1, 2, 3, 4, 5],\n", + "\"Title\": [\"The Matrix\", \"Inception\", \"Pulp Fiction\",\n", + "\"The Shawshank Redemption\", \"The Dark Knight\"],\n", + "\"Genre\": [\"Action\", \"Sci-Fi\", \"Crime\", \"Drama\", \"Action\"],\n", + "\"Rating\": [4.5, 4.8, 4.2, 4.9, 4.7],\n", + "\"Year\": [1999, 2010, 1994, 1994, 2008],\n", + "\"Director\": [\"Wachowskis\", \"Christopher Nolan\", \"Quentin Tarantino\",\n", + "\"Frank Darabont\", \"Christopher Nolan\"]\n", + "})\n", + "movies" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a7db0595-5a8a-48e7-bfe7-75ebac4b20e3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pandas.core.series.Series" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q3\n", + "\n", + "type(movies[\"Genre\"].value_counts())" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "4b47b4cb-d397-48f4-8fae-05429c50aa73", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'Pulp Fiction'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[14], line 2\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# Q4\u001b[39;00m\n\u001b[0;32m----> 2\u001b[0m movies\u001b[38;5;241m.\u001b[39mloc[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPulp Fiction\u001b[39m\u001b[38;5;124m\"\u001b[39m][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mDirector\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", + "File \u001b[0;32m~/anaconda3/lib/python3.11/site-packages/pandas/core/indexing.py:1153\u001b[0m, in \u001b[0;36m_LocationIndexer.__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 1150\u001b[0m axis \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maxis \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;241m0\u001b[39m\n\u001b[1;32m 1152\u001b[0m maybe_callable \u001b[38;5;241m=\u001b[39m com\u001b[38;5;241m.\u001b[39mapply_if_callable(key, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobj)\n\u001b[0;32m-> 1153\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_getitem_axis(maybe_callable, axis\u001b[38;5;241m=\u001b[39maxis)\n", + "File \u001b[0;32m~/anaconda3/lib/python3.11/site-packages/pandas/core/indexing.py:1393\u001b[0m, in \u001b[0;36m_LocIndexer._getitem_axis\u001b[0;34m(self, key, axis)\u001b[0m\n\u001b[1;32m 1391\u001b[0m \u001b[38;5;66;03m# fall thru to straight lookup\u001b[39;00m\n\u001b[1;32m 1392\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_validate_key(key, axis)\n\u001b[0;32m-> 1393\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_get_label(key, axis\u001b[38;5;241m=\u001b[39maxis)\n", + "File \u001b[0;32m~/anaconda3/lib/python3.11/site-packages/pandas/core/indexing.py:1343\u001b[0m, in \u001b[0;36m_LocIndexer._get_label\u001b[0;34m(self, label, axis)\u001b[0m\n\u001b[1;32m 1341\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m_get_label\u001b[39m(\u001b[38;5;28mself\u001b[39m, label, axis: AxisInt):\n\u001b[1;32m 1342\u001b[0m \u001b[38;5;66;03m# GH#5567 this will fail if the label is not present in the axis.\u001b[39;00m\n\u001b[0;32m-> 1343\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mobj\u001b[38;5;241m.\u001b[39mxs(label, axis\u001b[38;5;241m=\u001b[39maxis)\n", + "File \u001b[0;32m~/anaconda3/lib/python3.11/site-packages/pandas/core/generic.py:4236\u001b[0m, in \u001b[0;36mNDFrame.xs\u001b[0;34m(self, key, axis, level, drop_level)\u001b[0m\n\u001b[1;32m 4234\u001b[0m new_index \u001b[38;5;241m=\u001b[39m index[loc]\n\u001b[1;32m 4235\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 4236\u001b[0m loc \u001b[38;5;241m=\u001b[39m index\u001b[38;5;241m.\u001b[39mget_loc(key)\n\u001b[1;32m 4238\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(loc, np\u001b[38;5;241m.\u001b[39mndarray):\n\u001b[1;32m 4239\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m loc\u001b[38;5;241m.\u001b[39mdtype \u001b[38;5;241m==\u001b[39m np\u001b[38;5;241m.\u001b[39mbool_:\n", + "File \u001b[0;32m~/anaconda3/lib/python3.11/site-packages/pandas/core/indexes/range.py:418\u001b[0m, in \u001b[0;36mRangeIndex.get_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 416\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key) \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01merr\u001b[39;00m\n\u001b[1;32m 417\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(key, Hashable):\n\u001b[0;32m--> 418\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key)\n\u001b[1;32m 419\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_check_indexing_error(key)\n\u001b[1;32m 420\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mKeyError\u001b[39;00m(key)\n", + "\u001b[0;31mKeyError\u001b[0m: 'Pulp Fiction'" + ] + } + ], + "source": [ + "# Q4\n", + "movies.loc[\"Pulp Fiction\"][\"Director\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "d1da11ec-3615-42fd-b7da-f2f4d69709d3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>year</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>1994.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>NaN</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>2004.0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " year\n", + "0 1994.0\n", + "1 NaN\n", + "2 2004.0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame([\n", + "{\"year\":1994.0},\n", + "{\"year\":None},\n", + "{\"year\":2004.0}\n", + "])\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "cdd11f49-929a-4966-a82d-679691c2e95b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>year</th>\n", + " <th>decade</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>1994.0</td>\n", + " <td>1990.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>NaN</td>\n", + " <td>NaN</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>2004.0</td>\n", + " <td>2000.0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " year decade\n", + "0 1994.0 1990.0\n", + "1 NaN NaN\n", + "2 2004.0 2000.0" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q5\n", + "df[\"decade\"] = df[\"year\"] // 10 * 10\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "9088d5ba-e391-4c75-abf9-2cc150884368", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 1994\n", + "2 2004\n", + "Name: year, dtype: int64" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q6\n", + "df[\"year\"].dropna().astype(int)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "7a178e67-3971-4d5d-b88a-4e1710c8882a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>year</th>\n", + " <th>decade</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>1994.0</td>\n", + " <td>1990.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>NaN</td>\n", + " <td>NaN</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>2004.0</td>\n", + " <td>2000.0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>2008.0</td>\n", + " <td>2000.0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " year decade\n", + "0 1994.0 1990.0\n", + "1 NaN NaN\n", + "2 2004.0 2000.0\n", + "3 2008.0 2000.0" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = pd.DataFrame([\n", + "{\"year\":1994, \"decade\": 1990},\n", + "{\"year\":None, \"decade\": None},\n", + "{\"year\":2004, \"decade\": 2000},\n", + "{\"year\":2008, \"decade\": 2000}\n", + "])\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "3d4d135e-06a0-42c4-90a5-48fa2a76d978", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q7\n", + "df[\"decade\"].value_counts().iloc[0]" + ] + }, + { + "cell_type": "markdown", + "id": "8922116e-5f13-4815-a71e-65e9cc77a315", + "metadata": {}, + "source": [ + "##### Q8\n", + "`<a href=\"https://www.google.com\">link</a>`<br>\n", + "<a href=\"https://www.google.com\">link</a>" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "313994b5-6991-439b-b2d3-3c1886ce4cb5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Not 200\n" + ] + } + ], + "source": [ + "# Q9\n", + "import requests\n", + "\n", + "def fetch_data(api_url):\n", + " try:\n", + " response = requests.get(api_url)\n", + " status_code = response.status_code\n", + " except requests.HTTPError as e:\n", + " return None\n", + " if status_code == 200:\n", + " return \"Success\"\n", + " else:\n", + " return \"Not 200\"\n", + "\n", + "result = fetch_data(\"https://example.com/abc123\")\n", + "print(result)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "4b047fab-12e4-4874-a395-53431e263fe4", + "metadata": {}, + "outputs": [], + "source": [ + "# Q10\n", + "import requests\n", + "\n", + "def save_html(url):\n", + " try:\n", + " response = requests.get(url)\n", + " response.raise_for_status()\n", + " file = open(\"web_page.html\", \"w\", encoding=\"utf-8\")\n", + " file.write(response.text) ###SOLUTION LINE ????\n", + " file.close()\n", + " except requests.HTTPError as e:\n", + " print(\"WARNING! Could not fetch page\")" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "15991384-1a60-4a5c-aa09-e88670e6bee2", + "metadata": {}, + "outputs": [], + "source": [ + "# Q11\n", + "from bs4 import BeautifulSoup\n", + "import os\n", + "\n", + "if os.path.exists(\"web_page.html\"):\n", + " file = open(\"web_page.html\")\n", + " html_content = file.read() ###SOLUTION LINE ????\n", + " soup = BeautifulSoup(html_content, \"html.parser\")\n", + " link = soup.find(\"a\")\n", + " file.close()" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "0b64e8e4-0e7f-4e3c-aa81-1d8fdfac4b46", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "220" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q12\n", + "\n", + "# import requests\n", + "# response = requests.get(\"https://www.example.com/data.json\")\n", + "# data_text = response.text\n", + "# data_json = response.json()\n", + "\n", + "import json\n", + "\n", + "data_text = '''{\"john\": 150, \"emma\": 220, \"mike\": 180}'''\n", + "data_json = json.loads(data_text)\n", + "\n", + "data_json[\"emma\"] ###SOLUTION LINE" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "8873033e-97e0-47e0-84e1-461b3ff0b0f6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>index</th>\n", + " <th>name</th>\n", + " <th>industry</th>\n", + " <th>headquarters</th>\n", + " <th>established</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>2</td>\n", + " <td>Toyota</td>\n", + " <td>Automotive</td>\n", + " <td>Japan</td>\n", + " <td>1937</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>6</td>\n", + " <td>Volkswagen</td>\n", + " <td>Automotive</td>\n", + " <td>Germany</td>\n", + " <td>1937</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " index name industry headquarters established\n", + "0 2 Toyota Automotive Japan 1937\n", + "1 6 Volkswagen Automotive Germany 1937" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q13\n", + "\n", + "import sqlite3\n", + "import pandas as pd\n", + "\n", + "# companies=pd.DataFrame({\n", + "# 'name':['Walmart','Samsung Electronics','Toyota','Amazon','Mercedes Benz','Apple','Volkswagen'],\n", + "# 'industry':['Retail','Electronics','Automotive','Retail','Automotive','Electronics','Automotive'],\n", + "# 'headquarters':['USA','South Korea','Japan','USA','Germany','USA','Germany'],\n", + "# 'established':[1962,1969,1937,1994,1926,1976,1937]\n", + "# })\n", + "conn = sqlite3.connect(\"companies.db\")\n", + "# companies.to_sql(\"companies\",conn)\n", + "\n", + "\n", + "\n", + "companies = pd.read_sql(\"SELECT * FROM companies\", conn)\n", + "\n", + "\n", + "query = \"SELECT * FROM companies WHERE established = 1937\" ### SOLUTION\n", + "pd.read_sql(query, conn)" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "bd78ea9b-55db-4e55-a548-8b7b3ff80330", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>index</th>\n", + " <th>name</th>\n", + " <th>industry</th>\n", + " <th>headquarters</th>\n", + " <th>established</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>3</td>\n", + " <td>Amazon</td>\n", + " <td>Retail</td>\n", + " <td>USA</td>\n", + " <td>1994</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>5</td>\n", + " <td>Apple</td>\n", + " <td>Electronics</td>\n", + " <td>USA</td>\n", + " <td>1976</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>0</td>\n", + " <td>Walmart</td>\n", + " <td>Retail</td>\n", + " <td>USA</td>\n", + " <td>1962</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " index name industry headquarters established\n", + "0 3 Amazon Retail USA 1994\n", + "1 5 Apple Electronics USA 1976\n", + "2 0 Walmart Retail USA 1962" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q14\n", + "pd.read_sql(\"\"\"\n", + "SELECT * FROM companies WHERE headquarters = \"USA\" ORDER BY name ASC\n", + "\"\"\",conn)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "f34d5232-d7d2-4b67-9a8c-f58374c2e4fa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>headquarters</th>\n", + " <th>num_companies</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>USA</td>\n", + " <td>3</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " headquarters num_companies\n", + "0 USA 3" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q15\n", + "query = \"\"\"\n", + "SELECT headquarters, COUNT(*) AS num_companies\n", + "FROM companies\n", + "GROUP BY headquarters\n", + "HAVING num_companies > 2\n", + "ORDER BY num_companies DESC\n", + "\"\"\"\n", + "output = pd.read_sql(query, conn)\n", + "output" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "ade68c8c-b236-4017-903f-056fcd81f88b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>index</th>\n", + " <th>name</th>\n", + " <th>industry</th>\n", + " <th>headquarters</th>\n", + " <th>established</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>0</td>\n", + " <td>Walmart</td>\n", + " <td>Retail</td>\n", + " <td>USA</td>\n", + " <td>1962</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " index name industry headquarters established\n", + "0 0 Walmart Retail USA 1962" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q16\n", + "pd.read_sql(\"\"\"\n", + "SELECT * FROM companies WHERE headquarters = \"USA\" AND industry = \"Retail\" ORDER BY established ASC Limit 1\n", + "\"\"\",conn)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "96ddf943-dec1-426a-b480-1d280dfdfd59", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " established num_companies\n", + "0 1937 2\n" + ] + }, + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q17\n", + "question_df = pd.read_sql(\"\"\"\n", + "SELECT established, COUNT(*) AS num_companies\n", + "FROM companies\n", + "GROUP BY established\n", + "HAVING num_companies > 1\n", + "\"\"\", conn)\n", + "print(question_df)\n", + "len(question_df)" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "4d9f7b22-bff3-433e-9c33-115fb507dfe3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>index</th>\n", + " <th>name</th>\n", + " <th>industry</th>\n", + " <th>headquarters</th>\n", + " <th>established</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>1</td>\n", + " <td>Samsung Electronics</td>\n", + " <td>Electronics</td>\n", + " <td>South Korea</td>\n", + " <td>1969</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>2</td>\n", + " <td>Toyota</td>\n", + " <td>Automotive</td>\n", + " <td>Japan</td>\n", + " <td>1937</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>4</td>\n", + " <td>Mercedes Benz</td>\n", + " <td>Automotive</td>\n", + " <td>Germany</td>\n", + " <td>1926</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>6</td>\n", + " <td>Volkswagen</td>\n", + " <td>Automotive</td>\n", + " <td>Germany</td>\n", + " <td>1937</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " index name industry headquarters established\n", + "0 1 Samsung Electronics Electronics South Korea 1969\n", + "1 2 Toyota Automotive Japan 1937\n", + "2 4 Mercedes Benz Automotive Germany 1926\n", + "3 6 Volkswagen Automotive Germany 1937" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q18 (the != is what is being tested)\n", + "non_usa = pd.read_sql(\"\"\"\n", + "SELECT *\n", + "FROM companies\n", + "WHERE headquarters != \"USA\"\n", + "\"\"\", conn)\n", + "non_usa" + ] + }, + { + "cell_type": "markdown", + "id": "b731e73f-dc21-441b-9591-a5df1f313c05", + "metadata": {}, + "source": [ + "#### Q19\n", + "**Question asking about differences between `.loc` and `.iloc`**\n", + "\n", + "Answer: loc is primarily used with row and column labels, while iloc is used with\n", + "integer positions." + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "9f559dae-aba9-455d-b4ab-ca0845c9eb44", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<Axes: xlabel='A', ylabel='C'>" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "<Figure size 640x480 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Q20 - Answer: C A scatter plot with dots that are all the same color\n", + "\n", + "df = pd.DataFrame({\"A\":[1,2,3,4], \"B\":[2,7,5,8], \"C\":[3,6,9,12]})\n", + "df.plot.scatter(x=\"A\", y=\"C\")" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "b50e53cf-5998-4914-95c0-d9bd813bd825", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<Axes: ylabel='A'>" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "<Figure size 640x480 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Q21 Pandas DOES support pie plots\n", + "df.plot.pie(y='A')" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "f2cb95c4-fd6d-4429-8ca9-ad9395df4018", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0.5, 0, 'Hello World')" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "<Figure size 640x480 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Q22\n", + "ax = df.plot.bar()\n", + "ax.set_xlabel(\"Hello World\")" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "0bac7315-9dc6-403e-953f-f37cc7749f5d", + "metadata": {}, + "outputs": [], + "source": [ + "# Q23\n", + "\n", + "import os\n", + "\n", + "def get_all_paths_in(directory):\n", + " paths = []\n", + " files = os.listdir(directory)\n", + " for file in files:\n", + " if file.startswith(\".\"):\n", + " continue\n", + " path = os.path.join(directory, file)\n", + " if os.path.isfile(path):\n", + " paths.append(path)\n", + " elif os.path.isdir(path):\n", + " paths.extend(get_all_paths_in(path)) ###SOLUTION ????\n", + " return sorted(paths, reverse=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "09b189dc-9de7-4a90-9828-ce42cc6ac5fd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Red Giant': ['11 UMi', '14 And'],\n", + " 'White Dwarf': ['mu2 Sco'],\n", + " 'Neutron Star': ['HD 96127']}" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q24\n", + "\n", + "stars_dict = {\n", + "\"11 UMi\": {\"Stellar Mass\": 2.78, \"Stellar Age\": 1.560},\n", + "\"14 And\": {\"Stellar Mass\": 1.78, \"Stellar Age\": 4.500},\n", + "\"CD Cet\": {\"Stellar Mass\": 0.16, \"Stellar Age\": 3.000},\n", + "\"mu2 Sco\": {\"Stellar Mass\": 9.1, \"Stellar Age\": 0.020},\n", + "\"HD 96127\": {\"Stellar Mass\": 12.94, \"Stellar Age\": 4.067}\n", + "}\n", + "\n", + "star_classes = {\n", + "\"Red Giant\": [],\n", + "\"White Dwarf\": [],\n", + "\"Neutron Star\": []\n", + "}\n", + "\n", + "# SOLUTION: < < <= < >=\n", + "for star in stars_dict:\n", + " star_info = stars_dict[star]\n", + " mass = star_info[\"Stellar Mass\"]\n", + " if mass == None:\n", + " continue\n", + " if 0.5 < mass < 8:\n", + " star_classes[\"Red Giant\"].append(star)\n", + " elif 8 <= mass < 12:\n", + " star_classes[\"White Dwarf\"].append(star)\n", + " elif mass >= 12:\n", + " star_classes[\"Neutron Star\"].append(star)\n", + "\n", + "star_classes" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "ead522cf-fc2c-4888-8c83-17cd2173a04c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4.067\n" + ] + } + ], + "source": [ + "# Q25\n", + "print(stars_dict[star_classes[\"Neutron Star\"][0]][\"Stellar Age\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "391c03c4-3fe7-404a-a484-d8b2bbd175ed", + "metadata": {}, + "outputs": [], + "source": [ + "# Q26\n", + "import csv\n", + "import json\n", + "import os\n", + "\n", + "def process_csv(filename):\n", + " with open(filename) as file:\n", + " csv_reader = csv.reader(file)\n", + " list_data = list(csv_reader)\n", + " return list_data\n", + " \n", + "def read_json(path):\n", + " with open(path, encoding=\"utf-8\") as f:\n", + " return json.load(f)\n", + " \n", + "def get_planets_data(planet_file, mapping_file):\n", + " mapping_dict = read_json(mapping_file)\n", + " planets_csv = process_csv(planet_file)\n", + " planets_header = planets_csv[0]\n", + " planets_rows = planets_csv[1:]\n", + " return (planets_header, planets_rows, mapping_dict)\n", + "\n", + "# Root\n", + "# |\n", + "# |-- data\n", + "# | |-- planets1.csv\n", + "# | |-- mappings\n", + "# | |-- mapping1.json\n", + "# |\n", + "# |-- other_folder\n", + "\n", + "#SOLUTION\n", + "# get_planets_data(os.path.join(\"data\", \"planets1.csv\"),\n", + "# os.path.join(\"data\", \"mappings\", \"mapping1.json\")" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "352ffe18-be4b-4b34-a9ca-2ea46701ec48", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Column 1', 'Column 2']" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q27\n", + "data = \"\"\"\n", + "<table>\n", + "<thead>\n", + "<tr>\n", + "<th>Column 1</th>\n", + "<th>Column 2</th>\n", + "</tr>\n", + "</thead>\n", + "<tbody>\n", + "<tr>\n", + "<td>Row 1, Cell 1</td>\n", + "<td>Row 1, Cell 2</td>\n", + "</tr>\n", + "<tr>\n", + "<td>Row 2, Cell 1</td>\n", + "<td>Row 2, Cell 2</td>\n", + "</tr>\n", + "</tbody>\n", + "</table>\n", + "\"\"\"\n", + "\n", + "f=open(\"2023.html\",'w')\n", + "f.write(data)\n", + "f.close()\n", + "\n", + "from bs4 import BeautifulSoup\n", + "import pandas as pd\n", + "\n", + "with open(\"2023.html\", \"r\", encoding=\"utf-8\") as file:\n", + " html_content = file.read()\n", + "\n", + "soup = BeautifulSoup(html_content, \"html.parser\")\n", + "table = soup.find(\"table\")\n", + "headers = [val.get_text().strip() for val in table.find(\"thead\").find_all(\"th\")]\n", + "headers" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "15c56c7c-e2a9-4bf1-a593-bb7f0ed9fa86", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Column 1</th>\n", + " <th>Column 2</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>Row 1, Cell 1</td>\n", + " <td>Row 1, Cell 2</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>Row 2, Cell 1</td>\n", + " <td>Row 2, Cell 2</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Column 1 Column 2\n", + "0 Row 1, Cell 1 Row 1, Cell 2\n", + "1 Row 2, Cell 1 Row 2, Cell 2" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q28\n", + "table = soup.find(\"table\")\n", + "headers = [\"Column 1\", \"Column 2\"]\n", + "data = []\n", + "rows = table.find_all(\"tr\")\n", + "for row in rows[1:]:\n", + " cols = row.find_all(\"td\")\n", + " row_data = {}\n", + " for i in range(len(headers)):\n", + " row_data[headers[i]] = cols[i].get_text() ###SOLUTION ????\n", + " data.append(row_data)\n", + "\n", + "df = pd.DataFrame(data)\n", + "df" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "d6048328-0f8e-469c-9250-924bbe8e66d0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "None []\n" + ] + } + ], + "source": [ + "# Q29\n", + "print(soup.find(\"a\"), soup.find_all(\"a\"))" + ] + }, + { + "cell_type": "markdown", + "id": "47b5bddd-b827-4f6e-af43-af09b26bc7c7", + "metadata": {}, + "source": [ + "#### Q30 Primary Difference between `.find()` and `.find_all()`\n", + "answer: .find() returns the first match, while .find all() returns a list of\n", + "all matches" + ] + }, + { + "cell_type": "markdown", + "id": "06521e9d-a527-45fb-8a8e-8f3b502e3a75", + "metadata": {}, + "source": [ + "#### Q31\n", + "Assume that all necessary imports have already been made. Please select the answer that\n", + "correctly replaces all of the ???? spaces (in top-to-bottom order) as they appear below to\n", + "prepare the rankings database:\n", + "```\n", + "var1 = \"rankings.db\"\n", + "var2 = \"rankings\"\n", + "var3 = \"rankings.json\"\n", + "\n", + "rankings = pd.read_json(????)\n", + "conn = sqlite3.connect(????)\n", + "rankings.to_sql(????, conn, if_exists=\"replace\", index=False)\n", + "```\n", + "\n", + "Answer: E. var3, var1, var2" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "id": "256c4df3-4090-4c54-a588-53a5f1c70587", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "4" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# SETUP FOR Q32 and beyond\n", + "df = pd.DataFrame({\n", + " 'Year':[2022,2022,2022,2021],\n", + " 'Institution Name':['University of Tokyo','University of Munich','Kyoto University','Wisconsin-Madison'],\n", + " 'Country':['Japan','Germany','Japan','USA'],\n", + " 'Fac Student':[7.2, 14.3, 6.5, 15.2],\n", + " 'Cit Per Fac':[97.5, 97.2, 96.8, 96.1],\n", + " 'International':[99.7, 91.5, 98.9, 83.4]\n", + "})\n", + "df.to_sql(\"rankings\",conn)" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "ac8b5ac6-a9c0-478c-81b6-10d58376dbbf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Institution Name</th>\n", + " <th>Fac Student</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [Institution Name, Fac Student]\n", + "Index: []" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q32\n", + "pd.read_sql(\"\"\"\n", + "SELECT \"Institution Name\", \"Fac Student\"\n", + "FROM rankings\n", + "WHERE Year = 2023 AND Country = \"Brazil\"\n", + "ORDER BY \"Fac Student\" DESC\n", + "LIMIT 10\n", + "\"\"\",conn)\n", + "\n", + "# NOTE: Prefer double quotes for quoting identifiers, such as column or table names. It's the SQL standard.\n", + "# Backticks also work, but they're only supported for MySQL syntax compatibility. Single quotes are for string literals,\n", + "# not identifiers. Aug 5, 2014\n", + "# https://stackoverflow.com/questions/25141090/use-backticks-or-double-quotes-with-python-and-sqlite#:~:text=Prefer%20double%20quotes%20for%20quoting,for%20string%20literals%2C%20not%20identifiers." + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "id": "d66c5428-7fc1-4ffa-a095-0399d93bfafa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.7715279808433153" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q33\n", + "qry = \"\"\"\n", + "SELECT \"International\", \"Cit Per Fac\" FROM rankings\n", + "\n", + "\"\"\" # took out this so some data in qry: WHERE \"year\" = 2020 AND \"Country\" = \"Germany\"\n", + "pd.read_sql(qry, conn).corr().loc[\"International\"].loc[\"Cit Per Fac\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "ca82e3ba-f6b3-4a75-b73d-88658b101aef", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Country</th>\n", + " <th>Num Institutions</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + "Empty DataFrame\n", + "Columns: [Country, Num Institutions]\n", + "Index: []" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Q34\n", + "qry = \"\"\"SELECT Country, COUNT(*) AS \"Num Institutions\" FROM rankings\n", + "WHERE Year = 2020 GROUP BY Country ORDER BY \"Num Institutions\" DESC\n", + "LIMIT 5\"\"\"\n", + "pd.read_sql(qry,conn)" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "dc95d1ed-5375-459a-85d7-df63a51222a1", + "metadata": {}, + "outputs": [], + "source": [ + "# Q35\n", + "qry = \"\"\"\n", + "SELECT (\"Fac Student\" * \"Cit Per Fac\") AS \"Cit Per Student\"\n", + "\"\"\"\n" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "bc08b646-d7df-435c-b2c0-a9f0bc518014", + "metadata": {}, + "outputs": [], + "source": [ + "conn.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "16530e6a-83fd-47b0-a52b-819224f2ce8c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}