diff --git a/2022/python_workshop/notebooks/02_basic_data_types.ipynb b/2022/python_workshop/notebooks/02_basic_data_types.ipynb index d9a6aa8..98b8107 100644 --- a/2022/python_workshop/notebooks/02_basic_data_types.ipynb +++ b/2022/python_workshop/notebooks/02_basic_data_types.ipynb @@ -80,9 +80,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x_int = 10, y_int = 10\n", + "type of x_int: \n", + "type of y_int: \n", + "x_initial_identity = 1716000483920\n", + "y_initial_identity = 1716000483920\n", + "are they the same? True\n", + "x_int is y_int? True\n", + "does x_int have the same value as y_int? True\n", + "assigning new value to x\n", + "x_int = 11, y_int = 10\n", + "does x_int have the same value as y_int? False\n", + "x_initial_identity; 1716000483920\n", + "x_final_identity: 1716000483952\n" + ] + } + ], "source": [ "# assign x a value and then assign x to y\n", "x_int = 10\n", @@ -154,17 +174,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Este ok\n", + "Si aici este ok\n" + ] + } + ], "source": [ "# let's try to divide by 0\n", "# we will use a try-except block\n", "\n", "try:\n", - " x = 1 / 0\n", + " x = 1\n", "except ZeroDivisionError:\n", - " print(\"you can't divide by zero!\")" + " print(\"you can't divide by zero!\")\n", + " raise ZeroDivisionError\n", + "else:\n", + " print('Este ok')\n", + "finally:\n", + " print(\"Si aici este ok\")\n" ] }, { @@ -265,12 +299,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Peter Pan is a terrible boxer.\n", + "Whenever he throws a punch, it Neverlands\n", + "Neverlands\n", + "\n", + "I was wondering why the frisbee kept getting bigger and bigger.\n", + "But then it hit me.\n", + " Ba-dum tss.\n", + "\n" + ] + } + ], "source": [ "one_liner = \"Peter Pan is a terrible boxer.\\nWhenever he throws a punch, it Neverlands\"\n", "print(one_liner)\n", + "new_str = one_liner.split(\" \")\n", + "print(new_str[-1])\n", "\n", "multi_liner = \"\"\"\n", "I was wondering why the frisbee kept getting bigger and bigger.\n", @@ -282,9 +333,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['']\n", + "Ellipsis\n" + ] + } + ], "source": [ "# get the last word of that one-liner\n", "\n", @@ -307,24 +367,55 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "SELECT * FROM my_table WHERE date >= '2022-07-01 20:22:07';\n", + "\n", + "\n", + "SELECT * FROM my_table WHERE date >= '2022-07-01 20:22:07';\n", + "\n" + ] + } + ], "source": [ "# replace the wildcard in the string with a value\n", "statement = \"\"\"\n", + "SELECT * FROM my_table WHERE date >= {};\n", + "\"\"\"\n", + "statement_v2 = \"\"\"\n", "SELECT * FROM my_table WHERE date >= $$start_date$$;\n", "\"\"\"\n", "start_date = \"'2022-07-01 20:22:07'\"\n", - "replaced_statement = ...\n", - "print(replaced_statement)" + "replaced_statement = statement.format(start_date)\n", + "replaced_statement_v2 = statement_v2.replace(\"$$start_date$$\", start_date)\n", + "\n", + "print(replaced_statement)\n", + "print(replaced_statement_v2)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "This is a string that needs to be split,\n", + "based in the comma character,\n", + "so it should result in three strings.\n", + "\n" + ] + } + ], "source": [ "# split the following string based on the comma\n", "s = \"\"\"\n", @@ -333,7 +424,7 @@ "so it should result in three strings.\n", "\"\"\"\n", "\n", - "split_strings = ...\n", + "split_strings = s.strip('strings')\n", "print(split_strings)" ] }, @@ -359,9 +450,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "x evaluated to False\n", + "False\n", + "True\n", + "True\n", + "False\n" + ] + } + ], "source": [ "# an empty (None) variable evaluates to False\n", "x = int()\n", @@ -370,19 +474,31 @@ " print('x evaluated to False')\n", "\n", "# what does 0 evaluate to?\n", + "zero = bool(0)\n", + "print(zero)\n", "\n", "# what does 1 evaluate to?\n", - "\n", + "one = bool(1)\n", + "print(one)\n", "# what does a random string evaluate to?\n", - "\n", + "string = bool('fjghggf')\n", + "print(string)\n", "# what does an empty string evaluate to?\n", - "\n" + "empty_string = bool('')\n", + "print(empty_string)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 3.10.5 64-bit", + "display_name": "Python 3.9.12 ('base')", "language": "python", "name": "python3" }, @@ -396,12 +512,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.9.12" }, "orig_nbformat": 4, "vscode": { "interpreter": { - "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" + "hash": "d31b83e9610685068a0fe73b54051d44dc1110027bef1c52e64b671e72faac45" } } }, diff --git a/2022/python_workshop/notebooks/03a_lists_and_tuples.ipynb b/2022/python_workshop/notebooks/03a_lists_and_tuples.ipynb index f979125..b524c94 100644 --- a/2022/python_workshop/notebooks/03a_lists_and_tuples.ipynb +++ b/2022/python_workshop/notebooks/03a_lists_and_tuples.ipynb @@ -39,9 +39,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Verstappen\n", + "\n" + ] + } + ], "source": [ "f1_drivers = [\"Leclerc\", \"Verstappen\"]\n", "print(f1_drivers[1])\n", @@ -58,9 +67,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['Leclerc', 'Verstappen', 'Hamilton', 'Norris', 'Alonso', 'Bottas', 'Gasly', 'Vettel', 'Schumacher', 'Albon', 'Hulkenberg']\n" + ] + } + ], "source": [ "# using the append method - add one element\n", "f1_drivers.append(\"Hamilton\")\n", @@ -78,9 +95,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "removed Hulkenberg.\n", + "['Leclerc', 'Verstappen', 'Hamilton', 'Norris', 'Alonso', 'Bottas', 'Gasly', 'Vettel', 'Schumacher', 'Albon']\n", + "added Hulkenberg.\n", + "['Leclerc', 'Verstappen', 'Hamilton', 'Norris', 'Alonso', 'Bottas', 'Gasly', 'Vettel', 'Schumacher', 'Albon', 'Hulkenberg']\n", + "removed Hulkenberg again. won't add Hulkenberg back.\n", + "['Leclerc', 'Verstappen', 'Hamilton', 'Norris', 'Alonso', 'Bottas', 'Gasly', 'Vettel', 'Schumacher', 'Albon']\n" + ] + } + ], "source": [ "# we should probably remove Hulkenberg\n", "\n", @@ -106,9 +136,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ignore the last five drivers ['Leclerc', 'Verstappen', 'Hamilton', 'Norris', 'Alonso']\n", + "Revert the order ['Albon', 'Schumacher', 'Vettel', 'Gasly', 'Bottas', 'Alonso', 'Norris', 'Hamilton', 'Verstappen', 'Leclerc']\n", + "Print every other driver ['Leclerc', 'Hamilton', 'Alonso', 'Gasly', 'Schumacher']\n", + "['Leclerc', 'Verstappen', 'Hamilton', 'Norris', 'Alonso', 'Bottas', 'Gasly', 'Vettel', 'Schumacher', 'Albon']\n", + "Result ['Hamilton', 'Alonso', 'Gasly', 'Schumacher']\n" + ] + } + ], "source": [ "# List slicing - similar to what we have seen for strings, as strings are lists of characters.\n", "# list[m:n:p], where p is an optional parameter for step.\n", @@ -116,12 +158,13 @@ "print(\"Ignore the last five drivers {}\".format(f1_drivers[:-5]))\n", "print(\"Revert the order {}\".format(f1_drivers[::-1]))\n", "print(\"Print every other driver {}\".format(f1_drivers[::2]))\n", + "print(f1_drivers)\n", "\n", "# Can you figure out the slicing used to get the following result?\n", "# Result ['Hamilton', 'Alonso', 'Gasly', 'Schumacher']\n", "# hint: use the step parameter\n", "\n", - "print(\"Result {}\".format(...))" + "print(\"Result {}\".format(f1_drivers[2:-1:2]))" ] }, { @@ -133,7 +176,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, "outputs": [], "source": [ @@ -143,7 +186,7 @@ "# add all the teams to the list using the preferred method\n", "# the 2022 F1 teams are (for accurate results use this order!)\n", "# Ferrari, Redbull, Mercedes, McLaren, Alpine, Alfa Romeo, Alpha Tauri, Aston Martin, Haas, Williams\n", - "..." + "f1_teams.extend([\"Ferrari\", 'Redbull', 'Mercedes', 'McLaren', \"Alpine\", 'Alfa Romeo', 'Alpha Tauri', 'Aston Martin', 'Haas', 'Williams'])" ] }, { @@ -157,7 +200,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -176,9 +219,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " TEAM_DRIVER TEAM_NAME\n", + "0 Leclerc Ferrari\n", + "1 Verstappen Redbull\n", + "2 Hamilton Mercedes\n", + "3 Norris McLaren\n", + "4 Alonso Alpine\n", + "5 Bottas Alfa Romeo\n", + "6 Gasly Alpha Tauri\n", + "7 Vettel Aston Martin\n", + "8 Schumacher Haas\n", + "9 Albon Williams\n" + ] + } + ], "source": [ "# create an empty dataframe, with columns for driver and team\n", "df = pd.DataFrame(columns=['TEAM_DRIVER', 'TEAM_NAME'])\n", @@ -192,9 +253,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[True, 1, 1.5, 'abc', [1, 2, 3]]\n" + ] + } + ], "source": [ "# lists also accept items of different data types\n", "\n", @@ -251,9 +320,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "x1 != x2 --> {'abracadabra'} != {'c', 'r', 'b', 'd', 'a'}\n", + "\n", + "\n" + ] + } + ], "source": [ "x1 = {'abracadabra'}\n", "x2 = set('abracadabra')\n", @@ -284,9 +363,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Ferrari\n", + "\n" + ] + } + ], "source": [ "a_tuple = ('Leclerc', 'Ferrari')\n", "print(a_tuple[1])\n", @@ -296,9 +384,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('Leclerc',)\n", + "('Ferrari', 'Leclerc')\n" + ] + } + ], "source": [ "# similar with lists, you can slice tuples, too!\n", "print(a_tuple[:-1])\n", @@ -309,9 +406,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "TypeError", + "evalue": "'tuple' object does not support item assignment", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mc:\\python\\github\\bootcamp2022\\2022\\python_workshop\\notebooks\\03a_lists_and_tuples.ipynb Cell 20\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[39m# but cannot assign new values to the items\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m a_tuple[\u001b[39m0\u001b[39m] \u001b[39m=\u001b[39m \u001b[39m'\u001b[39m\u001b[39mVerstappen\u001b[39m\u001b[39m'\u001b[39m\n", + "\u001b[1;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" + ] + } + ], "source": [ "# but cannot assign new values to the items\n", "a_tuple[0] = 'Verstappen'\n", @@ -328,9 +437,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "TEAM(TEAM_DRIVER='Leclerc', TEAM_NAME='Ferrari')\n", + "TEAM(TEAM_DRIVER='Verstappen', TEAM_NAME='Redbull')\n", + "TEAM(TEAM_DRIVER='Hamilton', TEAM_NAME='Mercedes')\n", + "TEAM(TEAM_DRIVER='Norris', TEAM_NAME='McLaren')\n", + "TEAM(TEAM_DRIVER='Alonso', TEAM_NAME='Alpine')\n", + "TEAM(TEAM_DRIVER='Bottas', TEAM_NAME='Alfa Romeo')\n", + "TEAM(TEAM_DRIVER='Gasly', TEAM_NAME='Alpha Tauri')\n", + "TEAM(TEAM_DRIVER='Vettel', TEAM_NAME='Aston Martin')\n", + "TEAM(TEAM_DRIVER='Schumacher', TEAM_NAME='Haas')\n", + "TEAM(TEAM_DRIVER='Albon', TEAM_NAME='Williams')\n" + ] + } + ], "source": [ "f1_tuples = df.itertuples(index=False, name=\"TEAM\")\n", "\n", @@ -338,6 +466,11 @@ "\n", "print(f1_tuples)\n", "\n", + "# t = next(f1_tuples, False)\n", + "# while t:\n", + "# print(t) \n", + "# t = next(f1_tuples, False)\n", + "\n", "# in order to get the values, we must call the next() method on the iterator\n", "while (t := next(f1_tuples, False)):\n", " print(t)" @@ -345,22 +478,42 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('Leclerc', 'Ferrari'), ('Verstappen', 'Redbull'), ('Hamilton', 'Mercedes'), ('Norris', 'McLaren'), ('Alonso', 'Alpine'), ('Bottas', 'Alfa Romeo'), ('Gasly', 'Alpha Tauri'), ('Vettel', 'Aston Martin'), ('Schumacher', 'Haas'), ('Albon', 'Williams')]\n" + ] + } + ], "source": [ "# what if I want to store these tuples somewhere?\n", "# typles no longer named for this example\n", "\n", "competition_teams = list(df.itertuples(index=False, name=None))\n", - "print(competition_teams)" + "print(competition_teams)\n", + "driver_numbers = [16, 1, 44, 4, 14, 77, 10, 5, 47, 23]\n", + "\n", + " \n", + " " ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 44, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('Leclerc', 'Ferrari', 0), ('Verstappen', 'Redbull', 1), ('Hamilton', 'Mercedes', 2), ('Norris', 'McLaren', 3), ('Alonso', 'Alpine', 4), ('Bottas', 'Alfa Romeo', 5), ('Gasly', 'Alpha Tauri', 6), ('Vettel', 'Aston Martin', 7), ('Schumacher', 'Haas', 8), ('Albon', 'Williams', 9)]\n" + ] + } + ], "source": [ "# let's try to add the driver number for each tuple, by unpacking\n", "\n", @@ -371,13 +524,14 @@ "# for each team in the list\n", "for team in competition_teams:\n", " # get the index of the tuple\n", - " index_in_list = ...\n", - " # using the index, get the driver number\n", - " driver_number = ...\n", - " # create a new tuple by unpacking the team tuple and adding the driver number\n", - " new_tuple = ...\n", - " # add the new tuple to the updated list\n", - " updated_list...\n", + " # print(team)\n", + " index_in_list = competition_teams.index(team)\n", + " # # using the index, get the driver number\n", + " driver_number = index_in_list \n", + " # # create a new tuple by unpacking the team tuple and adding the driver number\n", + " new_tuple = (*team, driver_number)\n", + " # # add the new tuple to the updated list\n", + " updated_list.append(new_tuple)\n", "\n", "# update the list\n", "competition_teams = updated_list\n", @@ -444,7 +598,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3.10.5 64-bit", + "display_name": "Python 3.9.12 ('base')", "language": "python", "name": "python3" }, @@ -458,12 +612,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.9.12" }, "orig_nbformat": 4, "vscode": { "interpreter": { - "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" + "hash": "d31b83e9610685068a0fe73b54051d44dc1110027bef1c52e64b671e72faac45" } } }, diff --git a/2022/python_workshop/notebooks/03b_dictionaries.ipynb b/2022/python_workshop/notebooks/03b_dictionaries.ipynb index e9fa900..78c68f0 100644 --- a/2022/python_workshop/notebooks/03b_dictionaries.ipynb +++ b/2022/python_workshop/notebooks/03b_dictionaries.ipynb @@ -29,7 +29,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -82,9 +82,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "dict" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "type(f1_teams)" ] @@ -103,18 +114,43 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "retired\n", + "dict_items([('Sainz', 'Ferrari'), ('Leclerc', 'Ferrari'), ('Ricciardo', 'McLaren'), ('Russel', 'Mercedes'), ('Norris', 'McLaren'), ('Hamilton', 'Mercedes'), ('Perez', 'Redbull'), ('Verstappen', 'Redbull')])\n" + ] + } + ], "source": [ - "f1_teams['Raikkonen']" + "# f1_teams['Raikkonen']\n", + "print(f1_teams.get('Raikkonen', 'retired'))\n", + "print(f1_teams.items())" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Added Kimi! {'Sainz': 'Ferrari', 'Leclerc': 'Ferrari', 'Ricciardo': 'McLaren', 'Russel': 'Mercedes', 'Norris': 'McLaren', 'Hamilton': 'Mercedes', 'Perez': 'Redbull', 'Verstappen': 'Redbull', 'Raikkonen': 'Ferrari'} \n", + "\n", + "Kimi has moved! {'Sainz': 'Ferrari', 'Leclerc': 'Ferrari', 'Ricciardo': 'McLaren', 'Russel': 'Mercedes', 'Norris': 'McLaren', 'Hamilton': 'Mercedes', 'Perez': 'Redbull', 'Verstappen': 'Redbull', 'Raikkonen': 'Alfa Romeo'} \n", + "\n", + "Kimi has retired! {'Sainz': 'Ferrari', 'Leclerc': 'Ferrari', 'Ricciardo': 'McLaren', 'Russel': 'Mercedes', 'Norris': 'McLaren', 'Hamilton': 'Mercedes', 'Perez': 'Redbull', 'Verstappen': 'Redbull'} \n", + "\n", + "Different kind of retirement {'Sainz': 'Ferrari', 'Leclerc': 'Ferrari', 'Verstappen': 'Redbull', 'Ricciardo': 'McLaren', 'Russel': 'Mercedes', 'Norris': 'McLaren', 'Hamilton': 'Mercedes', 'Perez': 'Redbull'}\n" + ] + } + ], "source": [ "# add a new entry\n", "f1_teams['Raikkonen'] = 'Ferrari'\n", @@ -148,9 +184,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{: 1, : 2, : 3}\n" + ] + }, + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "d = {int: 1, float: 2, bool: 3}\n", "print(d)\n", @@ -172,9 +226,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "TypeError", + "evalue": "unhashable type: 'list'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mc:\\python\\github\\bootcamp2022\\2022\\python_workshop\\notebooks\\03b_dictionaries.ipynb Cell 11\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[39m# let's find out!\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m d \u001b[39m=\u001b[39m {\n\u001b[0;32m 3\u001b[0m [\u001b[39m1\u001b[39m, \u001b[39m1\u001b[39m]: \u001b[39m'\u001b[39m\u001b[39ma\u001b[39m\u001b[39m'\u001b[39m\n\u001b[0;32m 4\u001b[0m }\n", + "\u001b[1;31mTypeError\u001b[0m: unhashable type: 'list'" + ] + } + ], "source": [ "# let's find out!\n", "d = {\n", @@ -199,9 +265,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "-8752291807205467963\n" + ] + }, + { + "ename": "TypeError", + "evalue": "unhashable type: 'list'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mc:\\python\\github\\bootcamp2022\\2022\\python_workshop\\notebooks\\03b_dictionaries.ipynb Cell 13\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39mhash\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39mhello\u001b[39m\u001b[39m\"\u001b[39m))\n\u001b[1;32m----> 2\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39mhash\u001b[39;49m([\u001b[39m1\u001b[39;49m, \u001b[39m2\u001b[39;49m]))\n", + "\u001b[1;31mTypeError\u001b[0m: unhashable type: 'list'" + ] + } + ], "source": [ "print(hash(\"hello\"))\n", "print(hash([1, 2]))" @@ -256,9 +341,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Leclerc': 'Ferrari', 'Verstappen': 'Redbull', 'Hamilton': 'Mercedes', 'Norris': 'McLaren', 'Alonso': 'Alpine', 'Bottas': 'Alfa Romeo', 'Gasly': 'AlphaTauri', 'Vettel': 'Aston Martin', 'Schumacher': 'Haas', 'Albon': 'Williams'}\n" + ] + } + ], "source": [ "drivers = ['Leclerc', 'Verstappen', 'Hamilton', 'Norris', 'Alonso', 'Bottas', 'Gasly', 'Vettel', 'Schumacher', 'Albon']\n", "teams = ['Ferrari', 'Redbull', 'Mercedes', 'McLaren', 'Alpine', 'Alfa Romeo', 'AlphaTauri', 'Aston Martin', 'Haas', 'Williams']\n", @@ -277,9 +370,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Leclerc': 'Ferrari', 'Verstappen': 'Redbull', 'Hamilton': 'Mercedes', 'Norris': 'McLaren', 'Alonso': 'Alpine', 'Bottas': 'Alfa Romeo', 'Gasly': 'AlphaTauri', 'Vettel': 'Aston Martin', 'Schumacher': 'Haas', 'Albon': 'Williams'}\n" + ] + } + ], "source": [ "new_dict = {\n", " driver: team for driver, team in zip(drivers, teams)\n", @@ -296,31 +397,68 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Sainz': 'Ferrari', 'Leclerc': 'Ferrari', 'Verstappen': 'Redbull', 'Ricciardo': 'McLaren', 'Russel': 'Mercedes', 'Norris': 'McLaren', 'Hamilton': 'Mercedes', 'Perez': 'Redbull', 'Alonso': 'Alpine', 'Ocon': 'Alpine', 'Zhou': 'Alfa Romeo', 'Bottas': 'Alfa Romeo', 'Schumacher': 'Haas', 'Magnussen': 'Haas', 'Tsunoda': 'AlphaTauri', 'Gasly': 'AlphaTauri', 'Vettel': 'Aston Martin', 'Stroll': 'Aston Martin', 'Albon': 'Williams', 'Latifi': 'Williams'}\n" + ] + } + ], "source": [ - "# combine the two dictionaries f1_teams and f1_more_teams\n" + "# combine the two dictionaries f1_teams and f1_more_teams\n", + "f1_teams.update(f1_more_teams)\n", + "print(f1_teams)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['Ricciardo', 'Norris']" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# iterate through f1_teams and print only the McLaren drivers (just the drivers)\n" + "# iterate through f1_teams and print only the McLaren drivers (just the drivers)\n", + "[driver for driver, car in f1_teams.items() if car == \"McLaren\"]\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 58, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{16: ('Sainz', 'Ferrari'), 55: ('Leclerc', 'Ferrari'), 1: ('Verstappen', 'Redbull'), 11: ('Ricciardo', 'McLaren'), 44: ('Russel', 'Mercedes'), 63: ('Norris', 'McLaren'), 4: ('Hamilton', 'Mercedes'), 3: ('Perez', 'Redbull'), 14: ('Alonso', 'Alpine'), 31: ('Ocon', 'Alpine'), 24: ('Zhou', 'Alfa Romeo'), 77: ('Bottas', 'Alfa Romeo'), 47: ('Schumacher', 'Haas'), 20: ('Magnussen', 'Haas'), 22: ('Tsunoda', 'AlphaTauri'), 10: ('Gasly', 'AlphaTauri'), 5: ('Vettel', 'Aston Martin'), 18: ('Stroll', 'Aston Martin'), 23: ('Albon', 'Williams'), 6: ('Latifi', 'Williams')} \n", + "\n", + "\n", + "{'Ferrari': (55, 'Leclerc'), 'Redbull': (3, 'Perez'), 'McLaren': (63, 'Norris'), 'Mercedes': (4, 'Hamilton'), 'Alpine': (31, 'Ocon'), 'Alfa Romeo': (77, 'Bottas'), 'Haas': (20, 'Magnussen'), 'AlphaTauri': (10, 'Gasly'), 'Aston Martin': (18, 'Stroll'), 'Williams': (6, 'Latifi')}\n" + ] + } + ], "source": [ "# given the list of driver numbers, assign each driver their corresponding number\n", "f1_driver_numbers = [16, 55, 1, 11, 44, 63, 4, 3, 14, 31, 24, 77, 47, 20, 22, 10, 5, 18, 23, 6]\n", + "tuple_lst = ()\n", "\n", + "new_dict_1 = {numb: team for numb, team in zip(f1_driver_numbers, f1_teams.items())}\n", + "print(new_dict_1, '\\n\\n')\n", + "print({key: team_numb for key, team_numb in zip(f1_teams.values(), zip(f1_driver_numbers, f1_teams.keys()))})\n", "# expected result:\n", "# {16: ('Leclerc', 'Ferrari'),\n", "# 55: ('Sainz', 'Ferrari'),\n", @@ -357,9 +495,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a: {0: [1, 2, 3, [4]]} \n", + "b: {0: [1, 2, 3, [4]]}\n" + ] + } + ], "source": [ "# shallow copy\n", "a = {0: [1, 2, 3]}\n", @@ -371,9 +518,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a: {0: [1, 2, 3, [4]]} \n", + "c: {0: [1, 2, 3, [4]]} \n", + "d: {0: [1, 2, 3, [4]]}\n" + ] + } + ], "source": [ "# deep copy\n", "import copy\n", @@ -387,9 +544,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "a: {0: [1, 2, 3, [4], 5]} \n", + "c: {0: [1, 2, 3, [4]]} \n", + "d: {0: [1, 2, 3, [4], 5]}\n" + ] + } + ], "source": [ "a[0].append(5)\n", "print(\"a:\", a, \"\\nc:\", c, \"\\nd:\", d)" @@ -405,9 +572,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'pepper': 0.2, 'onion': 0.55, 'apple': 0.4, 'orange': 0.35}\n", + "pepper -> 0.2\n", + "onion -> 0.55\n", + "apple -> 0.4\n", + "orange -> 0.35\n" + ] + } + ], "source": [ "fruit_prices = {'apple': 0.40, 'orange': 0.35}\n", "vegetable_prices = {'pepper': 0.20, 'onion': 0.55}\n", @@ -428,9 +607,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "('apple', 0.4)\n", + "('orange', 0.35)\n", + "('banana', 0.25)\n", + "('pepper', 0.2)\n", + "('onion', 0.55)\n", + "('tomato', 0.42)\n" + ] + } + ], "source": [ "from itertools import chain\n", "\n", @@ -443,7 +635,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3.8.0 64-bit", + "display_name": "Python 3.9.12 ('base')", "language": "python", "name": "python3" }, @@ -457,12 +649,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.0" + "version": "3.9.12" }, "orig_nbformat": 4, "vscode": { "interpreter": { - "hash": "83bca74902d8d95dc0f4d5ef6f135f4aa78da41c0c8e870768b6659e568e6a46" + "hash": "d31b83e9610685068a0fe73b54051d44dc1110027bef1c52e64b671e72faac45" } } }, diff --git a/2022/python_workshop/notebooks/06_generators.ipynb b/2022/python_workshop/notebooks/06_generators.ipynb index 359ac7b..54e953e 100644 --- a/2022/python_workshop/notebooks/06_generators.ipynb +++ b/2022/python_workshop/notebooks/06_generators.ipynb @@ -34,9 +34,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Row count is 5001\n" + ] + } + ], "source": [ "def csv_reader(file_name):\n", " file = open(file_name)\n", @@ -48,7 +56,8 @@ "row_count = 0\n", "\n", "# hint: we need to iterate through csv_content and increment the row count; how can we do that?\n", - "# ...\n", + "for _ in csv_content:\n", + " row_count += 1\n", "\n", "print(f\"Row count is {row_count}\")\n" ] @@ -69,9 +78,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "uuid,date,name,departure,arrival,ticket_price\n", + "\n", + "Row count is 5001\n" + ] + } + ], "source": [ "def csv_reader(file_name):\n", " for row in open(file_name, \"r\"):\n", @@ -81,7 +100,9 @@ "row_count = 0\n", "\n", "# hint: we need to iterate through csv_content and increment the row count; how can we do that?\n", - "# ...\n", + "while (t:= next(csv_content, False)):\n", + " row_count += 1\n", + "\n", "\n", "print(f\"Row count is {row_count}\")" ] @@ -111,9 +132,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "[0, 1, 2, 3, 4]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "a = range(5)\n", "list(a)" @@ -128,7 +160,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -154,14 +186,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0\n", + "1\n", + "2\n", + "3\n", + "4\n", + "5\n", + "6\n", + "7\n" + ] + } + ], "source": [ "gen = infinite_sequence()\n", "\n", "print(next(gen))\n", "print(next(gen))\n", + "print(next(gen))\n", + "print(next(gen))\n", + "print(next(gen))\n", + "print(next(gen))\n", + "print(next(gen))\n", "print(next(gen))" ] }, @@ -189,15 +241,48 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[0, 1, 4, 9, 16]\n", + " at 0x000002AD995823C0>\n", + "0\n", + "1\n", + "4\n", + "9\n", + "16\n" + ] + }, + { + "ename": "StopIteration", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mStopIteration\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mc:\\python\\github\\bootcamp2022\\2022\\python_workshop\\notebooks\\06_generators.ipynb Cell 14\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39mnext\u001b[39m(generator_expression))\n\u001b[0;32m 10\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39mnext\u001b[39m(generator_expression))\n\u001b[1;32m---> 11\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39mnext\u001b[39;49m(generator_expression))\n", + "\u001b[1;31mStopIteration\u001b[0m: " + ] + } + ], "source": [ "list_comprehension = [num**2 for num in range(5)]\n", "generator_expression = (num**2 for num in range(5))\n", "\n", "print(list_comprehension)\n", - "print(generator_expression)" + "print(generator_expression)\n", + "print(next(generator_expression))\n", + "print(next(generator_expression))\n", + "print(next(generator_expression))\n", + "print(next(generator_expression))\n", + "print(next(generator_expression))\n", + "print(next(generator_expression))\n", + "\n", + "\n" ] }, { @@ -285,117 +370,66 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 72, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " at 0x000002AD995862E0>\n", + "['uuid', 'date', 'name', 'departure', 'arrival', 'ticket_price']\n", + "The average ticket price: $44.714285714285715\n" + ] + } + ], "source": [ "# we will use mean on order to get the average price\n", "from statistics import mean\n", "\n", + "airport_log = open('./resources/airport_log.csv', 'r')\n", "# generate an iterator for the lines in the file\n", - "lines = ...\n", + "lines = (i for i in airport_log)\n", "\n", "# split each line into a list and put the values into an iteratos\n", - "list_line = ...\n", - "\n", + "list_line = (i.rstrip().split(',') for i in lines)\n", + "print(list_line)\n", "# use the next() to store the column names into a list\n", - "cols = ...\n", + "cols = next(list_line)\n", + "print(cols)\n", "\n", "# create dictionaries and unite them with zip()\n", + "\n", + "# while (l:= next(list_line, False)):\n", + "# lst_of_values.append(l)\n", + "\n", "# the keys are the column names stored in cols\n", "# the values are the rows is list form, list_line\n", - "airport_logs_dicts = ...\n", + "airport_logs_dicts = (dict(zip(cols, data)) for data in list_line)\n", "\n", + "# while (t:= next(airport_logs_dicts), False):\n", + "# print(t)\n", "# filter the rows\n", "# we are interested in tickets from CLJ to AMS\n", "clj_ams_prices = (\n", " int(airport_logs_dict[\"ticket_price\"])\n", " for airport_logs_dict in airport_logs_dicts\n", - " if ( ... )\n", + " if ( airport_logs_dict['departure'] == 'CLJ' and airport_logs_dict['arrival'] == 'AMS' )\n", ")\n", "\n", "# for testing purposes - check all the prices - comment this after testing\n", - "while (i := next(clj_ams_prices, False)):\n", - " print(i)\n", + "# while (i := next(clj_ams_prices, False)):\n", + "# print(i)\n", "\n", "# uncomment this after checking all the prices\n", - "# avg_ticket_price = mean(clj_ams_prices)\n", - "# print(f\"The average ticket price: ${avg_ticket_price}\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Generator vs List vs Tuple" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "\n", - "a_list = []\n", - "for i in range(1, 1):\n", - " a_list.append(i)\n", - "\n", - "tup = tuple(a_list)\n", - "gen = (x for x in a_list)\n", - "\n", - "print(type(a_list))\n", - "print(type(tup))\n", - "print(type(gen))\n", - "\n", - "print('size of list is', sys.getsizeof(a_list))\n", - "print('size of tup is', sys.getsizeof(tup))\n", - "print('size of gen is', sys.getsizeof(gen))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "a_list = []\n", - "for i in range(1, 3):\n", - " a_list.append(i)\n", - "\n", - "tup = tuple(a_list)\n", - "gen = (x for x in a_list)\n", - "\n", - "print('gen')\n", - "for x in gen:\n", - " print(x)\n", - "\n", - "print('tup')\n", - "for x in tup:\n", - " print(x)\n", - "\n", - "print('list')\n", - "for x in a_list:\n", - " print(x)\n", - "\n", - "print('gen')\n", - "for x in gen:\n", - " print(x)\n", - "\n", - "print('tup')\n", - "for x in tup:\n", - " print(x)\n", - "\n", - "print('list')\n", - "for x in a_list:\n", - " print(x)" + "avg_ticket_price = mean(clj_ams_prices)\n", + "print(f\"The average ticket price: ${avg_ticket_price}\")\n" ] } ], "metadata": { "kernelspec": { - "display_name": "Python 3.10.5 64-bit", + "display_name": "Python 3.9.12 ('base')", "language": "python", "name": "python3" }, @@ -409,12 +443,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.9.12" }, "orig_nbformat": 4, "vscode": { "interpreter": { - "hash": "98590ff4fe04c8543246b2a01debd3de3c5ca9b666f43f1fa87d5110c692004c" + "hash": "d31b83e9610685068a0fe73b54051d44dc1110027bef1c52e64b671e72faac45" } } }, diff --git a/2022/python_workshop/notebooks/07_decorators.ipynb b/2022/python_workshop/notebooks/07_decorators.ipynb index 663c8f6..ee7b0cf 100644 --- a/2022/python_workshop/notebooks/07_decorators.ipynb +++ b/2022/python_workshop/notebooks/07_decorators.ipynb @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -53,9 +53,17 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'Sup, my old friend\n" + ] + } + ], "source": [ "say_hello_to_my_little_friend(greeter)" ] @@ -79,9 +87,24 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Verse: If I was an astronaut, I'd be floating in mid-air\n", + "Verse: And a broken heart would just belong\n", + "Bridge: Gravity keeps pulling me down\n", + "Bridge: As long as you're on the ground, I'll stick around\n", + "Chorus: I'm up in space, man\n", + "Chorus: Up in space, man\n", + "Outro: I've searched around the universe\n", + "Outro: Been down some black holes\n" + ] + } + ], "source": [ "def song():\n", " print(\"Verse: If I was an astronaut, I'd be floating in mid-air\")\n", @@ -103,6 +126,9 @@ " chorus()\n", " outro()\n", "\n", + "song()\n", + "\n", + "\n", "# what happens when you call the song() function?\n", "# does the order in which the inner functions are defined matter?" ] @@ -119,7 +145,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -144,7 +170,7 @@ " elif part == \"outro\":\n", " return outro\n", " else:\n", - " return None" + " return None\n" ] }, { @@ -156,9 +182,19 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Bridge: Gravity keeps pulling me down\n", + "Bridge: As long as you're on the ground, I'll stick around\n" + ] + } + ], "source": [ "bridge = song(\"bridge\")\n", "\n", @@ -170,7 +206,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ @@ -180,12 +216,21 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Bridge: Gravity keeps pulling me down\n", + "Bridge: As long as you're on the ground, I'll stick around\n" + ] + } + ], "source": [ "# does the bridge() function still work?\n", - "bridge()" + "bridge()\n" ] }, { @@ -203,7 +248,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ @@ -235,9 +280,19 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Something happening before the greeting.\n", + "Bună ziua.\n", + "Something happening after the greeting.\n" + ] + } + ], "source": [ "decorated_greeter()" ] @@ -257,16 +312,26 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Something happening before the greeting.\n", + "on lunch break, bye\n", + "Something happening after the greeting.\n" + ] + } + ], "source": [ "from datetime import datetime\n", "\n", "def greeter_decorator(func):\n", " def wrapper():\n", " print(\"Something happening before the greeting.\")\n", - " if datetime.now().hour == 13:\n", + " if datetime.now().hour == 12:\n", " print(\"on lunch break, bye\")\n", " else:\n", " func()\n", @@ -295,7 +360,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -306,9 +371,19 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Something happening before the greeting.\n", + "on lunch break, bye\n", + "Something happening after the greeting.\n" + ] + } + ], "source": [ "# recreate the anon_greeter(), this time decorated\n", "\n", @@ -334,7 +409,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, "outputs": [], "source": [ @@ -346,11 +421,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Something happening before the greeting.\n", + "on lunch break, bye\n", + "Something happening after the greeting.\n" + ] + } + ], "source": [ - "greeter(\"my old friend\")" + "greeter('my old friend')" ] }, { @@ -370,7 +455,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, "outputs": [], "source": [ @@ -387,7 +472,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": {}, "outputs": [], "source": [ @@ -399,9 +484,19 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Something happening before the greeting.\n", + "Bună ziua, my old friend\n", + "Something happening after the greeting.\n" + ] + } + ], "source": [ "greeter(\"my old friend\")" ] @@ -417,13 +512,24 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "I like repeating myself.\n", + "I like repeating myself.\n", + "None\n" + ] + } + ], "source": [ "## call the function twice\n", "from resources.methods.decorators import do_twice\n", "\n", + "@do_twice\n", "def repeat_after_me():\n", " print(\"I like repeating myself.\")\n", "\n", @@ -433,13 +539,22 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Finished 'waste_some_time' in 0.9532 seconds\n" + ] + } + ], "source": [ "## use a timer on this function\n", - "from ... import ...\n", + "from resources.methods.decorators import timer\n", "\n", + "@timer\n", "def waste_some_time(num_times):\n", " for _ in range(num_times):\n", " sum([i**2 for i in range(10000)])\n", @@ -449,15 +564,25 @@ }, { "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Finished 'waste_some_time' in 0.9941 seconds\n" + ] + } + ], "source": [ "## use another decorator to slow down the above function\n", "## can you use multiple decorators on the same function?\n", "## does the order of the decorators matter?\n", - "from ... import ....\n", + "from resources.methods.decorators import slow_down_1sec, timer\n", "\n", + "@slow_down_1sec\n", + "@timer\n", "def waste_some_time(num_times):\n", " for _ in range(num_times):\n", " sum([i**2 for i in range(10000)])\n", @@ -477,7 +602,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3.10.5 64-bit", + "display_name": "Python 3.9.12 ('base')", "language": "python", "name": "python3" }, @@ -491,12 +616,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.9.12" }, "orig_nbformat": 4, "vscode": { "interpreter": { - "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" + "hash": "d31b83e9610685068a0fe73b54051d44dc1110027bef1c52e64b671e72faac45" } } }, diff --git a/2022/python_workshop/notebooks/08_pandas.ipynb b/2022/python_workshop/notebooks/08_pandas.ipynb index b2da280..7e06623 100644 --- a/2022/python_workshop/notebooks/08_pandas.ipynb +++ b/2022/python_workshop/notebooks/08_pandas.ipynb @@ -29,9 +29,17 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], "source": [ "# first, install the requirements\n", "%pip install -r ../requirements.txt >> results/requirements_log.txt" @@ -39,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": {}, "outputs": [], "source": [ @@ -51,15 +59,201 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
seasonroundurlraceNameCircuitdatetimeFirstPracticeSecondPracticeThirdPracticeQualifyingSprint
020221http://en.wikipedia.org/wiki/2022_Bahrain_Gran...Bahrain Grand Prix{'circuitId': 'bahrain', 'url': 'http://en.wik...2022-03-2015:00:00Z{'date': '2022-03-18', 'time': '12:00:00Z'}{'date': '2022-03-18', 'time': '15:00:00Z'}{'date': '2022-03-19', 'time': '12:00:00Z'}{'date': '2022-03-19', 'time': '15:00:00Z'}NaN
120222http://en.wikipedia.org/wiki/2022_Saudi_Arabia...Saudi Arabian Grand Prix{'circuitId': 'jeddah', 'url': 'http://en.wiki...2022-03-2717:00:00Z{'date': '2022-03-25', 'time': '14:00:00Z'}{'date': '2022-03-25', 'time': '17:00:00Z'}{'date': '2022-03-26', 'time': '14:00:00Z'}{'date': '2022-03-26', 'time': '17:00:00Z'}NaN
220223http://en.wikipedia.org/wiki/2022_Australian_G...Australian Grand Prix{'circuitId': 'albert_park', 'url': 'http://en...2022-04-1005:00:00Z{'date': '2022-04-08', 'time': '03:00:00Z'}{'date': '2022-04-08', 'time': '06:00:00Z'}{'date': '2022-04-09', 'time': '03:00:00Z'}{'date': '2022-04-09', 'time': '06:00:00Z'}NaN
320224http://en.wikipedia.org/wiki/2022_Emilia_Romag...Emilia Romagna Grand Prix{'circuitId': 'imola', 'url': 'http://en.wikip...2022-04-2413:00:00Z{'date': '2022-04-22', 'time': '11:30:00Z'}{'date': '2022-04-23', 'time': '10:30:00Z'}NaN{'date': '2022-04-22', 'time': '15:00:00Z'}{'date': '2022-04-23', 'time': '14:30:00Z'}
420225http://en.wikipedia.org/wiki/2022_Miami_Grand_...Miami Grand Prix{'circuitId': 'miami', 'url': 'http://en.wikip...2022-05-0819:30:00Z{'date': '2022-05-06', 'time': '18:30:00Z'}{'date': '2022-05-06', 'time': '21:30:00Z'}{'date': '2022-05-07', 'time': '17:00:00Z'}{'date': '2022-05-07', 'time': '20:00:00Z'}NaN
\n", + "
" + ], + "text/plain": [ + " season round url \\\n", + "0 2022 1 http://en.wikipedia.org/wiki/2022_Bahrain_Gran... \n", + "1 2022 2 http://en.wikipedia.org/wiki/2022_Saudi_Arabia... \n", + "2 2022 3 http://en.wikipedia.org/wiki/2022_Australian_G... \n", + "3 2022 4 http://en.wikipedia.org/wiki/2022_Emilia_Romag... \n", + "4 2022 5 http://en.wikipedia.org/wiki/2022_Miami_Grand_... \n", + "\n", + " raceName \\\n", + "0 Bahrain Grand Prix \n", + "1 Saudi Arabian Grand Prix \n", + "2 Australian Grand Prix \n", + "3 Emilia Romagna Grand Prix \n", + "4 Miami Grand Prix \n", + "\n", + " Circuit date time \\\n", + "0 {'circuitId': 'bahrain', 'url': 'http://en.wik... 2022-03-20 15:00:00Z \n", + "1 {'circuitId': 'jeddah', 'url': 'http://en.wiki... 2022-03-27 17:00:00Z \n", + "2 {'circuitId': 'albert_park', 'url': 'http://en... 2022-04-10 05:00:00Z \n", + "3 {'circuitId': 'imola', 'url': 'http://en.wikip... 2022-04-24 13:00:00Z \n", + "4 {'circuitId': 'miami', 'url': 'http://en.wikip... 2022-05-08 19:30:00Z \n", + "\n", + " FirstPractice \\\n", + "0 {'date': '2022-03-18', 'time': '12:00:00Z'} \n", + "1 {'date': '2022-03-25', 'time': '14:00:00Z'} \n", + "2 {'date': '2022-04-08', 'time': '03:00:00Z'} \n", + "3 {'date': '2022-04-22', 'time': '11:30:00Z'} \n", + "4 {'date': '2022-05-06', 'time': '18:30:00Z'} \n", + "\n", + " SecondPractice \\\n", + "0 {'date': '2022-03-18', 'time': '15:00:00Z'} \n", + "1 {'date': '2022-03-25', 'time': '17:00:00Z'} \n", + "2 {'date': '2022-04-08', 'time': '06:00:00Z'} \n", + "3 {'date': '2022-04-23', 'time': '10:30:00Z'} \n", + "4 {'date': '2022-05-06', 'time': '21:30:00Z'} \n", + "\n", + " ThirdPractice \\\n", + "0 {'date': '2022-03-19', 'time': '12:00:00Z'} \n", + "1 {'date': '2022-03-26', 'time': '14:00:00Z'} \n", + "2 {'date': '2022-04-09', 'time': '03:00:00Z'} \n", + "3 NaN \n", + "4 {'date': '2022-05-07', 'time': '17:00:00Z'} \n", + "\n", + " Qualifying \\\n", + "0 {'date': '2022-03-19', 'time': '15:00:00Z'} \n", + "1 {'date': '2022-03-26', 'time': '17:00:00Z'} \n", + "2 {'date': '2022-04-09', 'time': '06:00:00Z'} \n", + "3 {'date': '2022-04-22', 'time': '15:00:00Z'} \n", + "4 {'date': '2022-05-07', 'time': '20:00:00Z'} \n", + "\n", + " Sprint \n", + "0 NaN \n", + "1 NaN \n", + "2 NaN \n", + "3 {'date': '2022-04-23', 'time': '14:30:00Z'} \n", + "4 NaN " + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# analyse a sample\n", "\n", "url = 'https://ergast.com/api/f1/2022.json'\n", "r = requests.get(url)\n", "j = r.json()\n", + "print(r)\n", "\n", "df = pd.DataFrame(j['MRData']['RaceTable']['Races'])\n", "\n", @@ -68,9 +262,442 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
seasonroundcircuit_idraceNameurlLATLONGlocalitycountrydatetime
020221bahrainBahrain Grand Prixhttp://en.wikipedia.org/wiki/2022_Bahrain_Gran...26.032550.51060SakhirBahrain2022-03-2015:00:00Z
120222jeddahSaudi Arabian Grand Prixhttp://en.wikipedia.org/wiki/2022_Saudi_Arabia...21.631939.10440JeddahSaudi Arabia2022-03-2717:00:00Z
220223albert_parkAustralian Grand Prixhttp://en.wikipedia.org/wiki/2022_Australian_G...-37.8497144.96800MelbourneAustralia2022-04-1005:00:00Z
320224imolaEmilia Romagna Grand Prixhttp://en.wikipedia.org/wiki/2022_Emilia_Romag...44.343911.71670ImolaItaly2022-04-2413:00:00Z
420225miamiMiami Grand Prixhttp://en.wikipedia.org/wiki/2022_Miami_Grand_...25.9581-80.23890MiamiUSA2022-05-0819:30:00Z
520226catalunyaSpanish Grand Prixhttp://en.wikipedia.org/wiki/2022_Spanish_Gran...41.57002.26111MontmelóSpain2022-05-2213:00:00Z
620227monacoMonaco Grand Prixhttp://en.wikipedia.org/wiki/2022_Monaco_Grand...43.73477.42056Monte-CarloMonaco2022-05-2913:00:00Z
720228bakuAzerbaijan Grand Prixhttp://en.wikipedia.org/wiki/2022_Azerbaijan_G...40.372549.85330BakuAzerbaijan2022-06-1211:00:00Z
820229villeneuveCanadian Grand Prixhttp://en.wikipedia.org/wiki/2022_Canadian_Gra...45.5000-73.52280MontrealCanada2022-06-1918:00:00Z
9202210silverstoneBritish Grand Prixhttp://en.wikipedia.org/wiki/2022_British_Gran...52.0786-1.01694SilverstoneUK2022-07-0314:00:00Z
10202211red_bull_ringAustrian Grand Prixhttp://en.wikipedia.org/wiki/2022_Austrian_Gra...47.219714.76470SpielbergAustria2022-07-1013:00:00Z
11202212ricardFrench Grand Prixhttp://en.wikipedia.org/wiki/2022_French_Grand...43.25065.79167Le CastelletFrance2022-07-2413:00:00Z
12202213hungaroringHungarian Grand Prixhttp://en.wikipedia.org/wiki/2022_Hungarian_Gr...47.578919.24860BudapestHungary2022-07-3113:00:00Z
13202214spaBelgian Grand Prixhttp://en.wikipedia.org/wiki/2022_Belgian_Gran...50.43725.97139SpaBelgium2022-08-2813:00:00Z
14202215zandvoortDutch Grand Prixhttp://en.wikipedia.org/wiki/2022_Dutch_Grand_...52.38884.54092ZandvoortNetherlands2022-09-0413:00:00Z
15202216monzaItalian Grand Prixhttp://en.wikipedia.org/wiki/2022_Italian_Gran...45.61569.28111MonzaItaly2022-09-1113:00:00Z
16202217marina_baySingapore Grand Prixhttp://en.wikipedia.org/wiki/2022_Singapore_Gr...1.2914103.86400Marina BaySingapore2022-10-0212:00:00Z
17202218suzukaJapanese Grand Prixhttp://en.wikipedia.org/wiki/2022_Japanese_Gra...34.8431136.54100SuzukaJapan2022-10-0905:00:00Z
18202219americasUnited States Grand Prixhttp://en.wikipedia.org/wiki/2022_United_State...30.1328-97.64110AustinUSA2022-10-2319:00:00Z
19202220rodriguezMexico City Grand Prixhttp://en.wikipedia.org/wiki/2022_Mexican_Gran...19.4042-99.09070Mexico CityMexico2022-10-3020:00:00Z
20202221interlagosBrazilian Grand Prixhttp://en.wikipedia.org/wiki/2022_Brazilian_Gr...-23.7036-46.69970São PauloBrazil2022-11-1318:00:00Z
21202222yas_marinaAbu Dhabi Grand Prixhttp://en.wikipedia.org/wiki/2022_Abu_Dhabi_Gr...24.467254.60310Abu DhabiUAE2022-11-2013:00:00Z
\n", + "
" + ], + "text/plain": [ + " season round circuit_id raceName \\\n", + "0 2022 1 bahrain Bahrain Grand Prix \n", + "1 2022 2 jeddah Saudi Arabian Grand Prix \n", + "2 2022 3 albert_park Australian Grand Prix \n", + "3 2022 4 imola Emilia Romagna Grand Prix \n", + "4 2022 5 miami Miami Grand Prix \n", + "5 2022 6 catalunya Spanish Grand Prix \n", + "6 2022 7 monaco Monaco Grand Prix \n", + "7 2022 8 baku Azerbaijan Grand Prix \n", + "8 2022 9 villeneuve Canadian Grand Prix \n", + "9 2022 10 silverstone British Grand Prix \n", + "10 2022 11 red_bull_ring Austrian Grand Prix \n", + "11 2022 12 ricard French Grand Prix \n", + "12 2022 13 hungaroring Hungarian Grand Prix \n", + "13 2022 14 spa Belgian Grand Prix \n", + "14 2022 15 zandvoort Dutch Grand Prix \n", + "15 2022 16 monza Italian Grand Prix \n", + "16 2022 17 marina_bay Singapore Grand Prix \n", + "17 2022 18 suzuka Japanese Grand Prix \n", + "18 2022 19 americas United States Grand Prix \n", + "19 2022 20 rodriguez Mexico City Grand Prix \n", + "20 2022 21 interlagos Brazilian Grand Prix \n", + "21 2022 22 yas_marina Abu Dhabi Grand Prix \n", + "\n", + " url LAT LONG \\\n", + "0 http://en.wikipedia.org/wiki/2022_Bahrain_Gran... 26.0325 50.51060 \n", + "1 http://en.wikipedia.org/wiki/2022_Saudi_Arabia... 21.6319 39.10440 \n", + "2 http://en.wikipedia.org/wiki/2022_Australian_G... -37.8497 144.96800 \n", + "3 http://en.wikipedia.org/wiki/2022_Emilia_Romag... 44.3439 11.71670 \n", + "4 http://en.wikipedia.org/wiki/2022_Miami_Grand_... 25.9581 -80.23890 \n", + "5 http://en.wikipedia.org/wiki/2022_Spanish_Gran... 41.5700 2.26111 \n", + "6 http://en.wikipedia.org/wiki/2022_Monaco_Grand... 43.7347 7.42056 \n", + "7 http://en.wikipedia.org/wiki/2022_Azerbaijan_G... 40.3725 49.85330 \n", + "8 http://en.wikipedia.org/wiki/2022_Canadian_Gra... 45.5000 -73.52280 \n", + "9 http://en.wikipedia.org/wiki/2022_British_Gran... 52.0786 -1.01694 \n", + "10 http://en.wikipedia.org/wiki/2022_Austrian_Gra... 47.2197 14.76470 \n", + "11 http://en.wikipedia.org/wiki/2022_French_Grand... 43.2506 5.79167 \n", + "12 http://en.wikipedia.org/wiki/2022_Hungarian_Gr... 47.5789 19.24860 \n", + "13 http://en.wikipedia.org/wiki/2022_Belgian_Gran... 50.4372 5.97139 \n", + "14 http://en.wikipedia.org/wiki/2022_Dutch_Grand_... 52.3888 4.54092 \n", + "15 http://en.wikipedia.org/wiki/2022_Italian_Gran... 45.6156 9.28111 \n", + "16 http://en.wikipedia.org/wiki/2022_Singapore_Gr... 1.2914 103.86400 \n", + "17 http://en.wikipedia.org/wiki/2022_Japanese_Gra... 34.8431 136.54100 \n", + "18 http://en.wikipedia.org/wiki/2022_United_State... 30.1328 -97.64110 \n", + "19 http://en.wikipedia.org/wiki/2022_Mexican_Gran... 19.4042 -99.09070 \n", + "20 http://en.wikipedia.org/wiki/2022_Brazilian_Gr... -23.7036 -46.69970 \n", + "21 http://en.wikipedia.org/wiki/2022_Abu_Dhabi_Gr... 24.4672 54.60310 \n", + "\n", + " locality country date time \n", + "0 Sakhir Bahrain 2022-03-20 15:00:00Z \n", + "1 Jeddah Saudi Arabia 2022-03-27 17:00:00Z \n", + "2 Melbourne Australia 2022-04-10 05:00:00Z \n", + "3 Imola Italy 2022-04-24 13:00:00Z \n", + "4 Miami USA 2022-05-08 19:30:00Z \n", + "5 Montmeló Spain 2022-05-22 13:00:00Z \n", + "6 Monte-Carlo Monaco 2022-05-29 13:00:00Z \n", + "7 Baku Azerbaijan 2022-06-12 11:00:00Z \n", + "8 Montreal Canada 2022-06-19 18:00:00Z \n", + "9 Silverstone UK 2022-07-03 14:00:00Z \n", + "10 Spielberg Austria 2022-07-10 13:00:00Z \n", + "11 Le Castellet France 2022-07-24 13:00:00Z \n", + "12 Budapest Hungary 2022-07-31 13:00:00Z \n", + "13 Spa Belgium 2022-08-28 13:00:00Z \n", + "14 Zandvoort Netherlands 2022-09-04 13:00:00Z \n", + "15 Monza Italy 2022-09-11 13:00:00Z \n", + "16 Marina Bay Singapore 2022-10-02 12:00:00Z \n", + "17 Suzuka Japan 2022-10-09 05:00:00Z \n", + "18 Austin USA 2022-10-23 19:00:00Z \n", + "19 Mexico City Mexico 2022-10-30 20:00:00Z \n", + "20 São Paulo Brazil 2022-11-13 18:00:00Z \n", + "21 Abu Dhabi UAE 2022-11-20 13:00:00Z " + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# pull the f1 2022 season races information from the ergast API\n", "\n", @@ -117,7 +744,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "metadata": {}, "outputs": [], "source": [ @@ -127,9 +754,146 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "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", + "
seasonroundcircuit_idraceNameurlLATLONGlocalitycountrydatetime
019501silverstoneBritish Grand Prixhttp://en.wikipedia.org/wiki/1950_British_Gran...52.0786-1.01694SilverstoneUK1950-05-13NaN
119502monacoMonaco Grand Prixhttp://en.wikipedia.org/wiki/1950_Monaco_Grand...43.73477.42056Monte-CarloMonaco1950-05-21NaN
219503indianapolisIndianapolis 500http://en.wikipedia.org/wiki/1950_Indianapolis...39.7950-86.23470IndianapolisUSA1950-05-30NaN
319504bremgartenSwiss Grand Prixhttp://en.wikipedia.org/wiki/1950_Swiss_Grand_...46.95897.40194BernSwitzerland1950-06-04NaN
419505spaBelgian Grand Prixhttp://en.wikipedia.org/wiki/1950_Belgian_Gran...50.43725.97139SpaBelgium1950-06-18NaN
\n", + "
" + ], + "text/plain": [ + " season round circuit_id raceName \\\n", + "0 1950 1 silverstone British Grand Prix \n", + "1 1950 2 monaco Monaco Grand Prix \n", + "2 1950 3 indianapolis Indianapolis 500 \n", + "3 1950 4 bremgarten Swiss Grand Prix \n", + "4 1950 5 spa Belgian Grand Prix \n", + "\n", + " url LAT LONG \\\n", + "0 http://en.wikipedia.org/wiki/1950_British_Gran... 52.0786 -1.01694 \n", + "1 http://en.wikipedia.org/wiki/1950_Monaco_Grand... 43.7347 7.42056 \n", + "2 http://en.wikipedia.org/wiki/1950_Indianapolis... 39.7950 -86.23470 \n", + "3 http://en.wikipedia.org/wiki/1950_Swiss_Grand_... 46.9589 7.40194 \n", + "4 http://en.wikipedia.org/wiki/1950_Belgian_Gran... 50.4372 5.97139 \n", + "\n", + " locality country date time \n", + "0 Silverstone UK 1950-05-13 NaN \n", + "1 Monte-Carlo Monaco 1950-05-21 NaN \n", + "2 Indianapolis USA 1950-05-30 NaN \n", + "3 Bern Switzerland 1950-06-04 NaN \n", + "4 Spa Belgium 1950-06-18 NaN " + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.head()" ] @@ -143,9 +907,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "0 silverstone\n", + "1 monaco\n", + "2 indianapolis\n", + "3 bremgarten\n", + "4 spa\n", + " ... \n", + "1074 suzuka\n", + "1075 americas\n", + "1076 rodriguez\n", + "1077 interlagos\n", + "1078 yas_marina\n", + "Name: circuit_id, Length: 1079, dtype: object" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.circuit_id" ] @@ -159,9 +945,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 44, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['season', 'round', 'circuit_id', 'raceName', 'url', 'LAT', 'LONG',\n", + " 'locality', 'country', 'date', 'time'],\n", + " dtype='object')" + ] + }, + "execution_count": 44, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.columns" ] @@ -175,9 +974,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 45, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Int64Index([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,\n", + " ...\n", + " 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078],\n", + " dtype='int64', length=1079)" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.index" ] @@ -191,9 +1004,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(1079, 11)" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.shape" ] @@ -207,9 +1031,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 47, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "season int64\n", + "round int64\n", + "circuit_id object\n", + "raceName object\n", + "url object\n", + "LAT float64\n", + "LONG float64\n", + "locality object\n", + "country object\n", + "date object\n", + "time object\n", + "dtype: object" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.dtypes" ] @@ -223,20 +1069,243 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 48, "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", + "
seasonroundcircuit_idraceNameurlLATLONGlocalitycountrydatetime
019501silverstoneBritish Grand Prixhttp://en.wikipedia.org/wiki/1950_British_Gran...52.0786-1.01694SilverstoneUK1950-05-13NaN
119502monacoMonaco Grand Prixhttp://en.wikipedia.org/wiki/1950_Monaco_Grand...43.73477.42056Monte-CarloMonaco1950-05-21NaN
\n", + "
" + ], + "text/plain": [ + " season round circuit_id raceName \\\n", + "0 1950 1 silverstone British Grand Prix \n", + "1 1950 2 monaco Monaco Grand Prix \n", + "\n", + " url LAT LONG \\\n", + "0 http://en.wikipedia.org/wiki/1950_British_Gran... 52.0786 -1.01694 \n", + "1 http://en.wikipedia.org/wiki/1950_Monaco_Grand... 43.7347 7.42056 \n", + "\n", + " locality country date time \n", + "0 Silverstone UK 1950-05-13 NaN \n", + "1 Monte-Carlo Monaco 1950-05-21 NaN " + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "f1_races.head()" + "f1_races.head(2)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 49, "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", + "
seasonroundcircuit_idraceNameurlLATLONGlocalitycountrydatetime
1074202218suzukaJapanese Grand Prixhttp://en.wikipedia.org/wiki/2022_Japanese_Gra...34.8431136.5410SuzukaJapan2022-10-0905:00:00Z
1075202219americasUnited States Grand Prixhttp://en.wikipedia.org/wiki/2022_United_State...30.1328-97.6411AustinUSA2022-10-2319:00:00Z
1076202220rodriguezMexico City Grand Prixhttp://en.wikipedia.org/wiki/2022_Mexican_Gran...19.4042-99.0907Mexico CityMexico2022-10-3020:00:00Z
1077202221interlagosBrazilian Grand Prixhttp://en.wikipedia.org/wiki/2022_Brazilian_Gr...-23.7036-46.6997São PauloBrazil2022-11-1318:00:00Z
1078202222yas_marinaAbu Dhabi Grand Prixhttp://en.wikipedia.org/wiki/2022_Abu_Dhabi_Gr...24.467254.6031Abu DhabiUAE2022-11-2013:00:00Z
\n", + "
" + ], + "text/plain": [ + " season round circuit_id raceName \\\n", + "1074 2022 18 suzuka Japanese Grand Prix \n", + "1075 2022 19 americas United States Grand Prix \n", + "1076 2022 20 rodriguez Mexico City Grand Prix \n", + "1077 2022 21 interlagos Brazilian Grand Prix \n", + "1078 2022 22 yas_marina Abu Dhabi Grand Prix \n", + "\n", + " url LAT LONG \\\n", + "1074 http://en.wikipedia.org/wiki/2022_Japanese_Gra... 34.8431 136.5410 \n", + "1075 http://en.wikipedia.org/wiki/2022_United_State... 30.1328 -97.6411 \n", + "1076 http://en.wikipedia.org/wiki/2022_Mexican_Gran... 19.4042 -99.0907 \n", + "1077 http://en.wikipedia.org/wiki/2022_Brazilian_Gr... -23.7036 -46.6997 \n", + "1078 http://en.wikipedia.org/wiki/2022_Abu_Dhabi_Gr... 24.4672 54.6031 \n", + "\n", + " locality country date time \n", + "1074 Suzuka Japan 2022-10-09 05:00:00Z \n", + "1075 Austin USA 2022-10-23 19:00:00Z \n", + "1076 Mexico City Mexico 2022-10-30 20:00:00Z \n", + "1077 São Paulo Brazil 2022-11-13 18:00:00Z \n", + "1078 Abu Dhabi UAE 2022-11-20 13:00:00Z " + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "f1_races.tail()" + "f1_races.tail(5)" ] }, { @@ -248,27 +1317,315 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 50, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Int64Index: 1079 entries, 0 to 1078\n", + "Data columns (total 11 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 season 1079 non-null int64 \n", + " 1 round 1079 non-null int64 \n", + " 2 circuit_id 1079 non-null object \n", + " 3 raceName 1079 non-null object \n", + " 4 url 1079 non-null object \n", + " 5 LAT 1079 non-null float64\n", + " 6 LONG 1079 non-null float64\n", + " 7 locality 1079 non-null object \n", + " 8 country 1079 non-null object \n", + " 9 date 1079 non-null object \n", + " 10 time 348 non-null object \n", + "dtypes: float64(2), int64(2), object(7)\n", + "memory usage: 101.2+ KB\n" + ] + } + ], "source": [ "f1_races.info()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 51, "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", + "
seasondatecountry
019501950-05-13UK
119501950-05-21Monaco
219501950-05-30USA
319501950-06-04Switzerland
419501950-06-18Belgium
\n", + "
" + ], + "text/plain": [ + " season date country\n", + "0 1950 1950-05-13 UK\n", + "1 1950 1950-05-21 Monaco\n", + "2 1950 1950-05-30 USA\n", + "3 1950 1950-06-04 Switzerland\n", + "4 1950 1950-06-18 Belgium" + ] + }, + "execution_count": 51, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races[['season', 'date', 'country']].head()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 52, "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", + "
seasonroundcircuit_idraceNameurlLATLONGlocalitycountrydatetime
1068202212ricardFrench Grand Prixhttp://en.wikipedia.org/wiki/2022_French_Grand...43.25065.79167Le CastelletFrance2022-07-2413:00:00Z
1069202213hungaroringHungarian Grand Prixhttp://en.wikipedia.org/wiki/2022_Hungarian_Gr...47.578919.24860BudapestHungary2022-07-3113:00:00Z
1070202214spaBelgian Grand Prixhttp://en.wikipedia.org/wiki/2022_Belgian_Gran...50.43725.97139SpaBelgium2022-08-2813:00:00Z
1071202215zandvoortDutch Grand Prixhttp://en.wikipedia.org/wiki/2022_Dutch_Grand_...52.38884.54092ZandvoortNetherlands2022-09-0413:00:00Z
1072202216monzaItalian Grand Prixhttp://en.wikipedia.org/wiki/2022_Italian_Gran...45.61569.28111MonzaItaly2022-09-1113:00:00Z
1073202217marina_baySingapore Grand Prixhttp://en.wikipedia.org/wiki/2022_Singapore_Gr...1.2914103.86400Marina BaySingapore2022-10-0212:00:00Z
1074202218suzukaJapanese Grand Prixhttp://en.wikipedia.org/wiki/2022_Japanese_Gra...34.8431136.54100SuzukaJapan2022-10-0905:00:00Z
1075202219americasUnited States Grand Prixhttp://en.wikipedia.org/wiki/2022_United_State...30.1328-97.64110AustinUSA2022-10-2319:00:00Z
\n", + "
" + ], + "text/plain": [ + " season round circuit_id raceName \\\n", + "1068 2022 12 ricard French Grand Prix \n", + "1069 2022 13 hungaroring Hungarian Grand Prix \n", + "1070 2022 14 spa Belgian Grand Prix \n", + "1071 2022 15 zandvoort Dutch Grand Prix \n", + "1072 2022 16 monza Italian Grand Prix \n", + "1073 2022 17 marina_bay Singapore Grand Prix \n", + "1074 2022 18 suzuka Japanese Grand Prix \n", + "1075 2022 19 americas United States Grand Prix \n", + "\n", + " url LAT LONG \\\n", + "1068 http://en.wikipedia.org/wiki/2022_French_Grand... 43.2506 5.79167 \n", + "1069 http://en.wikipedia.org/wiki/2022_Hungarian_Gr... 47.5789 19.24860 \n", + "1070 http://en.wikipedia.org/wiki/2022_Belgian_Gran... 50.4372 5.97139 \n", + "1071 http://en.wikipedia.org/wiki/2022_Dutch_Grand_... 52.3888 4.54092 \n", + "1072 http://en.wikipedia.org/wiki/2022_Italian_Gran... 45.6156 9.28111 \n", + "1073 http://en.wikipedia.org/wiki/2022_Singapore_Gr... 1.2914 103.86400 \n", + "1074 http://en.wikipedia.org/wiki/2022_Japanese_Gra... 34.8431 136.54100 \n", + "1075 http://en.wikipedia.org/wiki/2022_United_State... 30.1328 -97.64110 \n", + "\n", + " locality country date time \n", + "1068 Le Castellet France 2022-07-24 13:00:00Z \n", + "1069 Budapest Hungary 2022-07-31 13:00:00Z \n", + "1070 Spa Belgium 2022-08-28 13:00:00Z \n", + "1071 Zandvoort Netherlands 2022-09-04 13:00:00Z \n", + "1072 Monza Italy 2022-09-11 13:00:00Z \n", + "1073 Marina Bay Singapore 2022-10-02 12:00:00Z \n", + "1074 Suzuka Japan 2022-10-09 05:00:00Z \n", + "1075 Austin USA 2022-10-23 19:00:00Z " + ] + }, + "execution_count": 52, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races[1068:1076]" ] @@ -283,9 +1640,114 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "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", + "
seasoncircuit_idLATLONG
10682022ricard43.25065.79167
10692022hungaroring47.578919.24860
10702022spa50.43725.97139
10712022zandvoort52.38884.54092
10722022monza45.61569.28111
10732022marina_bay1.2914103.86400
10742022suzuka34.8431136.54100
10752022americas30.1328-97.64110
\n", + "
" + ], + "text/plain": [ + " season circuit_id LAT LONG\n", + "1068 2022 ricard 43.2506 5.79167\n", + "1069 2022 hungaroring 47.5789 19.24860\n", + "1070 2022 spa 50.4372 5.97139\n", + "1071 2022 zandvoort 52.3888 4.54092\n", + "1072 2022 monza 45.6156 9.28111\n", + "1073 2022 marina_bay 1.2914 103.86400\n", + "1074 2022 suzuka 34.8431 136.54100\n", + "1075 2022 americas 30.1328 -97.64110" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.iloc[1068:1076, [0, 2, 5, 6]]" ] @@ -299,9 +1761,112 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "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", + "
seasonroundcircuit_id
1068202212ricard
1069202213hungaroring
1070202214spa
1071202215zandvoort
1072202216monza
1073202217marina_bay
1074202218suzuka
1075202219americas
1076202220rodriguez
\n", + "
" + ], + "text/plain": [ + " season round circuit_id\n", + "1068 2022 12 ricard\n", + "1069 2022 13 hungaroring\n", + "1070 2022 14 spa\n", + "1071 2022 15 zandvoort\n", + "1072 2022 16 monza\n", + "1073 2022 17 marina_bay\n", + "1074 2022 18 suzuka\n", + "1075 2022 19 americas\n", + "1076 2022 20 rodriguez" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.loc[1068:1076, 'season':'circuit_id']\n" ] @@ -316,18 +1881,734 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 55, "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
seasonroundcircuit_idraceNameurlLATLONGlocalitycountrydatetime
105720221bahrainBahrain Grand Prixhttp://en.wikipedia.org/wiki/2022_Bahrain_Gran...26.032550.51060SakhirBahrain2022-03-2015:00:00Z
105820222jeddahSaudi Arabian Grand Prixhttp://en.wikipedia.org/wiki/2022_Saudi_Arabia...21.631939.10440JeddahSaudi Arabia2022-03-2717:00:00Z
105920223albert_parkAustralian Grand Prixhttp://en.wikipedia.org/wiki/2022_Australian_G...-37.8497144.96800MelbourneAustralia2022-04-1005:00:00Z
106020224imolaEmilia Romagna Grand Prixhttp://en.wikipedia.org/wiki/2022_Emilia_Romag...44.343911.71670ImolaItaly2022-04-2413:00:00Z
106120225miamiMiami Grand Prixhttp://en.wikipedia.org/wiki/2022_Miami_Grand_...25.9581-80.23890MiamiUSA2022-05-0819:30:00Z
106220226catalunyaSpanish Grand Prixhttp://en.wikipedia.org/wiki/2022_Spanish_Gran...41.57002.26111MontmelóSpain2022-05-2213:00:00Z
106320227monacoMonaco Grand Prixhttp://en.wikipedia.org/wiki/2022_Monaco_Grand...43.73477.42056Monte-CarloMonaco2022-05-2913:00:00Z
106420228bakuAzerbaijan Grand Prixhttp://en.wikipedia.org/wiki/2022_Azerbaijan_G...40.372549.85330BakuAzerbaijan2022-06-1211:00:00Z
106520229villeneuveCanadian Grand Prixhttp://en.wikipedia.org/wiki/2022_Canadian_Gra...45.5000-73.52280MontrealCanada2022-06-1918:00:00Z
1066202210silverstoneBritish Grand Prixhttp://en.wikipedia.org/wiki/2022_British_Gran...52.0786-1.01694SilverstoneUK2022-07-0314:00:00Z
1067202211red_bull_ringAustrian Grand Prixhttp://en.wikipedia.org/wiki/2022_Austrian_Gra...47.219714.76470SpielbergAustria2022-07-1013:00:00Z
1068202212ricardFrench Grand Prixhttp://en.wikipedia.org/wiki/2022_French_Grand...43.25065.79167Le CastelletFrance2022-07-2413:00:00Z
1069202213hungaroringHungarian Grand Prixhttp://en.wikipedia.org/wiki/2022_Hungarian_Gr...47.578919.24860BudapestHungary2022-07-3113:00:00Z
1070202214spaBelgian Grand Prixhttp://en.wikipedia.org/wiki/2022_Belgian_Gran...50.43725.97139SpaBelgium2022-08-2813:00:00Z
1071202215zandvoortDutch Grand Prixhttp://en.wikipedia.org/wiki/2022_Dutch_Grand_...52.38884.54092ZandvoortNetherlands2022-09-0413:00:00Z
1072202216monzaItalian Grand Prixhttp://en.wikipedia.org/wiki/2022_Italian_Gran...45.61569.28111MonzaItaly2022-09-1113:00:00Z
1073202217marina_baySingapore Grand Prixhttp://en.wikipedia.org/wiki/2022_Singapore_Gr...1.2914103.86400Marina BaySingapore2022-10-0212:00:00Z
1074202218suzukaJapanese Grand Prixhttp://en.wikipedia.org/wiki/2022_Japanese_Gra...34.8431136.54100SuzukaJapan2022-10-0905:00:00Z
1075202219americasUnited States Grand Prixhttp://en.wikipedia.org/wiki/2022_United_State...30.1328-97.64110AustinUSA2022-10-2319:00:00Z
1076202220rodriguezMexico City Grand Prixhttp://en.wikipedia.org/wiki/2022_Mexican_Gran...19.4042-99.09070Mexico CityMexico2022-10-3020:00:00Z
1077202221interlagosBrazilian Grand Prixhttp://en.wikipedia.org/wiki/2022_Brazilian_Gr...-23.7036-46.69970São PauloBrazil2022-11-1318:00:00Z
1078202222yas_marinaAbu Dhabi Grand Prixhttp://en.wikipedia.org/wiki/2022_Abu_Dhabi_Gr...24.467254.60310Abu DhabiUAE2022-11-2013:00:00Z
\n", + "
" + ], + "text/plain": [ + " season round circuit_id raceName \\\n", + "1057 2022 1 bahrain Bahrain Grand Prix \n", + "1058 2022 2 jeddah Saudi Arabian Grand Prix \n", + "1059 2022 3 albert_park Australian Grand Prix \n", + "1060 2022 4 imola Emilia Romagna Grand Prix \n", + "1061 2022 5 miami Miami Grand Prix \n", + "1062 2022 6 catalunya Spanish Grand Prix \n", + "1063 2022 7 monaco Monaco Grand Prix \n", + "1064 2022 8 baku Azerbaijan Grand Prix \n", + "1065 2022 9 villeneuve Canadian Grand Prix \n", + "1066 2022 10 silverstone British Grand Prix \n", + "1067 2022 11 red_bull_ring Austrian Grand Prix \n", + "1068 2022 12 ricard French Grand Prix \n", + "1069 2022 13 hungaroring Hungarian Grand Prix \n", + "1070 2022 14 spa Belgian Grand Prix \n", + "1071 2022 15 zandvoort Dutch Grand Prix \n", + "1072 2022 16 monza Italian Grand Prix \n", + "1073 2022 17 marina_bay Singapore Grand Prix \n", + "1074 2022 18 suzuka Japanese Grand Prix \n", + "1075 2022 19 americas United States Grand Prix \n", + "1076 2022 20 rodriguez Mexico City Grand Prix \n", + "1077 2022 21 interlagos Brazilian Grand Prix \n", + "1078 2022 22 yas_marina Abu Dhabi Grand Prix \n", + "\n", + " url LAT LONG \\\n", + "1057 http://en.wikipedia.org/wiki/2022_Bahrain_Gran... 26.0325 50.51060 \n", + "1058 http://en.wikipedia.org/wiki/2022_Saudi_Arabia... 21.6319 39.10440 \n", + "1059 http://en.wikipedia.org/wiki/2022_Australian_G... -37.8497 144.96800 \n", + "1060 http://en.wikipedia.org/wiki/2022_Emilia_Romag... 44.3439 11.71670 \n", + "1061 http://en.wikipedia.org/wiki/2022_Miami_Grand_... 25.9581 -80.23890 \n", + "1062 http://en.wikipedia.org/wiki/2022_Spanish_Gran... 41.5700 2.26111 \n", + "1063 http://en.wikipedia.org/wiki/2022_Monaco_Grand... 43.7347 7.42056 \n", + "1064 http://en.wikipedia.org/wiki/2022_Azerbaijan_G... 40.3725 49.85330 \n", + "1065 http://en.wikipedia.org/wiki/2022_Canadian_Gra... 45.5000 -73.52280 \n", + "1066 http://en.wikipedia.org/wiki/2022_British_Gran... 52.0786 -1.01694 \n", + "1067 http://en.wikipedia.org/wiki/2022_Austrian_Gra... 47.2197 14.76470 \n", + "1068 http://en.wikipedia.org/wiki/2022_French_Grand... 43.2506 5.79167 \n", + "1069 http://en.wikipedia.org/wiki/2022_Hungarian_Gr... 47.5789 19.24860 \n", + "1070 http://en.wikipedia.org/wiki/2022_Belgian_Gran... 50.4372 5.97139 \n", + "1071 http://en.wikipedia.org/wiki/2022_Dutch_Grand_... 52.3888 4.54092 \n", + "1072 http://en.wikipedia.org/wiki/2022_Italian_Gran... 45.6156 9.28111 \n", + "1073 http://en.wikipedia.org/wiki/2022_Singapore_Gr... 1.2914 103.86400 \n", + "1074 http://en.wikipedia.org/wiki/2022_Japanese_Gra... 34.8431 136.54100 \n", + "1075 http://en.wikipedia.org/wiki/2022_United_State... 30.1328 -97.64110 \n", + "1076 http://en.wikipedia.org/wiki/2022_Mexican_Gran... 19.4042 -99.09070 \n", + "1077 http://en.wikipedia.org/wiki/2022_Brazilian_Gr... -23.7036 -46.69970 \n", + "1078 http://en.wikipedia.org/wiki/2022_Abu_Dhabi_Gr... 24.4672 54.60310 \n", + "\n", + " locality country date time \n", + "1057 Sakhir Bahrain 2022-03-20 15:00:00Z \n", + "1058 Jeddah Saudi Arabia 2022-03-27 17:00:00Z \n", + "1059 Melbourne Australia 2022-04-10 05:00:00Z \n", + "1060 Imola Italy 2022-04-24 13:00:00Z \n", + "1061 Miami USA 2022-05-08 19:30:00Z \n", + "1062 Montmeló Spain 2022-05-22 13:00:00Z \n", + "1063 Monte-Carlo Monaco 2022-05-29 13:00:00Z \n", + "1064 Baku Azerbaijan 2022-06-12 11:00:00Z \n", + "1065 Montreal Canada 2022-06-19 18:00:00Z \n", + "1066 Silverstone UK 2022-07-03 14:00:00Z \n", + "1067 Spielberg Austria 2022-07-10 13:00:00Z \n", + "1068 Le Castellet France 2022-07-24 13:00:00Z \n", + "1069 Budapest Hungary 2022-07-31 13:00:00Z \n", + "1070 Spa Belgium 2022-08-28 13:00:00Z \n", + "1071 Zandvoort Netherlands 2022-09-04 13:00:00Z \n", + "1072 Monza Italy 2022-09-11 13:00:00Z \n", + "1073 Marina Bay Singapore 2022-10-02 12:00:00Z \n", + "1074 Suzuka Japan 2022-10-09 05:00:00Z \n", + "1075 Austin USA 2022-10-23 19:00:00Z \n", + "1076 Mexico City Mexico 2022-10-30 20:00:00Z \n", + "1077 São Paulo Brazil 2022-11-13 18:00:00Z \n", + "1078 Abu Dhabi UAE 2022-11-20 13:00:00Z " + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races[f1_races['season'] == 2022]" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 56, "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", + "
seasonroundcircuit_idraceNameurlLATLONGlocalitycountrydatetime
105720221bahrainBahrain Grand Prixhttp://en.wikipedia.org/wiki/2022_Bahrain_Gran...26.032550.51060SakhirBahrain2022-03-2015:00:00Z
105820222jeddahSaudi Arabian Grand Prixhttp://en.wikipedia.org/wiki/2022_Saudi_Arabia...21.631939.10440JeddahSaudi Arabia2022-03-2717:00:00Z
105920223albert_parkAustralian Grand Prixhttp://en.wikipedia.org/wiki/2022_Australian_G...-37.8497144.96800MelbourneAustralia2022-04-1005:00:00Z
106020224imolaEmilia Romagna Grand Prixhttp://en.wikipedia.org/wiki/2022_Emilia_Romag...44.343911.71670ImolaItaly2022-04-2413:00:00Z
106120225miamiMiami Grand Prixhttp://en.wikipedia.org/wiki/2022_Miami_Grand_...25.9581-80.23890MiamiUSA2022-05-0819:30:00Z
106220226catalunyaSpanish Grand Prixhttp://en.wikipedia.org/wiki/2022_Spanish_Gran...41.57002.26111MontmelóSpain2022-05-2213:00:00Z
106320227monacoMonaco Grand Prixhttp://en.wikipedia.org/wiki/2022_Monaco_Grand...43.73477.42056Monte-CarloMonaco2022-05-2913:00:00Z
106420228bakuAzerbaijan Grand Prixhttp://en.wikipedia.org/wiki/2022_Azerbaijan_G...40.372549.85330BakuAzerbaijan2022-06-1211:00:00Z
106520229villeneuveCanadian Grand Prixhttp://en.wikipedia.org/wiki/2022_Canadian_Gra...45.5000-73.52280MontrealCanada2022-06-1918:00:00Z
1066202210silverstoneBritish Grand Prixhttp://en.wikipedia.org/wiki/2022_British_Gran...52.0786-1.01694SilverstoneUK2022-07-0314:00:00Z
1067202211red_bull_ringAustrian Grand Prixhttp://en.wikipedia.org/wiki/2022_Austrian_Gra...47.219714.76470SpielbergAustria2022-07-1013:00:00Z
1068202212ricardFrench Grand Prixhttp://en.wikipedia.org/wiki/2022_French_Grand...43.25065.79167Le CastelletFrance2022-07-2413:00:00Z
1069202213hungaroringHungarian Grand Prixhttp://en.wikipedia.org/wiki/2022_Hungarian_Gr...47.578919.24860BudapestHungary2022-07-3113:00:00Z
1070202214spaBelgian Grand Prixhttp://en.wikipedia.org/wiki/2022_Belgian_Gran...50.43725.97139SpaBelgium2022-08-2813:00:00Z
\n", + "
" + ], + "text/plain": [ + " season round circuit_id raceName \\\n", + "1057 2022 1 bahrain Bahrain Grand Prix \n", + "1058 2022 2 jeddah Saudi Arabian Grand Prix \n", + "1059 2022 3 albert_park Australian Grand Prix \n", + "1060 2022 4 imola Emilia Romagna Grand Prix \n", + "1061 2022 5 miami Miami Grand Prix \n", + "1062 2022 6 catalunya Spanish Grand Prix \n", + "1063 2022 7 monaco Monaco Grand Prix \n", + "1064 2022 8 baku Azerbaijan Grand Prix \n", + "1065 2022 9 villeneuve Canadian Grand Prix \n", + "1066 2022 10 silverstone British Grand Prix \n", + "1067 2022 11 red_bull_ring Austrian Grand Prix \n", + "1068 2022 12 ricard French Grand Prix \n", + "1069 2022 13 hungaroring Hungarian Grand Prix \n", + "1070 2022 14 spa Belgian Grand Prix \n", + "\n", + " url LAT LONG \\\n", + "1057 http://en.wikipedia.org/wiki/2022_Bahrain_Gran... 26.0325 50.51060 \n", + "1058 http://en.wikipedia.org/wiki/2022_Saudi_Arabia... 21.6319 39.10440 \n", + "1059 http://en.wikipedia.org/wiki/2022_Australian_G... -37.8497 144.96800 \n", + "1060 http://en.wikipedia.org/wiki/2022_Emilia_Romag... 44.3439 11.71670 \n", + "1061 http://en.wikipedia.org/wiki/2022_Miami_Grand_... 25.9581 -80.23890 \n", + "1062 http://en.wikipedia.org/wiki/2022_Spanish_Gran... 41.5700 2.26111 \n", + "1063 http://en.wikipedia.org/wiki/2022_Monaco_Grand... 43.7347 7.42056 \n", + "1064 http://en.wikipedia.org/wiki/2022_Azerbaijan_G... 40.3725 49.85330 \n", + "1065 http://en.wikipedia.org/wiki/2022_Canadian_Gra... 45.5000 -73.52280 \n", + "1066 http://en.wikipedia.org/wiki/2022_British_Gran... 52.0786 -1.01694 \n", + "1067 http://en.wikipedia.org/wiki/2022_Austrian_Gra... 47.2197 14.76470 \n", + "1068 http://en.wikipedia.org/wiki/2022_French_Grand... 43.2506 5.79167 \n", + "1069 http://en.wikipedia.org/wiki/2022_Hungarian_Gr... 47.5789 19.24860 \n", + "1070 http://en.wikipedia.org/wiki/2022_Belgian_Gran... 50.4372 5.97139 \n", + "\n", + " locality country date time \n", + "1057 Sakhir Bahrain 2022-03-20 15:00:00Z \n", + "1058 Jeddah Saudi Arabia 2022-03-27 17:00:00Z \n", + "1059 Melbourne Australia 2022-04-10 05:00:00Z \n", + "1060 Imola Italy 2022-04-24 13:00:00Z \n", + "1061 Miami USA 2022-05-08 19:30:00Z \n", + "1062 Montmeló Spain 2022-05-22 13:00:00Z \n", + "1063 Monte-Carlo Monaco 2022-05-29 13:00:00Z \n", + "1064 Baku Azerbaijan 2022-06-12 11:00:00Z \n", + "1065 Montreal Canada 2022-06-19 18:00:00Z \n", + "1066 Silverstone UK 2022-07-03 14:00:00Z \n", + "1067 Spielberg Austria 2022-07-10 13:00:00Z \n", + "1068 Le Castellet France 2022-07-24 13:00:00Z \n", + "1069 Budapest Hungary 2022-07-31 13:00:00Z \n", + "1070 Spa Belgium 2022-08-28 13:00:00Z " + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races[(f1_races['season'] == 2022) & (f1_races['date'] < '2022-09-01')]" ] @@ -341,9 +2622,299 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 57, "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", + "
seasonroundcircuit_idraceNameurlLATLONGlocalitycountrydatetime
105720221bahrainBahrain Grand Prixhttp://en.wikipedia.org/wiki/2022_Bahrain_Gran...26.032550.51060SakhirBahrain2022-03-2015:00:00Z
105820222jeddahSaudi Arabian Grand Prixhttp://en.wikipedia.org/wiki/2022_Saudi_Arabia...21.631939.10440JeddahSaudi Arabia2022-03-2717:00:00Z
105920223albert_parkAustralian Grand Prixhttp://en.wikipedia.org/wiki/2022_Australian_G...-37.8497144.96800MelbourneAustralia2022-04-1005:00:00Z
106020224imolaEmilia Romagna Grand Prixhttp://en.wikipedia.org/wiki/2022_Emilia_Romag...44.343911.71670ImolaItaly2022-04-2413:00:00Z
106120225miamiMiami Grand Prixhttp://en.wikipedia.org/wiki/2022_Miami_Grand_...25.9581-80.23890MiamiUSA2022-05-0819:30:00Z
106220226catalunyaSpanish Grand Prixhttp://en.wikipedia.org/wiki/2022_Spanish_Gran...41.57002.26111MontmelóSpain2022-05-2213:00:00Z
106320227monacoMonaco Grand Prixhttp://en.wikipedia.org/wiki/2022_Monaco_Grand...43.73477.42056Monte-CarloMonaco2022-05-2913:00:00Z
106420228bakuAzerbaijan Grand Prixhttp://en.wikipedia.org/wiki/2022_Azerbaijan_G...40.372549.85330BakuAzerbaijan2022-06-1211:00:00Z
106520229villeneuveCanadian Grand Prixhttp://en.wikipedia.org/wiki/2022_Canadian_Gra...45.5000-73.52280MontrealCanada2022-06-1918:00:00Z
1066202210silverstoneBritish Grand Prixhttp://en.wikipedia.org/wiki/2022_British_Gran...52.0786-1.01694SilverstoneUK2022-07-0314:00:00Z
1067202211red_bull_ringAustrian Grand Prixhttp://en.wikipedia.org/wiki/2022_Austrian_Gra...47.219714.76470SpielbergAustria2022-07-1013:00:00Z
1068202212ricardFrench Grand Prixhttp://en.wikipedia.org/wiki/2022_French_Grand...43.25065.79167Le CastelletFrance2022-07-2413:00:00Z
1069202213hungaroringHungarian Grand Prixhttp://en.wikipedia.org/wiki/2022_Hungarian_Gr...47.578919.24860BudapestHungary2022-07-3113:00:00Z
1070202214spaBelgian Grand Prixhttp://en.wikipedia.org/wiki/2022_Belgian_Gran...50.43725.97139SpaBelgium2022-08-2813:00:00Z
\n", + "
" + ], + "text/plain": [ + " season round circuit_id raceName \\\n", + "1057 2022 1 bahrain Bahrain Grand Prix \n", + "1058 2022 2 jeddah Saudi Arabian Grand Prix \n", + "1059 2022 3 albert_park Australian Grand Prix \n", + "1060 2022 4 imola Emilia Romagna Grand Prix \n", + "1061 2022 5 miami Miami Grand Prix \n", + "1062 2022 6 catalunya Spanish Grand Prix \n", + "1063 2022 7 monaco Monaco Grand Prix \n", + "1064 2022 8 baku Azerbaijan Grand Prix \n", + "1065 2022 9 villeneuve Canadian Grand Prix \n", + "1066 2022 10 silverstone British Grand Prix \n", + "1067 2022 11 red_bull_ring Austrian Grand Prix \n", + "1068 2022 12 ricard French Grand Prix \n", + "1069 2022 13 hungaroring Hungarian Grand Prix \n", + "1070 2022 14 spa Belgian Grand Prix \n", + "\n", + " url LAT LONG \\\n", + "1057 http://en.wikipedia.org/wiki/2022_Bahrain_Gran... 26.0325 50.51060 \n", + "1058 http://en.wikipedia.org/wiki/2022_Saudi_Arabia... 21.6319 39.10440 \n", + "1059 http://en.wikipedia.org/wiki/2022_Australian_G... -37.8497 144.96800 \n", + "1060 http://en.wikipedia.org/wiki/2022_Emilia_Romag... 44.3439 11.71670 \n", + "1061 http://en.wikipedia.org/wiki/2022_Miami_Grand_... 25.9581 -80.23890 \n", + "1062 http://en.wikipedia.org/wiki/2022_Spanish_Gran... 41.5700 2.26111 \n", + "1063 http://en.wikipedia.org/wiki/2022_Monaco_Grand... 43.7347 7.42056 \n", + "1064 http://en.wikipedia.org/wiki/2022_Azerbaijan_G... 40.3725 49.85330 \n", + "1065 http://en.wikipedia.org/wiki/2022_Canadian_Gra... 45.5000 -73.52280 \n", + "1066 http://en.wikipedia.org/wiki/2022_British_Gran... 52.0786 -1.01694 \n", + "1067 http://en.wikipedia.org/wiki/2022_Austrian_Gra... 47.2197 14.76470 \n", + "1068 http://en.wikipedia.org/wiki/2022_French_Grand... 43.2506 5.79167 \n", + "1069 http://en.wikipedia.org/wiki/2022_Hungarian_Gr... 47.5789 19.24860 \n", + "1070 http://en.wikipedia.org/wiki/2022_Belgian_Gran... 50.4372 5.97139 \n", + "\n", + " locality country date time \n", + "1057 Sakhir Bahrain 2022-03-20 15:00:00Z \n", + "1058 Jeddah Saudi Arabia 2022-03-27 17:00:00Z \n", + "1059 Melbourne Australia 2022-04-10 05:00:00Z \n", + "1060 Imola Italy 2022-04-24 13:00:00Z \n", + "1061 Miami USA 2022-05-08 19:30:00Z \n", + "1062 Montmeló Spain 2022-05-22 13:00:00Z \n", + "1063 Monte-Carlo Monaco 2022-05-29 13:00:00Z \n", + "1064 Baku Azerbaijan 2022-06-12 11:00:00Z \n", + "1065 Montreal Canada 2022-06-19 18:00:00Z \n", + "1066 Silverstone UK 2022-07-03 14:00:00Z \n", + "1067 Spielberg Austria 2022-07-10 13:00:00Z \n", + "1068 Le Castellet France 2022-07-24 13:00:00Z \n", + "1069 Budapest Hungary 2022-07-31 13:00:00Z \n", + "1070 Spa Belgium 2022-08-28 13:00:00Z " + ] + }, + "execution_count": 57, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.query(\"`season` == 2022 and `date` < '2022-09-01'\")" ] @@ -357,9 +2928,54 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 58, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Italy 104\n", + "Germany 79\n", + "UK 77\n", + "USA 73\n", + "Monaco 68\n", + "Belgium 67\n", + "France 63\n", + "Spain 59\n", + "Canada 51\n", + "Brazil 49\n", + "Japan 38\n", + "Austria 37\n", + "Hungary 37\n", + "Australia 36\n", + "Netherlands 32\n", + "South Africa 23\n", + "Mexico 22\n", + "Argentina 20\n", + "Bahrain 19\n", + "Malaysia 19\n", + "Portugal 18\n", + "China 16\n", + "UAE 14\n", + "Singapore 13\n", + "Turkey 9\n", + "Russia 8\n", + "Sweden 6\n", + "Azerbaijan 6\n", + "Switzerland 5\n", + "Korea 4\n", + "India 3\n", + "Saudi Arabia 2\n", + "Morocco 1\n", + "Qatar 1\n", + "Name: country, dtype: int64" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# how many races were held in each country throughout the years?\n", "f1_races.country.value_counts()" @@ -367,9 +2983,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 59, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "2022 22\n", + "2021 22\n", + "2019 21\n", + "2018 21\n", + "2016 21\n", + " ..\n", + "1956 8\n", + "1957 8\n", + "1961 8\n", + "1955 7\n", + "1950 7\n", + "Name: season, Length: 73, dtype: int64" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# how many circuits in each season?\n", "f1_races.season.value_counts()" @@ -377,11 +3015,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 60, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "239" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# how many circuits between 1955 and 1975?" + "# how many circuits between 1955 and 1975?\n", + "f1_races[(f1_races['season'] >= 1955) & ( f1_races['season'] <= 1976)].season.value_counts().sum()" ] }, { @@ -393,9 +3043,160 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 61, "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", + "
numberpositionpositionTextpointsDriverConstructorgridlapsstatusTimeFastestLap
011125{'driverId': 'max_verstappen', 'permanentNumbe...{'constructorId': 'red_bull', 'url': 'http://e...253Finished{'millis': '5402112', 'time': '1:30:02.112'}{'rank': '2', 'lap': '30', 'Time': {'time': '1...
1442218{'driverId': 'hamilton', 'permanentNumber': '4...{'constructorId': 'mercedes', 'url': 'http://e...453Finished{'millis': '5412699', 'time': '+10.587'}{'rank': '4', 'lap': '30', 'Time': {'time': '1...
2633315{'driverId': 'russell', 'permanentNumber': '63...{'constructorId': 'mercedes', 'url': 'http://e...653Finished{'millis': '5418607', 'time': '+16.495'}{'rank': '3', 'lap': '51', 'Time': {'time': '1...
3114412{'driverId': 'perez', 'permanentNumber': '11',...{'constructorId': 'red_bull', 'url': 'http://e...353Finished{'millis': '5419422', 'time': '+17.310'}{'rank': '5', 'lap': '45', 'Time': {'time': '1...
4555511{'driverId': 'sainz', 'permanentNumber': '55',...{'constructorId': 'ferrari', 'url': 'http://en...1953Finished{'millis': '5430984', 'time': '+28.872'}{'rank': '1', 'lap': '51', 'Time': {'time': '1...
\n", + "
" + ], + "text/plain": [ + " number position positionText points \\\n", + "0 1 1 1 25 \n", + "1 44 2 2 18 \n", + "2 63 3 3 15 \n", + "3 11 4 4 12 \n", + "4 55 5 5 11 \n", + "\n", + " Driver \\\n", + "0 {'driverId': 'max_verstappen', 'permanentNumbe... \n", + "1 {'driverId': 'hamilton', 'permanentNumber': '4... \n", + "2 {'driverId': 'russell', 'permanentNumber': '63... \n", + "3 {'driverId': 'perez', 'permanentNumber': '11',... \n", + "4 {'driverId': 'sainz', 'permanentNumber': '55',... \n", + "\n", + " Constructor grid laps status \\\n", + "0 {'constructorId': 'red_bull', 'url': 'http://e... 2 53 Finished \n", + "1 {'constructorId': 'mercedes', 'url': 'http://e... 4 53 Finished \n", + "2 {'constructorId': 'mercedes', 'url': 'http://e... 6 53 Finished \n", + "3 {'constructorId': 'red_bull', 'url': 'http://e... 3 53 Finished \n", + "4 {'constructorId': 'ferrari', 'url': 'http://en... 19 53 Finished \n", + "\n", + " Time \\\n", + "0 {'millis': '5402112', 'time': '1:30:02.112'} \n", + "1 {'millis': '5412699', 'time': '+10.587'} \n", + "2 {'millis': '5418607', 'time': '+16.495'} \n", + "3 {'millis': '5419422', 'time': '+17.310'} \n", + "4 {'millis': '5430984', 'time': '+28.872'} \n", + "\n", + " FastestLap \n", + "0 {'rank': '2', 'lap': '30', 'Time': {'time': '1... \n", + "1 {'rank': '4', 'lap': '30', 'Time': {'time': '1... \n", + "2 {'rank': '3', 'lap': '51', 'Time': {'time': '1... \n", + "3 {'rank': '5', 'lap': '45', 'Time': {'time': '1... \n", + "4 {'rank': '1', 'lap': '51', 'Time': {'time': '1... " + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# analyse a sample\n", "url = 'https://ergast.com/api/f1/2022/12/results.json'\n", @@ -409,9 +3210,158 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 62, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
seasonRounddatecircuit_iddriverDATE_of_birthnationalityconstructorGriDtIMEStatuspointspodium
02022132022-07-31hungaroringmax_verstappen1997-09-30Dutchred_bull105975912.0Finished251
12022132022-07-31hungaroringhamilton1985-01-07Britishmercedes75983746.0Finished192
22022132022-07-31hungaroringrussell1998-02-15Britishmercedes15988249.0Finished153
32022132022-07-31hungaroringsainz1994-09-01Spanishferrari25990491.0Finished124
42022132022-07-31hungaroringperez1990-01-26Mexicanred_bull115991600.0Finished105
\n", + "
" + ], + "text/plain": [ + " season Round date circuit_id driver DATE_of_birth \\\n", + "0 2022 13 2022-07-31 hungaroring max_verstappen 1997-09-30 \n", + "1 2022 13 2022-07-31 hungaroring hamilton 1985-01-07 \n", + "2 2022 13 2022-07-31 hungaroring russell 1998-02-15 \n", + "3 2022 13 2022-07-31 hungaroring sainz 1994-09-01 \n", + "4 2022 13 2022-07-31 hungaroring perez 1990-01-26 \n", + "\n", + " nationality constructor GriD tIME Status points podium \n", + "0 Dutch red_bull 10 5975912.0 Finished 25 1 \n", + "1 British mercedes 7 5983746.0 Finished 19 2 \n", + "2 British mercedes 1 5988249.0 Finished 15 3 \n", + "3 Spanish ferrari 2 5990491.0 Finished 12 4 \n", + "4 Mexican red_bull 11 5991600.0 Finished 10 5 " + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# get the latest race's results\n", "\n", @@ -468,7 +3418,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 63, "metadata": {}, "outputs": [], "source": [ @@ -481,47 +3431,489 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 64, "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", + "
seasonRounddatecircuit_iddriverDATE_of_birthnationalityconstructorGriDtIMEStatuspointspodium
0195011950-05-13silverstonefarina1906-10-30Italianalfa18003600.0Finished9.01
1195011950-05-13silverstonefagioli1898-06-09Italianalfa28006200.0Finished6.02
2195011950-05-13silverstonereg_parnell1911-07-02Britishalfa48055600.0Finished4.03
3195011950-05-13silverstonecabantous1904-10-08Frenchlago6NaN+2 Laps3.04
4195011950-05-13silverstonerosier1905-11-05Frenchlago9NaN+2 Laps2.05
\n", + "
" + ], + "text/plain": [ + " season Round date circuit_id driver DATE_of_birth \\\n", + "0 1950 1 1950-05-13 silverstone farina 1906-10-30 \n", + "1 1950 1 1950-05-13 silverstone fagioli 1898-06-09 \n", + "2 1950 1 1950-05-13 silverstone reg_parnell 1911-07-02 \n", + "3 1950 1 1950-05-13 silverstone cabantous 1904-10-08 \n", + "4 1950 1 1950-05-13 silverstone rosier 1905-11-05 \n", + "\n", + " nationality constructor GriD tIME Status points podium \n", + "0 Italian alfa 1 8003600.0 Finished 9.0 1 \n", + "1 Italian alfa 2 8006200.0 Finished 6.0 2 \n", + "2 British alfa 4 8055600.0 Finished 4.0 3 \n", + "3 French lago 6 NaN +2 Laps 3.0 4 \n", + "4 French lago 9 NaN +2 Laps 2.0 5 " + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_results.head()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 65, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "(25207, 13)" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# find the dimensions (number of rows, number of columns) in the data" + "# find the dimensions (number of rows, number of columns) in the data\n", + "f1_results.shape\n", + "\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 66, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "42" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# calculate summary statistics for nationality and points (median)" + "# calculate summary statistics for nationality and points (median)\n", + "f1_results.nationality.nunique()\n", + "# f1_results.groupby('nationality').points.mean()\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 67, "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", + "
seasonRounddatecircuit_iddriverDATE_of_birthnationalityconstructorGriDtIMEStatuspointspodium
15875199911999-03-07albert_parkirvine1965-11-10Britishferrari65701659.0Finished10.01
15876199911999-03-07albert_parkfrentzen1967-05-18Germanjordan55702686.0Finished6.02
15877199911999-03-07albert_parkralf_schumacher1975-06-30Germanwilliams85708671.0Finished4.03
15878199911999-03-07albert_parkfisichella1973-01-14Italianbenetton75735077.0Finished3.04
15879199911999-03-07albert_parkbarrichello1972-05-23Brazilianstewart45756357.0Finished2.05
..........................................
162221999161999-10-31suzukagene1974-03-29Spanishminardi20NaNGearbox0.018
162231999161999-10-31suzukadamon_hill1960-09-17Britishjordan12NaNPhysical0.019
162241999161999-10-31suzukapanis1966-09-02Frenchprost6NaNAlternator0.020
162251999161999-10-31suzukatrulli1974-07-13Italianprost7NaNEngine0.021
162261999161999-10-31suzukazanardi1966-10-23Italianwilliams8NaNElectrical0.022
\n", + "

352 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " season Round date circuit_id driver DATE_of_birth \\\n", + "15875 1999 1 1999-03-07 albert_park irvine 1965-11-10 \n", + "15876 1999 1 1999-03-07 albert_park frentzen 1967-05-18 \n", + "15877 1999 1 1999-03-07 albert_park ralf_schumacher 1975-06-30 \n", + "15878 1999 1 1999-03-07 albert_park fisichella 1973-01-14 \n", + "15879 1999 1 1999-03-07 albert_park barrichello 1972-05-23 \n", + "... ... ... ... ... ... ... \n", + "16222 1999 16 1999-10-31 suzuka gene 1974-03-29 \n", + "16223 1999 16 1999-10-31 suzuka damon_hill 1960-09-17 \n", + "16224 1999 16 1999-10-31 suzuka panis 1966-09-02 \n", + "16225 1999 16 1999-10-31 suzuka trulli 1974-07-13 \n", + "16226 1999 16 1999-10-31 suzuka zanardi 1966-10-23 \n", + "\n", + " nationality constructor GriD tIME Status points podium \n", + "15875 British ferrari 6 5701659.0 Finished 10.0 1 \n", + "15876 German jordan 5 5702686.0 Finished 6.0 2 \n", + "15877 German williams 8 5708671.0 Finished 4.0 3 \n", + "15878 Italian benetton 7 5735077.0 Finished 3.0 4 \n", + "15879 Brazilian stewart 4 5756357.0 Finished 2.0 5 \n", + "... ... ... ... ... ... ... ... \n", + "16222 Spanish minardi 20 NaN Gearbox 0.0 18 \n", + "16223 British jordan 12 NaN Physical 0.0 19 \n", + "16224 French prost 6 NaN Alternator 0.0 20 \n", + "16225 Italian prost 7 NaN Engine 0.0 21 \n", + "16226 Italian williams 8 NaN Electrical 0.0 22 \n", + "\n", + "[352 rows x 13 columns]" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# isolate the date, race name, driver and constructor for the 1999 season" + "# isolate the date, race name, driver and constructor for the 1999 season\n", + "f1_results[f1_results['season'] == 1999]" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 68, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "prost 12\n", + "hunt 9\n", + "lauda 8\n", + "watson 4\n", + "emerson_fittipaldi 2\n", + "mass 1\n", + "Name: driver, dtype: int64" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# how many wins for McLaren between 1975 and 1985?" + "# how many wins for McLaren between 1975 and 1985?\n", + "f1_results[(f1_results['constructor'] == 'mclaren') & (f1_results['season'] >= 1975) & \n", + "(f1_results['season'] <= 1985) & \n", + "(f1_results['podium'] == 1)].driver.value_counts()" ] }, { @@ -538,9 +3930,20 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 69, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['url'], dtype='object')" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# from the f1_races df, let's remove the url column\n", "mask = f1_races.columns.str.contains('url$', regex=True)\n", @@ -550,9 +3953,133 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 70, "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", + "
seasonroundcircuit_idraceNameLATLONGlocalitycountrydatetime
019501silverstoneBritish Grand Prix52.0786-1.01694SilverstoneUK1950-05-13NaN
119502monacoMonaco Grand Prix43.73477.42056Monte-CarloMonaco1950-05-21NaN
219503indianapolisIndianapolis 50039.7950-86.23470IndianapolisUSA1950-05-30NaN
319504bremgartenSwiss Grand Prix46.95897.40194BernSwitzerland1950-06-04NaN
419505spaBelgian Grand Prix50.43725.97139SpaBelgium1950-06-18NaN
\n", + "
" + ], + "text/plain": [ + " season round circuit_id raceName LAT LONG \\\n", + "0 1950 1 silverstone British Grand Prix 52.0786 -1.01694 \n", + "1 1950 2 monaco Monaco Grand Prix 43.7347 7.42056 \n", + "2 1950 3 indianapolis Indianapolis 500 39.7950 -86.23470 \n", + "3 1950 4 bremgarten Swiss Grand Prix 46.9589 7.40194 \n", + "4 1950 5 spa Belgian Grand Prix 50.4372 5.97139 \n", + "\n", + " locality country date time \n", + "0 Silverstone UK 1950-05-13 NaN \n", + "1 Monte-Carlo Monaco 1950-05-21 NaN \n", + "2 Indianapolis USA 1950-05-30 NaN \n", + "3 Bern Switzerland 1950-06-04 NaN \n", + "4 Spa Belgium 1950-06-18 NaN " + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races = f1_races.drop(columns=columns_to_drop)\n", "f1_races.head()" @@ -560,9 +4087,214 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 71, "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", + "
seasoncircuit_idraceNameLATLONGlocalitycountrydatetime
01950silverstoneBritish Grand Prix52.0786-1.01694SilverstoneUK1950-05-13NaN
11950monacoMonaco Grand Prix43.73477.42056Monte-CarloMonaco1950-05-21NaN
21950indianapolisIndianapolis 50039.7950-86.23470IndianapolisUSA1950-05-30NaN
31950bremgartenSwiss Grand Prix46.95897.40194BernSwitzerland1950-06-04NaN
41950spaBelgian Grand Prix50.43725.97139SpaBelgium1950-06-18NaN
..............................
10742022suzukaJapanese Grand Prix34.8431136.54100SuzukaJapan2022-10-0905:00:00Z
10752022americasUnited States Grand Prix30.1328-97.64110AustinUSA2022-10-2319:00:00Z
10762022rodriguezMexico City Grand Prix19.4042-99.09070Mexico CityMexico2022-10-3020:00:00Z
10772022interlagosBrazilian Grand Prix-23.7036-46.69970São PauloBrazil2022-11-1318:00:00Z
10782022yas_marinaAbu Dhabi Grand Prix24.467254.60310Abu DhabiUAE2022-11-2013:00:00Z
\n", + "

1079 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " season circuit_id raceName LAT LONG \\\n", + "0 1950 silverstone British Grand Prix 52.0786 -1.01694 \n", + "1 1950 monaco Monaco Grand Prix 43.7347 7.42056 \n", + "2 1950 indianapolis Indianapolis 500 39.7950 -86.23470 \n", + "3 1950 bremgarten Swiss Grand Prix 46.9589 7.40194 \n", + "4 1950 spa Belgian Grand Prix 50.4372 5.97139 \n", + "... ... ... ... ... ... \n", + "1074 2022 suzuka Japanese Grand Prix 34.8431 136.54100 \n", + "1075 2022 americas United States Grand Prix 30.1328 -97.64110 \n", + "1076 2022 rodriguez Mexico City Grand Prix 19.4042 -99.09070 \n", + "1077 2022 interlagos Brazilian Grand Prix -23.7036 -46.69970 \n", + "1078 2022 yas_marina Abu Dhabi Grand Prix 24.4672 54.60310 \n", + "\n", + " locality country date time \n", + "0 Silverstone UK 1950-05-13 NaN \n", + "1 Monte-Carlo Monaco 1950-05-21 NaN \n", + "2 Indianapolis USA 1950-05-30 NaN \n", + "3 Bern Switzerland 1950-06-04 NaN \n", + "4 Spa Belgium 1950-06-18 NaN \n", + "... ... ... ... ... \n", + "1074 Suzuka Japan 2022-10-09 05:00:00Z \n", + "1075 Austin USA 2022-10-23 19:00:00Z \n", + "1076 Mexico City Mexico 2022-10-30 20:00:00Z \n", + "1077 São Paulo Brazil 2022-11-13 18:00:00Z \n", + "1078 Abu Dhabi UAE 2022-11-20 13:00:00Z \n", + "\n", + "[1079 rows x 9 columns]" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# another way to do this is to select what we want to keep\n", "mask = f1_races.columns.str.contains('url$|round', regex=True)\n", @@ -571,12 +4303,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 72, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "KeyError", + "evalue": "\"['tIME'] not found in axis\"", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mc:\\python\\github\\bootcamp2022\\2022\\python_workshop\\notebooks\\08_pandas.ipynb Cell 52\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[39m# or simply\u001b[39;00m\n\u001b[1;32m----> 2\u001b[0m f1_races\u001b[39m.\u001b[39;49mdrop(\u001b[39m'\u001b[39;49m\u001b[39mtIME\u001b[39;49m\u001b[39m'\u001b[39;49m, axis\u001b[39m=\u001b[39;49m\u001b[39m1\u001b[39;49m, inplace\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m)\n", + "File \u001b[1;32mc:\\programs\\miniconda3\\lib\\site-packages\\pandas\\util\\_decorators.py:311\u001b[0m, in \u001b[0;36mdeprecate_nonkeyword_arguments..decorate..wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 305\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mlen\u001b[39m(args) \u001b[39m>\u001b[39m num_allow_args:\n\u001b[0;32m 306\u001b[0m warnings\u001b[39m.\u001b[39mwarn(\n\u001b[0;32m 307\u001b[0m msg\u001b[39m.\u001b[39mformat(arguments\u001b[39m=\u001b[39marguments),\n\u001b[0;32m 308\u001b[0m \u001b[39mFutureWarning\u001b[39;00m,\n\u001b[0;32m 309\u001b[0m stacklevel\u001b[39m=\u001b[39mstacklevel,\n\u001b[0;32m 310\u001b[0m )\n\u001b[1;32m--> 311\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs)\n", + "File \u001b[1;32mc:\\programs\\miniconda3\\lib\\site-packages\\pandas\\core\\frame.py:4954\u001b[0m, in \u001b[0;36mDataFrame.drop\u001b[1;34m(self, labels, axis, index, columns, level, inplace, errors)\u001b[0m\n\u001b[0;32m 4806\u001b[0m \u001b[39m@deprecate_nonkeyword_arguments\u001b[39m(version\u001b[39m=\u001b[39m\u001b[39mNone\u001b[39;00m, allowed_args\u001b[39m=\u001b[39m[\u001b[39m\"\u001b[39m\u001b[39mself\u001b[39m\u001b[39m\"\u001b[39m, \u001b[39m\"\u001b[39m\u001b[39mlabels\u001b[39m\u001b[39m\"\u001b[39m])\n\u001b[0;32m 4807\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdrop\u001b[39m(\n\u001b[0;32m 4808\u001b[0m \u001b[39mself\u001b[39m,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 4815\u001b[0m errors: \u001b[39mstr\u001b[39m \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mraise\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[0;32m 4816\u001b[0m ):\n\u001b[0;32m 4817\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[0;32m 4818\u001b[0m \u001b[39m Drop specified labels from rows or columns.\u001b[39;00m\n\u001b[0;32m 4819\u001b[0m \n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 4952\u001b[0m \u001b[39m weight 1.0 0.8\u001b[39;00m\n\u001b[0;32m 4953\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m-> 4954\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39msuper\u001b[39;49m()\u001b[39m.\u001b[39;49mdrop(\n\u001b[0;32m 4955\u001b[0m labels\u001b[39m=\u001b[39;49mlabels,\n\u001b[0;32m 4956\u001b[0m axis\u001b[39m=\u001b[39;49maxis,\n\u001b[0;32m 4957\u001b[0m index\u001b[39m=\u001b[39;49mindex,\n\u001b[0;32m 4958\u001b[0m columns\u001b[39m=\u001b[39;49mcolumns,\n\u001b[0;32m 4959\u001b[0m level\u001b[39m=\u001b[39;49mlevel,\n\u001b[0;32m 4960\u001b[0m inplace\u001b[39m=\u001b[39;49minplace,\n\u001b[0;32m 4961\u001b[0m errors\u001b[39m=\u001b[39;49merrors,\n\u001b[0;32m 4962\u001b[0m )\n", + "File \u001b[1;32mc:\\programs\\miniconda3\\lib\\site-packages\\pandas\\core\\generic.py:4267\u001b[0m, in \u001b[0;36mNDFrame.drop\u001b[1;34m(self, labels, axis, index, columns, level, inplace, errors)\u001b[0m\n\u001b[0;32m 4265\u001b[0m \u001b[39mfor\u001b[39;00m axis, labels \u001b[39min\u001b[39;00m axes\u001b[39m.\u001b[39mitems():\n\u001b[0;32m 4266\u001b[0m \u001b[39mif\u001b[39;00m labels \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m-> 4267\u001b[0m obj \u001b[39m=\u001b[39m obj\u001b[39m.\u001b[39;49m_drop_axis(labels, axis, level\u001b[39m=\u001b[39;49mlevel, errors\u001b[39m=\u001b[39;49merrors)\n\u001b[0;32m 4269\u001b[0m \u001b[39mif\u001b[39;00m inplace:\n\u001b[0;32m 4270\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_update_inplace(obj)\n", + "File \u001b[1;32mc:\\programs\\miniconda3\\lib\\site-packages\\pandas\\core\\generic.py:4311\u001b[0m, in \u001b[0;36mNDFrame._drop_axis\u001b[1;34m(self, labels, axis, level, errors, consolidate, only_slice)\u001b[0m\n\u001b[0;32m 4309\u001b[0m new_axis \u001b[39m=\u001b[39m axis\u001b[39m.\u001b[39mdrop(labels, level\u001b[39m=\u001b[39mlevel, errors\u001b[39m=\u001b[39merrors)\n\u001b[0;32m 4310\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m-> 4311\u001b[0m new_axis \u001b[39m=\u001b[39m axis\u001b[39m.\u001b[39;49mdrop(labels, errors\u001b[39m=\u001b[39;49merrors)\n\u001b[0;32m 4312\u001b[0m indexer \u001b[39m=\u001b[39m axis\u001b[39m.\u001b[39mget_indexer(new_axis)\n\u001b[0;32m 4314\u001b[0m \u001b[39m# Case for non-unique axis\u001b[39;00m\n\u001b[0;32m 4315\u001b[0m \u001b[39melse\u001b[39;00m:\n", + "File \u001b[1;32mc:\\programs\\miniconda3\\lib\\site-packages\\pandas\\core\\indexes\\base.py:6644\u001b[0m, in \u001b[0;36mIndex.drop\u001b[1;34m(self, labels, errors)\u001b[0m\n\u001b[0;32m 6642\u001b[0m \u001b[39mif\u001b[39;00m mask\u001b[39m.\u001b[39many():\n\u001b[0;32m 6643\u001b[0m \u001b[39mif\u001b[39;00m errors \u001b[39m!=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39mignore\u001b[39m\u001b[39m\"\u001b[39m:\n\u001b[1;32m-> 6644\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mKeyError\u001b[39;00m(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mlist\u001b[39m(labels[mask])\u001b[39m}\u001b[39;00m\u001b[39m not found in axis\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 6645\u001b[0m indexer \u001b[39m=\u001b[39m indexer[\u001b[39m~\u001b[39mmask]\n\u001b[0;32m 6646\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdelete(indexer)\n", + "\u001b[1;31mKeyError\u001b[0m: \"['tIME'] not found in axis\"" + ] + } + ], "source": [ "# or simply\n", - "f1_races.drop('time', axis=1, inplace=True)" + "f1_races.drop('tIME', axis=1, inplace=True)" ] }, { @@ -591,7 +4340,20 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['season', 'round', 'circuit_id', 'race_name', 'LAT', 'LONG', 'locality',\n", + " 'country', 'date'],\n", + " dtype='object')" + ] + }, + "execution_count": 131, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.rename(\n", " columns={\n", @@ -614,7 +4376,27 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "season int64\n", + "round int64\n", + "circuit_id object\n", + "race_name object\n", + "LAT float64\n", + "LONG float64\n", + "locality object\n", + "country object\n", + "date object\n", + "dtype: object" + ] + }, + "execution_count": 132, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.dtypes" ] @@ -623,7 +4405,27 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "season int64\n", + "round int64\n", + "circuit_id object\n", + "race_name object\n", + "LAT float64\n", + "LONG float64\n", + "locality object\n", + "country object\n", + "date datetime64[ns]\n", + "dtype: object" + ] + }, + "execution_count": 133, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# date should be stored as datetime!\n", "f1_races.loc[:, ['date']] = f1_races.loc[:, ['date']].apply(pd.to_datetime)\n", @@ -634,7 +4436,19 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "date datetime64[ns]\n", + "dtype: object" + ] + }, + "execution_count": 134, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# or\n", "f1_races.loc[:, ['date']].astype({'date': 'datetime64[ns]'}).dtypes" @@ -670,7 +4484,131 @@ "cell_type": "code", "execution_count": null, "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", + "
seasonroundcircuit_idrace_nameLATLONGlocalitycountrydaterace_month
019501silverstoneBritish Grand Prix52.0786-1.01694SilverstoneUK1950-05-13May
119502monacoMonaco Grand Prix43.73477.42056Monte-CarloMonaco1950-05-21May
219503indianapolisIndianapolis 50039.7950-86.23470IndianapolisUSA1950-05-30May
319504bremgartenSwiss Grand Prix46.95897.40194BernSwitzerland1950-06-04June
419505spaBelgian Grand Prix50.43725.97139SpaBelgium1950-06-18June
\n", + "
" + ], + "text/plain": [ + " season round circuit_id race_name LAT LONG \\\n", + "0 1950 1 silverstone British Grand Prix 52.0786 -1.01694 \n", + "1 1950 2 monaco Monaco Grand Prix 43.7347 7.42056 \n", + "2 1950 3 indianapolis Indianapolis 500 39.7950 -86.23470 \n", + "3 1950 4 bremgarten Swiss Grand Prix 46.9589 7.40194 \n", + "4 1950 5 spa Belgian Grand Prix 50.4372 5.97139 \n", + "\n", + " locality country date race_month \n", + "0 Silverstone UK 1950-05-13 May \n", + "1 Monte-Carlo Monaco 1950-05-21 May \n", + "2 Indianapolis USA 1950-05-30 May \n", + "3 Bern Switzerland 1950-06-04 June \n", + "4 Spa Belgium 1950-06-18 June " + ] + }, + "execution_count": 136, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.head()" ] @@ -686,7 +4624,131 @@ "cell_type": "code", "execution_count": null, "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", + "
seasonroundcircuit_idrace_nameLATLONGlocalitycountrydaterace_month
102220205silverstone70th Anniversary Grand Prix52.0786-1.01694SilverstoneUK2020-08-09August
819200917yas_marinaAbu Dhabi Grand Prix24.467254.60310Abu DhabiUAE2009-11-01November
838201019yas_marinaAbu Dhabi Grand Prix24.467254.60310Abu DhabiUAE2010-11-14November
856201118yas_marinaAbu Dhabi Grand Prix24.467254.60310Abu DhabiUAE2011-11-13November
875201218yas_marinaAbu Dhabi Grand Prix24.467254.60310Abu DhabiUAE2012-11-04November
\n", + "
" + ], + "text/plain": [ + " season round circuit_id race_name LAT \\\n", + "1022 2020 5 silverstone 70th Anniversary Grand Prix 52.0786 \n", + "819 2009 17 yas_marina Abu Dhabi Grand Prix 24.4672 \n", + "838 2010 19 yas_marina Abu Dhabi Grand Prix 24.4672 \n", + "856 2011 18 yas_marina Abu Dhabi Grand Prix 24.4672 \n", + "875 2012 18 yas_marina Abu Dhabi Grand Prix 24.4672 \n", + "\n", + " LONG locality country date race_month \n", + "1022 -1.01694 Silverstone UK 2020-08-09 August \n", + "819 54.60310 Abu Dhabi UAE 2009-11-01 November \n", + "838 54.60310 Abu Dhabi UAE 2010-11-14 November \n", + "856 54.60310 Abu Dhabi UAE 2011-11-13 November \n", + "875 54.60310 Abu Dhabi UAE 2012-11-04 November " + ] + }, + "execution_count": 140, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.sort_values(['race_name', 'date'], ascending=[False, True]).head()\n" ] @@ -695,7 +4757,101 @@ "cell_type": "code", "execution_count": null, "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", + "
seasonroundcircuit_idrace_nameLATLONGlocalitycountrydaterace_month
1078202222yas_marinaAbu Dhabi Grand Prix24.467254.6031Abu DhabiUAE2022-11-20November
1077202221interlagosBrazilian Grand Prix-23.7036-46.6997São PauloBrazil2022-11-13November
1076202220rodriguezMexico City Grand Prix19.4042-99.0907Mexico CityMexico2022-10-30October
\n", + "
" + ], + "text/plain": [ + " season round circuit_id race_name LAT LONG \\\n", + "1078 2022 22 yas_marina Abu Dhabi Grand Prix 24.4672 54.6031 \n", + "1077 2022 21 interlagos Brazilian Grand Prix -23.7036 -46.6997 \n", + "1076 2022 20 rodriguez Mexico City Grand Prix 19.4042 -99.0907 \n", + "\n", + " locality country date race_month \n", + "1078 Abu Dhabi UAE 2022-11-20 November \n", + "1077 São Paulo Brazil 2022-11-13 November \n", + "1076 Mexico City Mexico 2022-10-30 October " + ] + }, + "execution_count": 141, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.nlargest(3, 'date')" ] @@ -704,7 +4860,101 @@ "cell_type": "code", "execution_count": null, "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", + "
seasonroundcircuit_idrace_nameLATLONGlocalitycountrydaterace_month
019501silverstoneBritish Grand Prix52.0786-1.01694SilverstoneUK1950-05-13May
119502monacoMonaco Grand Prix43.73477.42056Monte-CarloMonaco1950-05-21May
219503indianapolisIndianapolis 50039.7950-86.23470IndianapolisUSA1950-05-30May
\n", + "
" + ], + "text/plain": [ + " season round circuit_id race_name LAT LONG \\\n", + "0 1950 1 silverstone British Grand Prix 52.0786 -1.01694 \n", + "1 1950 2 monaco Monaco Grand Prix 43.7347 7.42056 \n", + "2 1950 3 indianapolis Indianapolis 500 39.7950 -86.23470 \n", + "\n", + " locality country date race_month \n", + "0 Silverstone UK 1950-05-13 May \n", + "1 Monte-Carlo Monaco 1950-05-21 May \n", + "2 Indianapolis USA 1950-05-30 May " + ] + }, + "execution_count": 142, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.nsmallest(3, 'date')\n" ] @@ -724,7 +4974,111 @@ "cell_type": "code", "execution_count": null, "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", + "
seasonroundcircuit_idrace_nameLATLONGlocalitycountryrace_month
date
1950-05-1319501silverstoneBritish Grand Prix52.0786-1.01694SilverstoneUKMay
1950-05-2119502monacoMonaco Grand Prix43.73477.42056Monte-CarloMonacoMay
1950-05-3019503indianapolisIndianapolis 50039.7950-86.23470IndianapolisUSAMay
\n", + "
" + ], + "text/plain": [ + " season round circuit_id race_name LAT \\\n", + "date \n", + "1950-05-13 1950 1 silverstone British Grand Prix 52.0786 \n", + "1950-05-21 1950 2 monaco Monaco Grand Prix 43.7347 \n", + "1950-05-30 1950 3 indianapolis Indianapolis 500 39.7950 \n", + "\n", + " LONG locality country race_month \n", + "date \n", + "1950-05-13 -1.01694 Silverstone UK May \n", + "1950-05-21 7.42056 Monte-Carlo Monaco May \n", + "1950-05-30 -86.23470 Indianapolis USA May " + ] + }, + "execution_count": 143, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.set_index('date', inplace=True)\n", "f1_races.head(3)" @@ -734,7 +5088,139 @@ "cell_type": "code", "execution_count": null, "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", + "
seasonroundcircuit_idrace_nameLATLONGlocalitycountryrace_month
date
2022-11-20202222yas_marinaAbu Dhabi Grand Prix24.467254.6031Abu DhabiUAENovember
2022-11-13202221interlagosBrazilian Grand Prix-23.7036-46.6997São PauloBrazilNovember
2022-10-30202220rodriguezMexico City Grand Prix19.4042-99.0907Mexico CityMexicoOctober
2022-10-23202219americasUnited States Grand Prix30.1328-97.6411AustinUSAOctober
2022-10-09202218suzukaJapanese Grand Prix34.8431136.5410SuzukaJapanOctober
\n", + "
" + ], + "text/plain": [ + " season round circuit_id race_name LAT \\\n", + "date \n", + "2022-11-20 2022 22 yas_marina Abu Dhabi Grand Prix 24.4672 \n", + "2022-11-13 2022 21 interlagos Brazilian Grand Prix -23.7036 \n", + "2022-10-30 2022 20 rodriguez Mexico City Grand Prix 19.4042 \n", + "2022-10-23 2022 19 americas United States Grand Prix 30.1328 \n", + "2022-10-09 2022 18 suzuka Japanese Grand Prix 34.8431 \n", + "\n", + " LONG locality country race_month \n", + "date \n", + "2022-11-20 54.6031 Abu Dhabi UAE November \n", + "2022-11-13 -46.6997 São Paulo Brazil November \n", + "2022-10-30 -99.0907 Mexico City Mexico October \n", + "2022-10-23 -97.6411 Austin USA October \n", + "2022-10-09 136.5410 Suzuka Japan October " + ] + }, + "execution_count": 144, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.sort_index(inplace=True, ascending=False)\n", "f1_races.head()" @@ -753,7 +5239,125 @@ "cell_type": "code", "execution_count": null, "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", + "
seasonroundcircuit_idrace_nameLATLONGlocalitycountryrace_month
date
2022-11-20202222yas_marinaAbu Dhabi Grand Prix24.467254.6031Abu DhabiUAENovember
2022-11-13202221interlagosBrazilian Grand Prix-23.7036-46.6997São PauloBrazilNovember
2022-10-30202220rodriguezMexico City Grand Prix19.4042-99.0907Mexico CityMexicoOctober
2022-10-23202219americasUnited States Grand Prix30.1328-97.6411AustinUSAOctober
\n", + "
" + ], + "text/plain": [ + " season round circuit_id race_name LAT \\\n", + "date \n", + "2022-11-20 2022 22 yas_marina Abu Dhabi Grand Prix 24.4672 \n", + "2022-11-13 2022 21 interlagos Brazilian Grand Prix -23.7036 \n", + "2022-10-30 2022 20 rodriguez Mexico City Grand Prix 19.4042 \n", + "2022-10-23 2022 19 americas United States Grand Prix 30.1328 \n", + "\n", + " LONG locality country race_month \n", + "date \n", + "2022-11-20 54.6031 Abu Dhabi UAE November \n", + "2022-11-13 -46.6997 São Paulo Brazil November \n", + "2022-10-30 -99.0907 Mexico City Mexico October \n", + "2022-10-23 -97.6411 Austin USA October " + ] + }, + "execution_count": 145, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races['2022-10-23':'2022-11-20']\n" ] @@ -762,7 +5366,27 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "season 2022\n", + "round 20\n", + "circuit_id rodriguez\n", + "race_name Mexico City Grand Prix\n", + "LAT 19.4042\n", + "LONG -99.0907\n", + "locality Mexico City\n", + "country Mexico\n", + "race_month October\n", + "Name: 2022-10-30 00:00:00, dtype: object" + ] + }, + "execution_count": 146, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# when not specifying a range\n", "f1_races.loc['2022-10-30']" @@ -772,7 +5396,139 @@ "cell_type": "code", "execution_count": null, "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", + "
seasonroundcircuit_idrace_nameLATLONGlocalitycountryrace_month
date
1950-05-1319501silverstoneBritish Grand Prix52.0786-1.01694SilverstoneUKMay
1950-05-2119502monacoMonaco Grand Prix43.73477.42056Monte-CarloMonacoMay
1950-05-3019503indianapolisIndianapolis 50039.7950-86.23470IndianapolisUSAMay
1950-06-0419504bremgartenSwiss Grand Prix46.95897.40194BernSwitzerlandJune
1950-06-1819505spaBelgian Grand Prix50.43725.97139SpaBelgiumJune
\n", + "
" + ], + "text/plain": [ + " season round circuit_id race_name LAT \\\n", + "date \n", + "1950-05-13 1950 1 silverstone British Grand Prix 52.0786 \n", + "1950-05-21 1950 2 monaco Monaco Grand Prix 43.7347 \n", + "1950-05-30 1950 3 indianapolis Indianapolis 500 39.7950 \n", + "1950-06-04 1950 4 bremgarten Swiss Grand Prix 46.9589 \n", + "1950-06-18 1950 5 spa Belgian Grand Prix 50.4372 \n", + "\n", + " LONG locality country race_month \n", + "date \n", + "1950-05-13 -1.01694 Silverstone UK May \n", + "1950-05-21 7.42056 Monte-Carlo Monaco May \n", + "1950-05-30 -86.23470 Indianapolis USA May \n", + "1950-06-04 7.40194 Bern Switzerland June \n", + "1950-06-18 5.97139 Spa Belgium June " + ] + }, + "execution_count": 147, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.sort_index(inplace=True, ascending=True)\n", "f1_races.head()" @@ -789,7 +5545,131 @@ "cell_type": "code", "execution_count": null, "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", + "
dateseasonroundcircuit_idrace_nameLATLONGlocalitycountryrace_month
01950-05-1319501silverstoneBritish Grand Prix52.0786-1.01694SilverstoneUKMay
11950-05-2119502monacoMonaco Grand Prix43.73477.42056Monte-CarloMonacoMay
21950-05-3019503indianapolisIndianapolis 50039.7950-86.23470IndianapolisUSAMay
31950-06-0419504bremgartenSwiss Grand Prix46.95897.40194BernSwitzerlandJune
41950-06-1819505spaBelgian Grand Prix50.43725.97139SpaBelgiumJune
\n", + "
" + ], + "text/plain": [ + " date season round circuit_id race_name LAT \\\n", + "0 1950-05-13 1950 1 silverstone British Grand Prix 52.0786 \n", + "1 1950-05-21 1950 2 monaco Monaco Grand Prix 43.7347 \n", + "2 1950-05-30 1950 3 indianapolis Indianapolis 500 39.7950 \n", + "3 1950-06-04 1950 4 bremgarten Swiss Grand Prix 46.9589 \n", + "4 1950-06-18 1950 5 spa Belgian Grand Prix 50.4372 \n", + "\n", + " LONG locality country race_month \n", + "0 -1.01694 Silverstone UK May \n", + "1 7.42056 Monte-Carlo Monaco May \n", + "2 -86.23470 Indianapolis USA May \n", + "3 7.40194 Bern Switzerland June \n", + "4 5.97139 Spa Belgium June " + ] + }, + "execution_count": 148, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.reset_index(inplace=True)\n", "f1_races.head()" @@ -806,7 +5686,131 @@ "cell_type": "code", "execution_count": null, "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", + "
dateseasonroundcircuit_idrace_namelatlonglocalitycountryrace_month
01950-05-1319501silverstoneBritish Grand Prix52.0786-1.01694SilverstoneUKMay
11950-05-2119502monacoMonaco Grand Prix43.73477.42056Monte-CarloMonacoMay
21950-05-3019503indianapolisIndianapolis 50039.7950-86.23470IndianapolisUSAMay
31950-06-0419504bremgartenSwiss Grand Prix46.95897.40194BernSwitzerlandJune
41950-06-1819505spaBelgian Grand Prix50.43725.97139SpaBelgiumJune
\n", + "
" + ], + "text/plain": [ + " date season round circuit_id race_name lat \\\n", + "0 1950-05-13 1950 1 silverstone British Grand Prix 52.0786 \n", + "1 1950-05-21 1950 2 monaco Monaco Grand Prix 43.7347 \n", + "2 1950-05-30 1950 3 indianapolis Indianapolis 500 39.7950 \n", + "3 1950-06-04 1950 4 bremgarten Swiss Grand Prix 46.9589 \n", + "4 1950-06-18 1950 5 spa Belgian Grand Prix 50.4372 \n", + "\n", + " long locality country race_month \n", + "0 -1.01694 Silverstone UK May \n", + "1 7.42056 Monte-Carlo Monaco May \n", + "2 -86.23470 Indianapolis USA May \n", + "3 7.40194 Bern Switzerland June \n", + "4 5.97139 Spa Belgium June " + ] + }, + "execution_count": 149, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# lowercase all column names so the dataset is easier to work with\n", "f1_races = f1_races.rename(columns=lambda x: x.lower())\n", @@ -853,7 +5857,30 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 151, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/svg+xml": "\n\n\n \n \n \n \n 2022-08-02T12:40:46.607103\n image/svg+xml\n \n \n Matplotlib v3.5.2, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "# the plot() method will generate line plots for all numeric columns by default\n", "f1_races.plot(title='not very helpful', ylabel='year', alpha=1)" @@ -870,7 +5897,131 @@ "cell_type": "code", "execution_count": null, "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", + "
dateseasonroundcircuit_idrace_namelatlonglocalitycountryrace_month
01950-05-1319501silverstoneBritish Grand Prix52.0786-1.01694SilverstoneUKMay
11950-05-2119502monacoMonaco Grand Prix43.73477.42056Monte-CarloMonacoMay
21950-05-3019503indianapolisIndianapolis 50039.7950-86.23470IndianapolisUSAMay
31950-06-0419504bremgartenSwiss Grand Prix46.95897.40194BernSwitzerlandJune
41950-06-1819505spaBelgian Grand Prix50.43725.97139SpaBelgiumJune
\n", + "
" + ], + "text/plain": [ + " date season round circuit_id race_name lat \\\n", + "0 1950-05-13 1950 1 silverstone British Grand Prix 52.0786 \n", + "1 1950-05-21 1950 2 monaco Monaco Grand Prix 43.7347 \n", + "2 1950-05-30 1950 3 indianapolis Indianapolis 500 39.7950 \n", + "3 1950-06-04 1950 4 bremgarten Swiss Grand Prix 46.9589 \n", + "4 1950-06-18 1950 5 spa Belgian Grand Prix 50.4372 \n", + "\n", + " long locality country race_month \n", + "0 -1.01694 Silverstone UK May \n", + "1 7.42056 Monte-Carlo Monaco May \n", + "2 -86.23470 Indianapolis USA May \n", + "3 7.40194 Bern Switzerland June \n", + "4 5.97139 Spa Belgium June " + ] + }, + "execution_count": 152, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.head()" ] @@ -879,7 +6030,224 @@ "cell_type": "code", "execution_count": null, "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", + "
dateseasonroundcircuit_idrace_namelatlonglocalitycountryrace_month
9752017-11-26201720yas_marinaAbu Dhabi Grand Prix24.467254.6031Abu DhabiUAENovember
9762018-03-2520181albert_parkAustralian Grand Prix-37.8497144.9680MelbourneAustraliaMarch
9772018-04-0820182bahrainBahrain Grand Prix26.032550.5106SakhirBahrainApril
9782018-04-1520183shanghaiChinese Grand Prix31.3389121.2200ShanghaiChinaApril
9792018-04-2920184bakuAzerbaijan Grand Prix40.372549.8533BakuAzerbaijanApril
.................................
10742022-10-09202218suzukaJapanese Grand Prix34.8431136.5410SuzukaJapanOctober
10752022-10-23202219americasUnited States Grand Prix30.1328-97.6411AustinUSAOctober
10762022-10-30202220rodriguezMexico City Grand Prix19.4042-99.0907Mexico CityMexicoOctober
10772022-11-13202221interlagosBrazilian Grand Prix-23.7036-46.6997São PauloBrazilNovember
10782022-11-20202222yas_marinaAbu Dhabi Grand Prix24.467254.6031Abu DhabiUAENovember
\n", + "

104 rows × 10 columns

\n", + "
" + ], + "text/plain": [ + " date season round circuit_id race_name \\\n", + "975 2017-11-26 2017 20 yas_marina Abu Dhabi Grand Prix \n", + "976 2018-03-25 2018 1 albert_park Australian Grand Prix \n", + "977 2018-04-08 2018 2 bahrain Bahrain Grand Prix \n", + "978 2018-04-15 2018 3 shanghai Chinese Grand Prix \n", + "979 2018-04-29 2018 4 baku Azerbaijan Grand Prix \n", + "... ... ... ... ... ... \n", + "1074 2022-10-09 2022 18 suzuka Japanese Grand Prix \n", + "1075 2022-10-23 2022 19 americas United States Grand Prix \n", + "1076 2022-10-30 2022 20 rodriguez Mexico City Grand Prix \n", + "1077 2022-11-13 2022 21 interlagos Brazilian Grand Prix \n", + "1078 2022-11-20 2022 22 yas_marina Abu Dhabi Grand Prix \n", + "\n", + " lat long locality country race_month \n", + "975 24.4672 54.6031 Abu Dhabi UAE November \n", + "976 -37.8497 144.9680 Melbourne Australia March \n", + "977 26.0325 50.5106 Sakhir Bahrain April \n", + "978 31.3389 121.2200 Shanghai China April \n", + "979 40.3725 49.8533 Baku Azerbaijan April \n", + "... ... ... ... ... ... \n", + "1074 34.8431 136.5410 Suzuka Japan October \n", + "1075 30.1328 -97.6411 Austin USA October \n", + "1076 19.4042 -99.0907 Mexico City Mexico October \n", + "1077 -23.7036 -46.6997 São Paulo Brazil November \n", + "1078 24.4672 54.6031 Abu Dhabi UAE November \n", + "\n", + "[104 rows x 10 columns]" + ] + }, + "execution_count": 153, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "f1_races.tail(104)" ] @@ -888,7 +6256,148 @@ "cell_type": "code", "execution_count": null, "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", + "
season20182019202020212022
race_month_order
31.02.0NaN1.02.0
43.02.0NaN1.02.0
52.02.0NaN3.03.0
62.03.0NaN3.02.0
74.02.03.02.04.0
81.01.04.02.01.0
93.04.03.03.02.0
103.02.02.02.04.0
112.02.03.03.02.0
12NaN1.02.02.0NaN
\n", + "
" + ], + "text/plain": [ + "season 2018 2019 2020 2021 2022\n", + "race_month_order \n", + "3 1.0 2.0 NaN 1.0 2.0\n", + "4 3.0 2.0 NaN 1.0 2.0\n", + "5 2.0 2.0 NaN 3.0 3.0\n", + "6 2.0 3.0 NaN 3.0 2.0\n", + "7 4.0 2.0 3.0 2.0 4.0\n", + "8 1.0 1.0 4.0 2.0 1.0\n", + "9 3.0 4.0 3.0 3.0 2.0\n", + "10 3.0 2.0 2.0 2.0 4.0\n", + "11 2.0 2.0 3.0 3.0 2.0\n", + "12 NaN 1.0 2.0 2.0 NaN" + ] + }, + "execution_count": 154, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# bar plots would be more useful for this dataset\n", "f1_races.set_index('date', inplace=True)\n", @@ -905,7 +6414,30 @@ "cell_type": "code", "execution_count": null, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 155, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/svg+xml": "\n\n\n \n \n \n \n 2022-08-02T12:43:51.149324\n image/svg+xml\n \n \n Matplotlib v3.5.2, https://matplotlib.org/\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "ax = plot_data.plot(\n", " kind='bar', rot=0, xlabel='', ylabel='rounds',\n", @@ -926,58 +6458,779 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 86, "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", + "
seasonrounddatecircuit_iddriverdate_of_birthnationalityconstructorgridtimestatuspointspodium
0195011950-05-13silverstonefarina1906-10-30Italianalfa18003600.0Finished9.01
1195011950-05-13silverstonefagioli1898-06-09Italianalfa28006200.0Finished6.02
2195011950-05-13silverstonereg_parnell1911-07-02Britishalfa48055600.0Finished4.03
3195011950-05-13silverstonecabantous1904-10-08Frenchlago6NaN+2 Laps3.04
4195011950-05-13silverstonerosier1905-11-05Frenchlago9NaN+2 Laps2.05
..........................................
252022022132022-07-31hungaroringkevin_magnussen1992-10-05Danishhaas13NaN+1 Lap0.016
252032022132022-07-31hungaroringalbon1996-03-23Thaiwilliams17NaN+1 Lap0.017
252042022132022-07-31hungaroringlatifi1995-06-29Canadianwilliams19NaN+1 Lap0.018
252052022132022-07-31hungaroringtsunoda2000-05-11Japanesealphatauri16NaN+2 Laps0.019
252062022132022-07-31hungaroringbottas1989-08-28Finnishalfa8NaNPower Unit0.020
\n", + "

25207 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " season round date circuit_id driver date_of_birth \\\n", + "0 1950 1 1950-05-13 silverstone farina 1906-10-30 \n", + "1 1950 1 1950-05-13 silverstone fagioli 1898-06-09 \n", + "2 1950 1 1950-05-13 silverstone reg_parnell 1911-07-02 \n", + "3 1950 1 1950-05-13 silverstone cabantous 1904-10-08 \n", + "4 1950 1 1950-05-13 silverstone rosier 1905-11-05 \n", + "... ... ... ... ... ... ... \n", + "25202 2022 13 2022-07-31 hungaroring kevin_magnussen 1992-10-05 \n", + "25203 2022 13 2022-07-31 hungaroring albon 1996-03-23 \n", + "25204 2022 13 2022-07-31 hungaroring latifi 1995-06-29 \n", + "25205 2022 13 2022-07-31 hungaroring tsunoda 2000-05-11 \n", + "25206 2022 13 2022-07-31 hungaroring bottas 1989-08-28 \n", + "\n", + " nationality constructor grid time status points podium \n", + "0 Italian alfa 1 8003600.0 Finished 9.0 1 \n", + "1 Italian alfa 2 8006200.0 Finished 6.0 2 \n", + "2 British alfa 4 8055600.0 Finished 4.0 3 \n", + "3 French lago 6 NaN +2 Laps 3.0 4 \n", + "4 French lago 9 NaN +2 Laps 2.0 5 \n", + "... ... ... ... ... ... ... ... \n", + "25202 Danish haas 13 NaN +1 Lap 0.0 16 \n", + "25203 Thai williams 17 NaN +1 Lap 0.0 17 \n", + "25204 Canadian williams 19 NaN +1 Lap 0.0 18 \n", + "25205 Japanese alphatauri 16 NaN +2 Laps 0.0 19 \n", + "25206 Finnish alfa 8 NaN Power Unit 0.0 20 \n", + "\n", + "[25207 rows x 13 columns]" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# first, clean up the data in the f1_results dataframe\n", "\n", - "# lowercase all the columns so that they are easier to use" + "# lowercase all the columns so that they are easier to use\n", + "f1_results = f1_results.rename(columns=lambda x: x.lower())\n", + "f1_results" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 87, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['season', 'round', 'date', 'circuit_id', 'driver', 'date_of_birth',\n", + " 'nationality', 'constructor', 'grid', 'time', 'status', 'points',\n", + " 'podium'],\n", + " dtype='object')" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# what columns are in this dataset?" + "# what columns are in this dataset?\n", + "f1_results.columns" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 88, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "832" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# how many distinct drivers are in the dataset?" + "# how many distinct drivers are in the dataset?\n", + "distinct = f1_results.driver.nunique()\n", + "distinct" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 89, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "15" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# which of those drivers are Austrian?" + "# which of those drivers are Austrian?\n", + "f1_results[f1_results['nationality'] == 'Austrian'].driver.nunique()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 90, "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
seasonrounddatecircuit_iddriverdate_of_birthnationalityconstructorgridtimestatuspointspodium
251872022132022-07-31hungaroringmax_verstappen1997-09-30Dutchred_bull105975912.0Finished25.01
251882022132022-07-31hungaroringhamilton1985-01-07Britishmercedes75983746.0Finished19.02
251892022132022-07-31hungaroringrussell1998-02-15Britishmercedes15988249.0Finished15.03
251902022132022-07-31hungaroringsainz1994-09-01Spanishferrari25990491.0Finished12.04
251912022132022-07-31hungaroringperez1990-01-26Mexicanred_bull115991600.0Finished10.05
251922022132022-07-31hungaroringleclerc1997-10-16Monegasqueferrari35991959.0Finished8.06
251932022132022-07-31hungaroringnorris1999-11-13Britishmclaren46054212.0Finished6.07
251942022132022-07-31hungaroringalonso1981-07-29Spanishalpine6NaN+1 Lap4.08
251952022132022-07-31hungaroringocon1996-09-17Frenchalpine5NaN+1 Lap2.09
251962022132022-07-31hungaroringvettel1987-07-03Germanaston_martin18NaN+1 Lap1.010
251972022132022-07-31hungaroringstroll1998-10-29Canadianaston_martin14NaN+1 Lap0.011
251982022132022-07-31hungaroringgasly1996-02-07Frenchalphatauri20NaN+1 Lap0.012
251992022132022-07-31hungaroringzhou1999-05-30Chinesealfa12NaN+1 Lap0.013
252002022132022-07-31hungaroringmick_schumacher1999-03-22Germanhaas15NaN+1 Lap0.014
252012022132022-07-31hungaroringricciardo1989-07-01Australianmclaren9NaN+1 Lap0.015
252022022132022-07-31hungaroringkevin_magnussen1992-10-05Danishhaas13NaN+1 Lap0.016
252032022132022-07-31hungaroringalbon1996-03-23Thaiwilliams17NaN+1 Lap0.017
252042022132022-07-31hungaroringlatifi1995-06-29Canadianwilliams19NaN+1 Lap0.018
252052022132022-07-31hungaroringtsunoda2000-05-11Japanesealphatauri16NaN+2 Laps0.019
252062022132022-07-31hungaroringbottas1989-08-28Finnishalfa8NaNPower Unit0.020
\n", + "
" + ], + "text/plain": [ + " season round date circuit_id driver date_of_birth \\\n", + "25187 2022 13 2022-07-31 hungaroring max_verstappen 1997-09-30 \n", + "25188 2022 13 2022-07-31 hungaroring hamilton 1985-01-07 \n", + "25189 2022 13 2022-07-31 hungaroring russell 1998-02-15 \n", + "25190 2022 13 2022-07-31 hungaroring sainz 1994-09-01 \n", + "25191 2022 13 2022-07-31 hungaroring perez 1990-01-26 \n", + "25192 2022 13 2022-07-31 hungaroring leclerc 1997-10-16 \n", + "25193 2022 13 2022-07-31 hungaroring norris 1999-11-13 \n", + "25194 2022 13 2022-07-31 hungaroring alonso 1981-07-29 \n", + "25195 2022 13 2022-07-31 hungaroring ocon 1996-09-17 \n", + "25196 2022 13 2022-07-31 hungaroring vettel 1987-07-03 \n", + "25197 2022 13 2022-07-31 hungaroring stroll 1998-10-29 \n", + "25198 2022 13 2022-07-31 hungaroring gasly 1996-02-07 \n", + "25199 2022 13 2022-07-31 hungaroring zhou 1999-05-30 \n", + "25200 2022 13 2022-07-31 hungaroring mick_schumacher 1999-03-22 \n", + "25201 2022 13 2022-07-31 hungaroring ricciardo 1989-07-01 \n", + "25202 2022 13 2022-07-31 hungaroring kevin_magnussen 1992-10-05 \n", + "25203 2022 13 2022-07-31 hungaroring albon 1996-03-23 \n", + "25204 2022 13 2022-07-31 hungaroring latifi 1995-06-29 \n", + "25205 2022 13 2022-07-31 hungaroring tsunoda 2000-05-11 \n", + "25206 2022 13 2022-07-31 hungaroring bottas 1989-08-28 \n", + "\n", + " nationality constructor grid time status points podium \n", + "25187 Dutch red_bull 10 5975912.0 Finished 25.0 1 \n", + "25188 British mercedes 7 5983746.0 Finished 19.0 2 \n", + "25189 British mercedes 1 5988249.0 Finished 15.0 3 \n", + "25190 Spanish ferrari 2 5990491.0 Finished 12.0 4 \n", + "25191 Mexican red_bull 11 5991600.0 Finished 10.0 5 \n", + "25192 Monegasque ferrari 3 5991959.0 Finished 8.0 6 \n", + "25193 British mclaren 4 6054212.0 Finished 6.0 7 \n", + "25194 Spanish alpine 6 NaN +1 Lap 4.0 8 \n", + "25195 French alpine 5 NaN +1 Lap 2.0 9 \n", + "25196 German aston_martin 18 NaN +1 Lap 1.0 10 \n", + "25197 Canadian aston_martin 14 NaN +1 Lap 0.0 11 \n", + "25198 French alphatauri 20 NaN +1 Lap 0.0 12 \n", + "25199 Chinese alfa 12 NaN +1 Lap 0.0 13 \n", + "25200 German haas 15 NaN +1 Lap 0.0 14 \n", + "25201 Australian mclaren 9 NaN +1 Lap 0.0 15 \n", + "25202 Danish haas 13 NaN +1 Lap 0.0 16 \n", + "25203 Thai williams 17 NaN +1 Lap 0.0 17 \n", + "25204 Canadian williams 19 NaN +1 Lap 0.0 18 \n", + "25205 Japanese alphatauri 16 NaN +2 Laps 0.0 19 \n", + "25206 Finnish alfa 8 NaN Power Unit 0.0 20 " + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# what are the results from the latest race?\n", + "f1_results.tail()\n", "\n", - "# hint: you may use the date column; convert it to datetime first!\n" + "# hint: you may use the date column; convert it to datetime first!\n", + "f1_results['date'].apply(pd.to_datetime)\n", + "latest_date = f1_results['date'].max()\n", + "f1_results[f1_results['date'] == latest_date]\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 91, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "max_verstappen\n", + "max_verstappen 8\n", + "Name: driver, dtype: int64\n" + ] + } + ], "source": [ "# who won the race? how many races has this pilot won this year?\n", "\n", @@ -986,18 +7239,38 @@ "# then use iloc[i][j] to access the first (and only) row (i) of the dataframe and the 'driver' column (j)\n", "# winner = f1_results[ ... filters ... ].iloc[i][j]\n", "\n", - "\n", + "winner = f1_results[(f1_results['date'] == latest_date) & (f1_results['podium'] == 1)].iloc[0]['driver']\n", + "print(winner)\n", "# use this ^ to filter f1_results on season, podium and driver\n", - "# and then count\n" + "# and then count\n", + "count = f1_results[(f1_results['season'] == 2022) & \n", + "(f1_results['podium'] == 1) & \n", + "(f1_results['driver'] == winner)].driver.value_counts()\n", + "\n", + "print(count)" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 92, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'hungaroring'" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "# on which circuit did Lewis Hamilton have the most wins?" + "# on which circuit did Lewis Hamilton have the most wins?\n", + "circuit = f1_results.query(\"`driver` == 'hamilton' and `podium` == 1\").circuit_id.value_counts()\n", + "circuit.idxmax()\n", + "# f1_results[(f1_results['driver'] == 'hamilton') & (f1_results['circuit_id'] == circuit)]" ] }, { @@ -1014,9 +7287,166 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 93, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "array(['farina', 'fagioli', 'reg_parnell', 'cabantous', 'rosier',\n", + " 'gerard', 'harrison', 'etancelin', 'hampshire', 'fry',\n", + " 'shawe_taylor', 'claes', 'fangio', 'kelly', 'bira', 'murray',\n", + " 'crossley', 'graffenried', 'chiron', 'martin', 'peter_walker',\n", + " 'rolt', 'leslie_johnson', 'ascari', 'sommer', 'villoresi',\n", + " 'gonzalez', 'manzon', 'trintignant', 'rol', 'schell', 'whitehead',\n", + " 'pian', 'parsons', 'holland', 'rose', 'green', 'bettenhausen',\n", + " 'chitwood', 'wallard', 'faulkner', 'george_connor', 'paul_russo',\n", + " 'flaherty', 'fohr', 'darter', 'hellings', 'mcgrath', 'ruttman',\n", + " 'hartley', 'davies', 'mcdowell', 'walt_brown', 'webb', 'hoyt',\n", + " 'ader', 'holmes', 'rathmann', 'banks', 'schindler', 'levrett',\n", + " 'cantrell', 'agabashian', 'bonetto', 'pagani', 'branca', 'levegh',\n", + " 'chaboud', 'pozzi', 'serafini', 'guy_mairesse', 'taruffi',\n", + " 'biondetti', 'louveau', 'comotti', 'sanesi', 'pietsch', 'moss',\n", + " 'fischer', 'abecassis', 'hirt', 'nazaruk', 'ayulo', 'linden',\n", + " 'ball', 'forberg', 'nalon', 'force', 'hanks', 'scarborough',\n", + " 'mackey', 'stevenson', 'dinsmore', 'miller', 'ward', 'griffith',\n", + " 'vukovich', 'andre_pilette', 'gordini', 'simon', 'marimon',\n", + " 'duncan_hamilton', 'parker', 'john_james', 'swaters', 'landi',\n", + " 'richardson', 'godia', 'grignard', 'jover', 'behra', 'wharton',\n", + " 'alan_brown', 'brandon', 'macklin', 'collins', 'hans_stuck',\n", + " 'ulmen', 'terra', 'cross', 'bryan', 'reece', 'rigsby', 'james',\n", + " 'fonder', 'johnson', 'sweikert', 'bob_scott', 'hawthorn', 'frere',\n", + " 'tornaco', 'laurent', 'legat', 'obrien', 'gaze', 'charrington',\n", + " 'carini', 'poore', 'thompson', 'salvadori', 'downing',\n", + " 'graham_whitehead', 'mcalpine', 'bianco', 'crook', 'riess',\n", + " 'niedermayr', 'klenk', 'klodwig', 'heeks', 'brudes', 'balsa',\n", + " 'bechem', 'cantoni', 'krause', 'schoeller', 'aston', 'helfrich',\n", + " 'peters', 'flinterman', 'lof', 'bayol', 'crespo', 'galvez',\n", + " 'john_barber', 'menditeguy', 'birger', 'cruz', 'daywalt', 'mccoy',\n", + " 'mantz', 'teague', 'thomson', 'mieres', 'wacker', 'georges_berger',\n", + " 'jimmy_stewart', 'fairman', 'ian_stewart', 'herrmann', 'nuckey',\n", + " 'seidel', 'barth', 'karch', 'fitzau', 'adolff', 'lang', 'scherrer',\n", + " 'mantovani', 'musso', 'maglioli', 'fitch', 'loyer', 'daponte',\n", + " 'freeland', 'crockett', 'niday', 'jackson', 'elisian', 'kling',\n", + " 'pollet', 'beauman', 'marr', 'thorne', 'gould', 'whitehouse',\n", + " 'flockhart', 'riseley_prichard', 'bucci', 'riu', 'volonterio',\n", + " 'iglesias', 'castellotti', 'uria', 'perdisa', 'whiteaway',\n", + " 'homeier', 'herman', 'connor', 'weyant', 'templeman', 'andrews',\n", + " 'russo', 'ray_crawford', 'keller', 'ramos', 'sparken',\n", + " 'jack_brabham', 'lucas', 'piotti', 'gerini', 'gendebien',\n", + " 'oscar_gonzalez', 'scarlatti', 'brooks', 'dick_rathmann', 'veith',\n", + " 'christie', 'garrett', 'tolan', 'turner', 'scotti', 'portago',\n", + " 'chapman', 'titterington', 'halford', 'scott_Brown', 'emery',\n", + " 'milhoux', 'bonnier', 'leston', 'trips', 'tomaso', 'gregory',\n", + " 'lewis-evans', 'bueb', 'boyd', 'edmunds', 'sachs', 'magill',\n", + " 'cheesbourg', 'macdowel', 'mackay-fraser', 'naylor', 'beaufort',\n", + " 'marsh', 'england', 'gibson', 'allison', 'hill', 'kavanagh',\n", + " 'kessler', 'filippis', 'testut', 'cabianca', 'ecclestone',\n", + " 'taramazzo', 'george_amick', 'larson', 'dempsey_wilson', 'foyt',\n", + " 'goldsmith', 'phil_hill', 'shelby', 'burgess', 'stacey', 'mclaren',\n", + " 'goethals', 'la_caze', 'guelfi', 'picard', 'bridger', 'Changy',\n", + " 'bianchi', 'lovely', 'lucienbonnet', 'arnold', 'mcwithey',\n", + " 'branson', 'grim', 'ireland', 'orey', 'gurney', 'davis', 'fontes',\n", + " 'bristow', 'henry_taylor', 'ashdown', 'piper', 'mike_taylor',\n", + " 'greene', 'bill_moss', 'parkes', 'dennis_taylor', 'trevor_taylor',\n", + " 'parnell', 'cabral', 'blanchard', 'constantine', 'said', 'cade',\n", + " 'larreta', 'bonomi', 'munaron', 'estefano', 'chimeri', 'creus',\n", + " 'ginther', 'surtees', 'daigh', 'reventlow', 'ruby', 'tingelstad',\n", + " 'amick', 'hurtubise', 'weiler', 'sutton', 'clark', 'mairesse',\n", + " 'drogo', 'gamble', 'thiele', 'vic_wilson', 'owen', 'hall', 'drake',\n", + " 'may', 'lewis', 'bandini', 'baghetti', 'collomb', 'bordeu',\n", + " 'maggs', 'ashmore', 'monteverdi', 'pirocchi', 'starrabba',\n", + " 'ricardo_rodriguez', 'vaccarella', 'bussinello', 'penske', 'ryan',\n", + " 'sharp', 'hansgen', 'ken_miles', 'pon', 'slotemaker', 'siffert',\n", + " 'campbell-jones', 'schiller', 'arundell', 'abate', 'settember',\n", + " 'chamberlain', 'shelly', 'walter', 'seiffert', 'prinoth', 'lippi',\n", + " 'schroeder', 'mayer', 'lederle', 'love', 'johnstone', 'pieterse',\n", + " 'serrurier', 'harris', 'hocking', 'vyver', 'tingle', 'amon',\n", + " 'scarfiotti', 'mitter', 'hailwood', 'anderson', 'raby', 'kuhnke',\n", + " 'spence', 'ernesto_brambilla', 'broeker', 'rodriguez', 'vos',\n", + " 'solana', 'dochnal', 'monarch', 'blokdyk', 'niemann', 'klerk',\n", + " 'prophet', 'driver', 'revson', 'taylor', 'gardner', 'attwood',\n", + " 'bucknum', 'rindt', 'geki', 'stewart', 'hawkins', 'puzey',\n", + " 'pretorius', 'charlton', 'reed', 'clapham', 'hulme', 'rhodes',\n", + " 'rollinson', 'gubby', 'bassi', 'bondurant', 'ligier', 'irwin',\n", + " 'lawrence', 'botha', 'courage', 'gavin', 'beltoise', 'hobbs',\n", + " 'rees', 'moser', 'oliver', 'ickx', 'hart', 'hahne', 'ahrens',\n", + " 'jo_schlesser', 'fisher', 'wietzes', 'pease', 'tom_jones',\n", + " 'williams', 'rooyen', 'adamich', 'redman', 'elford', 'widdows',\n", + " 'bell', 'pescarolo', 'brack', 'unser', 'mario_andretti', 'miles',\n", + " 'cordts', 'eaton', 'stommelen', 'roig', 'peterson', 'giunti',\n", + " 'regazzoni', 'cevert', 'gethin', 'emerson_fittipaldi', 'schenken',\n", + " 'galli', 'wisell', 'hutchison', 'westbury', 'ganley', 'barber',\n", + " 'lennep', 'walker', 'mazet', 'jean', 'beuttler', 'marko', 'lauda',\n", + " 'jarier', 'donohue', 'craft', 'Cannoc', 'posey', 'reutemann',\n", + " 'pace', 'wilson_fittipaldi', 'depailler', 'merzario', 'migault',\n", + " 'scheckter', 'bueno', 'follmer', 'keizan', 'hunt', 'purley',\n", + " 'opel', 'watson', 'mass', 'williamson', 'mcrae', 'edwards',\n", + " 'robarts', 'stuck', 'brambilla', 'ian_scheckter', 'belso',\n", + " 'schuppan', 'pilette', 'pryce', 'larrousse', 'kinnunen', 'roos',\n", + " 'jabouille', 'dolhem', 'lombardi', 'ashley', 'laffite', 'perkins',\n", + " 'quester', 'wilds', 'facetti', 'koinigg', 'tunmer', 'evans',\n", + " 'brise', 'wunderink', 'jones', 'palm', 'magee', 'fushida',\n", + " 'henton', 'nicholson', 'morgan', 'crawford', 'ertl', 'trimmer',\n", + " 'lunger', 'vonlanthen', 'zorzi', 'leclere', 'hoffmann', 'nilsson',\n", + " 'kessel', 'zapico', 'villota', 'neve', 'nelleman', 'galica',\n", + " 'pesenti_rossi', 'binder', 'hayje', 'andersson', 'stuppacher',\n", + " 'ribeiro', 'brown', 'takahara', 'hasemi', 'hoshino', 'keegan',\n", + " 'patrese', 'dryver', 'rebaque', 'tambay', 'gilles_villeneuve',\n", + " 'heyer', 'giacomelli', 'leoni', 'ongais', 'takahashi', 'pironi',\n", + " 'cheever', 'keke_rosberg', 'arnoux', 'daly', 'colombo', 'lees',\n", + " 'piquet', 'bleekemolen', 'gimax', 'rahal', 'gabbiani', 'angelis',\n", + " 'lammers', 'brancatelli', 'gaillard', 'surer', 'zunino', 'prost',\n", + " 'kennedy', 'johansson', 'south', 'needell', 'desire_wilson',\n", + " 'mansell', 'thackwell', 'manfred_winkelhock', 'cesaris', 'cogan',\n", + " 'serra', 'guerra', 'stohr', 'salazar', 'londono', 'borgudd',\n", + " 'alboreto', 'warwick', 'ghinzani', 'francia', 'villeneuve_sr',\n", + " 'boesel', 'baldi', 'paletti', 'guerrero', 'fabi', 'moreno',\n", + " 'byrne', 'sullivan', 'cecotto', 'corrado_fabi', 'schlesser',\n", + " 'boutsen', 'acheson', 'palmer', 'brundle', 'hesnault', 'alliot',\n", + " 'bellof', 'senna', 'gartner', 'rothengatter', 'berger', 'martini',\n", + " 'streiff', 'danner', 'capelli', 'dumfries', 'nannini', 'berg',\n", + " 'caffi', 'satoru_nakajima', 'fabre', 'campos', 'tarquini',\n", + " 'forini', 'larini', 'dalmas', 'modena', 'sala', 'gugelmin',\n", + " 'larrauri', 'bailey', 'schneider', 'suzuki', 'raphanel', 'herbert',\n", + " 'grouillard', 'foitek', 'alesi', 'pirro', 'bernard', 'donnelly',\n", + " 'gachot', 'weidler', 'lehto', 'barilla', 'morbidelli', 'brabham',\n", + " 'hakkinen', 'blundell', 'comas', 'poele', 'barbazza', 'bartels',\n", + " 'michael_schumacher', 'zanardi', 'wendlinger', 'katayama',\n", + " 'fittipaldi', 'belmondo', 'chiesa', 'amati', 'damon_hill',\n", + " 'naspetti', 'mccarthy', 'barrichello', 'badoer', 'andretti',\n", + " 'lamy', 'apicella', 'irvine', 'toshio_suzuki', 'gounon', 'panis',\n", + " 'verstappen', 'frentzen', 'beretta', 'ratzenberger', 'coulthard',\n", + " 'montermini', 'adams', 'schiattarella', 'noda', 'salo', 'lagorce',\n", + " 'inoue', 'deletraz', 'diniz', 'boullion', 'papis', 'lavaggi',\n", + " 'magnussen', 'villeneuve', 'rosset', 'fisichella', 'marques',\n", + " 'nakano', 'trulli', 'ralf_schumacher', 'sospiri', 'wurz',\n", + " 'fontana', 'tuero', 'takagi', 'rosa', 'zonta', 'gene', 'sarrazin',\n", + " 'heidfeld', 'button', 'mazzacane', 'burti', 'raikkonen', 'alonso',\n", + " 'montoya', 'bernoldi', 'enge', 'yoong', 'webber', 'sato', 'massa',\n", + " 'mcnish', 'davidson', 'pizzonia', 'wilson', 'matta', 'firman',\n", + " 'kiesa', 'baumgartner', 'klien', 'pantano', 'bruni', 'glock',\n", + " 'karthikeyan', 'monteiro', 'friesacher', 'albers', 'liuzzi',\n", + " 'doornbos', 'rosberg', 'speed', 'ide', 'montagny', 'yamamoto',\n", + " 'kubica', 'hamilton', 'kovalainen', 'sutil', 'vettel',\n", + " 'markus_winkelhock', 'nakajima', 'bourdais', 'piquet_jr', 'buemi',\n", + " 'alguersuari', 'grosjean', 'kobayashi', 'hulkenberg',\n", + " 'bruno_senna', 'petrov', 'grassi', 'chandhok', 'resta', 'ambrosio',\n", + " 'maldonado', 'perez', 'ricciardo', 'vergne', 'pic', 'gutierrez',\n", + " 'bottas', 'jules_bianchi', 'chilton', 'garde', 'kevin_magnussen',\n", + " 'kvyat', 'ericsson', 'lotterer', 'stevens', 'nasr', 'sainz',\n", + " 'max_verstappen', 'merhi', 'rossi', 'jolyon_palmer', 'wehrlein',\n", + " 'haryanto', 'vandoorne', 'ocon', 'giovinazzi', 'stroll', 'gasly',\n", + " 'brendon_hartley', 'leclerc', 'sirotkin', 'norris', 'albon',\n", + " 'russell', 'latifi', 'aitken', 'pietro_fittipaldi', 'tsunoda',\n", + " 'mick_schumacher', 'mazepin', 'zhou'], dtype=object)" + ] + }, + "execution_count": 93, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# look for your driver's id in the list\n", "f1_results['driver'].unique()" @@ -1024,100 +7454,558 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 94, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "michael_schumacher's nationality is German\n" + ] + } + ], "source": [ "# which driver have you chosen?\n", - "driver = '...'\n", + "driver = 'michael_schumacher'\n", "\n", "# what nationality is this driver?\n", - "nationality = ...\n", + "nationality = f1_results[f1_results['driver'] == driver].nationality.iloc[0]\n", "print(f\"{driver}'s nationality is {nationality}\")\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 95, "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", + "
seasonrounddatecircuit_iddriverdate_of_birthnationalityconstructorgridtimestatuspointspodium
129151991111991-08-25spamichael_schumacher1969-01-03Germanjordan7NaNClutch0.026
129241991121991-09-08monzamichael_schumacher1969-01-03Germanbenetton74708782.0Finished2.05
129551991131991-09-22estorilmichael_schumacher1969-01-03Germanbenetton105818886.0Finished1.06
129851991141991-09-29catalunyamichael_schumacher1969-01-03Germanbenetton56001009.0Finished1.06
130231991151991-10-20suzukamichael_schumacher1969-01-03Germanbenetton9NaNEngine0.014
..........................................
211542012162012-10-14yeongammichael_schumacher1969-01-03Germanmercedes105877892.0Finished0.013
211872012172012-10-28buddhmichael_schumacher1969-01-03Germanmercedes14NaNRetired0.022
212002012182012-11-04yas_marinamichael_schumacher1969-01-03Germanmercedes136386742.0Finished0.011
212292012192012-11-18americasmichael_schumacher1969-01-03Germanmercedes5NaN+1 Lap0.016
212442012202012-11-25interlagosmichael_schumacher1969-01-03Germanmercedes136334563.0Finished6.07
\n", + "

308 rows × 13 columns

\n", + "
" + ], + "text/plain": [ + " season round date circuit_id driver \\\n", + "12915 1991 11 1991-08-25 spa michael_schumacher \n", + "12924 1991 12 1991-09-08 monza michael_schumacher \n", + "12955 1991 13 1991-09-22 estoril michael_schumacher \n", + "12985 1991 14 1991-09-29 catalunya michael_schumacher \n", + "13023 1991 15 1991-10-20 suzuka michael_schumacher \n", + "... ... ... ... ... ... \n", + "21154 2012 16 2012-10-14 yeongam michael_schumacher \n", + "21187 2012 17 2012-10-28 buddh michael_schumacher \n", + "21200 2012 18 2012-11-04 yas_marina michael_schumacher \n", + "21229 2012 19 2012-11-18 americas michael_schumacher \n", + "21244 2012 20 2012-11-25 interlagos michael_schumacher \n", + "\n", + " date_of_birth nationality constructor grid time status \\\n", + "12915 1969-01-03 German jordan 7 NaN Clutch \n", + "12924 1969-01-03 German benetton 7 4708782.0 Finished \n", + "12955 1969-01-03 German benetton 10 5818886.0 Finished \n", + "12985 1969-01-03 German benetton 5 6001009.0 Finished \n", + "13023 1969-01-03 German benetton 9 NaN Engine \n", + "... ... ... ... ... ... ... \n", + "21154 1969-01-03 German mercedes 10 5877892.0 Finished \n", + "21187 1969-01-03 German mercedes 14 NaN Retired \n", + "21200 1969-01-03 German mercedes 13 6386742.0 Finished \n", + "21229 1969-01-03 German mercedes 5 NaN +1 Lap \n", + "21244 1969-01-03 German mercedes 13 6334563.0 Finished \n", + "\n", + " points podium \n", + "12915 0.0 26 \n", + "12924 2.0 5 \n", + "12955 1.0 6 \n", + "12985 1.0 6 \n", + "13023 0.0 14 \n", + "... ... ... \n", + "21154 0.0 13 \n", + "21187 0.0 22 \n", + "21200 0.0 11 \n", + "21229 0.0 16 \n", + "21244 6.0 7 \n", + "\n", + "[308 rows x 13 columns]" + ] + }, + "execution_count": 95, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f1_results[f1_results['driver'] == driver]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "michael_schumacher's first race was on 1991-08-25 with jordan\n" + ] + } + ], "source": [ "# when was his first race and for which constructor?\n", - "races = ...\n", - "first_race_date = ...\n", - "first_race_constructor = ...\n", + "races = f1_results['driver'] == driver\n", + "# f1_results[races]\n", + "first_race_date = f1_results[races].date.min()\n", + "first_race_constructor = f1_results[(races) & (f1_results['date'] == first_race_date)].constructor.iloc[0]\n", "print(f\"{driver}'s first race was on {first_race_date} with {first_race_constructor}\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 119, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "michael_schumacher's first podium was on 1992-03-22 with benetton\n" + ] + } + ], "source": [ "# when was his first podium + with which constructor?\n", "# keep in mind the driver may have been on the podium 0 times\n", - "podiums = ...\n", - "first_podium_date = ...\n", - "first_podium_constructor = ...\n", - "print(f\"{driver}'s first podium was on {first_podium_date} with {first_podium_constructor}\")" + "try:\n", + " podiums = f1_results.podium.between(1, 3)\n", + " # f1_results[podiums]\n", + " first_podium_date = f1_results[(podiums) & (races)]['date'].min()\n", + " # first_podium_date\n", + "\n", + " first_podium_constructor = f1_results[(podiums) & (races)].constructor.iloc[0]\n", + " print(f\"{driver}'s first podium was on {first_podium_date} with {first_podium_constructor}\")\n", + "except IndexError:\n", + " print(f'{driver} has never been on the podium')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 120, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "michael_schumacher's first win was on 1992-08-30 with benetton at spa\n" + ] + } + ], "source": [ "# what about his first win + with which constructor + which circuit?\n", "# keep in mind the driver may have won 0 races\n", - "first_win = ...\n", - "first_win_date = ...\n", - "first_win_constructor = ...\n", - "first_win_circuit = ...\n", - "print(f\"{driver}'s first win was on {first_win_date} with {first_win_constructor} at {first_win_circuit}\")" + "try:\n", + " first_win = f1_results[(races) & (f1_results['podium'] == 1)]\n", + " # first_win\n", + " first_win_date = first_win.date.min()\n", + " # first_win_date\n", + " first_win_constructor = first_win.constructor.iloc[0]\n", + " # first_win_constructor\n", + " first_win_circuit = first_win.circuit_id.iloc[0]\n", + " # first_win_circuit\n", + " print(f\"{driver}'s first win was on {first_win_date} with {first_win_constructor} at {first_win_circuit}\")\n", + "except IndexError:\n", + " print(f'{driver} has not won any race')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 122, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "michael_schumacher has 308 race starts\n" + ] + } + ], "source": [ "# how many race starts?\n", "# hint: check the Status is NOT one of Did not qualify, Did not prequalify, Not classified\n", - "race_starts = ...\n", + "race_starts = f1_results[(races) & (f1_results['status'] != 'Din not qualify') & (f1_results['status'] != 'Did not prequalify')\n", + "& (f1_results['status'] != 'classified')].count()[0]\n", "print(f\"{driver} has {race_starts} race starts\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 123, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "michael_schumacher has finished 219 races\n" + ] + } + ], "source": [ "# how many of those races did he actually finished?\n", "# hint: look for Status Finished; for this exercise, we'll not consider other statuses as successful\n", - "races_finished = ...\n", + "races_finished = f1_results[(races) & (f1_results['status'] == 'Finished')].count()[0]\n", "print(f\"{driver} has finished {races_finished} races\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 124, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "michael_schumacher has won 91 races\n" + ] + } + ], "source": [ "# how many has he won?\n", - "races_won = ...\n", + "races_won = f1_results[(races) & (f1_results['podium'] == 1)].count()[0]\n", "print(f\"{driver} has won {races_won} races\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 130, "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", + "
drivernationalityseasoncircuit_idrace_startedrace_finishedrace_wonconstructor
12915michael_schumacherGerman1991spaTrueFalseFalsejordan
12924michael_schumacherGerman1991monzaTrueTrueFalsebenetton
12955michael_schumacherGerman1991estorilTrueTrueFalsebenetton
12985michael_schumacherGerman1991catalunyaTrueTrueFalsebenetton
13023michael_schumacherGerman1991suzukaTrueFalseFalsebenetton
\n", + "
" + ], + "text/plain": [ + " driver nationality season circuit_id race_started \\\n", + "12915 michael_schumacher German 1991 spa True \n", + "12924 michael_schumacher German 1991 monza True \n", + "12955 michael_schumacher German 1991 estoril True \n", + "12985 michael_schumacher German 1991 catalunya True \n", + "13023 michael_schumacher German 1991 suzuka True \n", + "\n", + " race_finished race_won constructor \n", + "12915 False False jordan \n", + "12924 True False benetton \n", + "12955 True False benetton \n", + "12985 True False benetton \n", + "13023 False False benetton " + ] + }, + "execution_count": 130, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# create a dataframe that contains the follwing information:\n", "#\n", @@ -1130,8 +8018,17 @@ "# race_won (Boolean)\n", "# constructor\n", "\n", - "f1_career = ...\n", + "# get the latest race's results\n", + " \n", + "\n", + "f1_career = f1_results[f1_results['driver'] == driver]\n", + "f1_career = f1_career.assign(\n", + " race_started = lambda x: ~x.status.isin(['Did not qualify', 'Did not proqualify', 'Not classified']),\n", + " race_finished = lambda x: x.status.isin(['Finished']),\n", + " race_won = lambda x: x.podium == 1\n", + ")\n", "\n", + "f1_career = f1_career[['driver', 'nationality', 'season', 'circuit_id', 'race_started', 'race_finished', 'race_won', 'constructor']]\n", "f1_career.head()" ] }, @@ -1144,7 +8041,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 131, "metadata": {}, "outputs": [], "source": [ @@ -1161,18 +8058,64 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 132, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 132, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX4AAAEWCAYAAABhffzLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8qNh9FAAAACXBIWXMAAAsTAAALEwEAmpwYAABGh0lEQVR4nO3dd3xb1fn48c/jIW8nlmOHOMuOnWmSAFkUKKNhdgAdlFLKKKtQyuiXQmkp31I6frTl2wUFSlllFcoohZbdMkKBTAiEJCROYjnbjuR4yUOyzu8PXdmK8ZBlTet5v15+xb7SvffoRn58dO5zniPGGJRSSqWOtHg3QCmlVGxp4FdKqRSjgV8ppVKMBn6llEoxGviVUirFaOBXSqkUo4FfKaVSjAb+FCUiU0SkVUTSh3jesSKyI0pteF1ELorCcW8SkYcjfdxISoY2Rkuo7z0VPRr4U5Qxps4Yk2+M6Y53W9TIWX9IbgpjPyMibVYgbhWR/dZ2m4g8KSK11nOOHeQYZ4nIhj7bXhlg2/X63os/DfxKJTkRyRjhIeZbgTjfGDM2aPtbwDeAPUPs/yYwS0RKgtozH8jps+1T1nNVnGngH0Ws3tm1IvKB1Yu7V0TGi8gLItIiIq+KSJH13HKrJ5dh/WwXkftFZJeINIrIM32OfY2I1IvIbhH5ZtD2z4nIeyLSLCLb+/Y6ReRwEXlbRPaLyNrBeo4DvKYqEXlDRJpEZJ+IPB70WLXVi3SJyF4R+WHQrjYRedB63R+JyMKg/YyIVAX9/ICI/Mz6/lgR2SEi1wW93tNF5LMissk61w+D9l0sIu9Yr2+3iNwuIrYItLFMRJ4SkQYR2SYiVwY9dpPVG39YRJqB8/tcs3Ei8k+rTS4RWSYiw/pdN8Z0GWN+Z4x5Cxi0Z26M2QlsBY62Nh0GfAS80WdbGrCyn/fe6yLyUxH5r3UtXhaRcdZj2dbrdFqvZ6WIjB/Oa1GfpIF/9PkycAIwA/gC8ALwQ6AE///3lQPs9xCQC1QDpcBvgx47CBgDTAQuBP4Y+AMCtAHnAmOBzwGXicjpACIyEfgX8DPADnwPeCrQCwzRT4GXgSJgEnCbdewC4FXgRaAMqAL+HbTfqcBjVrueBW4fxjkPArLxv97/Bf6Mv+e7APg0cKOIVFjP7Qa+C4zD36NdCnx7JG20gvRzwFqrDUuBq0XkpKB9TwOetPZ9xBhzkzHmJuuxa4Ad+P/Px+P//492Ua436Q3yRwPL8H9iCN72rjHGM8D+Xwe+if+9Z8P/XgE4D/97bzJQDFwKtEe68alGA//oc5sxZq/VC1sGLDfGvGeM6QD+DhzadwcRmQCcAlxqjGk0xniMMW8EPcUD3Gxtfx5oBWYCGGNeN8Z8aIzxGWM+AP4KHGPt9w3geWPM89bjrwCrgM8O4/V4gKlAmTGmw+qBAnwe2GOM+T9re4sxZnnQfm9Z5+3G/0dt/jDP+XMrSD2GP6j/3jrHR8D6wPGMMauNMe8aY7zGmFrgT0GvP9w2LgJKjDE3Wz3vrfj/+HwtaN93jDHPWNe1byD0ABOAqdb/2TIzeDXGNVZver+I/GEY1ylYcO/+0/jfe8v6bHujn/0C7jfGbLJey9+AQ4JeSzFQZYzptq53c5htVBYN/KPP3qDv2/v5Ob+ffSYDLmNM4wDHdBpjvEE/uwPHEZElIvKaNSTRhL9HNs563lTgjKCgsh84Cn9QCtV1gAArrOGQC4LavGWQ/YLHpd1AtoQ+Fu4MuvEYCKr9XkcRmWENq+yxhl1+Qe/rD7eNU4GyPtfth/h77wHbBznur4Ea4GUR2Soi1w/yXIDDjDFjra+BPhEO5U1gnvVJ8HD8f5g2AhOsbUcx+Ph+32sReJ8+BLwEPGYNQ/5KRDLDbKOyaOBX4A8idhEZG8a+j+IfpphsjBkD3IU/UAeO+1BQUBlrjMkzxtwS6sGNMXuMMRcbY8qAbwF3WOPz24FpYbQX/IElN+jng8I8DsCdwEZgujGmEH+ADn794bRxO7Ctz3UrMMYEf1IasAdvfbK4xhgzDf9w0v+IyNIw2hEy61PJLuASoM4Y02o99I61LR94N4zjeowxPzHGzAGOwP8p6tzItDp1aeBXGGN2478XcIeIFIlIpogcPdR+lgL8nxY6RGQx/rHagIeBL4jISSKSbt2oO1ZEJoXaNhE5I+j5jfgDng/4J/7e5NUikiUiBSKyJMTDvg983WrTyfQOzYSjAGgGWkVkFnBZ0GPhtnEF0CIi3xeRHKudB4vIolAaJCKfF/9NcQGa8N+H8A3vZYHV5mzrR5v1/yeD7LIM+B/r34C3rG2r+hmSCqUNx4nIXPHn/DfjH/oZ9mtRB9LArwLOwf9LtRGoB64Ocb9vAzeLSAv+G6F/CzxgjNmO/ybkD4EG/D3Zaxne+24RsFxEWvF/srjKGLPVGNOC/yb2F/APE2wGjgvxmFdZ++0HzgaeGUZ7+voe/j92LfjH4XuyjsJtozXM9Hn849zbgH3APfhvcoZiOv6byq34e9x3GGNeC3HfYB/jH9aaiH+4pR3/MNRA3sB/c/atoG3LrG3hpnEehP8mdjOwwTrHQ2EeS1lEV+BSSqnUoj1+pZRKMRr4VdyJyF3SWzIg+OuueLdNqdFIh3qUUirFjLTGR0yMGzfOlJeXx7sZSimVVFavXr3PGPOJmfJJEfjLy8tZtWpVvJuhlFJJRUQc/W3XMX6llEoxGviVUirFaOBXSqkUkxRj/P3xeDzs2LGDjo6OeDdFJYns7GwmTZpEZqbW+FKpLWkD/44dOygoKKC8vJzBy4coBcYYnE4nO3bsoKKiYugdlBrFknaop6Ojg+LiYg36KiQiQnFxsX5CVIokDvyABn01LPp+UcovqQO/UqqXMYa/rdpOe9egS+QqpYE/mdx0003ceuutn9h+11138eCDD8ahRSqRfLCjieue/ICX1+8Z+skqpSXtzV3l5/V6ufTSSyN2rIwMfUskq1pnGwDO1q44t0QlOu3xJ7if//znzJgxg6OOOoqPP/4YgGOPPZarr76ahQsX8vvf/77nk8DGjRtZvHhxz761tbXMnTsXgNWrV3PMMcewYMECTjrpJHbv3t3vsVTyqnO6AXC1aeBXg9PuXQJbvXo1jz32GO+//z5er5fDDjuMBQsWANDV1dVTv+imm24CYNasWXR1dbFt2zYqKip4/PHHOfPMM/F4PFxxxRX84x//oKSkhMcff5wbbriB++677xPHUsnL4bICv1sDvxqcBv4EtmzZMr74xS+Sm+tfF/zUU0/teezMM8/sd5+vfvWrPP7441x//fU8/vjjPP7443z88cesW7eOE044AYDu7m4mTJgw5LFUcgn0+Bu1x6+GoIE/SeXl5fW7/cwzz+SMM87gS1/6EiLC9OnT+fDDD6muruadd94Z1rFUcnG4rDF+DfxqCDrGn8COPvponnnmGdrb22lpaeG5554bcp/KykrS09P56U9/2tOTnzlzJg0NDT2B3+Px8NFHH0W17Sq2Ojzd7G3uBLTHr4amPf4Edthhh3HmmWcyf/58SktLWbRoUUj7nXnmmVx77bVs27YNAJvNxpNPPsmVV15JU1MTXq+Xq6++murq6mg2X8XQdmt8vyArg0Yd41dDSIqlFxcuXGj63nzcsGEDs2fPjlOLVLIare+bV9fv5aIHV3FU1Tje2epk889OIS1NZyqnOhFZbYxZ2He7DvUoNQoEMnoOnTKWbp+hucMT5xapRKaBX6lRoM7ZRkFWBtNK/DfqNZdfDUYDv1KjgMPlZrI9F3teFqCBXw0uaoFfRO4TkXoRWRe07dcislFEPhCRv4vI2GidX6lUUud0M7U4F3uuDdDArwYXzR7/A8DJfba9AhxsjJkHbAJ+EMXzK5USun2G7Y1uphTnYs/3B37N7FGDiVrgN8a8Cbj6bHvZGOO1fnwXmBSt8yuVKvY0d+DpNky15/X0+HUSlxpMPMf4LwBeGOhBEblERFaJyKqGhoYYNkup5OKwqnJOLc4lx5ZOdmaaTuJSg4pL4BeRGwAv8MhAzzHG3G2MWWiMWVhSUhK7xkXYs88+yy233DLg47W1tRx88MEROdcDDzzAd77znYgcq7y8nH379kXkWKOhHYksUKNnit1f06k4LwtXm6ZzqoHFfOauiJwPfB5YapJh9tgInXrqqQcUV1OxkyrrCzhcbjLThbKxOQAU5WXiauuMc6tUIovpb4WInAxcBxxjjHFH6rg/ee4j1u9qjtThAJhTVsiPvzB4SYPa2lpOPvlkDj/8cN5++20WLVrEN7/5TX784x9TX1/PI488wvr161m1ahW33347e/fu5dJLL2Xr1q0A3HnnnZSVldHd3c3FF1/M22+/zcSJE/nHP/5BTk4Of/7zn7n77rvp6uqiqqqKhx56iNzcXBoaGrj00kupq6sD4He/+x1HHnnkkK/piSee4Cc/+Qnp6emMGTOGN998k+7ubr7//e/z4osvkpaWxsUXX8wVV1wBwG233cZzzz2Hx+PhiSeeYNasWdx0003k5+fzve99D4CDDz6Yf/7znwBDXovFixezYsUKrrrqKjo6OsjJyeH+++9n5syZw25HW1sbV1xxBevWrcPj8XDTTTdx2mmn8cADD/D000/T2tpKd3c3b7zxRnhvgCRS53QzqSiXdGumblGuDZdbe/xqYNFM5/wr8A4wU0R2iMiFwO1AAfCKiLwvIndF6/yxUlNTwzXXXMPGjRvZuHEjjz76KG+99Ra33norv/jFLw547pVXXskxxxzD2rVrWbNmTU+tnM2bN3P55Zfz0UcfMXbsWJ566ikAvvSlL7Fy5UrWrl3L7NmzuffeewG46qqr+O53v8vKlSt56qmnuOiii0Jq680338xLL73E2rVrefbZZwG4++67qa2t5f333+eDDz7g7LPP7nn+uHHjWLNmDZdddlm/Sz6Gcy1mzZrFsmXLeO+997j55pv54Q9/GFY7fv7zn/OZz3yGFStW8Nprr3HttdfS1uYf616zZg1PPvlkSgR98FflnGwN8wAU59l0jF8NKmo9fmPMWf1svjca5xqqZx5NFRUVPatcVVdXs3TpUkSEuXPnUltbe8Bz//Of//SsjRvodTc2NlJRUcEhhxwCwIIFC3r2W7duHT/60Y/Yv38/ra2tnHTSSQC8+uqrrF+/vue4zc3NtLa2DtnWI488kvPPP5+vfvWrfOlLX+o51qWXXtozJGK323ueH3jOggULePrppyNyLZqamjjvvPPYvHkzIoLH4wmrHS+//DLPPvtszx+Cjo6Onk9AJ5xwwgH7j3Z1TjeHTi7q+bkoz6Z5/GpQo38ANMqysrJ6vk9LS+v5OS0tDa/XO9BuAx4jPT2d9vZ2AM4//3yeeeYZ5s+fzwMPPMDrr78OgM/n49133yU7O3tYbb3rrrtYvnw5//rXv1iwYAGrV68OqV3p6ek9ryUjIwOfz9fznI6Ojn5fx0DX4sYbb+S4447j73//O7W1tRx77LFDtru/dhhjeOqpp5g5c+YBz12+fHlKrS+w391Fc4eXqcW9PX57ro3WTi+d3m6yMtLj2DqVqLRkQwwtXbqUO++8E/CvgtXU1DTo81taWpgwYQIej4dHHulNgDrxxBO57bbben5+//33Qzr/li1bWLJkCTfffDMlJSVs376dE044gT/96U89AdXlcg16jPLyctasWQP4h1QCpZ9D1dTUxMSJEwF/FlLAcNtx0kkncdtttxHID3jvvfeG1Y7RwtEnowfomcS1X8f51QA08MfQ73//e1577TXmzp3LggULDhiu6c9Pf/pTlixZwpFHHsmsWbN6tv/hD39g1apVzJs3jzlz5nDXXaHdKrn22muZO3cuBx98MEcccQTz58/noosuYsqUKcybN4/58+fz6KOPDnqML3/5y7hcLqqrq7n99tuZMWNGSOcOuO666/jBD37AoYceesAnouG248Ybb8Tj8TBv3jyqq6u58cYbh9WO0SJQlXNqce+nnJ5JXK063KP6p/X4VUoZbe+b2/+zmVtf3sSGm08mx+Yf1nl3q5Ov3f0uj1y0hCOrxsW5hSqetB6/UqOQw+mmtCCrJ+iDP6sHtFCbGpje3B2Ffv7zn/PEE08csO2MM87ghhtuiFOLVLQ4XO4DxvfBn9UDGvjVwJI68BtjENHl5fq64YYbNMj3IxmGNYdru8vNpyqLD9g2NicT0MCvBpa0Qz3Z2dk4nc5R+cusIs8Yg9PpHHYKbCLr8HSzp7mDqfYD01cz0tMYm5uppZnVgJK2xz9p0iR27NiBVu5UocrOzmbSpNhVAvd0+8hMj17fakejG2M4IIc/wJ5r09LMakBJG/gzMzOpqKiIdzOU6temvS2cevtb3HPuIo6aHp3Mmp4c/n4Cf5GWbVCDSNqhHqUS2R2v1dDh8fHO1uiVlA4E/qn2fnr8WrZBDUIDv1IRVud08+zaXQB8FOGqsQecx+UmPysDu5XFE8yeq4FfDSxph3qUSlR3vbmFjLQ0lkyzRzXwO5z+qpz9ZbYV5dlodHdp5pvql/b4lYqgvc0dPLlqB19ZOIljZ5bS0NJJfUvH0DuGoc7l7neYB/yTuDzdhtbO0AoFqtSigV+pCLpn2Va8Ph+XHl1JdVkhQMQXCQLw+QzbG9v7zegBncSlBqeBX6kIaWzr4pHldZw6v4wpxbnMsQJ/NIZ79jR30OX19ZvRA2DP00lcamAa+JWKkAfersXd1c1lx1YBUJidyRR7blR6/L0ZPf2vPWDP869hoJO4VH808CsVAa2dXh54u5YT5oxn5kEFPdvnTCjko12Dr7sQjjqXf5nJgYZ6tDSzGowGfqUi4NHlDpraPXz72MoDtleXFVLrdEf8JqvD6SYjTZgwpv8SFEXWUI/2+FV/NPArNUIdnm7+vGwbR1YVc+iUogMeq57oH+ffsDuywz11LjcTi3LIGKAkRH5WBrb0NFxtugqX+iQN/EqN0JOrd9DQ0snl1th+sOqyMQB8tDOywz11/ZRjDiYiFOVl4mrrjOh51eiggV+pEfB2+7jrjS0cMnnsJ8ojA5QWZDEu3xbxzB6H0z3g+H5AUa5Ne/yqX1EL/CJyn4jUi8i6oG12EXlFRDZb/xYNdgylEt1zH+xiR2M7lx9X1e8MWRFh9oTCiAb+JreHpnbPgBk9AcX5Nh3jV/2KZo//AeDkPtuuB/5tjJkO/Nv6Wamk5PMZ7nhtCzPHF7B0VumAz6suG8Pm+ha6vL6InNdhZfQMlMMfUKT1etQAohb4jTFvAq4+m08D/mJ9/xfg9GidX6loe2XDXjbXt/Lt4ypJSxu4Hk51WSGebsPm+paInLcnh3+IwK8VOtVAYj3GP94Ys9v6fg8wfqAnisglIrJKRFbpYisq0RhjuOO1GqbYc/nc3AmDPrc6wjN461xWHf5Bbu6CP/A3tXvwdkfmk4YaPeJ2c9f410wccN1EY8zdxpiFxpiFJSUlMWyZUkP7b42TtTuauPSYygFTKgPKi/PItaVHbAZvndPNuPwscm2DF9cNlGtudOsNXnWgWAf+vSIyAcD6tz7G51cqIv74Wg2lBVl8ecHEIZ+blha4wRuZlE6Hq23IYR7wj/GDTuJSnxTrwP8scJ71/XnAP2J8fqVGbLWjkXe2Ornk6GlkZaSHtE91WSHrdzXj8w34ITdkdc6ByzEHK9YKnWoA0Uzn/CvwDjBTRHaIyIXALcAJIrIZON76WamkcufrNYzNzeSsxVNC3qe6rJC2ru6e8flwdXq72d3cMWRGD2hpZjWwqK3AZYw5a4CHlkbrnEpF24bdzby6oZ7vHj+DvKzQf316ZvDuaqZ83OD594PZ7mrHmKEzeqB3jF8Dv+pLZ+4qNQx3vr6FPFs65x0xdVj7TR+fT0aajHicP1CVc8oQk7cgaIxfA7/qQwO/UiGq3dfGPz/YxTcOn8rY3E8ucD6YrIx0po8vGHFKZ6g5/AC2jDQKsjJwauBXfWjgVypEf3pzCxnpaVx4VEVY+8+JQOmGOpebXFt6z43boQQWXVcqmAZ+pUKwp6mDJ1fv4KsLJ1Fa2H8N/KFUlxWyr7WT+ubwF1+vc/qrcvZXF6g/OntX9UcDv1Ih+POyrfgMfOvoyqGfPICeGbwjqM3vcA1dlTOYBn7VHw38Sg3B1dbFo8vrOG1+GZNDyJ8fSGDx9XBn8Pp8hjqXm6nFoWcFFeXa9Oau+gQN/EoN4YH/bqPd081lx4bf2wcoyM5kanFu2Jk9e1s66PL6hqzRE6w434ZLx/hVHxr4lRpES4eHB96u5aTq8UwfXzD0DkMYyQ3e4WT0BBTl2ujw+HB3RXbNX5XcojaBS8XOi+t2U+dyc8kIxp9Hsy6vj//9x7qwxrrrWzpp7vDy7X6WVQxHdVkhL6zbQ3OHh8LszGHtWxcI/CHk8AfYrUXXXW1dQxZ1U6lD3wlJ7vkPd/OdR9eQmZ7GRUdNG7QufKpav7uZx1ZuZ4o9l1xbaLV1gp37qanMnzw2Im0JzODduLuFxRX2Ye1b53KTniZMGBt6VpE9LwuAxjYPk3S9O2XRwJ/E/rNxL1f+9T1ybRm0dnrZub99RDcfR6tAfZw/n7uQmQeNfLhmJHpr8zcNO/A7XG4mjs0hc4gy0MECPX6nLrqugugYf5J6u2Yflz68hlkTCrjtrEMBqKlvjXOrElOdM1DmIP5/FEsLsxmXnxXWOH+dM7RyzMG0NLPqjwb+JLTa0chFD66ivDiXBy9YwiHWMMSWBg38/XE43ZQWZJETxjBPNMwpC+8Gr8PlHvYfr2JrqMfVpouxqF4a+JPMup1NnH//CkoLsnj4wiXY82wU5dkozrNpj38A4QTMaKouK2Tz3hY6vd0h79PU7mG/2zPsHn9BdgbpaYJLh3pUEA38SWTz3hbOvW8FhdmZPHLx4QeUDqgszdfAP4A6pzuk+vWxUl1WiNdn2Lw39P+vQEZPKFU5g6WlCUW5mdrjVwfQwJ8kHM42zr5nOelpwsMXLWHi2JwDHq8sydehnn50eLrZ09wxrBTIaAtk9gxnBm/gBvVwe/zgL9ugs3dVMA38SWDX/na+/ufleLp9PHzhEir6WcijqjSfRrcHZ6t+pA+2fQQBM1qm2nPJs6UPawavw6rDH07WVlGu1utRB9LAn+DqWzo4+57lNLd7ePCCJQOmI1aV5gOa2dNXoKecSEM9vYuvD6PH73QzLt9G/jBW/Qqw52nZBnUgDfwJrLGti3PuWcGepg7u/+Yi5k4aM+BzK0v8nwK2NLTFqnlJoafMQQLd3AX/OP+G3aEvvu5whn+DWod6VF8a+BNUS4eH8+5fwTZnG/ect5CF5YNP9ikbk0NOZrr2+Puoc7nJz8roWX82UVSXjaGtq5taZ2h/qIdblTOY3VqMJdQ/Mmr008CfgNxdXi54YCXrdzVzx9cP48iqcUPuk5YmTCvJo0Zv8B7A4Wwb1sIlsdJTojmE2vyd3m52NbWH3eMvyrXhM/6UUKUgToFfRL4rIh+JyDoR+auIhLek0SjU6e3mWw+tZrWjkd+eeQjHzxkf8r5Vpfls0R7/ARIthz9gxvgCMtMlpHH+HY3tGBP+DerifP+nHR3nVwExD/wiMhG4ElhojDkYSAe+Fut2JCJPt4/vPPoeyzbv45Yvz+ML88uGtX9VST4797drCV5Lt8+ww9WeUBk9AbaMNKpKQ1t8fSSpnNBbtkEze1RAvIZ6MoAcEckAcoFdcWpHwjDGcO0Ta3ll/V5+cmo1X104edjHqLQye7bqDV4A9jR30NXtS6iMnmDVZYWs39WEMYOPvQcmb4VbgC9wf0MDvwqIeeA3xuwEbgXqgN1AkzHm5b7PE5FLRGSViKxqaGiIdTNjrs7l5pn3d3HZsZWcd0R5WMcIpHTqRC4/h3XjNJEmbwXzL77eRX3L4HMvHE43ubZ0SvKzwjpPIPBrZo8KiMdQTxFwGlABlAF5IvKNvs8zxtxtjFlojFlYUlIS62bGXK3VqztuZmnYx5hanEt6mmhmjyURJ28FC3UGb51rZDeoA0M9Tg38yhKPoZ7jgW3GmAZjjAd4GjgiDu1IKIHSwSMJUlkZ6Uyx52rgtzicbjLShAljEjN3YPYE/2S8oWbwjiSHHyDHlk5OZrr2+FWPeAT+OuBwEckVfxdmKbAhDu1IKA6nm+zMNEoLwvs4H6A1e3o5XG4mFeWQMYyFS2Kpd/H1gXv8Pp+xcvhH9qlFZ++qYPEY418OPAmsAT602nB3rNuRaAJphyPNN68qzWfbvja83b4ItSx51TndCb8iWfUQtfnrWzrp9PqYEubkrQB7ntbrUb3i0hUyxvzYGDPLGHOwMeYcY0zKVxarG+HH+YDKkjw83aYnBTCVOcJYsSrWqsvGUOdy09zR/+SqnlTOEb43irRsgwqSmJ+BU4wx/kA93Frr/enN7EntlM797i6aO7wJm9ETEJjBu2GAXr8jAvd+AIp1qEcF0cCfABpaO2n3dEekd1qpVTqB3uJsiZrDH9C7+Hr/gb/O5SY9TSjrs/7CcBXl2nC1auBXfhr4E0BdBINUYXYmpQVZKR/4RzrbNVZKC7IpKRh48XWH003Z2GwyR3iD2p6XSVtXNx2e0Jd7VKOXBv4EEOnSwVWlmtnTU4c/wW/uAsyZUDhgSqfD5Y7IcJXdWnR9v1sLtSkN/AnB4XKTJjCpKIKBv751yFIAo5nD2UZJQRa5tuEvXBJr1WWF1NS39rv4ep2zLSKfBO15mQA4ddF1hQb+hFDnbGPCmBxsGZH576gsyael0ztkKYDRbKSTnmKpumwMXp9h054DP6U1d3hodHsi8kkwMHu3URddV4QY+EXkSBHJs77/hoj8RkSmRrdpqSPSpYN7MntSeJy/zuVOuFW3BlLdU5v/wOGewL2fSNyn0NLMKlioXcw7AbeIzAeuAbYAD0atVSmmzjnymZnBetbfTdFx/g5PN3uaOxI+oydgij2X/KyMT9zg7b1PMfIx/p7SzK2p+ylQ9Qo18HuNf8D4NOB2Y8wfgf5X/VbD0trpxdnWFdEgVVqQRX5WRspm9uxodI9o4ZJY8y++/sna/JFMSR2ba0MEXFG4ubtpb0tK309KRqEG/hYR+QFwDvAvEUkDMqPXrNTR83E+ghONRITKFM7siWRPOVaqy8awYXcz3UHr4ta52ijOs5GfNfIb1OlpwticzIjP3t20t4UTf/sm9/+3NqLHVdEVauA/E+gELjDG7AEmAb+OWqtSSJ0rMjMz+6oqyU/ZHr8jgmPjsTKnrBB3n8XXHU53RD8JFkWhXk+gpPQf/rNZ1/RNIiEFfivYPwUESkfuA/4erUalkmjNMK0szWNvc+eANWBGM4fTTZ4tnWJrAZJk0HODN2i4x+GM7A1qe27kA39NfSsi/vkBd72xJaLHVtETalbPxfgrav7J2jQReCZKbUopDpebotxMCrMjO3JWVZK6yzDWufxVOUda6TSWppceuPh6l9fH7qb2EVflDGbPs9EY4ayemvpWKorzOP2QMu57axu7m9ojenwVHaEO9VwOHAk0AxhjNgPhLxWlekSqKmdfVSlcsycZqnL2ZctIY3ppQc8M3p372/GZyM3mBn/gj/QqXFsaWqkszeeaE2diDPzm5U0RPb6KjlADf6cxpucdYy2SrrfxI8Dhaotory5gij2XzPTUW4bR5zNsb2xnahSuabT5F19vxhgTsaqcwQKlmSOVgePt9lHrbKOyJJ/J9lzO/dRUnlqzg417Bl9KUsVfqIH/DRH5IZAjIicATwDPRa9ZqcHT7WPX/o6oTDTKSE+jvDgv5TJ79jR30OX1Jc2s3WDVZYU427rY29wZlVpDxXk2vD5DS6c3IsdzuNx4uk3Pp8vLj6siLyuDX76wMSLHV9ETauC/HmjAv2LWt4DngR9Fq1GpYtf+drp9JmoTjQI1e1JJslTl7E/1RP/i6x/tasLhdJOTmU7JCJfiDNY7iSsywz2B91Yg8Bfl2bj8uCpe+7iBt7fsi8g5VHSEGvhzgPuMMWcYY74C3GdtUyMQ6aqcfVWW5ONwuenyps4yjNGYFxErsyf0ZvYEag1F8ga1PS+yZRsCM8OnlfRe6/OPKGfCmGxueWEjPp+OBieqUAP/vzkw0OcAr0a+OanF0dM7jU6QqirNp9vXO16cChyuNjLShLKx2fFuyrDlZ2VQbi2+XueKTFXOYIHAH6lJXDX1rYwvzDogIy07M51rTpzJBzua+NeHuyNyHhV5oQb+bGNMz5iB9X3yfZZOMHXONrIy0iiN4Mf5YKmY2eNwuplYlEPGCBcuiZfqsjGs29UUlSJzgcAfqcyeLQ1tPe+xYF88dCKzDirg1y99nFKfNpNJqL8dbSJyWOAHEVkAaMLuCDmc/nzztLTo5JsHPoKn0g3eughXOo21OWWF7Ghsp8Pji/h9iqII9viNMWypb6Wy5JOBPz1NuP6UWdS53Dyy3DHic6nICzXwXw08ISLLROQt4HHgO1FrVYqIdungXFsGE8fmpFyPP5kDf2AGLxDxNN88Wzq2jLSIjPHvbe6ktdPbb48f4JgZJRxRWcxt/6lJydnjiS7Ukg0rgVnAZcClwGxjzOpwTyoiY0XkSRHZKCIbRORT4R4rWRlj/L3TKGefVJbmp0x55ia3h6Z2T1Jm9ARUl43p+T7Sf8BExF+2IQJZPYFPkVX99PgD5/rBKbNxtXXxJy3lkHCGMxA6E5gDHAacJSLnjuC8vwdeNMbMAuYDG0ZwrKS0r7ULd1d31BcLqSzJY0t9W0JlWESrLQ6r4F0yVeXsq6Qgi5KCLNIEJo6NfOJcUYTKNgQ+RVYO0OMHmDtpDKfOL+Pet7axp6ljxOdUkRNqrZ4fA7dZX8cBvwJODeeEIjIGOBq4F8AY02WM2R/OsZJZb1XO6AapqtJ82j3d7G5OjF+8Nzc1cOhPX2HZ5oaIHzuZc/iDzZs4hsn23IgtxRmsOEIVOmvqWynIyhgyMeHak2bS7TP89hUt5ZBIQn1nfQVYCuwxxnwTfy99zOC7DKgC/2Sw+0XkPRG5J7CsYzARuUREVonIqoaGyAeJeItWVc6+Ah/FE2Gcf8U2F5c8tIqmdg8vrtsT8eP3XNMkHuMH+PEXqrn9rMOGfmIYIlWaOVCjZ6h5BpPtuZxzeDlPrN7Opr0tIz6vioxQA3+HMcYHeEWkEKgHJod5zgz8w0V3GmMOBdrwzww+gDHmbmPMQmPMwpKSkjBPlbgcTjciMKkouvPgKhNk/d212/dzwQMrKRubw6FTxrKy1hXxc9Q53YzLzyIvAguXxNOU4lzmTgq3XzU4e25mxHr8/WX09Oc7n6kiz6alHBLJkIFf/H/SPxCRscCfgdXAGuCdMM+5A9hhjFlu/fwk/j8EKaXO5WZCYTZZGelRPU9xno2xuZlxvcG7YXcz5963gqK8TB696HCWzipl097WiK8G5XC1McWuE8oHY8/LornDi6c7/Pz65g4P9S2dA2b0fPKcNi47rpJ/b6xn+VZn2OdVkTNk4LfW2l1sjNlvjLkLOAE4zxryGTZrUZftIjLT2rQUWB/OsZKZwxn5mZn9EZG4rsa1taGVc+5dTk5mOo9edDgHjclmUbkdgFWOxoiey79offLe2I0Fe55/lu1IbvD2rdETiguOrOCgwmx+8cJGXZ83AYQ61LNGRBYBGGNqjTEfjPC8VwCPiMgHwCHAL0Z4vKTjz+GPTZCqLMlnaxx6/Ntdbs6+ZznGwMMXLWGyNfY+f/JYbOlpER3u6fT6b2An+/h+tPVO4go/t74no6ck9PdvdmY6/3PiDNZu38/zH0b+/o4anlAD/xLgHRHZIiIfiMiHVtAOizHmfWv8fp4x5nRjTGS7fgmurdPLvtaumPT4wd8z29faxf4Ir740mL3NHZx9z3LaOr08dOGSA3qH2ZnpzJs0hhXbIhf4t7vaMSb5M3qiradQ2wiG2WoaWrGlpw37j+yXD5vEzPEF/PqljVrKIc5CDfwnAZXAZ4AvAJ+3/lVhiHXaYaxr9jhbOzn7nuU4Wzv5ywWLmRM0GzVgUYWddTubcHdFpjb89lGSyhltkQj8W+rbKB+XO+x6SOlpwvdPmUmt081fV9SFfX41cqHO3HX09xXtxo1WjhiXDg5kX8SiZk9Tu4dz7l3Bdpebe89fxKFTivp93uJyO16f4f26/RE5b6ACaTJP3ooFe+7ISzNvaQg9o6ev42aWcvg0O3/492ZatJRD3CRnCcMkF5i8FauhnolFOWRlpEW9x9/W6eX8+1ewub6FP52zgMOnFQ/43MOmFiECKyI0zu9wucm1pTMu3xaR441WIy3U1untxuHsvypnKAKlHJxtXdz95tawjqFGTgN/HDicbsbkZDImJ3PoJ0dAepowLcqZPR2ebi76yyo+2NHEbWcdxrEzSwd9/picTGYdVBixG7x1UVi4ZDTKTE+jIDsj7KEeh9ONzwwvo6ev+ZPH8vl5E7hn2TbqE2RGearRwB8HdS53zMeiK0vy2NIQnQVZurw+Lnt4Ne9uc3LrGfM4+eCDQtpvcXkRaxz7R5RTHuBI8nLMsWQfwezd3oye8AM/+Es5eH0+fvvq5hEdR4VHA38cxKN0cFVpPtsb3XR4uiN6XG+3j6sff4/XPm7g56fP5YuHTgp530UVdto93Xy0q3lEbfD5TFz+mCYr+wgKtQUC/7RhpHL2Z2pxHmcvmcrjK+uoqddSDrGmgT/GvN0+du5vj3mQqirNxxjYGsFev89nuO6pD3j+wz386HOz+fqSKcPaf7E1kWvlCNM697Z00OX1Rbx+/Whlzw2/x7+loZWJY3PItY28LMYVn6ki15bBL1/8eMTHUsOjgT/Gdu3voNtnYr4YeKQze4wx/O+z63h6zU7+54QZXPTpacM+RmlhNlOLc0d8g7cuyovWjzYjKdRWU986aCnm4SjOz+KyYyt5Zf3eqNRuUgPTwB9jjhhn9ARUjMsjTSKXy3/XG1t5+N06vnXMNK74TFXYx1lUbmdVrWtENfodmsM/LIHSzMMtneDzGbY0tA64+Eo4LjiygvGFWfzi+Q1ayiGGNPDHWE8Of4yDVHZmOpPtuREp1tbc4eGO12s4fvZ4rj951ogyaRaX22l0e0b0SaTO6SY9TSiLwsIlo1FRno1Or4/2Yd7v2dXkXwt4JBk9feXY0vnu8TN4r25/VEp1q/5p4I+xOpcbW0Ya4wuyY37uypL8iJRnfvhdBy0dXq4+fvqI0ycXVfjH+Ucy3ONwuSkbm03mMGeSpqrAJC7nMJdgDKdGTyi+smAS00vz+dVLH0ckw0sNTX9TYszhbGNyUQ5pabHPN68qzWfrvja6RzCs0t7Vzb3LtnHMjBIOnjjymvHlxbmMy88a0Q3eOmdbzO+ZJLNA2YbhZvbUhFGVMxQZ6Wl8/+RZbNvXxmMrt0f02Kp/GvhjzBHH0sFVJfl0eX3saHSHfYzHV9bhbOvi8uPCH9cPJiIsrihiZW34dfocMVi0fjQpCrNez5aGNopyMynOH3y5xXAsnV3K4go7v391E62dkanfpAamgT+GjDFsj+NEo8pS/x+ccMfTu7w+7n5zK4vKi1hsDdFEwqJyOzv3t7Nzf/uw921q97Df7dGMnmEIt1DblmGsujVc/lIOs9jX2sWftZRD1GngjyFnWxdtXd1xyz6pKikAws/seeb9nexq6uDbEertBywaQT6/VuUcvnADf01Da8SHeYIdOqWIz82dwJ+XbaW+RUs5RJMG/hiKV0ZPwJjcTMblZ4UV+Lt9hrte38KcCYUcOyOyayDPnlBIQVZGWDd4exdY1zH+UBVmZ5CeJsMa43e1deFq64pq4Ad/KYcur4/faymHqNLAH0M9VTnjGKTCrdnz4ro9bN3XxuXHVUW8EFp6mnDY1KKwevzxmheRzESEomHO3g0MD0ZrqCegfFweX18yhcdWbo9JGfFUpYE/hhxONyIwqSh++eZVpf4qncOZLGOM4Y+v1TCtJC/kAmzDtbjCzub64S/AXud0My7fRn7WyEsIpJLiYc7ejVZGT3+uXDqd7Iw0fvXixqifK1Vp4I+hOqebgwqzyc5Mj1sbqkrzaWr3sG8YOdyvb2pg/e5mLjumkvQopaH2jPMPc7jH4XT3rOWrQleUlzmsdXe31LeSlZHGxBhMkhuXn8W3jqnkpY/2stqhpRyiQQN/DCVC6eBwavbc8VoNE8fmcPqhE6PVLOZNGhPWAuz+Res18A+XPc+Gs60z5OfXNLQyrSQ/ZvNPLvp0BSUFWfzi+Y1ayiEKNPDHUCKUDh7u+rsrtrlYWdvIJUdPi+rM2OzMdOZPHsOKYeTzd3q72dXUrlU5w+AvzRx6j7+mProZPX3l2jL47vEzWO1o5OX1e2N23lQRt8AvIuki8p6I/DNebYgld5eXhpbOuE3eCpgwJptcW3rIgf+Pr9UwLt/GmYsmR7ll/uGej4axAPuOxnaM0aqc4bDn2tjv7gppFnd7Vzc797dHtDhbKL66cBKVJXn88sWNeLWUQ0TFs8d/FbAhjuePqTpXIO0wvkFKRPw1e0IY6lm3s4k3NjVwwVEVMbkvsajCvwD7eyEuwF6nOfxhK8qz4TP+CXBD2bqvFWN6JwDGSqCUw9aGNh5fpaUcIikugV9EJgGfA+6Jx/njId45/MGqSkMr1nbH6zUUZGfwjcOnxqBVsCCwAHuIaZ2BOvyayjl8w5nEFcuMnr5OmDOeReVF/PaVzbRpKYeIiVeP/3fAdcCAn99E5BIRWSUiqxoaGmLWsGjpXSwk/uPRVaX57GrqGPQXqaa+lRfW7eG8T5VTmB2bReELszOZPYwF2B1ONzmZ6ZREoXbMaDecQm1bGtpIEyiPwzCliHD9KbPZ19rJPcu2xfz8o1XMA7+IfB6oN8asHux5xpi7jTELjTELS0oiO1M0HhyuNgqzMxiTG5sgOphAWd3BlmG8640tZGWk8c0jy2PUKr/FFXbeqwttAfY6VxtT7LkRn1CWCoqGUZp5S30rk+25cUtDXjC1iJOrD+JPb26hoSX0TCQ1sHj0+I8EThWRWuAx4DMi8nAc2hFT8azK2VdPZk9D/4tc72h088x7Ozlr8ZSoVGIczKJy/wLs63Y2Dflch1OrcoarOD/0Hn9NfWRX3QrHdSfPpNPr4w//1lIOkRDzwG+M+YExZpIxphz4GvAfY8w3Yt2OWKtLoNLBU4vzyEiTATN7/vzmVkTg4jDW0R2pRRVFwNATuXw+ozn8IxDo8Q81xt/tM2zb1xaX8f1g00ryOWvxZP66oo6tWsphxDSPPwa83T52NrYnTJDKTE9jSnEuW+o/OdTT0NLJYyu386VDJ8VlKcPSgmzKi3NZsW3wfP76lk46vb6EuFmejLIz08m1pQ8Z+Le73HR1+6JeoycUVy2dgS0jjV+/9HG8m5L04hr4jTGvG2M+H882xMLupg68PpNQQaqqJL/f9Xfv++82PN0+Lj22Mg6t8ltUbmeVY/AF2HvSYxNk+CwZ2fNsQ9ZG6lluMc49foCSgiwuOXoaL6zbw5q68BfuUdrjj4lELB1cVZpP7b62A26iNrV7eOgdB5+dO4GKcfFr66IKO/vdnkEXhnc4/Z9WEuVTVDKy59lwDTHGH5jvEe8x/oCLPz2NcflZ/L/nN2gphxHQwB8DgdLBidTjryzJx2uNkwc89E4trZ1evn1sZBdaGa7FVsG2wfL561xu0gQmxrHSabILpTRzTX0r4/KzEiIbDSAvK4Orj5/OytpGXt1QH+/mJC0N/DFQ53RjS09jfGF2vJvSo2/NHneXl/v+W8tnZpUyp6wwnk1janEuJQVZg97gdTjdlI3NiWr9oNEulNLM/lW3EueTKsCZiyYzrSSPW17YoKUcwqS/NTHgcLqZZM+JWknjcFT2CfyPrdiOq62Ly4+L39h+gIiwuNw+6MIsjgQoeJfsioYY4zfGsCXGxdlCkZmexnUnzWJLQxtPrN4R7+YkJQ38MeBIwLTD/KwMDirMZktDa88i6ksq7CyYGrlF1EdiUXkRu5o62NHo7vfxOmdbQt0zSUb2PBttXd10eLr7fbyhtZPmDm9CZPT0dVL1eBZMLeK3r2wKuaif6qWBP8qMMWx3Jc7krWCBmj1/f28He5o7uDzCi6iPxKKKgRdmae7w0Oj2aI9/hIYq2xDPGj1DERF+cMos6ls6uVdLOQybBv4oc7V10drpjXtVzv4ElmG88/UtzJ04hk9PHxfvJvWYdZC1AHs/+fy9dY8S75omk6EmcQXWZk7EwA+wsNzOiXPG86c3t7KvVUs5DIcG/ihzJHDp4MqSPNq6uql1urn8uMqEqnmTniYsKC/qt8ffm8OfeNc0mQxVoXNLfSt5tnQOSqCkhL6uO3kW7Z5ubtNSDsOigT/K6hKoHHNfgRu8lSV5nDgnOouoj8Sicjs19a2fCEy98yIS75omk6ECf019K5Wl+QnVIeirqjSfMxdN5pHlddTuG7jooDqQBv4oCwSpSUWJF6SqJ4yhKDeTa06cGbO1VIdj8QDj/HWuNux5NgpiVC56tOoZ4x9wqCf+xdlCcfXx07WUwzBp4I8yh6uNgwqz41bSdjBjcjNZc+MJfHbuhHg3pV/zJo3BlpH2ibROhzP+i9aPBmNyMhHpv8ff2ulld1NHQpRqGEppQTYXfXoa//pwN+9v3x/v5iQFDfxRVpfgpYMT+WN8VkY6h0wa+4kev7/EdeJe02SRnib+2bv9ZPUEVmhLxFTO/lxy9DTG5du0lEOINPBHmZYOHplFFUWs29Xcs1pYl9fH7qbEqXSa7IpyM2ls++S6uz01epKgxw/+eSlXLZ3O8m0u/rNRSzkMRQN/FLV3dVPf0qm90xFYVG6nO2gB9p372/EZrcoZKfY8G862T6ZC1tS3kpEmSfXe/driKVSMy+OWFzZqKYchaOCPIi0dPHILphaRJrDCGu7pqcqZRAEpkflLM3+yx19T38rU4tykqoXkL+Uwk831rTy1Rks5DCZ5/leTkJYOHrmC7ExmTyjsucEb+GOq1zQyBirNvKUh8Wr0hOLkgw/i0Clj+c0rm2jv6r8UhdLAH1U9PX4NUiOyqNzOe9sb6fL6cDjdZGemUVIQ27WAR6uiXH+htuAbop5u/3VOlhu7wfylHGazt7mT+/6rpRwGooE/ihxONwXZGYxNkFrmyWpxhZ0Oj491u5p6UjkTORspmdjzbHh9huaO3kJnDmcbXp9Jyh4/+N8vx88ez12vbxmy7HSq0sAfRYHSwRqkRmaRtTDLym0u6lxalTOS+pvEVVOf2DV6QnH9KTNp6/Jy23+0lEN/NPBH0XaXm6kapEaspCCLinF5rNjm8qfH6o3diCmyAr8zKPAHUjmnJeFQT0BVaQFnLprMw+86esqmqF4a+KOk22fY0ZjYk7eSyaLyIpbV7KPD49PAH0HF/fb4W5kwJpv8rIx4NSsirj5+Bulpwq9f1lIOfcU88IvIZBF5TUTWi8hHInJVrNsQC7v2t+PpNpp9EiGLyu10ef252XqzPHJ6SjO7D+zxJ/MwT8D4wmwu/vQ0nlu7i7VayuEA8ejxe4FrjDFzgMOBy0VkThzaEVVaOjiyAgXbgIRc1CZZ9a3QGVhuMRkzevpzydHTsOfZ+H8vaCmHYDEP/MaY3caYNdb3LcAGYGKs2xFtWjo4sqbYcyktyCJNYOLYnHg3Z9TItaWTlZHWM9Szu6mDtq7upCjOFoqC7EyuWjqdd7e6eP3jhng3J2HEdYxfRMqBQ4Hl8WxHNDhcbWSmCxPGaJCKBBHhqOnjqCzJx5aht6YiRUT8k7iswN9To2eU9PgBzlo8hanFudzywka6fdrrhzgGfhHJB54CrjbGNPfz+CUiskpEVjU0JN9f6jqnm8lFuaQnYJ37ZHXzaQfzyMVL4t2MUacotzfwB9bZrSwdPcNptow0rjtpFh/vbdFSDpa4BH4RycQf9B8xxjzd33OMMXcbYxYaYxaWlJTEtoER4EjwcszJKD8rg9KCxF0GMFkV5/eWbaipb6UwO4OS/NE1M/qzcw9i/uSx/PaVTXR4tJRDPLJ6BLgX2GCM+U2szx8Lxhgrh18Dv0p8gbIN0JvRM9omHfpLOcxid1MH9/+3Nt7Nibt49PiPBM4BPiMi71tfn41DO6Km0e2hpdOrVTlVUvCXZg70+NtGTUZPX4dPK2bprFLueL1mwOUmU0U8snreMsaIMWaeMeYQ6+v5WLcjmrQqp0om9jwbLR1e9rV2sq+1c1Tk8A/k+6fMoq3Ty+2v1cS7KXGl6RFRoDn8KpkEyjasqm0EkrtGz1BmjC/gjAWTefCdWra7UreUgwb+KNAcfpVM7Nbs3cDaxqN1qCfguyf4SzncmsKlHDTwR4HD6WZ8YRbZmenxbopSQwrM3l2xzYUtI43Jo7zDctCYbC48qoJ/vL+LD3c0xbs5caGBPwrqXG1alVMljUDgX7+7mWnj8lJi7sm3jqmkKDeTW15MzVIOGvijoM6lOfwqeRTl+RcK6vaZUT/ME1CYncmVS6fz3xonb27eF+/mxJwG/gjr8HSzt7lTM3pU0ghU6ARGTY2eUJy9ZCpT7Ln8v+c3pFwpBw38EaYZPSrZZKanUZjtr70/mjN6+rJlpPG9k2aycU8Lz7y3M97NiSkN/BGmGT0qGQXG+StLUuve1OfnTmDepDH838sfp1QpBw38A/B2+2jv6h72V6C6odaMV8nEnmdDZPSncvaVliZcf8osdjV18Je3a+PdnJhJ7rXVomS1w8UFD6yiqd0T1v6F2RkU5WZGuFVKRU9JQRZT7LkpmYJ8ROU4jptZwh9fq+HMRZMZG3TPY7TSwN/Hup1NnH/fSorzbVx2bGVYx5g9oXDUFblSo9t1J8+itcMb72bEzfdPmcUpv1/GH1+r4YbPjboFAT9BA3+QTXtbOOfe5RTmZPLIxYfrSk8qZaTaEE9fsw4q5CuHTeIvbzs491Plo34Sm47xW2r3tXH2PcvJSE/jkYuWaNBXKsX8z4kzEIHfvLIp3k2JOg38wM797Zx9z3K83T4euWgJ5eP0xqxSqWbCmBwuOKqCZ97fybqdo7uUQ8oH/vqWDr5xz3Ka2z08dOESZowviHeTlFJxcukxlYzJyeSXL26Md1OiKqUDf2NbF+fcs4I9TR08cMEiDp44Jt5NUkrF0ZicTL5zXBXLNu/jzU3Jt9Z3qFI28Dd3eDj3vhVsc7Zxz3kLWTDVHu8mKaUSwDmfmsqkohxueWEjvlFayiElA7+7y8uFD6xkw+5m7jz7MI6sGhfvJimlEkRWRjrXnjST9bub+cfa0VnKIeUCf4enm289tJrVjkZ+97VDWDp7fLybpJRKMF+YV8bBEwu59aVNo7KUQ0oFfk+3j+88+h7LNu/jl1+ex+fnlcW7SUqpBJSWJvzglNns3N/OQ+844t2ciEuZwN/tM/zP39by6oa93HxaNWcsnBzvJimlEtiRVeM4ZkYJt79WQ5M7vPItiSolAr/PZ/jB0x/w3NpdXH/KLM79VHm8m6SUSgLXnzKL5g4Pd7xeE++mRFRcAr+InCwiH4tIjYhcH81zGWO4+Z/r+duqHVz5mSouPSa8+jtKqdQze0IhXzx0Ive/XcvO/e3xbk7ExDzwi0g68EfgFGAOcJaIRK0q0q0vf8wDb9dy4VEVfPeEGdE6jVJqlLrmxJkA/N/LH8e5JZETjyJti4EaY8xWABF5DDgNWB/pE93xeg1/fG0LZy2ewo8+N1srZiqlhm3i2By+eUQ5dy/byoc7Yl/K4Rdfmsui8sjOM4pH4J8IbA/6eQewpO+TROQS4BKAKVOmhHWiqfY8vrJgEj87/WAN+kqpsF3+mSrcXd042zpjfu6cKKyRkLBlmY0xdwN3AyxcuDCs6XOfmzeBz82bENF2KaVST2F2Jj89/eB4NyNi4nFzdycQnEs5ydqmlFIqBuIR+FcC00WkQkRswNeAZ+PQDqWUSkkxH+oxxnhF5DvAS0A6cJ8x5qNYt0MppVJVXMb4jTHPA8/H49xKKZXqUmLmrlJKqV4a+JVSKsVo4FdKqRSjgV8ppVKMGJP4S4uJSAPQBuyLd1sS2Dj0+gxFr9Hg9PoMLdmu0VRjTEnfjUkR+AFEZJUxZmG825Go9PoMTa/R4PT6DG20XCMd6lFKqRSjgV8ppVJMMgX+u+PdgASn12doeo0Gp9dnaKPiGiXNGL9SSqnISKYev1JKqQjQwK+UUikmboFfRO4TkXoRWRe0bb6IvCMiH4rIcyJSaG23icj91va1InJs0D4LrO01IvIHGUVLbUXwGr1uLW7/vvVVGvtXE3kiMllEXhOR9SLykYhcZW23i8grIrLZ+rfI2i7We6RGRD4QkcOCjnWe9fzNInJevF5TJEX4+nQHvX9GTRn1MK7RLOv3r1NEvtfnWCdbv2c1InJ9PF5PyIwxcfkCjgYOA9YFbVsJHGN9fwHwU+v7y4H7re9LgdVAmvXzCuBwQIAXgFPi9ZoS+Bq9DiyM9+uJwvWZABxmfV8AbALmAL8Crre2Xw/80vr+s9Z7RKz3zHJrux3Yav1bZH1fFO/XlyjXx3qsNd6vJ0GuUSmwCPg58L2g46QDW4BpgA1YC8yJ9+sb6CtuPX5jzJuAq8/mGcCb1vevAF+2vp8D/Mfarx7YDywUkQlAoTHmXeO/+g8Cp0e35bETiWsU/VbGjzFmtzFmjfV9C7AB/5rOpwF/sZ72F3rfE6cBDxq/d4Gx1nvoJOAVY4zLGNOI/7qeHLtXEh0RvD6j1nCvkTGm3hizEvD0OdRioMYYs9UY0wU8Zh0jISXaGP9H9F6sM+hdonEtcKqIZIhIBbDAemwi/sXaA3ZY20az4V6jgPutj+k3jqbhsAARKQcOBZYD440xu62H9gDjre8nAtuDdgu8XwbaPmqM8PoAZIvIKhF5V0ROj36LYy/EazSQpHoPJVrgvwD4toisxv+xq8vafh/+C7kK+B3wNtAdjwYmgHCu0dnGmLnAp62vc2LZ4GgTkXzgKeBqY0xz8GPWJ8GUzlmO0PWZavylCr4O/E5EKiPf0vhJtfdQXFbgGogxZiNwIoCIzAA+Z233At8NPE9E3sY/FteIf7H2gFG/cHsY1whjzE7r3xYReRT/x9IHY9vy6BCRTPy/sI8YY562Nu8VkQnGmN3WUEW9tX0nB34KCrxfdgLH9tn+ejTbHSsRuj7B76GtIvI6/p7xlhi8hKgb5jUayIDXLhElVI8/kG0iImnAj4C7rJ9zRSTP+v4EwGuMWW99FGsWkcOt4YtzgX/Ep/WxMdxrZA39jLO2ZwKfB9b1e/AkY/2f3wtsMMb8JuihZ4FAZs559L4nngXOtbJXDgearPfQS8CJIlJkZW+caG1LapG6PtZ1ybKOOQ44ElgfkxcRZWFco4GsBKaLSIWI2ICvWcdITPG6qwz8FdiN/ybJDuBC4Cr8vdRNwC30ziwuBz7Gf+PlVfwfOwPHWYg/kG0Bbg/sMxq+InGNgDz8GT4f4L8/8HsgPd6vLULX5yj8H8E/AN63vj4LFAP/BjZb18JuPV+AP1rvlQ8JynTCP4RWY319M96vLZGuD3CE9fNa698L4/3a4niNDrJ+F5vxJ1DswJ9ggrXfJuv63RDv1zbYl5ZsUEqpFJNQQz1KKaWiTwO/UkqlGA38SimVYjTwK6VUitHAr5RSKUYDv1JKpRgN/EoplWI08KuUJSJ5IvIv8a9fsE5EzhT/+g5viMhqEXkpUJ1SRC4WkZXWc58SkVxr+xnWvmtF5E1rW7b0ro3wnogcZ20/X0SeFpEXrTrvv4rfq1epTCdwqZQlIl8GTjbGXGz9PAZ/PfrTjDENInImcJIx5gIRKTbGOK3n/QzYa4y5TUQ+tI6xU0TGGmP2i8g1QLW13yzgZfzltL8G/C/+Ojed+GdaH2WM2Y5SMZRQRdqUirEPgf8TkV8C/8Rf9O9g4BWrcnU6/pIZAAdbAX8skE9vLZ//Ag+IyN+AQIGvo4DbwF9UT0Qc+AM/wL+NMU0AIrIemMqB5XyVijoN/CplGWM2iX95wc8CP8O/kM1HxphP9fP0B4DTjTFrReR8rGqexphLRWQJ/iqpq0VkwRCn7Qz6vhv9HVRxoGP8KmWJSBngNsY8DPwaWAKUiMinrMczRaTaenoBsNuqcHp20DEqjTHLjTH/CzTgL827LPAcq3T2FPzDOkolBO1tqFQ2F/i1iPjwV0C9DPACf7DG+zPwL2rzEXAj/pWZGqx/C6xj/FpEpuOvbPlv/BUsNwJ3WuP/XuB8Y0ynjL6Fz1SS0pu7SimVYnSoRymlUowGfqWUSjEa+JVSKsVo4FdKqRSjgV8ppVKMBn6llEoxGviVUirF/H9434R7dG01bAAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "plot_data_wins.plot(title=f\"{driver}'s F1 Wins\", ylabel=\"races\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 133, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 133, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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v6PexYPv7yCxVyTL505laFKsD3LZMRr4lQpxG/eVcdXi1dTUOXn88pM4d9zA9nfqwVwuw7f5lazOKWFNTilrckopqa7r0jHTk+N47tpsBvfp5aVcdo0GfqVC2LrvS5m15GuS4qIYkRLFDS9s4OGZhvMn+GZwsO6oweli64EK1rgF+gpHAwCD+/TitIwUskckMXFYX+KiOxcyk+OjiYroPi3rGvh97M0332T79u3ceWfLE43l5uZy3nnnsXXr1i6ntXTpUtauXcvjjz/e5WOlpaWxdu1akpP98yRhd89HT7RqTwlXL/2a1N4xvDA3m4SYSK5++mtueXED9U4XF08cEugs+kRtg5PNeeWs3lPC6pxS1n1/iJo6JwAjkuP48QkDmZKexJT0JIb0DXyzjC9o4PexCy644KjB1ZT/6PwCrftiVzHXLvuaIX1jeeHabPr3jgFg6dWTufaZtdy2chMNTsOlk4cGOKddV1PXwIa9ZazOKWX1nhI27CujrsFqq89MTeBnE4eQPSKJKWlJTeXQ0/WI/4o/vLWN7QcqvHrM4wf15t7z2x7SIDc3l3PPPZepU6fy5ZdfMnnyZObMmcO9995LYWEhzz//PNu3b2+qhRcUFHD99dezZ88eAJ544gkGDRqE0+lk7ty5fPnllwwePJg33niDXr16sWjRIhYuXEhdXR2jRo3i2WefJTY2lqKiIq6//nr27t0LwMMPP8y0adPaPaeVK1fyhz/8gfDwcBITE/nss89wOp389re/5d133yUsLIy5c+dy0003AfDYY4/x1ltvUV9fz8qVKxkzZgz33Xcf8fHx/OY3vwFg3LhxvP322wDtlsWUKVNYs2YNt9xyCw6Hg169evH000+TmZnZ4XxUV1dz0003sXXrVurr67nvvvu48MILWbp0Ka+++ipVVVU4nU4+/fTTzn0AerB/7yjkumfXMcJud06Oj25aFxsVwZLZk5n37DrueGUzdU4XV04dHsDcdlyFo551uYdYnVPKmpwSNueV0+AyhAmMHZTIL6YOt2r0aUn0jYsKdHYDokcE/kD67rvvWLlyJUuWLGHy5Mm88MILfPHFF7z55pv8+c9/5qKLLmra9uabb+a0007jtddew+l0UlVVxaFDh9i1axfLly9n0aJFXHrppbzyyitceeWVXHzxxcydOxeA3/3udyxevJibbrqJW265hVtv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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "plot_data_start.plot(title=f\"{driver}'s F1 Race Starts\", ylabel=\"races\")" ] @@ -1186,9 +8129,84 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 134, "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", + "
driverstartswins
season
199160
1992161
1993161
1994148
1995179
\n", + "
" + ], + "text/plain": [ + "driver starts wins\n", + "season \n", + "1991 6 0\n", + "1992 16 1\n", + "1993 16 1\n", + "1994 14 8\n", + "1995 17 9" + ] + }, + "execution_count": 134, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from functools import reduce\n", "\n", @@ -1203,9 +8221,32 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 135, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 135, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "plot_data.plot(title=f\"{driver}'s F1 Career\", ylabel=\"races\")" ] @@ -1219,12 +8260,48 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 136, "metadata": {}, "outputs": [], "source": [ "# explore more possibilities to store the results, e.g. to_sql()\n", - "f1_career.to_csv(f\"./results/f1_career_{driver}.csv\", index=False)" + "f1_career.to_csv(f\"./results/f1_career_{driver}.csv\", index=False)\n", + "f1_career.to" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " driver nationality constructor season\n", + "0 farina Italian alfa 1950\n", + "1 fagioli Italian alfa 1950\n", + "2 reg_parnell British alfa 1950\n", + "3 cabantous French lago 1950\n", + "4 rosier French lago 1950\n", + "... ... ... ... ...\n", + "25202 kevin_magnussen Danish haas 2022\n", + "25203 albon Thai williams 2022\n", + "25204 latifi Canadian williams 2022\n", + "25205 tsunoda Japanese alphatauri 2022\n", + "25206 bottas Finnish alfa 2022\n", + "\n", + "[25207 rows x 4 columns]\n" + ] + } + ], + "source": [ + "df1 = f1_results[['driver', 'nationality']]\n", + "df2 = f1_results[['constructor', 'season']]\n", + "\n", + "big_df = pd.concat([df1, df2], axis=1)\n", + "\n", + "print(big_df)\n" ] }, { @@ -1240,7 +8317,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3.10.5 64-bit", + "display_name": "Python 3.9.12 ('base')", "language": "python", "name": "python3" }, @@ -1254,12 +8331,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.9.12" }, "orig_nbformat": 4, "vscode": { "interpreter": { - "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" + "hash": "d31b83e9610685068a0fe73b54051d44dc1110027bef1c52e64b671e72faac45" } } }, diff --git a/2022/python_workshop/notebooks/09_some_really_bad_code.ipynb b/2022/python_workshop/notebooks/09_some_really_bad_code.ipynb index 41e4f6d..d4e13b5 100644 --- a/2022/python_workshop/notebooks/09_some_really_bad_code.ipynb +++ b/2022/python_workshop/notebooks/09_some_really_bad_code.ipynb @@ -21,148 +21,494 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "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", + "
DateProfessionRankEquipmentInsalubritySize_ProductionSalary
02009-01-01Metal heater7Heating furnaces2258026020.0
12009-01-01Metal heater6Heating furnaces2258022980.0
22009-01-01Metal heater5Heating furnaces2258020350.0
32009-01-01Metal heater5Heating furnaces2258020350.0
42009-01-01Metal heater4Heating furnaces2258018090.0
52009-01-01Metal planter4Heating furnaces2258018090.0
62009-01-01Refractory4Heating furnaces1158016110.0
72009-01-01Roller7Piercing mill1858025300.0
82009-01-01Roller6Piercing mill1858022260.0
92009-01-01Roller assistant4Piercing mill1858017370.0
102009-01-01Roller7Pilgrim mill1858025300.0
112009-01-01Roller6Pilgrim mill1858022260.0
122009-01-01Roller assistant4Pilgrim mill1858017370.0
132009-01-01Roller assistant3Pilgrim mill1858015420.0
142009-01-01Hot metal cutter4Pilgrim mill1658017010.0
152009-01-01Cleaner3Pilgrim mill1858015420.0
162009-01-01Roller5Sizing mill1858019630.0
172009-01-01Operator5Sizing mill858017830.0
182009-01-01Operator5Sizing mill858017830.0
192009-01-01Operator4Sizing mill858015570.0
\n", + "
" + ], + "text/plain": [ + " Date Profession Rank Equipment Insalubrity \\\n", + "0 2009-01-01 Metal heater 7 Heating furnaces 22 \n", + "1 2009-01-01 Metal heater 6 Heating furnaces 22 \n", + "2 2009-01-01 Metal heater 5 Heating furnaces 22 \n", + "3 2009-01-01 Metal heater 5 Heating furnaces 22 \n", + "4 2009-01-01 Metal heater 4 Heating furnaces 22 \n", + "5 2009-01-01 Metal planter 4 Heating furnaces 22 \n", + "6 2009-01-01 Refractory 4 Heating furnaces 11 \n", + "7 2009-01-01 Roller 7 Piercing mill 18 \n", + "8 2009-01-01 Roller 6 Piercing mill 18 \n", + "9 2009-01-01 Roller assistant 4 Piercing mill 18 \n", + "10 2009-01-01 Roller 7 Pilgrim mill 18 \n", + "11 2009-01-01 Roller 6 Pilgrim mill 18 \n", + "12 2009-01-01 Roller assistant 4 Pilgrim mill 18 \n", + "13 2009-01-01 Roller assistant 3 Pilgrim mill 18 \n", + "14 2009-01-01 Hot metal cutter 4 Pilgrim mill 16 \n", + "15 2009-01-01 Cleaner 3 Pilgrim mill 18 \n", + "16 2009-01-01 Roller 5 Sizing mill 18 \n", + "17 2009-01-01 Operator 5 Sizing mill 8 \n", + "18 2009-01-01 Operator 5 Sizing mill 8 \n", + "19 2009-01-01 Operator 4 Sizing mill 8 \n", + "\n", + " Size_Production Salary \n", + "0 580 26020.0 \n", + "1 580 22980.0 \n", + "2 580 20350.0 \n", + "3 580 20350.0 \n", + "4 580 18090.0 \n", + "5 580 18090.0 \n", + "6 580 16110.0 \n", + "7 580 25300.0 \n", + "8 580 22260.0 \n", + "9 580 17370.0 \n", + "10 580 25300.0 \n", + "11 580 22260.0 \n", + "12 580 17370.0 \n", + "13 580 15420.0 \n", + "14 580 17010.0 \n", + "15 580 15420.0 \n", + "16 580 19630.0 \n", + "17 580 17830.0 \n", + "18 580 17830.0 \n", + "19 580 15570.0 " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "import pandas as pd\n", + "import csv\n", + "\n", "\n", "df = pd.read_csv('./resources/factory_salary.csv')\n", "\n", - "df.head()" + "df.head(20)" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 23, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Date Profession Rank Equipment \\\n", + "0 2009-01-01 Metal heater 7 Heating furnaces \n", + "1 2009-01-01 Metal heater 6 Heating furnaces \n", + "2 2009-01-01 Metal heater 5 Heating furnaces \n", + "3 2009-01-01 Metal heater 5 Heating furnaces \n", + "4 2009-01-01 Metal heater 4 Heating furnaces \n", + ".. ... ... ... ... \n", + "259 2009-08-01 Quality controller 7 Control and measuring equipment \n", + "260 2009-09-01 Quality controller 7 Control and measuring equipment \n", + "261 2009-10-01 Quality controller 7 Control and measuring equipment \n", + "262 2009-11-01 Quality controller 7 Control and measuring equipment \n", + "263 2009-12-01 Quality controller 7 Control and measuring equipment \n", + "\n", + " Insalubrity Size_Production Salary \n", + "0 22 580 26020.0 \n", + "1 22 580 22980.0 \n", + "2 22 580 20350.0 \n", + "3 22 580 20350.0 \n", + "4 22 580 18090.0 \n", + ".. ... ... ... \n", + "259 0 1180 26342.235294117647 \n", + "260 0 1080 25044.58823529412 \n", + "261 0 780 22060.0 \n", + "262 0 1020 24266.0 \n", + "263 0 810 22060.0 \n", + "\n", + "[264 rows x 7 columns]\n" + ] + } + ], "source": [ - "import csv\n", + "def helper_result(index, column_name, options={}):\n", + " result = []\n", + " for row in csv_data:\n", + " if row[index] == options[column_name]:\n", + " result.append(row)\n", "\n", - " def finder(options = {}):\n", - " with open(\"./resources/factory_salary.csv\", \"rt\") as csvfile:\n", - " data = csv.reader(csvfile, delimiter=',', quotechar='\"')\n", + " return result\n", + "\n", + "\n", + "\n", + "def finder(options = {}):\n", + " with open(\"./resources/factory_salary.csv\", \"rt\") as csvfile:\n", + " data = csv.reader(csvfile, delimiter=',', quotechar='\"')\n", " # skip header\n", - " next(data)\n", - " csv_data = []\n", - " for row in data:\n", - " csv_data.append(row)\n", + " next(data)\n", + " csv_data = []\n", + " for row in data:\n", + " csv_data.append(row)\n", "\n", - " salary = []\n", - " if 'Profession' in options:\n", + " columns_names = ['Date', 'Profession', 'Rank', 'Equipment', 'Insalubrity',\t'Size_Production',\t'Salary']\n", + " for column in columns_names:\n", + " output = []\n", + " if column in options:\n", " result = []\n", - " for row in csv_data:\n", - " if row[1] == options['Profession']:\n", + " for index, row in enumerate(csv_data):\n", + " if row[index] == options[column]:\n", " result.append(row)\n", + " mapped = {}\n", + " mapped[column] = row[index]\n", + " output.append(mapped)\n", " csv_data = result\n", + " \n", + " return output\n", "\n", - " if 'Equipment' in options:\n", - " result = []\n", - " for row in csv_data:\n", - " if row[3] == options['Equipment']:\n", - " result.append(row)\n", - " csv_data = result\n", + "# if 'Profession' in options:\n", + "# result = []\n", + "# for row in csv_data:\n", + "# if row[1] == options['Profession']:\n", + "# result.append(row)\n", + "# csv_data = result\n", "\n", - " if 'Size_Production' in options:\n", - " result = []\n", - " for row in csv_data:\n", - " if row[5] == options['Size_Production']:\n", - " result.append(row)\n", - " csv_data = result\n", + "# if 'Equipment' in options:\n", + "# result = []\n", + "# for row in csv_data:\n", + "# if row[3] == options['Equipment']:\n", + "# result.append(row)\n", + "# csv_data = result\n", "\n", - " if 'Date' in options:\n", - " result = []\n", - " for row in csv_data:\n", - " if row[0] == options['Date']:\n", - " result.append(row)\n", - " csv_data = result\n", + "# if 'Size_Production' in options:\n", + "# result = []\n", + "# for row in csv_data:\n", + "# if row[5] == options['Size_Production']:\n", + "# result.append(row)\n", + "# csv_data = result\n", "\n", - " output = []\n", - " for row in csv_data:\n", - " mapped = {}\n", - " mapped['Date'] = row[0]\n", - " mapped['Profession'] = row[1]\n", - " mapped['Rank'] = row[2]\n", - " mapped['Equipment'] = row[3]\n", - " mapped['Insalubrity'] = row[4]\n", - " mapped['Size_Production'] = row[5]\n", - " mapped['Salary'] = row[6]\n", - " output.append(mapped)\n", + "# if 'Date' in options:\n", + "# result = []\n", + "# for row in csv_data:\n", + "# if row[0] == options['Date']:\n", + "# result.append(row)\n", + "# csv_data = result\n", "\n", - " return output\n", + "# output = []\n", + "# for row in csv_data:\n", + "# mapped = {}\n", + "# mapped['Date'] = row[0]\n", + "# mapped['Profession'] = row[1]\n", + "# mapped['Rank'] = row[2]\n", + "# mapped['Equipment'] = row[3]\n", + "# mapped['Insalubrity'] = row[4]\n", + "# mapped['Size_Production'] = row[5]\n", + "# mapped['Salary'] = row[6]\n", + "# output.append(mapped)\n", "\n", + "# return output\n", "\n", - " def finder_by(options):\n", - " with open(\"./resources/factory_salary.csv\", \"rt\") as csvfile:\n", - " data = csv.reader(csvfile, delimiter=',', quotechar='\"')\n", - " # skip header\n", - " next(data)\n", - " csv_data = []\n", - " for row in data:\n", - " csv_data.append(row)\n", - "\n", - " if 'Profession' in options:\n", - " for row in csv_data:\n", - " if row[1] == options['Profession']:\n", - " mapped = {}\n", - " mapped['Date'] = row[0]\n", - " mapped['Profession'] = row[1]\n", - " mapped['Rank'] = row[2]\n", - " mapped['Equipment'] = row[3]\n", - " mapped['Insalubrity'] = row[4]\n", - " mapped['Size_Production'] = row[5]\n", - " mapped['Salary'] = row[6]\n", - " return mapped\n", - "\n", - " if 'Equipment' in options:\n", - " for row in csv_data:\n", - " if row[3] == options['Equipment']:\n", - " mapped = {}\n", - " mapped['Date'] = row[0]\n", - " mapped['Profession'] = row[1]\n", - " mapped['Rank'] = row[2]\n", - " mapped['Equipment'] = row[3]\n", - " mapped['Insalubrity'] = row[4]\n", - " mapped['Size_Production'] = row[5]\n", - " mapped['Salary'] = row[6]\n", - " return mapped\n", - "\n", - " if 'Rank' in options:\n", - " for row in csv_data:\n", - " if row[2] == options['Rank']:\n", - " mapped = {}\n", - " mapped['Date'] = row[0]\n", - " mapped['Profession'] = row[1]\n", - " mapped['Rank'] = row[2]\n", - " mapped['Equipment'] = row[3]\n", - " mapped['Insalubrity'] = row[4]\n", - " mapped['Size_Production'] = row[5]\n", - " mapped['Salary'] = row[6]\n", - " return mapped\n", - "\n", - " if 'Date' in options:\n", - " for row in csv_data:\n", - " if row[0] == options['Date']:\n", - " mapped = {}\n", - " mapped['Date'] = row[0]\n", - " mapped['Profession'] = row[1]\n", - " mapped['Rank'] = row[2]\n", - " mapped['Equipment'] = row[3]\n", - " mapped['Insalubrity'] = row[4]\n", - " mapped['Size_Production'] = row[5]\n", - " mapped['Salary'] = row[6]\n", - " return mapped\n", - "\n", - " raise RecordNotFound\n", - "\n", - "class RecordNotFound(Exception):\n", - " pass\n" + "\n", + "# def finder_by(options):\n", + "# with open(\"./resources/factory_salary.csv\", \"rt\") as csvfile:\n", + "# data = csv.reader(csvfile, delimiter=',', quotechar='\"')\n", + "# # skip header\n", + "# next(data)\n", + "# csv_data = []\n", + "# for row in data:\n", + "# csv_data.append(row)\n", + "\n", + "# if 'Profession' in options:\n", + "# for row in csv_data:\n", + "# if row[1] == options['Profession']:\n", + "# mapped = {}\n", + "# mapped['Date'] = row[0]\n", + "# mapped['Profession'] = row[1]\n", + "# mapped['Rank'] = row[2]\n", + "# mapped['Equipment'] = row[3]\n", + "# mapped['Insalubrity'] = row[4]\n", + "# mapped['Size_Production'] = row[5]\n", + "# mapped['Salary'] = row[6]\n", + "# return mapped\n", + "\n", + "# if 'Equipment' in options:\n", + "# for row in csv_data:\n", + "# if row[3] == options['Equipment']:\n", + "# mapped = {}\n", + "# mapped['Date'] = row[0]\n", + "# mapped['Profession'] = row[1]\n", + "# mapped['Rank'] = row[2]\n", + "# mapped['Equipment'] = row[3]\n", + "# mapped['Insalubrity'] = row[4]\n", + "# mapped['Size_Production'] = row[5]\n", + "# mapped['Salary'] = row[6]\n", + "# return mapped\n", + "\n", + "# if 'Rank' in options:\n", + "# for row in csv_data:\n", + "# if row[2] == options['Rank']:\n", + "# mapped = {}\n", + "# mapped['Date'] = row[0]\n", + "# mapped['Profession'] = row[1]\n", + "# mapped['Rank'] = row[2]\n", + "# mapped['Equipment'] = row[3]\n", + "# mapped['Insalubrity'] = row[4]\n", + "# mapped['Size_Production'] = row[5]\n", + "# mapped['Salary'] = row[6]\n", + "# return mapped\n", + "\n", + "# if 'Date' in options:\n", + "# for row in csv_data:\n", + "# if row[0] == options['Date']:\n", + "# mapped = {}\n", + "# mapped['Date'] = row[0]\n", + "# mapped['Profession'] = row[1]\n", + "# mapped['Rank'] = row[2]\n", + "# mapped['Equipment'] = row[3]\n", + "# mapped['Insalubrity'] = row[4]\n", + "# mapped['Size_Production'] = row[5]\n", + "# mapped['Salary'] = row[6]\n", + "# return mapped\n", + "\n", + "# raise RecordNotFound\n", + "\n", + "# print(pd.DataFrame(finder(df['Rank'].head(10))))\n", + "\n", + "# class RecordNotFound(Exception):\n", + "# pass\n" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -225,7 +571,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3.10.5 64-bit", + "display_name": "Python 3.9.12 ('base')", "language": "python", "name": "python3" }, @@ -239,12 +585,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.9.12" }, "orig_nbformat": 4, "vscode": { "interpreter": { - "hash": "aee8b7b246df8f9039afb4144a1f6fd8d2ca17a180786b69acc140d282b71a49" + "hash": "d31b83e9610685068a0fe73b54051d44dc1110027bef1c52e64b671e72faac45" } } }, diff --git a/2022/python_workshop/notebooks/10_test.ipynb b/2022/python_workshop/notebooks/10_test.ipynb index 5ea7578..ee30f38 100644 --- a/2022/python_workshop/notebooks/10_test.ipynb +++ b/2022/python_workshop/notebooks/10_test.ipynb @@ -9,18 +9,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "### Please state your name here:\n" + "### Please state your name here:\n", + "my_name = 'Munteanu Victor'\n" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Note: you may need to restart the kernel to use updated packages.\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], "source": [ "# make sure requirements are up to date\n", "%pip install --upgrade pip >> results/requirements_log.txt\n", @@ -38,14 +48,41 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "~~~ 1\n", + "{'cubed': 1}\n", + "{'squared': 1}\n", + "@@@ 1\n", + "~~~ 2\n", + "{'cubed': 8}\n", + "{'squared': 4}\n", + "@@@ 2\n", + "~~~ 3\n", + "{'cubed': 27}\n", + "{'squared': 9}\n", + "@@@ 3\n", + "~~~ 4\n", + "{'cubed': 64}\n", + "{'squared': 16}\n", + "@@@ 4\n" + ] + } + ], "source": [ "def f2(n):\n", " for i in range(1, n):\n", " print(f\"~~~ {i}\")\n", - "\n", + " yield {'cubed': i ** 3} \n", + " yield {'squared': i ** 2}\n", + " yield f'@@@ {i}'\n", + " \n", + " \n", "\n", "\n", "\n", @@ -100,7 +137,26 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "\n", + "file_1 = open('./resources/input_file_1.csv')\n", + "file_2 = open('./resources/input_file_2.csv')\n", + "lines_1 = (i for i in file_1)\n", + "lines_2 = (i for i in file_2)\n", + "\n", + "list_line_1 = (i.rstrip().split(',') for i in lines_1)\n", + "list_line_2 = (i.rstrip().split(',') for i in lines_2)\n", + "\n", + "cols_1 = next(lines_1)\n", + "cols_2 = next(lines_2)\n", + "\n", + "dict_list_1 = (dict(zip(cols_1, data)) for data in list_line_1)\n", + "while (t:= next())\n", + "\n", + "\n", + "\n", + "\n" + ] }, { "cell_type": "markdown", @@ -115,7 +171,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -125,14 +181,229 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "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", + "
Nr. Crt.NumeCod A.N.M.C.S.JudetClasificareTIP USP (in functie de specificul patologiei tratate)TIP USP (in functie de regimul proprietatii)TIP USP (din punct de vedere al invatamantului si al cercetarii stiintifice medicale)Adresa completa a sediului principalAdresa email oficialaWebsiteAutoritatea tutelaraAcreditare ciclul IAcreditare ciclul II__1__2
01SPITALUL MUNICIPAL CALAFATA001DoljIVgeneralpublicfara invatamantB-dul. T. Vladimirescu, Nr. 24, Calafat, cod 2...spitalcalafat@gmail.comspitalcalafat.roPRIMARIA MUNICIPIULUI CALAFATAcreditatCategoria V Decizie de prelungire a procesului...
12SPITALUL DE PSIHIATRIE CRONICI SCHITU GRECIA002OltVafectiuni cronicepublicfara invatamantSLATINA STR. A. I. CUZA NR. 14spitalulschitu@gmail.comwww.spitalul-schitu.roCONSILIUL JUDETEAN OLTAcreditatCategoria V Decizie de prelungire a procesului...
23SPITALUL CLINIC NICOLAE MALAXAA003BucurestiIIIgeneralpublicclinic cu sectii universitareSTR. DIMITRIE CANTEMIR, NR.1, PARTER, SECT.4, ...secretariat@spitalmalaxa.rowww.spitalmalaxa.roASSMBAcreditatCategoria IV Acreditat cu incredere redusa
34SPITALUL MILITAR DE URGENTA \"REGINA MARIA\" BRA?OVA004BrasovIIIurgentapublicfara invatamantBucuresti, Str. Institutul Medico-Militar, Nr....smureginamaria@rdsbv.rowww.smubrasov.roDIRECtIA MEDICALa a Ministerului Apararii Nati...AcreditatCategoria II Acreditat cu recomandari
45SPITALUL ORASENESC INEUA005AradIVgeneralpublicfara invatamantCalea Republicii, nr. 5spitalineu@yahoo.rohttp://www.spitalineu.roPrimaria Orasului IneuAcreditatCategoria V Decizie de prelungire a procesului...
\n", + "
" + ], + "text/plain": [ + " Nr. Crt. Nume Cod A.N.M.C.S. \\\n", + "0 1 SPITALUL MUNICIPAL CALAFAT A001 \n", + "1 2 SPITALUL DE PSIHIATRIE CRONICI SCHITU GRECI A002 \n", + "2 3 SPITALUL CLINIC NICOLAE MALAXA A003 \n", + "3 4 SPITALUL MILITAR DE URGENTA \"REGINA MARIA\" BRA?OV A004 \n", + "4 5 SPITALUL ORASENESC INEU A005 \n", + "\n", + " Judet Clasificare \\\n", + "0 Dolj IV \n", + "1 Olt V \n", + "2 Bucuresti III \n", + "3 Brasov III \n", + "4 Arad IV \n", + "\n", + " TIP USP (in functie de specificul patologiei tratate) \\\n", + "0 general \n", + "1 afectiuni cronice \n", + "2 general \n", + "3 urgenta \n", + "4 general \n", + "\n", + " TIP USP (in functie de regimul proprietatii) \\\n", + "0 public \n", + "1 public \n", + "2 public \n", + "3 public \n", + "4 public \n", + "\n", + " TIP USP (din punct de vedere al invatamantului si al cercetarii stiintifice medicale) \\\n", + "0 fara invatamant \n", + "1 fara invatamant \n", + "2 clinic cu sectii universitare \n", + "3 fara invatamant \n", + "4 fara invatamant \n", + "\n", + " Adresa completa a sediului principal \\\n", + "0 B-dul. T. Vladimirescu, Nr. 24, Calafat, cod 2... \n", + "1 SLATINA STR. A. I. CUZA NR. 14 \n", + "2 STR. DIMITRIE CANTEMIR, NR.1, PARTER, SECT.4, ... \n", + "3 Bucuresti, Str. Institutul Medico-Militar, Nr.... \n", + "4 Calea Republicii, nr. 5 \n", + "\n", + " Adresa email oficiala Website \\\n", + "0 spitalcalafat@gmail.com spitalcalafat.ro \n", + "1 spitalulschitu@gmail.com www.spitalul-schitu.ro \n", + "2 secretariat@spitalmalaxa.ro www.spitalmalaxa.ro \n", + "3 smureginamaria@rdsbv.ro www.smubrasov.ro \n", + "4 spitalineu@yahoo.ro http://www.spitalineu.ro \n", + "\n", + " Autoritatea tutelara Acreditare ciclul I \\\n", + "0 PRIMARIA MUNICIPIULUI CALAFAT Acreditat \n", + "1 CONSILIUL JUDETEAN OLT Acreditat \n", + "2 ASSMB Acreditat \n", + "3 DIRECtIA MEDICALa a Ministerului Apararii Nati... Acreditat \n", + "4 Primaria Orasului Ineu Acreditat \n", + "\n", + " Acreditare ciclul II __1 __2 \n", + "0 Categoria V Decizie de prelungire a procesului... \n", + "1 Categoria V Decizie de prelungire a procesului... \n", + "2 Categoria IV Acreditat cu incredere redusa \n", + "3 Categoria II Acreditat cu recomandari \n", + "4 Categoria V Decizie de prelungire a procesului... " + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "url_hospitals = 'https://data.gov.ro/dataset/4197b53e-7c91-4fcc-be07-883076d40ffc/resource/7a343719-d625-4b5c-98b5-895a684d61c4/download/anmcs-acreditare-unitati-sanitare-dec2021.json'\n", "\n", "\n", - "hospitals = ...\n", + "hospitals = pd.read_json(url_hospitals)\n", "\n", "hospitals.head()" ] @@ -146,10 +417,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "1365" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hospitals.shape[0]" + ] }, { "cell_type": "markdown", @@ -160,10 +444,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "17" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hospitals.shape[1]" + ] }, { "cell_type": "markdown", @@ -177,10 +474,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "hospitals.columns\n", + "hospitals.drop(hospitals.columns[[0, 7, 14, 15, 16]], axis=1, inplace=True)\n", + "\n" + ] }, { "cell_type": "markdown", @@ -199,10 +500,24 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "hospitals.rename(\n", + " columns={'TIP USP (in functie de specificul patologiei tratate)': 'tip_patologie',\n", + " 'TIP USP (in functie de regimul proprietatii)': 'tip',\n", + " 'Adresa completa a sediului principal': 'adresa',\n", + " 'Adresa email oficiala': 'email',\n", + " 'Autoritatea tutelara': 'autoritate_tutelara',\n", + " 'Acreditare ciclul I': 'acreditare_i',\n", + " 'Acreditare ciclul II': 'acreditare_ii'\n", + " },\n", + " inplace=True\n", + ")\n", + "hospitals.rename(columns=lambda x: x.lower(), inplace=True)\n", + "\n" + ] }, { "cell_type": "markdown", @@ -215,10 +530,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "\n", + "hospitals = hospitals.replace(r'^s*$', float('NaN'), regex = True)\n", + "hospitals.dropna(inplace=True)\n" + ] }, { "cell_type": "markdown", @@ -229,10 +548,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "public 380\n", + "Name: tip, dtype: int64\n", + "privat 382\n", + "Name: tip, dtype: int64\n" + ] + } + ], + "source": [ + "public = hospitals[hospitals['tip'] == 'public'].tip.value_counts()\n", + "privat = hospitals[hospitals['tip'] == 'privat'].tip.value_counts()\n", + "print(public)\n", + "print(privat)\n" + ] }, { "cell_type": "markdown", @@ -243,10 +578,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "0 Acreditat\n", + "1 Acreditat\n", + "2 Acreditat\n", + "3 Acreditat\n", + "4 Acreditat\n", + " ... \n", + "757 -\n", + "758 -\n", + "759 -\n", + "760 -\n", + "761 -\n", + "Name: acreditare_i, Length: 762, dtype: object" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hospitals['acreditare_i']" + ] }, { "cell_type": "markdown", @@ -257,10 +616,14 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "hospitals.head()\n", + "not_acrredited = hospitals['acreditare_i'] == 'Neacreditat'\n", + "not_acrredited_hospitals = hospitals[not_acrredited]" + ] }, { "cell_type": "markdown", @@ -271,10 +634,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "2" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "not_acrredited_hospitals.value_counts().sum()" + ] }, { "cell_type": "markdown", @@ -286,11 +662,176 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "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", + "
numecod a.n.m.c.s.judetclasificaretip_patologietipadresaemailwebsiteautoritate_tutelaraacreditare_iacreditare_ii
12INSTITUTUL ONCOLOGIC \"PROF. DR. I. CHIRICUTAA013ClujI MspecialitatepublicStrada Cristian Popi?teanu, nr. 1-3, sector 1,...office@iocn.rowww.iocn.roMinisterul SanatatiiAcreditatCategoria III Acreditat cu rezerve
26SPITALUL DE BOLI PSIHICE CRONICE BORSAA029ClujVpentru bolnavi cu afectiuni cronicepublicCALEA DOROBANTILOR,NR.106,CLUJ NAPOCA,CLUJoffice@spitalpsihiatrieborsa.rowww.spitalpsihiatrieborsa.roCONSILIUL JUDETEAN CLUJAcreditatCategoria II Acreditat cu recomandari
32SPITALUL MUNICIPAL GHERLAA037ClujIVgeneralpublicGHERLA, STR.BOBALNA NR.2secretariat@spitalgherla.rowww.spitalgherla.roPRIMARIA MUNICIPIULUI GHERLAAcreditatCategoria V Decizie de prelungire a procesului...
44PENITENCIARUL SPITAL DEJA050ClujIIIgeneralpublicSTR. MARIA GHICULEASA NR.47psdej@anp.gov.rohttp://anp.gov.ro/penitenciarul-spital-dej/ANPAcreditatCategoria II Acreditat cu recomandari
55SOCIETATEA MEDISPROF SRLA062ClujNeclasificatpentru bolnavi cu afectiuni croniceprivatPIATA 1 MAI NR. 3, CLUJ-NAPOCA, JUD. CLUJoffice@medisprof.rowww.medisprof.roMEDISPROF SRLAcreditatCategoria V Decizie de prelungire a procesului...
\n", + "
" + ], + "text/plain": [ + " nume cod a.n.m.c.s. judet \\\n", + "12 INSTITUTUL ONCOLOGIC \"PROF. DR. I. CHIRICUTA A013 Cluj \n", + "26 SPITALUL DE BOLI PSIHICE CRONICE BORSA A029 Cluj \n", + "32 SPITALUL MUNICIPAL GHERLA A037 Cluj \n", + "44 PENITENCIARUL SPITAL DEJ A050 Cluj \n", + "55 SOCIETATEA MEDISPROF SRL A062 Cluj \n", + "\n", + " clasificare tip_patologie tip \\\n", + "12 I M specialitate public \n", + "26 V pentru bolnavi cu afectiuni cronice public \n", + "32 IV general public \n", + "44 III general public \n", + "55 Neclasificat pentru bolnavi cu afectiuni cronice privat \n", + "\n", + " adresa \\\n", + "12 Strada Cristian Popi?teanu, nr. 1-3, sector 1,... \n", + "26 CALEA DOROBANTILOR,NR.106,CLUJ NAPOCA,CLUJ \n", + "32 GHERLA, STR.BOBALNA NR.2 \n", + "44 STR. MARIA GHICULEASA NR.47 \n", + "55 PIATA 1 MAI NR. 3, CLUJ-NAPOCA, JUD. CLUJ \n", + "\n", + " email \\\n", + "12 office@iocn.ro \n", + "26 office@spitalpsihiatrieborsa.ro \n", + "32 secretariat@spitalgherla.ro \n", + "44 psdej@anp.gov.ro \n", + "55 office@medisprof.ro \n", + "\n", + " website autoritate_tutelara \\\n", + "12 www.iocn.ro Ministerul Sanatatii \n", + "26 www.spitalpsihiatrieborsa.ro CONSILIUL JUDETEAN CLUJ \n", + "32 www.spitalgherla.ro PRIMARIA MUNICIPIULUI GHERLA \n", + "44 http://anp.gov.ro/penitenciarul-spital-dej/ ANP \n", + "55 www.medisprof.ro MEDISPROF SRL \n", + "\n", + " acreditare_i acreditare_ii \n", + "12 Acreditat Categoria III Acreditat cu rezerve \n", + "26 Acreditat Categoria II Acreditat cu recomandari \n", + "32 Acreditat Categoria V Decizie de prelungire a procesului... \n", + "44 Acreditat Categoria II Acreditat cu recomandari \n", + "55 Acreditat Categoria V Decizie de prelungire a procesului... " + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "judet = ..." + "jud_cluj = hospitals[hospitals['judet'] == 'Cluj']\n", + "jud_cluj.head()" ] }, { @@ -302,10 +843,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "36" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "jud_cluj.value_counts().sum()" + ] }, { "cell_type": "markdown", @@ -320,11 +874,99 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "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", + "
judettipunaccreditedaccredited
12ClujpublicFalseTrue
26ClujpublicFalseTrue
32ClujpublicFalseTrue
44ClujpublicFalseTrue
55ClujprivatFalseTrue
\n", + "
" + ], + "text/plain": [ + " judet tip unaccredited accredited\n", + "12 Cluj public False True\n", + "26 Cluj public False True\n", + "32 Cluj public False True\n", + "44 Cluj public False True\n", + "55 Cluj privat False True" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "stat = ...\n", + "stat = hospitals[hospitals['judet'] == 'Cluj']\n", + "stat = stat.assign(\n", + " unaccredited = lambda x: x.acreditare_i.isin(['Neacreditat']),\n", + " accredited = lambda x: x.acreditare_i.isin(['Acreditat']),\n", + "\n", + ")\n", + "\n", + "stat = stat[['judet', 'tip', 'unaccredited', 'accredited']]\n", "stat.head()" ] }, @@ -343,51 +985,191 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, "outputs": [], "source": [ - "plot_acreditat = ..." + "import matplotlib\n", + "\n", + "stat['unaccredited'] = stat['unaccredited'].astype(int)\n", + "stat['accredited'] = stat['accredited'].astype(int)\n", + "\n", + "plot_acreditat = stat.pivot_table(index='tip', columns='judet', values='accredited', aggfunc='sum')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_acreditat.plot(title='Acreditat', ylabel='cate')" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, "outputs": [], "source": [ - "plot_neacreditat = ..." + "plot_neacreditat = stat.pivot_table(index='tip', columns='judet', values='unaccredited', aggfunc='sum')" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "plot_neacreditat.plot(title= f'neacreditat', ylabel='cate')\n" + ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "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", + "
judetCluj_xCluj_y
tip
privat30
public190
\n", + "
" + ], + "text/plain": [ + "judet Cluj_x Cluj_y\n", + "tip \n", + "privat 3 0\n", + "public 19 0" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "plot_data = ...\n", + "from functools import reduce\n", + "\n", + "\n", + "\n", + "plot_data = reduce(lambda left,right: pd.merge(left,right,on=['tip'], how='inner'), [plot_acreditat, plot_neacreditat])\n", + "\n", "plot_data.head()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ "plot_data.plot(kind=\"bar\")" ] @@ -395,9 +1177,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3.10.5", + "display_name": "Python 3.9.12 ('base')", "language": "python", - "name": "py10" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -409,9 +1191,14 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.5" + "version": "3.9.12" }, - "orig_nbformat": 4 + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "d31b83e9610685068a0fe73b54051d44dc1110027bef1c52e64b671e72faac45" + } + } }, "nbformat": 4, "nbformat_minor": 2 diff --git a/2022/python_workshop/notebooks/module_1.py b/2022/python_workshop/notebooks/module_1.py index f673107..a60bbc5 100644 --- a/2022/python_workshop/notebooks/module_1.py +++ b/2022/python_workshop/notebooks/module_1.py @@ -8,4 +8,3 @@ c = 3 - diff --git a/2022/python_workshop/notebooks/resources/methods/decorators.py b/2022/python_workshop/notebooks/resources/methods/decorators.py index c4ec33c..ff09052 100644 --- a/2022/python_workshop/notebooks/resources/methods/decorators.py +++ b/2022/python_workshop/notebooks/resources/methods/decorators.py @@ -7,8 +7,9 @@ def do_twice(func): @functools.wraps(func) def wrapper_do_twice(*args, **kwargs): - .... - return .... + func() + return func() + return wrapper_do_twice @@ -19,8 +20,8 @@ def timer(func): @functools.wraps(func) def wrapper_timer(*args, **kwargs): start = time.perf_counter() - value = ... - end = ... + value = func(*args, **kwargs) + end = time.perf_counter() run_time = end - start print(f"Finished {func.__name__!r} in {run_time:.4f} seconds") return value @@ -33,7 +34,7 @@ def slow_down_1sec(func): @functools.wraps(func) def wrapper_slow_down(*args, **kwargs): - ... + time.sleep(5) return func(*args, **kwargs) return wrapper_slow_down diff --git a/2022/python_workshop/train.ipynb b/2022/python_workshop/train.ipynb new file mode 100644 index 0000000..f342fc5 --- /dev/null +++ b/2022/python_workshop/train.ipynb @@ -0,0 +1,130 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "dict_1 = {'car': 'Toyota', 'model': ['Camry'], 'color': ['red']}\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Shape of passed values is (3, 1), indices imply (3, 2)", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mc:\\python\\github\\bootcamp2022\\2022\\python_workshop\\train.ipynb Cell 3\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[0m df \u001b[39m=\u001b[39m pd\u001b[39m.\u001b[39;49mDataFrame(data\u001b[39m=\u001b[39;49m[\u001b[39m'\u001b[39;49m\u001b[39mToyota\u001b[39;49m\u001b[39m'\u001b[39;49m, \u001b[39m'\u001b[39;49m\u001b[39mHonda\u001b[39;49m\u001b[39m'\u001b[39;49m, [\u001b[39m'\u001b[39;49m\u001b[39mCamry\u001b[39;49m\u001b[39m'\u001b[39;49m]], columns\u001b[39m=\u001b[39;49m[\u001b[39m'\u001b[39;49m\u001b[39mcar\u001b[39;49m\u001b[39m'\u001b[39;49m, \u001b[39m'\u001b[39;49m\u001b[39mmodel\u001b[39;49m\u001b[39m'\u001b[39;49m])\n", + "File \u001b[1;32mc:\\programs\\miniconda3\\lib\\site-packages\\pandas\\core\\frame.py:737\u001b[0m, in \u001b[0;36mDataFrame.__init__\u001b[1;34m(self, data, index, columns, dtype, copy)\u001b[0m\n\u001b[0;32m 729\u001b[0m mgr \u001b[39m=\u001b[39m arrays_to_mgr(\n\u001b[0;32m 730\u001b[0m arrays,\n\u001b[0;32m 731\u001b[0m columns,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 734\u001b[0m typ\u001b[39m=\u001b[39mmanager,\n\u001b[0;32m 735\u001b[0m )\n\u001b[0;32m 736\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m--> 737\u001b[0m mgr \u001b[39m=\u001b[39m ndarray_to_mgr(\n\u001b[0;32m 738\u001b[0m data,\n\u001b[0;32m 739\u001b[0m index,\n\u001b[0;32m 740\u001b[0m columns,\n\u001b[0;32m 741\u001b[0m dtype\u001b[39m=\u001b[39;49mdtype,\n\u001b[0;32m 742\u001b[0m copy\u001b[39m=\u001b[39;49mcopy,\n\u001b[0;32m 743\u001b[0m typ\u001b[39m=\u001b[39;49mmanager,\n\u001b[0;32m 744\u001b[0m )\n\u001b[0;32m 745\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m 746\u001b[0m mgr \u001b[39m=\u001b[39m dict_to_mgr(\n\u001b[0;32m 747\u001b[0m {},\n\u001b[0;32m 748\u001b[0m index,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 751\u001b[0m typ\u001b[39m=\u001b[39mmanager,\n\u001b[0;32m 752\u001b[0m )\n", + "File \u001b[1;32mc:\\programs\\miniconda3\\lib\\site-packages\\pandas\\core\\internals\\construction.py:351\u001b[0m, in \u001b[0;36mndarray_to_mgr\u001b[1;34m(values, index, columns, dtype, copy, typ)\u001b[0m\n\u001b[0;32m 346\u001b[0m \u001b[39m# _prep_ndarray ensures that values.ndim == 2 at this point\u001b[39;00m\n\u001b[0;32m 347\u001b[0m index, columns \u001b[39m=\u001b[39m _get_axes(\n\u001b[0;32m 348\u001b[0m values\u001b[39m.\u001b[39mshape[\u001b[39m0\u001b[39m], values\u001b[39m.\u001b[39mshape[\u001b[39m1\u001b[39m], index\u001b[39m=\u001b[39mindex, columns\u001b[39m=\u001b[39mcolumns\n\u001b[0;32m 349\u001b[0m )\n\u001b[1;32m--> 351\u001b[0m _check_values_indices_shape_match(values, index, columns)\n\u001b[0;32m 353\u001b[0m \u001b[39mif\u001b[39;00m typ \u001b[39m==\u001b[39m \u001b[39m\"\u001b[39m\u001b[39marray\u001b[39m\u001b[39m\"\u001b[39m:\n\u001b[0;32m 355\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39missubclass\u001b[39m(values\u001b[39m.\u001b[39mdtype\u001b[39m.\u001b[39mtype, \u001b[39mstr\u001b[39m):\n", + "File \u001b[1;32mc:\\programs\\miniconda3\\lib\\site-packages\\pandas\\core\\internals\\construction.py:422\u001b[0m, in \u001b[0;36m_check_values_indices_shape_match\u001b[1;34m(values, index, columns)\u001b[0m\n\u001b[0;32m 420\u001b[0m passed \u001b[39m=\u001b[39m values\u001b[39m.\u001b[39mshape\n\u001b[0;32m 421\u001b[0m implied \u001b[39m=\u001b[39m (\u001b[39mlen\u001b[39m(index), \u001b[39mlen\u001b[39m(columns))\n\u001b[1;32m--> 422\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mShape of passed values is \u001b[39m\u001b[39m{\u001b[39;00mpassed\u001b[39m}\u001b[39;00m\u001b[39m, indices imply \u001b[39m\u001b[39m{\u001b[39;00mimplied\u001b[39m}\u001b[39;00m\u001b[39m\"\u001b[39m)\n", + "\u001b[1;31mValueError\u001b[0m: Shape of passed values is (3, 1), indices imply (3, 2)" + ] + } + ], + "source": [ + "df = pd.DataFrame(data=['Toyota', 'Honda', ['Camry']], columns=['car', 'model'])" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
car
0Toyota
1Honda
\n", + "
" + ], + "text/plain": [ + " car\n", + "0 Toyota\n", + "1 Honda" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.12 ('base')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "d31b83e9610685068a0fe73b54051d44dc1110027bef1c52e64b671e72faac45" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}