{ "cells": [ { "cell_type": "markdown", "id": "368e0ff0-d7f6-4ba2-8891-de2a39db4b8e", "metadata": {}, "source": [ "# ChatGPT Python Code Writer for Analyzing Datasets\n", "With examples using Starbucks location data! ☕️ " ] }, { "cell_type": "markdown", "id": "b4a0410b-805e-4d1a-8758-a9e57691c4cc", "metadata": {}, "source": [ "## Step 1: Import (a lot of) libraries" ] }, { "cell_type": "code", "execution_count": 79, "id": "95e21d55-52e5-4f34-8988-f30bdbb51847", "metadata": {}, "outputs": [], "source": [ "# Since we cannot be certain of what kind of code ChatGPT will come up with, \n", "# we start by installing a bunch of libraries it may use in its response. \n", "# Lots of these are for making pretty maps. \n", "\n", "# Basics\n", "import pandas as pd\n", "import openai\n", "import os\n", "\n", "# Mapping\n", "from geopy import distance\n", "from geopy.geocoders import Nominatim\n", "import geopandas as gpd\n", "from shapely.geometry import Point, Polygon\n", "from geopy.distance import geodesic\n", "import folium\n", "\n", "# Charts\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "# Parsing text, displaying results in markdown\n", "from IPython.display import display, Markdown, Latex\n", "import re" ] }, { "cell_type": "markdown", "id": "774cbaf9-02ff-49fe-9d49-2dfa51799ee6", "metadata": {}, "source": [ "## Step 2: Set up your [OpenAI key](https://platform.openai.com/)" ] }, { "cell_type": "code", "execution_count": 80, "id": "c3f6aae9-33a5-4559-a49a-ae9812a17664", "metadata": {}, "outputs": [], "source": [ "## OPENAI KEY ##\n", "openai.api_key = os.environ.get('OPENAI_KEY')" ] }, { "cell_type": "markdown", "id": "fd087429-5278-45ca-86e5-3f11f8b48fd3", "metadata": {}, "source": [ "## Step 3. Load your data and parse inputs for the OpenAI query\n", "This sample dataset is a directory of Starbucks locations, scraped from the Starbucks store locator webpage by Github user [chrismeller](https://github.com/chrismeller/). Geospatial coordinates have been truncated, just in case..." ] }, { "cell_type": "code", "execution_count": 81, "id": "6e27b49f-3637-4776-b2a3-9f019966d618", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0.1Unnamed: 0BrandStore NumberStore NameOwnership TypeStreet AddressCityState/ProvinceCountryPostcodePhone NumberTimezoneLongitudeLatitude
000Starbucks47370-257954Meritxell, 96LicensedAv. Meritxell, 96Andorra la Vella7ADAD500376818720GMT+1:00 Europe/Andorra1.5342.51
1111Starbucks1579-122101HCT Abu Dhabi Women's College BlockLicensedNajda Street, Higher Colleges of TechnologyAbu DhabiAZAE316726426280GMT+04:00 Asia/Dubai54.3724.49
2212Starbucks32595-122105Standard Chartered BuildingLicensedKhalidiya St., Beside Union Cooperative SocietyAbu DhabiAZAE316726359275GMT+04:00 Asia/Muscat55.6924.19
3320Starbucks32767-131566Shangri-La SouqLicensedShangri-La Souk, Um Al NarAbu DhabiAZAE316725581641GMT+04:00 Asia/Dubai54.5124.42
4445Starbucks32640-131563Tawam HospitalLicensedAl Ain Abu Dhabi Rd, Khalifa Bin Zayed, Al Mak...Al AinAZAE316737677581GMT+04:00 Asia/Muscat55.6524.19
\n", "
" ], "text/plain": [ " Unnamed: 0.1 Unnamed: 0 Brand Store Number \\\n", "0 0 0 Starbucks 47370-257954 \n", "1 1 11 Starbucks 1579-122101 \n", "2 2 12 Starbucks 32595-122105 \n", "3 3 20 Starbucks 32767-131566 \n", "4 4 45 Starbucks 32640-131563 \n", "\n", " Store Name Ownership Type \\\n", "0 Meritxell, 96 Licensed \n", "1 HCT Abu Dhabi Women's College Block Licensed \n", "2 Standard Chartered Building Licensed \n", "3 Shangri-La Souq Licensed \n", "4 Tawam Hospital Licensed \n", "\n", " Street Address City \\\n", "0 Av. Meritxell, 96 Andorra la Vella \n", "1 Najda Street, Higher Colleges of Technology Abu Dhabi \n", "2 Khalidiya St., Beside Union Cooperative Society Abu Dhabi \n", "3 Shangri-La Souk, Um Al Nar Abu Dhabi \n", "4 Al Ain Abu Dhabi Rd, Khalifa Bin Zayed, Al Mak... Al Ain \n", "\n", " State/Province Country Postcode Phone Number Timezone \\\n", "0 7 AD AD500 376818720 GMT+1:00 Europe/Andorra \n", "1 AZ AE 3167 26426280 GMT+04:00 Asia/Dubai \n", "2 AZ AE 3167 26359275 GMT+04:00 Asia/Muscat \n", "3 AZ AE 3167 25581641 GMT+04:00 Asia/Dubai \n", "4 AZ AE 3167 37677581 GMT+04:00 Asia/Muscat \n", "\n", " Longitude Latitude \n", "0 1.53 42.51 \n", "1 54.37 24.49 \n", "2 55.69 24.19 \n", "3 54.51 24.42 \n", "4 55.65 24.19 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Read in your data (can be multiple datasets)\n", "data = pd.read_csv('../data/directory.csv')\n", "\n", "# Generate a list of columns for each dataset, for later use in generating code\n", "columns = list(data)\n", "\n", "# If you can do it under the API token limit, generate head (or synthetic head) data for each file, to give the OpenAI API context. \n", "# Store as a .json so it transmits properly.\n", "head = data.head()\n", "json_head = head.to_json(orient='records')\n", "\n", "# Displaying the data head so you have a sense of what's in it.\n", "display(head)" ] }, { "cell_type": "markdown", "id": "30d4d983-de2e-41ef-9b70-b312fd632ea7", "metadata": {}, "source": [ "## Step 4. Prime the AI -- define the role and response parameters for the AI" ] }, { "cell_type": "code", "execution_count": 105, "id": "b09c4542-ed98-4a5b-a8f3-cca99daa20b5", "metadata": {}, "outputs": [], "source": [ "# Prepare your base prompt, which tells the OpenAI oracale what its role is and any\n", "# information it should use to prepare its response. \n", "\n", "BASE_PROMPT = [\n", " {\"role\": \"system\", \"content\": f\"You are a python programmer. Write a program that uses the column names\"\n", " f\"--{columns}-- from the Starbucks dataframe that can be used to answer the question. If helpful, here\"\n", " f\"are sample data: {json_head}. The data can be found here: ../data/directory.csv\"\n", " }]\n", "\n", "# Set up global variables so that you can ask follow up questions and receive answers based on prior responses.\n", "messages = []\n", "messages += BASE_PROMPT\n", "message_response = \"x\"" ] }, { "cell_type": "markdown", "id": "ee9ae9fa-08cd-4166-8be2-4b21ef3efe10", "metadata": {}, "source": [ "## Step 5. Write a function for sending base prompt and question to OpenAI and storing response." ] }, { "cell_type": "code", "execution_count": 114, "id": "239eede2-18d8-4289-94e3-0dc9ddda576e", "metadata": {}, "outputs": [], "source": [ "def question (prompt):\n", " global messages\n", " global message_response\n", " \n", " # Add user prompt to messages.\n", " messages += [{\"role\": \"user\", \"content\": prompt}]\n", " \n", " # Call the OpenAI API and parse the response.\n", " response = openai.ChatCompletion.create(model=\"gpt-3.5-turbo\",messages=messages)\n", " message_response = response[\"choices\"][0][\"message\"][\"content\"]\n", " \n", " # Store response for follow up questions. \n", " messages += [{'role':'assistant', 'content':message_response}]\n", "\n", " # Display the question and results using Markdown\n", " display (Markdown(\"### \" + prompt))\n", " display(Markdown(message_response))\n" ] }, { "cell_type": "markdown", "id": "bafd98d2-96da-4f35-9e73-f4d252c758f6", "metadata": {}, "source": [ "## Step 6. Ask a question!" ] }, { "cell_type": "code", "execution_count": 107, "id": "3536fb34-e337-4874-9a79-e932647f3cbc", "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "### How many Starbucks are in the EU?" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "To answer this question using the given dataframe, we need to filter the data where the \"Country\" column is in the EU countries list, and then count the number of rows. Here's the code to do this:\n", "\n", "```python\n", "import pandas as pd\n", "\n", "# Read the Starbucks dataframe\n", "starbucks_df = pd.read_csv('../data/directory.csv')\n", "\n", "# List of EU countries\n", "eu_countries = ['AT', 'BE', 'BG', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'PL', 'PT', 'RO', 'SE', 'SI', 'SK']\n", "\n", "# Filter Starbucks stores in the EU\n", "starbucks_eu_df = starbucks_df[starbucks_df['Country'].isin(eu_countries) & (starbucks_df['Brand'] == 'Starbucks')]\n", "\n", "# Count the number of Starbucks stores in the EU\n", "num_of_starbucks_in_eu = len(starbucks_eu_df)\n", "\n", "# Print the result\n", "print(\"There are\", num_of_starbucks_in_eu, \"Starbucks stores in the EU.\")\n", "```\n", "\n", "Note that this code assumes that the \"Country\" column contains the two-letter country codes, such as \"AD\" for Andorra, \"AE\" for United Arab Emirates, etc." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "prompt = \"How many Starbucks are in the EU?\"\n", "question (prompt)" ] }, { "cell_type": "markdown", "id": "a88bd641-b18f-43d2-8478-d5186e03807e", "metadata": {}, "source": [ "### Optional: Ask a follow up question. " ] }, { "cell_type": "code", "execution_count": 111, "id": "8ff3df0e-33aa-4568-8602-e54c12289067", "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "### Can you turn the response into a chart, by country and using colors and fonts that are used in the Starbucks logo?" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/markdown": [ "Sure! Here's the modified code that includes a horizontal bar chart with colors and fonts based on the Starbucks logo, grouped by country:\n", "\n", "```python\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "# Read the Starbucks dataframe\n", "starbucks_df = pd.read_csv('../data/directory.csv')\n", "\n", "# List of EU countries\n", "eu_countries = ['AT', 'BE', 'BG', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'PL', 'PT', 'RO', 'SE', 'SI', 'SK']\n", "\n", "# Filter Starbucks stores in the EU\n", "starbucks_eu_df = starbucks_df[starbucks_df['Country'].isin(eu_countries) & (starbucks_df['Brand'] == 'Starbucks')]\n", "\n", "# Count the number of Starbucks stores by country\n", "starbucks_by_country = starbucks_eu_df.groupby('Country')['Brand'].count().reset_index().rename(columns={'Brand': 'Num_of_starbucks'})\n", "\n", "# Sort the data by number of stores\n", "starbucks_by_country = starbucks_by_country.sort_values('Num_of_starbucks', ascending=False)\n", "\n", "# Set the color scheme and font\n", "sns.set_palette(sns.color_palette([\"#00704A\"]))\n", "sns.set(font=\"Helvetica\")\n", "\n", "# Create the bar chart\n", "plt.figure(figsize=(12,8))\n", "sns.barplot(x='Num_of_starbucks', y='Country', data=starbucks_by_country, color=\"#00704A\")\n", "plt.title('Number of Starbucks Stores in the EU by Country', fontsize=18, fontweight='bold')\n", "plt.xlabel('Number of Stores', fontsize=14)\n", "plt.ylabel('Country', fontsize=14)\n", "plt.xticks(fontsize=14)\n", "plt.yticks(fontsize=14)\n", "plt.show()\n", "```\n", "\n", "This code groups the data by country using the `groupby()` function, and creates a horizontal bar chart using `barplot()` function. The color code `#00704A` is the main green color used in the Starbucks logo, and the chart is sorted by the number of stores in each country. The final chart will look like this:\n", "\n", "![Starbucks chart by country](https://i.imgur.com/XEboX9P.png)\n", "\n", "I hope this helps!" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Optional follow up question. You can add these until you run out of tokens. \n", "prompt = \"Can you turn the response into a chart, by country and using colors and fonts that are used in the Starbucks logo?\"\n", "question(prompt)" ] }, { "cell_type": "markdown", "id": "f92b2d6f-3ba7-4067-9073-57df9eda93f1", "metadata": {}, "source": [ "### Pause!\n", "Sometimes the response will try to answer the prompt, in addition to providing the code. These answers are often (but not always) nonsense! Make sure you review and run the code yourself to be certain of the result. \n", "\n", "Now, here is what is really exciting about OpenAI: the API combines information about the dataset with its own knowledge. For example, when asking about the number of Starbucks in each EU country, the AI will generate a list of countries to use. Or, if asking the AI to use Starbucks colors for charts, it will know to use infamous Starbucks green. 😃 Amazing, and also very risky -- always double check the 'additional knowledge' being provided. " ] }, { "cell_type": "markdown", "id": "b372cb4b-614d-4e1c-aba5-b4709c67def2", "metadata": {}, "source": [ "## Step 7. Parse the OpenAI response to pull out the Python code." ] }, { "cell_type": "code", "execution_count": 112, "id": "ea7ba57b-e2bd-4be6-b294-7fafe892c701", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "import matplotlib.pyplot as plt\n", "# Read the Starbucks dataframe\n", "starbucks_df = pd.read_csv('../data/directory.csv')\n", "\n", "# List of EU countries\n", "eu_countries = ['AT', 'BE', 'BG', 'CY', 'CZ', 'DE', 'DK', 'EE', 'ES', 'FI', 'FR', 'GR', 'HR', 'HU', 'IE', 'IT', 'LT', 'LU', 'LV', 'MT', 'NL', 'PL', 'PT', 'RO', 'SE', 'SI', 'SK']\n", "\n", "# Filter Starbucks stores in the EU\n", "starbucks_eu_df = starbucks_df[starbucks_df['Country'].isin(eu_countries) & (starbucks_df['Brand'] == 'Starbucks')]\n", "\n", "# Count the number of Starbucks stores by country\n", "starbucks_by_country = starbucks_eu_df.groupby('Country')['Brand'].count().reset_index().rename(columns={'Brand': 'Num_of_starbucks'})\n", "\n", "# Sort the data by number of stores\n", "starbucks_by_country = starbucks_by_country.sort_values('Num_of_starbucks', ascending=False)\n", "\n", "# Set the color scheme and font\n", "sns.set_palette(sns.color_palette([\"#00704A\"]))\n", "sns.set(font=\"Helvetica\")\n", "\n", "# Create the bar chart\n", "plt.figure(figsize=(12,8))\n", "sns.barplot(x='Num_of_starbucks', y='Country', data=starbucks_by_country, color=\"#00704A\")\n", "plt.title('Number of Starbucks Stores in the EU by Country', fontsize=18, fontweight='bold')\n", "plt.xlabel('Number of Stores', fontsize=14)\n", "plt.ylabel('Country', fontsize=14)\n", "plt.xticks(fontsize=14)\n", "plt.yticks(fontsize=14)\n", "plt.show()\n" ] } ], "source": [ "# Now, we parse the ChatGPT response to pull out the Python code. Full disclosure:\n", "# I used ChatGPT to write this code, so don't ask me too many questions about it.\n", "\n", "text = message_response\n", "\n", "# Define the regular expression pattern to match the Python code\n", "pattern = r\"```(?:python)?\\n([\\s\\S]*?)\\n```\"\n", "\n", "# Extract all Python code blocks from the text\n", "python_blocks = re.findall(pattern, text)\n", "\n", "# Combine all Python code blocks into a single string\n", "python_code = \"\\n\".join(python_blocks)\n", "\n", "# Remove import statements from the Python code\n", "python_code = re.sub(r\"(?:from\\s+\\w+(?:\\.\\w+)*\\s+)?import\\s+\\w+(\\s+as\\s+\\w+)?(?:,\\s*\\w+(\\s+as\\s+\\w+)?)*\\s*\\n\", \"\", python_code)\n", "print (python_code)\n" ] }, { "cell_type": "markdown", "id": "c3804423-2daf-4b9a-aaf6-ac6a961d5a9e", "metadata": {}, "source": [ "## Step 8. Run the code (DANGER!)" ] }, { "cell_type": "code", "execution_count": 113, "id": "46b21445-b5b3-452c-8930-b5440332f318", "metadata": {}, "outputs": [ { "data": { "image/png": "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c+c6R0zk5Hvn6xwLxH333Xcu+yYpKUmvvvqq3n77bR0+fDhPa3Ms3Lpx48ZUJ2RutWTJEudwdXe+47LzPX8zR6jcsGGDVq9eLUnOqSzZ0bdvXxUuXFgpKSmKiopKd02Q69ev65VXXtGVK1cUFBTknAonuf8Zu3me/q3fcdevX9ecOXOy/Xpy2913363atWvLMAy9/fbbunz5sipVqpTugpMAUiPkA8hRr732mgIDA51zJ2/l+CPl6tWrGj58uE6dOqWEhARt2rQp09ui5Rar1apnnnlGmzZtUnJysq5cuaLFixc7783dp0+fVFdtXn75ZQUEBGjVqlV65513dPr0aRmGoQsXLuirr77SoEGDJN24xZU7w0pv5efnp27dukmSFixYkObK8ZUrVxQdHS1JatSokSpXrnzbz9m/f38FBARo3759evXVV13+QWoYhlasWKF///vfkqROnTqlGpLuuGp8890BJDlXst65c6c+/PBDJSYmKjk5Wbt27dKQIUP08ccfO4el/ve//81wfn16fvvtN/Xr109xcXG6fv26zp8/r0mTJjmHe7/00kup2jtO3MyaNUurV6/WpUuXdPLkSUVHR2v+/PkuF4l68MEHdf/998swDA0cOFAxMTHO55o+fbpmzZol6ca93TPz0ksvKSgoSNeuXXPee1r63wrxc+fOTTOk9vr161qwYIEkqVatWll6X3KzXx977DEFBwfr2rVrevvtt9OcqHEMkZey9p7c/HwvvPCCpBt38Jg/f77+/vtvGYah+Ph4TZgwQR9//LGkG59Nh5x+7/KSY4pOXFycW7//t3r00UdVtWpVJSUlqW/fvtq5c6euXbuma9euafv27erZs6eOHz+uu+66S927d7/t58uOZ555RoUKFdLVq1f14osvulwsbuPGjc71K1q0aOHWlfzsfs87REREqESJEvrrr78UFxenIkWKpLmNa1aULl1a7733nvz8/BQXF6f27dtrwYIFzik9Fy9e1IYNG9S1a1dt3rxZAQEBmjhxokqWLOk8hrufsXLlyjn/LXr77be1b98+Xbp0Sfv379eAAQN07NgxtxYzzIjjd/jnn392e9FJxwmWTZs2SXLv5Apwp2JOPoAcdffdd+uFF17Qe++953L/Pffco44dO2rJkiVat25dqlvkFCxYUGPHjtVrr72WV+VKkl544QXNnDkz1RUThyZNmqS5N3ft2rU1fvx4jR49Wl9++aXLK/qtWrXSq6++mmM1Pvfcc1q/fr0OHjyop59+Ws2bN1fFihWVmJio9evX69y5cypatKjGjBmTI89XtWpVvfHGGxo7dqyWL1+uH374QY0aNVK5cuWUL18+nTt3Tjt27NDp06cl3QjJQ4YMSXUMx2JThw8fVp06dRQREaHZs2frkUce0fz58/Xzzz/rgw8+0AcffOB8jL+/v1555RWdOnVKCxYs0OTJk7V169ZsX2l6+eWX9d5776W5ZZckvfjii2rYsGGqbc8//7zWrl2rpKSkNK+jefPmKlSokJYvX55qu8Vi0Xvvvaenn35ap06dcjnX+eGHH3aeoMlISEiIBg4cqOjoaG3ZskVr1qxRmzZt9OSTT2ru3Lk6ffq02rZtq5YtW6p06dL6+++/tXHjRp09e1aFCxd2+bvrSm72a1BQkF5//XUNGzZMK1euVFxcnJo2barAwEAdPHjQuTJ29+7d072dWXr69Omj+Ph4zZ8/X2+88UaaNT/8/Pz08ssvp5onndPvXV6qWbOmNm7cqB9//FE1a9ZUx44dNWHCBLePly9fPk2fPl3PPvus4uLi9PTTT6dpU6pUKc2YMSPVYnhZNX369HRHb93qnXfeSXWP9zJlyuj111/Xa6+9pj179qhVq1Zq0aKF7r77bl26dEl79uxRXFycs+2bb76Z7fqk7H/PO/j7+6tt27bO76B27dq5fb/7Zs2aafr06Ro5cqTOnj2rsWPHumwXEhKiiRMnprmDi7ufMYvFosGDB2vkyJE6duyYunTpkuq4r776qr788ssMR1JkV82aNRUTE6MPPvhAU6ZM0YQJE9SxY8dsHePhhx/WO++8I6vVKj8/v1S/NwAyRsgHkON69+6tJUuWpDv/c9y4capQoYKWLl2q06dPq2DBgqpfv74GDx7s9h9Pt6NevXpq2bKlpkyZor179yolJUUVKlRQZGSknnrqKZejCzp06KBq1arpk08+0U8//aSEhASFhIQoNDRUkZGRzvv85pQCBQpo1qxZGjlypL7//vs0ax5UqVJF0dHRqlChQo49Z5cuXVS2bFm9++67OnDggMt1FsqUKaNevXrpqaeeSnM7rHbt2mn37t1au3atLl++rBIlSki6ETg+//xzTZs2TatWrdJff/2lf/zjH3rggQfUq1cvVatWTWfPnlVcXJwOHTqU6kpWVvXp00fly5fXZ599pl9//VUBAQGqXr26evfu7Vx87maVK1fWggUL9O9//1t79+7VlStXVK5cOXXu3Fm9e/dO97aQpUqV0uLFi/Xxxx9r7dq1+v3331WgQAHnEPzs/FH69NNPa8GCBTp+/LgmTJigxo0bq1SpUvroo480bNgwnT17VosXL071mDJlyuhf//pXlue3S7nXr9L/5tG+/fbbOnnyZKoTYPny5VO/fv3SnDTICovFojfeeEMPPfSQ5syZo/379yslJUUlS5ZU7dq11b179zRX5HPjvcsrPXv21OHDh7Vt2zalpKSkGm7trjJlymjx4sWaNWuWVq5cqVOnTqlgwYIqU6aMmjdvrh49emRrnvnNDMPI8qr8rqZHdOjQQaVKldL48eP166+/aunSpan258uXT61atdLrr7/udo3ufM87PPLII86Q75hb767mzZtr/fr1mj9/vn744Qfn1LXg4GBVrFhRzZo1U9euXdM92eLuZywyMlKFCxfWF198ocOHD8tut6tq1arq27evWrZsme70M3eNGTNGr732mg4dOqSAgIAsretxq5CQED3wwAPasmWLGjZs6NbtSoE7lcXI6Ru3AgBy1bFjx7Rz504lJCQoODhY1atXV40aNXJ1xeFjx44pNjbWuQBd8eLFVa1aNVWrVo2VjvPA9evXtWvXLv3666+6fPmyChcurNDQUN1///23te5DbvVrcnKytm7dqpMnT8owDN19991q2LCh2wHtduTWe4fcceDAAR05ckR//vmnChYsqFKlSun+++/P8krxueG7777TsGHDFBoaqu+++85jddzMmz5jucUwDLVt21YnTpzQBx98oLZt23q6JMBnEPIBAACAdHTr1k179uzR2LFj83zNgjvZtm3b9Mwzz6hEiRL64YcfOCkHZAOfFgAAAOAmp0+fVrFixbR27Vrt2bNHRYsWzfaccmTf5cuXlZycLJvNpvfff1/SjalMBHwge/jEAAAAADcZOXKkduzY4fz52WefdXmXDeSsuLi4VHcGCAkJYfQE4AZCPgAAAHCT4OBg+fv76x//+Ic6dOigvn37erqkO0JgYKAKFiwowzBUvXp1vfbaawoKCvJ0WYDPYU4+AAAAAAAm4efpAgAAAAAAQM4g5AMAAAAAYBLMyXeDYRiy25nlYCZ+fhb61EToT/Oh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UnXr1s2xegEAAAAA8DS3Qv7NgoODFRwcnBO1OH3xxReaMWOGQkNDNXXqVN17773OfVevXtW//vUvzZ07Vy+//LLmzJmT5vHFihXTqFGjXB572bJlevXVVzV16lTNmjUrR+sGAAAAAMCTvO4m9n/++afef/99FS1aVJ999lmqgC9JBQsW1OjRo1W7dm3t2LFDsbGx2Tp++/btVahQIf3yyy85WDUAAAAAAJ7ndSH/P//5j65du6bu3burZMmSLttYLBYNHDhQHTt2VGJiYraO7+fnp/z588tms+VEuQAAAAAAeI3bHq6f07Zt2yZJeuihhzJs17hxYzVu3Djbx//999+VkJCgmjVrulUfAAAAAADeyuuu5B8/flySVLFixRw97tWrV7Vv3z69/PLLkqTnnnsuR48PAAAAAICned2V/EuXLkm6sUL+zVasWOEM6DerX79+msX3zpw5k+6t9CRp6NChat26dQ5UCwAAAACA9/C6kJ8/f35dv35dV69eTRX0K1SooJ49ezp/ttvtmjt3rstjuLqFntVqVXx8vH788UfNmDFDDRo0UI0aNXLnRQAAAAAA4AFeF/JLliyp48ePKz4+XlWqVHFur1atmqpVq+b8+cKFC+mG/IxuoTdlyhRNnz5dc+fO1cSJE3O2eAAAAAAAPMjr5uTXqVNHkrR169YM2x06dMit47dq1UqSdO7cObceDwAAAACAt/K6kN+xY0dJ0rx583T16tV023399dduHT8oKEiSuIUeAAAAAMB0vC7k33///WrevLnOnDmjF198URcvXky1/9q1a3rvvfe0Zs0a+fm5X75hGLdbKgAAAAAAXsXr5uRLUnR0tAYMGKCNGzeqWbNmeuCBB1SqVCklJiZq+/bt+u9//6uRI0dq9erV2T6248TA33//ndNlAwAAAADgUV4Z8osWLarZs2dr6dKlWrp0qXbs2KGUlBSVKFFCDRo00NNPP63w8HD9/vvvOnjwYLaOHRISoiJFiujo0aPasGGDWrRokUuvAgAAAACAvOWVIV+SAgIC1LlzZ3Xu3DndNq+99lqabYcPH87wuAULFtTu3btvuz4AAAAAALyN183JBwAAAAAA7iHkAwAAAABgEoR8AAAAAABMgpAPAAAAAIBJEPIBAAAAADAJQj4AAAAAACZByAcAAAAAwCQCPF2ArwotXc7TJeQqs78+AAAA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f/31l9GwYUOjWbNmhtVqzdO6kTWXL182HnroISM0NNQIDQ01Tpw44dxHn/qOEydOGFWqVDG6du1qXLlyxbn93//+txEaGmrMnj3bMAz61Fe8/fbbRmhoqPHNN984tyUnJxtPPPGEERoaauzcudMwDPrTG6WkpBg///yz8cUXXxjNmjUzQkNDjSeffDJNu+z0XdeuXY0qVaoYO3bscG777bffjBo1ahjdunXL3ReELPdp69atjRo1ahgHDhxwbktKSjK6detmhIaGGhs3bjQMwzCuX79uNGvWzKhVq1aqv3+3b99uhIaGGsOGDcv113Qny2p/3uyXX34xqlataoSGhhqNGzdOtY/+NC+u5GfBV199pYCAAL388svObf7+/urTp49sNpuWLVvmweqQkbVr16p06dJphjINHjxYfn5+Wrt2rf7++2+tXr1aVapU0WOPPeZs849//EORkZE6c+aMfvrpp7wuHVkwefJkXbx4UREREam206e+Zc6cObLb7Ro7dqwKFSrk3P7ss8+qWLFiOnjwIH3qQ2JiYlSoUCF17NjRua1gwYLq0aOHJGnv3r30p5c6fPiwnnjiCU2YMCHdobrZ6btDhw5p7969atasme6//35n2woVKqhly5bavXu3Tpw4kauv6U6XlT49cuSITpw4oTZt2qhq1arO7YGBgerfv78kac2aNZKkH374QWfOnFHnzp1VsWJFZ9v69eurVq1aWrVqla5cuZKLr+jOlpX+vJnNZtOYMWMUFhamu+66K81++tO8CPmZuHTpkg4fPqz77rtPISEhqfbVrl1b/v7+zB/0UpcvX1ZCQoKqVKmSZl9gYKCKFi2qc+fOae/evbJarWrcuHGadnXr1pUk+tgL7du3T/PmzdPgwYN19913p9pHn/qWmJgY3XPPPapWrVqq7UWKFNH27dv1zjvv0Kc+xmKxpNnmmI9fqFAh+tNL3XPPPXr//fed/7mSnb5z/C/97DlZ6dP4+HhJSvMdLEmlS5eWJOc6Rrt27ZLkuk/r1Kmj69eva9++fTlSO9LKSn/ebNasWTp48KDeeust+fv7p9lPf5oXIT8Thw8flt1uV6VKldLsK1KkiEqWLJlmYSh4h3z58mnGjBkaPHhwmn2nT5/W33//rZCQEOecQFd97Njm+AcQ3sFqtWr06NGqUqWKevbsmWY/feo7Ll++rN9++01hYWGyWq1avXq13n//fU2fPl379+93tqNPfUfdunV15coVLVq0yLktOTlZc+bMkcViUUREBP3ppYoWLapHHnnE+Z8r2em7jNo6rhrSz7krK31avXp1zZgxQ23atEmzz/E97LjQlZX+5+/i3JOV/nSIj4/X1KlT1b17d9WoUcNlG/rTvAI8XYC3u3jxoiSluYrvEBQUxFAzL1WgQAE1a9YszfarV69q9OjRkqSWLVtm2MdBQUGSpISEhNwrFNn22Wef6ddff9WCBQtcnpmmT33HX3/9Jbvdrnz58qlbt26prhhMmTJFXbt21Ztvvkmf+pDBgwdrz549Gj16tFatWqW77rpLO3bsUHx8vAYNGqTKlSs7705Df/qe7HwWHW3/8Y9/pGkbHBycqi08p1SpUipVqlSa7adPn9bkyZMl3fh7ScpanzrawLPeeOMNBQUF6cUXX0y3Df1pXlzJz8Tly5clSfnz53e5v1ChQjIMIy9Lwm04dOiQunbtqpiYGJUpU0aDBg3KsI8d84PpY+9x8uRJTZ8+XU899ZRq1qzpsg196jscd7hYtWqVLl++rDlz5ig2NlYrVqxQ7dq1tWDBAs2ZM4c+9SEFChRwTpPaunWrvvnmG8XHxyt//vzOPyTpT9+Vnb7LqG1gYGCqtvAua9asUefOnfXnn3+qWbNmzqv8WelTu92ed4XCpW+//VZbtmzR6NGjVaRIkXTb0Z/mRcjPRL58+STJeQunW12/fl3FihXLw4rgjpSUFE2ePFmdO3fWoUOHVKtWLX311VcKCQlRQECAs82tHPeGpY+9x9ixY1W0aNE0t/S5GX3qO65fvy5J8vPz07Rp01S/fn0VLFhQlStXVnR0tCwWixYuXEif+pCoqCh999136tSpk9avX689e/bo888/V+nSpfXmm29q48aN9KcPy07fOdq6+hvK8dmnn73LuXPnNGjQIA0ePFh///23OnfurClTpjjX2aBPvd/ff/+tCRMmpDo5kx7607wI+ZkoXry4pP+d6bpVQkICv/xe7sSJE+rUqZNmzJihgIAAvfLKK/rqq6+cq4w6hhxeunQpzWMdwwjpY++wbNky/fTTT5memaZPfUfhwoUlSeXKlUszJ/Dee+9VhQoVdPz4cfrURxw4cEAxMTGqWbOmxo8fr3Llyqlw4cJq1KiRpkyZIkmaO3cu/enDstN39LNv+eGHH9S+fXutW7dOd999t2bMmKHx48enuspLn3q/SZMm6erVqxo7dmymbelP82JOfiYcC8P8+uuvafalpKTo3LlzmZ4lg+ecPXtW3bt3119//aUGDRpo3LhxKlu2bKo2FSpUkOS6jx2LjYSGhuZ+scjUL7/8IkkuF1OUpNatW0uSc/4Zfer9HHdGcIT9WzmGC/I59Q2ONWrq1auXZoX9KlWqqGjRooqPj9fjjz8uif70Rdn5LN7ctk6dOhm2hWdt2rRJL7zwgux2u3r06KGXXnrJ5fdyhQoVtGvXLv36669p5vGfPHlSEn3qab/88ouSkpJcrkslSWFhYSpTpoy+//57+tPECPmZKFWqlO69917FxcXp4sWLKlq0qHPfTz/9lO5tZOAdJk6cqL/++kudOnXSuHHj5OeXdvBKRESELBaLYmJi0uzbunWrJNe3FkHeq1+/vsvtW7du1bFjxxQZGakiRYooMjJSH3zwAX3qA4KDg51X6y9fvpxqhEZSUpKOHz+u0NBQPqc+wjEn+88//0yz7/r160pKStK9995Lf/qw7PRdRESEpBu3yezatWuatgULFkz3ex15x2q1asyYMbLZbJowYYIiIyPTbRsREaGFCxcqJiZGDz74YKp927ZtU9myZVPdbx15r3379i4/V998840Mw1Dnzp2deYb+NDEDmfr000+N0NBQ4+2333Zuu3z5stGxY0ejXr16RkJCggerQ3quXLli1KhRw3j44YeNa9euZdj2ueeeM0JDQ421a9c6tx09etSoU6eO0b1799wuFbdp+PDhRmhoqHHixAnnNvrUd3zyySdGaGio8cYbbxh2u925fdKkSUZoaKgxZ84cwzDoU1+QmJho1KpVy7jvvvuMffv2pdr34YcfGqGhocaMGTMMw6A/fUFoaKjx5JNPptmenb575JFHjPvuu8+IjY11btuxY4dRrVo149VXX8294uGSqz7dtm2bERoaaowaNSrTxycnJxsRERFGvXr1jFOnTjm3f/fdd0ZoaKjxwQcf5HjNSF96n1FXmjVrZjRu3DjVNvrTvCyGwbKmmbl27Zq6du2qAwcOqF69eqpUqZK2bNmiM2fOZHrGE56za9cude/eXffdd5/q1q3rsk3RokU1aNAgnTx5Up06dVJSUpJatmypwMBArVu3ThaLRfPmzXOuFA3vNGLECC1ZskRr165V+fLlJYk+9SHXr19Xr169tHv3blWpUkX33XeffvvtN+3du1f333+/Zs2apYCAAPrURyxatEijR49WQECAHnzwQZUsWVIHDx7Uvn37dN999+mrr75SwYIF6U8fEBYWpjp16mj+/Pmptmen73bv3q1evXrJ399frVq1ks1m0/r161W8eHEtXLjQ5a3bkHtc9en06dM1ZcoUtWjRQmXKlHH5uJo1a6p9+/aSpJUrV+rll19WcHCwWrRooYSEBP3www+qVKmS/vOf/zhH9CD3pfcZdaV58+ayWq3avHlzqu30pzkxXD8L8ufPr9mzZ+u9997T+vXrFRcXp0qVKmnkyJFq1aqVp8tDOs6fPy9JiouLU1xcnMs2jtvolS9fXgsWLNC//vUvbdu2TRaLRffff79eeukl/tD0UfSp78iXL58+//xzffTRR/r222/17bffqlSpUnr++efVv39/5+q/9Klv6Ny5s+69917NnDlTe/bsUVJSkkqVKqU+ffpo4MCBKliwoCT605dlp+/q1q2r2bNn69///rc2bNigAgUKqFWrVnr55ZcJ+F7ir7/+kiRt2LAh3TYdO3Z0hvx27dopMDBQH374oVatWqUiRYqoS5cuevHFFwmEPoj+NCeu5AMAAAAAYBLcQg8AAAAAAJMg5AMAAAAAYBKEfAAAAAAATIKQDwAAAACASRDyAQAAAAAwCUI+AAAAAAAmQcgHAAAAAMAkCPkAAAAAAJgEIR8AAAAAAJMg5AMAcJumTp2qsLAwNWjQQJcuXXLZZvv27QoLC9PkyZPzuLobmjdvrh49enjkud01c+ZMNWnSRFWrVtXOnTszbb9mzRr16tVL999/v+677z49+OCDGjx4sLZv354H1QIA4B0I+QAA5JALFy5o2rRpni7DFE6fPq1//etfSkpKUpcuXVSyZMkM27/33nsaPHiwjh07pgYNGqhLly6qXr26Nm3apJ49e+rf//53qvaTJ09WWFgYJwAAAKYT4OkCAAAwC4vFonnz5umJJ55QpUqVPF2OTzt79qwk6bHHHtPYsWMzbLt//3598sknatiwoaZPn65ChQqlOk6vXr300UcfqXnz5qpZs2au1g0AgKdxJR8AgBzSsWNHXb9+XRMmTPB0KR5z9erVHDmO3W6XJAUFBWXadt26dZKkgQMHpgr4klS6dGlFRUVJkjZt2pQjtaUnJSUlV48PAEBWEPIBAMgh7du3V926dfXjjz9q48aNmbbv0aOHwsLCZLVaU213NX+/efPmatKkic6dO6chQ4aobt26atCggd5++21du3ZN33//vTp27KgaNWqoefPmmjVrlsvn/Pnnn9WjRw+Fh4crIiJCQ4cO1ZkzZ9K0O3PmjIYPH66GDRuqZs2aioyM1MKFC2UYhrPN6dOnFRYWpvHjx2vjxo1q166dunXrluFrvnbtmmbMmKG2bduqRo0aatiwoV555RXFx8c724wYMUI9e/aUJM2YMSPTYfUJCQmS0g/ZjRo10pAhQxQeHu58L2fMmCFJ6tmzp5o3b56t+hw1hoWF6ffff9eIESNUp04d/fjjj87969evV7du3VSrVi3Vr19fUVFROnjwYJrafvzxR3Xv3l3169dX7dq19cQTT2jt2rUZvYUAAGSIkA8AQA4aM2aM/Pz8FB0drWvXruXosa9evaqnn35ax48fV+vWrVWgQAHNnTtX/fr108CBA1WkSBE99thjSk5O1oQJE9KcaDh+/Lh69uypCxcuqH379qpSpYqWL1+url276ty5c852v/32mzp37qzly5erZs2a6tChg1JSUjR69Gi98soraerauXOnBg0apNKlS6tt27bp1m+z2dS/f39NnjxZhQoVUmRkpMLDw7Vq1Sp17NjRGYIbNWqkNm3aSJJq1qypnj176q677kr3uBUrVpQkvf7669q0aVOa9z0kJEQvvPCCmjRpIkmKjIx0Dttv06aNIiMjs1XfzQYNGqSYmBi1bt1aZcuWlSR98cUXGjhwoM6cOaO2bduqcePGiomJUZcuXVKNJli5cqX69u2rP/74Q23atFHTpk114sQJRUVFac2aNem+XgAAMsKcfAAAclDVqlX1xBNP6Ouvv9aXX36p5557LseOffHiRbVu3VpvvfWW/Pz8FB8fr1atWikmJkZRUVEaNGiQJGnfvn3q0qWL1qxZo2bNmjkff/78efXu3Vuvvvqq/P39JUnTpk3T1KlT9cEHH+idd96RJL322mu6dOmS5s6dq9q1a0u6MXx+2LBh+u677/TYY485A7MkHTx4UOPHj1fnzp0zrP+rr77S1q1b/1979xYSVdeHAfxx0tFR01E0QREyebUSQzTzkAiJQSFmJqIwlIglZgetRgoxxRgzQoIuKsUsqNDGzAMWaqBIKmRqpngoPIZQmpbl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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# The following code will execute the OPENAI-generated Python scripts. CHECK THE CODE FIRST!\n", "\n", "try:\n", " exec(python_code)\n", "except FileNotFoundError:\n", " print(\"FileNotFoundError: directory.csv not found in directory:\", os.getcwd())\n", "except Exception as e:\n", " print(\"Error:\", e)" ] }, { "cell_type": "code", "execution_count": null, "id": "dce8e2f4-063c-407d-b5dc-8ed968465a75", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.9" } }, "nbformat": 4, "nbformat_minor": 5 }