From f8fd99a9281ee3886d88fc322e655af46920aae5 Mon Sep 17 00:00:00 2001 From: Benjamin Adovasio <111182300+Benjamin-Adovasio@users.noreply.github.com> Date: Wed, 22 Oct 2025 22:51:24 -0400 Subject: [PATCH] Created using Colab --- Benjamin_Adovasio_Midterm_project.ipynb | 1271 +++++++++++++++++++++++ 1 file changed, 1271 insertions(+) create mode 100644 Benjamin_Adovasio_Midterm_project.ipynb diff --git a/Benjamin_Adovasio_Midterm_project.ipynb b/Benjamin_Adovasio_Midterm_project.ipynb new file mode 100644 index 0000000..d4f392f --- /dev/null +++ b/Benjamin_Adovasio_Midterm_project.ipynb @@ -0,0 +1,1271 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [], + "toc_visible": true, + "include_colab_link": true + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "view-in-github", + "colab_type": "text" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "source": [ + "# Project Description" + ], + "metadata": { + "id": "hOeAjWK7tc2S" + } + }, + { + "cell_type": "markdown", + "source": [ + "As described in the accompanying document, you were recently hired as part of an independent, non-partisan commission that is analyzing the emotional stability of billionaries. The goal of the commission is to asssess their suitability for positions in government office. Many sources of data are being considered, and you are the head of a sub-committee that was tasked with investigating the tweets of Elon Musk.\n", + "\n", + "**You are strongly encouraged to use generative AI for this project, with no constraints.**" + ], + "metadata": { + "id": "iDo5A2VItfwM" + } + }, + { + "cell_type": "markdown", + "source": [ + "# Starter Code\n", + "\n", + "The following code may prove useful for your goals." + ], + "metadata": { + "id": "a1CraMUTZmUg" + } + }, + { + "cell_type": "markdown", + "source": [ + "## Download the tweets:" + ], + "metadata": { + "id": "bCCNO3UEzjU7" + } + }, + { + "cell_type": "code", + "source": [ + "import pandas as pd\n", + "\n", + "# url address for Musk's tweets\n", + "url = 'https://raw.githubusercontent.com/MainakRepositor/Datasets/refs/heads/master/Elon%20Tweets/2018.csv'\n", + "\n", + "# load into a df\n", + "df = pd.read_csv(url, index_col=0)\n", + "\n", + "# tweet contents as a dictionary\n", + "elon_tweets = df['tweet'].to_dict()\n", + "\n", + "# features to keep\n", + "feature_keep_list = [\n", + " 'id',\n", + " 'conversation_id',\n", + " 'created_at',\n", + " 'date',\n", + " 'tweet',\n", + " 'day',\n", + " 'hour',\n", + " 'retweet',\n", + " 'nlikes',\n", + " 'nreplies',\n", + " 'nretweets'\n", + " ]\n", + "\n", + "cols_to_keep = [df.columns.get_loc(col) for col in feature_keep_list]\n", + "df = df.iloc[:, cols_to_keep]" + ], + "metadata": { + "id": "85DJQBVGzlyq" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "df.shape" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "AJ6gUCv7Z23i", + "outputId": "c4122802-e133-49b3-e4f6-f54de691047d" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "(2285, 11)" + ] + }, + "metadata": {}, + "execution_count": 4 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## A bit of cleanup to make for easier analysis:" + ], + "metadata": { + "id": "Rcg_uU4ebjOx" + } + }, + { + "cell_type": "code", + "source": [ + "# Function that cleans text\n", + "def clean_text(unformatted_string):\n", + " cleaned_words = []\n", + " words = unformatted_string.split()\n", + " for word in words:\n", + " if not word.startswith('@') and not word.startswith('#') and not word.startswith('http'):\n", + " cleaned_words.append(word)\n", + " formatted_string = ' '.join(cleaned_words).lower().rstrip('?!.')\n", + " return formatted_string\n", + "\n", + "# How to create a column of cleaned tweets\n", + "df['cleaned_tweets'] = df['tweet'].apply(clean_text)\n", + "\n", + "# Extracting the month from a date-string\n", + "def extract_month(date):\n", + " month = date.split()[0].split('-')[1]\n", + " return month\n", + "\n", + "# How to create a column with the month\n", + "df['month'] = df['date'].apply(extract_month)" + ], + "metadata": { + "id": "TEQQFIJoaWqH" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "df.head()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 434 + }, + "id": "hFh1rH6ZbLr-", + "outputId": "f824937b-451b-4845-a3a4-8940151bf40f" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + " id conversation_id created_at \\\n", + "0 1079469237230493696 1079155749077475328 1.546200e+12 \n", + "1 1079459047252709377 1079457030060924928 1.546198e+12 \n", + "2 1078716366591483904 1078716366591483904 1.546021e+12 \n", + "3 1078529476018008064 1078529330492321793 1.545976e+12 \n", + "4 1078395092090699776 1078383289356902401 1.545944e+12 \n", + "\n", + " date tweet \\\n", + "0 2018-12-30 20:08:16 @Ben757677 @vincent13031925 Thanks Tesla owner... \n", + "1 2018-12-30 19:27:46 @Grimezsz Turns out if you take Dayquil, you e... \n", + "2 2018-12-28 18:16:38 Excited to have Larry Ellison & Kathleen W... \n", + "3 2018-12-28 05:53:59 @NutmegTheRed @Tesla Ok \n", + "4 2018-12-27 21:00:00 @westcoastbill Tesla team did a great job! \n", + "\n", + " day hour retweet nlikes nreplies nretweets \\\n", + "0 7 20 False 2789 99 132 \n", + "1 7 19 False 14452 303 940 \n", + "2 5 18 False 36045 1013 2158 \n", + "3 5 5 False 535 40 17 \n", + "4 4 21 False 3750 100 141 \n", + "\n", + " cleaned_tweets month \n", + "0 thanks tesla owners in china! looking forward ... 12 \n", + "1 turns out if you take dayquil, you exit the ma... 12 \n", + "2 excited to have larry ellison & kathleen w... 12 \n", + "3 ok 12 \n", + "4 tesla team did a great job 12 " + ], + "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", + "
idconversation_idcreated_atdatetweetdayhourretweetnlikesnrepliesnretweetscleaned_tweetsmonth
0107946923723049369610791557490774753281.546200e+122018-12-30 20:08:16@Ben757677 @vincent13031925 Thanks Tesla owner...720False278999132thanks tesla owners in china! looking forward ...12
1107945904725270937710794570300609249281.546198e+122018-12-30 19:27:46@Grimezsz Turns out if you take Dayquil, you e...719False14452303940turns out if you take dayquil, you exit the ma...12
2107871636659148390410787163665914839041.546021e+122018-12-28 18:16:38Excited to have Larry Ellison &amp; Kathleen W...518False3604510132158excited to have larry ellison &amp; kathleen w...12
3107852947601800806410785293304923217931.545976e+122018-12-28 05:53:59@NutmegTheRed @Tesla Ok55False5354017ok12
4107839509209069977610783832893569024011.545944e+122018-12-27 21:00:00@westcoastbill Tesla team did a great job!421False3750100141tesla team did a great job12
\n", + "
\n", + "
\n", + "\n", + "
\n", + " \n", + "\n", + " \n", + "\n", + " \n", + "
\n", + "\n", + "\n", + "
\n", + " \n", + "\n", + "\n", + "\n", + " \n", + "
\n", + "\n", + "
\n", + "
\n" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "dataframe", + "variable_name": "df", + "summary": "{\n \"name\": \"df\",\n \"rows\": 2285,\n \"fields\": [\n {\n \"column\": \"id\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 32534198703731928,\n \"min\": 948428274467618816,\n \"max\": 1079469237230493696,\n \"num_unique_values\": 2285,\n \"samples\": [\n 975228272366759939,\n 1039404142559551488,\n 1067303432313200642\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"conversation_id\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 69362572227781552,\n \"min\": 1659576083,\n \"max\": 1079457030060924928,\n \"num_unique_values\": 1011,\n \"samples\": [\n 1007665949044928517,\n 1007010099255111680,\n 1001954184273498112\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"created_at\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 7756757430.990703,\n \"min\": 1514957896000.0,\n \"max\": 1546200496000.0,\n \"num_unique_values\": 2282,\n \"samples\": [\n 1529898027000.0,\n 1527384280000.0,\n 1537294081000.0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"date\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 2282,\n \"samples\": [\n \"2018-06-25 03:40:27\",\n \"2018-05-27 01:24:40\",\n \"2018-09-18 18:08:01\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tweet\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 2285,\n \"samples\": [\n \"@IraEhrenpreis @Tesla Thanks for your support over all those years!\",\n \"@DMC_Ryan @EdoubleZero Love that red. We tried every possible way to make red look 3D without floating a special red tint in primary gloss layer, but no way. We have to stop whole paint shop for red & it looks like an episode of Dexter.\",\n \"@jonkudelka Touch\\u00e9\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"day\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1,\n \"min\": 1,\n \"max\": 7,\n \"num_unique_values\": 7,\n \"samples\": [\n 7,\n 5,\n 1\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"hour\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 7,\n \"min\": 0,\n \"max\": 23,\n \"num_unique_values\": 24,\n \"samples\": [\n 3,\n 22,\n 20\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"retweet\",\n \"properties\": {\n \"dtype\": \"boolean\",\n \"num_unique_values\": 1,\n \"samples\": [\n false\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"nlikes\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 43718,\n \"min\": 244,\n \"max\": 1191893,\n \"num_unique_values\": 1924,\n \"samples\": [\n 727\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"nreplies\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 1571,\n \"min\": 4,\n \"max\": 43488,\n \"num_unique_values\": 836,\n \"samples\": [\n 413\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"nretweets\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 10432,\n \"min\": 4,\n \"max\": 357185,\n \"num_unique_values\": 1058,\n \"samples\": [\n 6151\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"cleaned_tweets\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 2082,\n \"samples\": [\n \"in early 90s, i wrote a multitasker for pcs that spoofed the cpu & cd-rom to act in parallel, so could read video continuously while player sprite moved smoothly. required c++, assembly & direct flipping of cpu registers. that company\\u2019s name was rocket science. fate loves irony\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"month\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 12,\n \"samples\": [\n \"02\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}" + } + }, + "metadata": {}, + "execution_count": 6 + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Useful graphing modules:" + ], + "metadata": { + "id": "mT3RtHyncG97" + } + }, + { + "cell_type": "code", + "source": [ + "import matplotlib.pyplot as pyplot\n", + "import seaborn as sns" + ], + "metadata": { + "id": "I2JWCrSJb_eG" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# Example -- when were the most tweets?\n", + "sns.countplot(data=df, x='month')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 470 + }, + "id": "OFGEjfHCcMEW", + "outputId": "62b55828-63a8-40d8-9217-cdf7d57ebbac" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 8 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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Dh28Y+Hh4YqOjlZoaGijhwQAAGioyyo7nTt3liTV1dU1SRgAAIDG1qAblCVp3759WrduncrLy88pP48//vgVBwMAAGgMDSo7r7zyisaNG6f27dvL5XLJZrN5x2w2G2UHAAAEjQaVnaeeekpPP/20srOzGzsPAABAo2rQhwp+++23uueeexo7CwAAQKNrUNm555579OGHHzZ2FgAAgEbXoLexunXrpscee0ybNm1SYmKiwsLCfMZ/+9vfNko4AACAK9WgsvPyyy+rTZs2KigoUEFBgc+YzWaj7AAAgKDRoLJz4MCBxs4BAADQJBp0z05jyc3N1c0336y2bdsqOjpad911l/bu3esz58SJE8rMzFS7du3Upk0bpaenq6yszGfOwYMHNXToULVu3VrR0dGaNGmSTp8+7c9TAQAAQapBV3Z+9atfXXD81VdfvaTjFBQUKDMzUzfffLNOnz6tRx99VKmpqdq1a5ciIiIkSRMnTtT777+vJUuWyOl0avz48Ro+fLg2btwo6d9fQDp06FC5XC598sknKi0tVUZGhsLCwvTMM8805PQAAIBBGlR2vv32W5/1U6dO6fPPP1dFRUW9XxB6PitWrPBZX7BggaKjo1VUVKR+/fqpsrJS8+bNU35+vve48+fPV48ePbRp0yb17dtXH374oXbt2qXVq1crJiZGvXv31pNPPqns7GxNnTpV4eHhDTlFAABgiAaVnaVLl56zra6uTuPGjdPVV1/d4DCVlZWSpKioKElSUVGRTp06pZSUFO+c7t27q1OnTiosLFTfvn1VWFioxMRExcTEeOekpaVp3Lhx2rlzp/r06XPO69TU1Kimpsa7XlVV1eDMAAAguDXaPTshISHKysrSzJkzG7R/XV2dHn74Yd1222264YYbJEkej0fh4eGKjIz0mRsTEyOPx+Odc3bROTN+Zqw+ubm5cjqd3iU+Pr5BmQEAQPBr1BuUS0pKGnxjcGZmpj7//HMtXry4MSPVKycnR5WVld7l0KFDTf6aAAAgMBr0NlZWVpbPumVZKi0t1fvvv69Ro0Zd9vHGjx+vZcuWacOGDerYsaN3u8vl0smTJ1VRUeFzdaesrEwul8s7Z8uWLT7HO/O01pk532e322W32y87JwAAaH4aVHaKi4t91kNCQtShQwe98MILF31S62yWZWnChAlaunSp1q9fr65du/qMJyUlKSwsTGvWrFF6erokae/evTp48KDcbrckye126+mnn1Z5ebmio6MlSatWrZLD4VBCQkJDTg8AABikQWVn3bp1jfLimZmZys/P1zvvvKO2bdt677FxOp1q1aqVnE6nRo8eraysLEVFRcnhcGjChAlyu93q27evJCk1NVUJCQkaOXKkpk+fLo/Ho8mTJyszM9P4qzdJkxYGOoKKZmQEOgIAABfUoLJzxtdff+39EMDrrrtOHTp0uKz958yZI0nq37+/z/b58+frl7/8pSRp5syZCgkJUXp6umpqapSWlqbZs2d754aGhmrZsmUaN26c3G63IiIiNGrUKE2bNq3hJwYAAIzRoLJTXV2tCRMmaOHChaqrq5P079KRkZGhl156Sa1bt76k41iWddE5LVu2VF5envLy8s47p3Pnzvrggw8uLTwAAPiP0qCnsbKyslRQUKD33ntPFRUVqqio0DvvvKOCggL9/ve/b+yMAAAADdagKzt///vf9be//c3n7achQ4aoVatWuvfee71vTwEAAARag67sHD9+/JwP8pOk6OhoHT9+/IpDAQAANJYGlR23260pU6boxIkT3m3fffednnjiCe8j4QAAAMGgQW9jzZo1S4MGDVLHjh3Vq1cvSdI//vEP2e12ffjhh40aEAAA4Eo0qOwkJiZq3759WrRokfbs2SNJuv/++zVixAi1atWqUQMCAABciQaVndzcXMXExGjMmDE+21999VV9/fXXys7ObpRwAAAAV6pB9+z85S9/Uffu3c/Zfv3112vu3LlXHAoAAKCxNKjseDwexcbGnrO9Q4cOKi0tveJQAAAAjaVBZSc+Pl4bN248Z/vGjRsVFxd3xaEAAAAaS4Pu2RkzZowefvhhnTp1SgMGDJAkrVmzRo888gifoAwAAIJKg8rOpEmT9M033+g3v/mNTp48Kenf32GVnZ2tnJycRg0IAABwJRpUdmw2m5577jk99thj2r17t1q1aqVrrrlGdru9sfMBAABckQaVnTPatGmjm2++ubGyAAAANLoG3aAMAADQXFB2AACA0Sg7AADAaJQdAABgNMoOAAAwGmUHAAAYjbIDAACMRtkBAABGo+wAAACjUXYAAIDRKDsAAMBolB0AAGA0yg4AADAaZQcAABiNsgMAAIxG2QEAAEaj7AAAAKNRdgAAgNEoOwAAwGiUHQAAYDTKDgAAMFpA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FB4eHnQ5z57/5JNPauzYsf6KeNkZ/YWy4wenTp3SvffeK8uyNGfOnEDHQRPo0KGDlixZovfee09t2rSR0+lURUWFbrzxRr/fw3Exjz32mCoqKrR69Wp9+umnysrK0r333qsdO3YEOto5vvvuO+Xn5/v9noOLOXMf1q9//Ws9+OCD6tOnj2bOnKnrrrtOr776aoDT+Ro7dqzS0tKUmJioESNGaOHChVq6dKlKSkoCHU2S9O6772rt2rWaNWtWoKNc1IgRI1RcXKyCggJde+21uvfee/163+DlqKqq0tChQ5WQkKCpU6cGOk7AGfHdWMHsTNH54osvtHbtWq7qNMCZy9plZWWKjY31bi8rK1Pv3r39kqF9+/YKDQ095+mqsrIyb77U1FSVlJToX//6l1q0aKHIyEi5XC5dddVVfsl4KTlLSkr03//93/r88891/fXXS5J69eqljz76SHl5eZo7d27AM57tb3/7m44fP66MjIwmz3W2i2U88/9hQkKCz3iPHj108ODBoMlZn+TkZEnS/v37dfXVVwc849q1a1VSUnLO2/vp6en60Y9+pPXr1wc84xlOp1NOp1PXXHON+vbtqx/84AdaunSp7r///ibPeDk5jx49qkGDBqlt27ZaunSpwsLC/JLvcjL6W3D9k9MwZ4rOvn37tHr1arVr1y7QkZqlrl27yuVyac2aNd5tVVVV2rx5s9xut18yhIeHKykpySdDXV2d1qxZc06G9u3bKzIyUmvXrlV5eblfn8C7WM4z92p8/2pTaGio354au5zf5bx583THHXeoQ4cOfsl2qRm7dOmiuLg47d2712e/f/7zn+rcuXPQ5KzPmY+XOPsfDk3pYhn/+Mc/avv27dq2bZt3kaSZM2dq/vz5QZGxPpZlybIs1dTU+CWjdGk5q6qqlJqaqvDwcL377rtq2bKl3/JdasaAaPJboA129OhRq7i42CouLrYkWX/605+s4uJi64svvrBOnjxp3XHHHVbHjh2tbdu2WaWlpd6lpqYmKDJalmV98803VnFxsfX+++9bkqzFixdbxcXFVmlpqd8yXkrOZ5991oqMjLTeeecda/v27dadd95pde3a1fruu+/8lnHx4sWW3W63FixYYO3atcsaO3asFRkZaXk8HsuyLOvVV1+1CgsLrf3791uvv/66FRUVZWVlZfkt36XkPHnypNWtWzfrRz/6kbV582Zr//791vPPP2/ZbDbr/fffD4qMZ+zbt8+y2WzW8uXL/ZbrcjLOnDnTcjgc1pIlS6x9+/ZZkydPtlq2bOn3p3MulHP//v3WtGnTrE8//dQ6cOCA9c4771hXXXWV1a9fv6DJWB8F4GmsC2UsKSmxnnnmGevTTz+1vvjiC2vjxo3WsGHDrKioKKusrCxoclZWVlrJyclWYmKitX//fp+/d06fPh0UGS3LskpLS63i4mLrlVdesSRZGzZssIqLi61vvvmmyTJRdq7Amcfmvr+MGjXK+yh3fcu6deuCIqNlWdb8+fPrHZ8yZYrfMl5Kzrq6Ouuxxx6zYmJiLLvdbg0cONDau3evXzNalmW99NJLVqdOnazw8HDrlltusTZt2uQdy87OtmJiYqywsDDrmmuusV544QWrrq7O7xkvlvOf//ynNXz4cCs6Otpq3bq11bNnz3MeRQ90RsuyrJycHCs+Pt6qra31e7YzLpYxNzfX6tixo9W6dWvL7XZbH330UVDlPHjwoNWvXz8rKirKstvtVrdu3axJkyb5fERCoDPWJxBlx7LOn/Grr76yBg8ebEVHR1thYWFWx44drQceeMDas2eP3zNeKOf5/hyVZB04cCAoMlqWZU2ZMqXejPPnz2+yPDbLsqymuWYEAAAQeNyzAwAAjEbZAQAARqPsAAAAo1F2AACA0Sg7AADAaJQdAABgNMoOAAAwGmUHAOoxdepUv333GoCmRdkB8B/PZrPp7bffDnQMAE2EsgMAAIxG2QEQNPr3768JEybo4Ycf1g9+8APFxMTolVdeUXV1tR588EG1bdtW3bp10/Lly737FBQU6JZbbpHdbldsbKz++Mc/6vTp0z7H/O1vf6tHHnlEUVFRcrlcmjp1qne8S5cukqSf/exnstls3vUzXn/9dXXp0kVOp1P33Xefjh492pS/AgBNgLIDIKi89tprat++vbZs2aIJEyZo3Lhxuueee3Trrbfqs88+U2pqqkaOHKnjx4/rq6++0pAhQ3TzzTfrH//4h+bMmaN58+bpqaeeOueYERER2rx5s6ZPn65p06Zp1apVkqStW7dKkubPn6/S0lLvuiSVlJTo7bff1rJly7Rs2TIVFBTo2Wef9d8vA0Cj4ItAAQSN/v37q7a2Vh999JEkqba2Vk6nU8OHD9fChQslSR6PR7GxsSosLNR7772nv//979q9e7dsNpskafbs2crOzlZlZaVCQkLOOaYk3XLLLRowYIC3uNhsNi1dulR33XWXd87UqVM1Y8YMeTwetW3bVpL0yCOPaMOGDdq0aZM/fh0AGglXdgAElZ49e3p/Dg0NVbt27ZSYmOjdFhMTI0kqLy/X7t275Xa7vUVHkm677TYdO3ZMX375Zb3HlKTY2FiVl5dfNEuXLl28Redy9gMQXCg7AIJKWFiYz7rNZvPZdqbY1NXVXdExL2X/hu4HILhQdgA0Wz169FBhYaHOfjd+48aNatu2rTp27HjJxwkLC1NtbW1TRAQQBCg7AJqt3/zmNzp06JAmTJigPXv26J133tGUKVOUlZWlkJBL/+OtS5cuWrNmjTwej7799tsmTAwgECg7AJqtH/7wh/rggw+0ZcsW9erVSw899JBGjx6tyZMnX9ZxXnjhBa1atUrx8fHq06dPE6UFECg8jQUAAIzGlR0AAGA0yg4AADAaZQcAABiNsgMAAIxG2QEAAEaj7AAAAKNRdgAAgNEoOwAAwGiUHQAAYDTKDgAAMBplBwAAGI2yAwAAjPb/AE44FG3/SkDnAAAAAElFTkSuQmCC\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Example -- what is the distribution of likes? (note log scale)\n", + "sns.histplot(data=df, x='nlikes', log_scale=True)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 472 + }, + "id": "M4JUhkhpcpza", + "outputId": "b490e848-67ac-47cd-ff4c-9454fd9ae4ef" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 9 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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6RcAgM5G2Omiamtrdf78OWX8YpGs8QO81m/VvjLt/+B3am5u9lqfAAD4E2Gni7PGD1B00mCv9eesOu61vgAACARMUAYAAEYj7AAAAKMRdgAAgNEIOwAAwGiEHQAAYDTCDgAAMBphBwAAGI2wAwAAjEbYAQAARiPsAAAAoxF2AACA0Qg7AADAaIQdAABgNMIOAAAwGmEHAAAYjbADAACM5tewU1RUpJEjR6pPnz6KjY3Vvffeq8OHD3u0uXDhgvLz89W3b19FREQoNzdX1dXVHm0qKys1adIkhYeHKzY2VvPmzVNzc3NnngoAAAhQfg0727ZtU35+vnbu3KlNmzapqalJWVlZamhocLeZO3euPvzwQ73zzjvatm2bTp48qcmTJ7v3t7S0aNKkSbp48aJ27NihNWvWaPXq1Vq4cKE/TgkAAASYHv788A0bNnisr169WrGxsSovL9cdd9yh+vp6vf766yopKdG4ceMkSatWrdKQIUO0c+dOjR49Wp988okOHjyozZs3Ky4uTunp6Xrqqac0f/58LV68WKGhof44NQAAECACas5OfX29JCk6OlqSVF5erqamJmVmZrrbpKSkKCkpSWVlZZKksrIyDRs2THFxce422dnZcjqdOnDgwGU/p7GxUU6n02MBAABmCpiw09raqscee0y33Xabhg4dKklyOBwKDQ1VVFSUR9u4uDg5HA53m/8bdC7tv7TvcoqKihQZGeleEhMTvXw2AAAgUARM2MnPz9f+/fv15ptv+vyzCgsLVV9f715OnDjh888EAAD+0a6wc/311+vUqVM/2F5XV6frr7/+mvubPXu21q9fr08//VT9+/d3b7fZbLp48aLq6uo82ldXV8tms7nbfP/urEvrl9p8X1hYmKxWq8cCAADM1K6wc/z4cbW0tPxge2Njo7755ps29+NyuTR79mytW7dOW7Zs0cCBAz32jxgxQiEhISotLXVvO3z4sCorK2W32yVJdrtd+/btU01NjbvNpk2bZLValZqaeq2nBgAADHNNd2N98MEH7p83btyoyMhI93pLS4tKS0s1YMCANveXn5+vkpISvf/+++rTp497jk1kZKR69eqlyMhITZ8+XQUFBYqOjpbVatWcOXNkt9s1evRoSVJWVpZSU1M1depULVu2TA6HQwsWLFB+fr7CwsKu5fQAAICBrins3HvvvZIki8WivLw8j30hISEaMGCAfvOb37S5vxUrVkiSxowZ47F91apVmjZtmiTpxRdfVFBQkHJzc9XY2Kjs7Gy99tpr7rbBwcFav369Zs2aJbvdrt69eysvL09Lly69llMDAACGuqaw09raKkkaOHCgvvjiC8XExHTow10u14+26dmzp4qLi1VcXHzFNsnJyfroo486VAsAADBTux4qeOzYMW/XAQAA4BPtfoJyaWmpSktLVVNT477ic8kbb7zR4cIAAAC8oV1hZ8mSJVq6dKluvfVWxcfHy2KxeLsuAAAAr2hX2Fm5cqVWr16tqVOnerseAAAAr2rXc3YuXryov//7v/d2LQAAAF7XrrDzy1/+UiUlJd6uBQAAwOva9TXWhQsX9Lvf/U6bN29WWlqaQkJCPPa/8MILXikOAACgo9oVdvbu3av09HRJ0v79+z32MVkZAAAEknaFnU8//dTbdQAAAPhEu5+zAwSaiooKn/QbExOjpKQkn/QNAPC9doWdsWPHXvXrqi1btrS7IOBana8/JcmiKVOm+KT/Xr3CdehQBYEHALqodoWdS/N1LmlqatKePXu0f//+H7wgFPC1pnNnJLmU/sB89RuY4tW+nVXHteuNJaqtrSXsAEAX1a6w8+KLL152++LFi3X27NkOFQS0V0RskqKTBvu7DABAgGnXc3auZMqUKbwXCwAABBSvhp2ysjL17NnTm10CAAB0SLu+xpo8ebLHusvlUlVVlXbv3q0nn3zSK4UBAAB4Q7vCTmRkpMd6UFCQBg8erKVLlyorK8srhQEAAHhDu8LOqlWrvF0HAACAT3TooYLl5eXuB7ndfPPNuuWWW7xSFAAAgLe0K+zU1NTo/vvv19atWxUVFSVJqqur09ixY/Xmm2+qX79+3qwRAACg3dp1N9acOXN05swZHThwQKdPn9bp06e1f/9+OZ1OPfroo96uEQAAoN3adWVnw4YN2rx5s4YMGeLelpqaquLiYiYoAwCAgNKuKzutra0KCQn5wfaQkBC1trZ2uCgAAABvaVfYGTdunP7lX/5FJ0+edG/75ptvNHfuXI0fP95rxQEAAHRUu8LOq6++KqfTqQEDBuiGG27QDTfcoIEDB8rpdOqVV17xdo0AAADt1q45O4mJifryyy+1efNmHTp0SJI0ZMgQZWZmerU4AACAjrqmKztbtmxRamqqnE6nLBaLJkyYoDlz5mjOnDkaOXKkbr75Zv3pT3/yVa0AAADX7JrCzvLlyzVjxgxZrdYf7IuMjNQ///M/64UXXvBacQAAAB11TWHnq6++0sSJE6+4PysrS+Xl5R0uCgAAwFuuKexUV1df9pbzS3r06KFvv/22w0UBAAB4yzWFnb/7u7/T/v37r7h/7969io+P73BRAAAA3nJNYefOO+/Uk08+qQsXLvxg3/nz57Vo0SLdddddXisOAACgo67p1vMFCxbo3Xff1U033aTZs2dr8ODBkqRDhw6puLhYLS0t+vd//3efFAoAANAe1xR24uLitGPHDs2aNUuFhYVyuVySJIvFouzsbBUXFysuLs4nhQIAALTHNT9UMDk5WR999JG+++47HTlyRC6XS4MGDdJ1113ni/oAAAA6pF1PUJak6667TiNHjvRmLQAAAF7XrndjAQAAdBWEHQAAYDTCDgAAMBphBwAAGK3dE5SB7qSiosLrfcbExCgpKcnr/QIAPPk17Gzfvl3PPfecysvLVVVVpXXr1unee+917582bZrWrFnjcUx2drY2bNjgXj99+rTmzJmjDz/8UEFBQcrNzdVLL72kiIiIzjoNGOx8/SlJFk2ZMsXrfffqFa5DhyoIPP9fZWWlamtrfdI3wRLo3vwadhoaGjR8+HD94he/0OTJky/bZuLEiVq1apV7PSwszGP/gw8+qKqqKm3atElNTU16+OGHNXPmTJWUlPi0dnQPTefOSHIp/YH56jcwxWv9OquOa9cbS1RbW8sfYf0t6KSkDNH58+d80j/BEuje/Bp2cnJylJOTc9U2YWFhstlsl91XUVGhDRs26IsvvtCtt94qSXrllVd055136vnnn1dCQoLXa0b3FBGbpOikwf4uw1i1tbU6f/6cMn6xSNb4AV7tm2AJIODn7GzdulWxsbG67rrrNG7cOD399NPq27evJKmsrExRUVHuoCNJmZmZCgoK0q5du/Szn/3ssn02NjaqsbHRve50On17EgDaxBo/gFAJwOsC+m6siRMn6g9/+INKS0v1H//xH9q2bZtycnLU0tIiSXI4HIqNjfU4pkePHoqOjpbD4bhiv0VFRYqMjHQviYmJPj0PAADgPwF9Zef+++93/zxs2DClpaXphhtu0NatWzV+/Ph291tYWKiCggL3utPpJPAAAGCogL6y833XX3+9YmJidOTIEUmSzWZTTU2N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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Example -- Is there a relationship between the hour of the tweet and the number of likes it got?\n", + "sns.scatterplot(data=df, x='hour', y='nlikes')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 483 + }, + "id": "vbpm3mFbdAnJ", + "outputId": "6bdb1031-489f-4006-b7cf-e63797d6da2a" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "" + ] + }, + "metadata": {}, + "execution_count": 10 + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "## Extracting tweet sentiments\n", + "\n", + "Below is a demonstration of how to extract 'sentiment' and 'subjectivity' data from a sentence. Note that this could be applied to an entire column of data. This uses the library TextBlob, which you can find out a bit more about [here](https://textblob.readthedocs.io/en/dev/). The 'polarity' score that's returned is a float from -1.0 (extremely negative sentiment) to 1.0 (extremely positive sentiment)\n", + "\n" + ], + "metadata": { + "id": "XrsfzXVW3Qhg" + } + }, + { + "cell_type": "code", + "source": [ + "from textblob import TextBlob" + ], + "metadata": { + "id": "EpBRc4DFOdLv" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# grab a sample from the cleaned-up tweets:\n", + "sample_tweet = df['cleaned_tweets'][305]\n", + "sample_tweet\n" + ], + "metadata": { + "id": "1002N4xuOnz9", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 53 + }, + "outputId": "13fd8622-5b36-4c77-c860-d8dd4d9ed395" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'sure hope this isn’t true. it is the non-linearities, such as siberian permafrost melting or ocean currents changing, that are most difficult to predict'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 12 + } + ] + }, + { + "cell_type": "code", + "source": [ + "# basic analysis of sentiment -- note that this is just involves using a method\n", + "blob = TextBlob(sample_tweet)\n", + "analyzed = blob.sentiment\n", + "print(analyzed)" + ], + "metadata": { + "id": "-MbObj72PVsx", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "c6ebbcc4-24f5-4537-b43b-8901aed0684a" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Sentiment(polarity=0.17, subjectivity=0.7077777777777777)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# just for calibration purposes, so you get a sense of what the sentiment scores mean:\n", + "super_positive = 'I am having the most amazing day ever. I am absolutely in love with the universe and it is in love with me!!! Peace and love to all.'\n", + "\n", + "# Polarity score of ~0.6 (strong positive sentiment)\n", + "blob = TextBlob(super_positive)\n", + "analyzed = blob.sentiment\n", + "print(analyzed)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "BxkQU-p8e2CI", + "outputId": "a3378513-ea26-4f9f-b680-7c8af05f9ad6" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Sentiment(polarity=0.6153125, subjectivity=0.64)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# just for calibration purposes, so you get a sense of what the sentiment scores mean:\n", + "super_negative = 'Everything is shit, and the world is fucked.'\n", + "# Note: Apologies for the foul language -- without it it doesn't report negative sentiment!\n", + "\n", + "# Polarity score of -.4 (strong negative sentiment)\n", + "blob = TextBlob(super_negative)\n", + "analyzed = blob.sentiment\n", + "print(analyzed)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4pQzpu47eXHj", + "outputId": "cbe3ba7c-7069-4d95-8188-b86136d0f7f4" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Sentiment(polarity=-0.4, subjectivity=0.75)\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "If you're interested in getting polarity and subjectivity separately, you can unpack the tuple:\n" + ], + "metadata": { + "id": "xp0dNx2iggPo" + } + }, + { + "cell_type": "code", + "source": [ + "# Tuple unpacking:\n", + "polarity, sentiment = blob.sentiment\n", + "print(f'polarity: {polarity}')\n", + "print(f'sentiment: {sentiment}')" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gBjUuy-hgPE-", + "outputId": "dc883e40-8c7e-4f86-bbc5-99e410e013a3" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "polarity: -0.4\n", + "sentiment: 0.75\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "# **YOUR ANALYSIS BELOW**" + ], + "metadata": { + "id": "Zgdxge5jgt6g" + } + }, + { + "cell_type": "markdown", + "source": [ + "Neatness counts! This should be a *readable* narrative that flows, and which explains and contextualizes the analysis. Make use of text/markdown boxes like one. Don't just throw piles of code at this thing with random analyses and hope that I'm going to find my way through it. Tell me a story, and create a path." + ], + "metadata": { + "id": "7q8Y3Uh8g1vV" + } + }, + { + "cell_type": "markdown", + "source": [ + "#Our Project Begins Below\n", + "##By Benjamin Adovasio AND Parker Davis" + ], + "metadata": { + "id": "h-jJVG5iA9QE" + } + }, + { + "cell_type": "markdown", + "source": [ + "These imports should be run first:" + ], + "metadata": { + "id": "PGJbgb3Jtk7q" + } + }, + { + "cell_type": "code", + "source": [ + "import matplotlib.pyplot as plt #For graphing\n", + "from google import genai #For sending the code to gemini (Only needed for the inital classification)\n", + "import json\n", + "import time\n", + "import re\n", + "import pandas as pd\n", + "from google.colab import files #For saving and reuploading the file" + ], + "metadata": { + "id": "-QZpUpvUtabF" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "Our first step is going to be to run the tweets through gemini-2.5-flash and ask it to retun a csv of each tweet and a grade for emotional stability. This step may take a while to run, but only has to be done once as it will save the results as a csv file that can be loaded later." + ], + "metadata": { + "id": "oA42TeNJBgsi" + } + }, + { + "cell_type": "code", + "source": [ + "\n", + "# -----------------------------\n", + "# Initialize Gemini client\n", + "# -----------------------------\n", + "client = genai.Client(api_key=\"AIzaSyAn1jzJwn3TLDu8SaHc58fqDaHhxPNA7bg\")\n", + "\n", + "# -----------------------------\n", + "# Parameters\n", + "# -----------------------------\n", + "batch_size = 250 # safe and fast\n", + "delay = 1 # optional delay between batches to avoid TPM issues\n", + "model_name = \"gemini-2.5-flash\" # supported by all accounts\n", + "\n", + "# -----------------------------\n", + "# Function to process a chunk\n", + "# -----------------------------\n", + "def analyze_chunk(chunk, start_index=0):\n", + " prompt = f\"\"\"\n", + " Read through the following list of Elon Musk's tweets and return a JSON array.\n", + " Each item should include:\n", + " - \"index\" (the absolute row number)\n", + " - \"stability_score\" (a float between 0.00 and 1.00)\n", + "\n", + " Tweets (rows {start_index}-{start_index + len(chunk) - 1}):\n", + " {chunk.to_json(orient=\"records\")}\n", + " \"\"\"\n", + "\n", + " response = client.models.generate_content(\n", + " model=model_name,\n", + " contents=prompt\n", + " )\n", + "\n", + " text = response.text.strip()\n", + "\n", + " # Extract the JSON array from the response (ignores extra text/markdown)\n", + " match = re.search(r\"\\[.*\\]\", text, re.DOTALL)\n", + " if match:\n", + " json_text = match.group(0)\n", + " try:\n", + " data = json.loads(json_text)\n", + " except json.JSONDecodeError:\n", + " print(f\"⚠️ JSON decode error for rows {start_index}-{start_index + len(chunk) - 1}\")\n", + " print(json_text)\n", + " data = []\n", + " else:\n", + " print(f\"⚠️ No JSON found for rows {start_index}-{start_index + len(chunk) - 1}\")\n", + " print(text)\n", + " data = []\n", + "\n", + " return data\n", + "\n", + "# -----------------------------\n", + "# Process all tweets in batches\n", + "# -----------------------------\n", + "results = []\n", + "total_batches = (len(df) + batch_size - 1) // batch_size\n", + "\n", + "for i, start in enumerate(range(0, len(df), batch_size)):\n", + " chunk = df.iloc[start:start+batch_size]\n", + " data = analyze_chunk(chunk, start_index=start)\n", + " results.extend(data)\n", + "\n", + " # Progress tracking\n", + " progress = (start + len(chunk)) / len(df) * 100\n", + " print(f\"Batch {i+1}/{total_batches} processed: rows {start}-{start+len(chunk)-1} \"\n", + " f\"({len(results)} total scores collected, {progress:.1f}% complete)\")\n", + "\n", + " # Optional delay between batches\n", + " time.sleep(delay)\n", + "\n", + "# -----------------------------\n", + "# Combine results into a DataFrame\n", + "# -----------------------------\n", + "scores_df = pd.DataFrame(results)\n", + "\n", + "# Merge with original tweets DataFrame\n", + "final_df = df.join(scores_df.set_index(\"index\"), how=\"left\")\n", + "\n", + "# -----------------------------\n", + "# Save the results so you don't rerun Gemini\n", + "# -----------------------------\n", + "final_df.to_parquet(\"tweets_stability_scores.parquet\", index=False)\n", + "print(\"\\n✅ All batches completed. DataFrame saved as 'tweets_stability_scores.parquet'\")\n", + "print(final_df.head())\n", + "\n" + ], + "metadata": { + "id": "sbfAbai7gqGu", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 400 + }, + "outputId": "59d02e72-217e-4223-b1ae-da1c879eb5fb" + }, + "execution_count": null, + "outputs": [ + { + "metadata": { + "tags": null + }, + "name": "stdout", + "output_type": "stream", + "text": [ + "Batch 1/10 processed: rows 0-249 (250 total scores collected, 10.9% complete)\n", + "Batch 2/10 processed: rows 250-499 (500 total scores collected, 21.9% complete)\n" + ] + }, + { + "output_type": "error", + "ename": "KeyboardInterrupt", + "evalue": "", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipython-input-3266777564.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 57\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstart\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[0mchunk\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0mbatch_size\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 59\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0manalyze_chunk\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mchunk\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstart_index\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstart\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 60\u001b[0m \u001b[0mresults\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mextend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 61\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/tmp/ipython-input-3266777564.py\u001b[0m in \u001b[0;36manalyze_chunk\u001b[0;34m(chunk, start_index)\u001b[0m\n\u001b[1;32m 25\u001b[0m \"\"\"\n\u001b[1;32m 26\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 27\u001b[0;31m response = client.models.generate_content(\n\u001b[0m\u001b[1;32m 28\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmodel_name\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 29\u001b[0m \u001b[0mcontents\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mprompt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/google/genai/models.py\u001b[0m in \u001b[0;36mgenerate_content\u001b[0;34m(self, model, contents, config)\u001b[0m\n\u001b[1;32m 4999\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0mremaining_remote_calls_afc\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5000\u001b[0m \u001b[0mi\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 5001\u001b[0;31m response = self._generate_content(\n\u001b[0m\u001b[1;32m 5002\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcontents\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcontents\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconfig\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mparsed_config\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5003\u001b[0m )\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/google/genai/models.py\u001b[0m in \u001b[0;36m_generate_content\u001b[0;34m(self, model, contents, config)\u001b[0m\n\u001b[1;32m 3811\u001b[0m \u001b[0mrequest_dict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_common\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mencode_unserializable_types\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest_dict\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3812\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3813\u001b[0;31m response = self._api_client.request(\n\u001b[0m\u001b[1;32m 3814\u001b[0m \u001b[0;34m'post'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrequest_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhttp_options\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3815\u001b[0m )\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/google/genai/_api_client.py\u001b[0m in \u001b[0;36mrequest\u001b[0;34m(self, http_method, path, request_dict, http_options)\u001b[0m\n\u001b[1;32m 1305\u001b[0m \u001b[0mhttp_method\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpath\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrequest_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhttp_options\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1306\u001b[0m )\n\u001b[0;32m-> 1307\u001b[0;31m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_request\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhttp_request\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhttp_options\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstream\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1308\u001b[0m response_body = (\n\u001b[1;32m 1309\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresponse_stream\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresponse_stream\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m''\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/google/genai/_api_client.py\u001b[0m in \u001b[0;36m_request\u001b[0;34m(self, http_request, http_options, stream)\u001b[0m\n\u001b[1;32m 1141\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mretry\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_request_once\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhttp_request\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstream\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# type: ignore[no-any-return]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1142\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1143\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_retry\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_request_once\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhttp_request\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstream\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# type: ignore[no-any-return]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1144\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1145\u001b[0m async def _async_request_once(\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/tenacity/__init__.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, fn, *args, **kwargs)\u001b[0m\n\u001b[1;32m 473\u001b[0m \u001b[0mretry_state\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mRetryCallState\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mretry_object\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0margs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 474\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 475\u001b[0;31m \u001b[0mdo\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mretry_state\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mretry_state\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 476\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mDoAttempt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 477\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/tenacity/__init__.py\u001b[0m in \u001b[0;36miter\u001b[0;34m(self, retry_state)\u001b[0m\n\u001b[1;32m 374\u001b[0m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 375\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0maction\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miter_state\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mactions\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 376\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0maction\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mretry_state\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 377\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 378\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/tenacity/__init__.py\u001b[0m in \u001b[0;36m\u001b[0;34m(rs)\u001b[0m\n\u001b[1;32m 396\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_post_retry_check_actions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mretry_state\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;34m\"RetryCallState\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 397\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miter_state\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_explicit_retry\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miter_state\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mretry_run_result\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 398\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_add_action_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mlambda\u001b[0m \u001b[0mrs\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mrs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutcome\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 399\u001b[0m \u001b[0;32mreturn\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 400\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.12/concurrent/futures/_base.py\u001b[0m in \u001b[0;36mresult\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 447\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mCancelledError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 448\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_state\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mFINISHED\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 449\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__get_result\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 450\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 451\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_condition\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwait\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.12/concurrent/futures/_base.py\u001b[0m in \u001b[0;36m__get_result\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 399\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 400\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 401\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 402\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 403\u001b[0m \u001b[0;31m# Break a reference cycle with the exception in self._exception\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/tenacity/__init__.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, fn, *args, **kwargs)\u001b[0m\n\u001b[1;32m 476\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdo\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mDoAttempt\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 477\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 478\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 479\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mBaseException\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0;31m# noqa: B902\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 480\u001b[0m \u001b[0mretry_state\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_exception\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m# type: ignore[arg-type]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/google/genai/_api_client.py\u001b[0m in \u001b[0;36m_request_once\u001b[0;34m(self, http_request, stream)\u001b[0m\n\u001b[1;32m 1111\u001b[0m )\n\u001b[1;32m 1112\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1113\u001b[0;31m response = self._httpx_client.request(\n\u001b[0m\u001b[1;32m 1114\u001b[0m \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mhttp_request\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1115\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mhttp_request\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpx/_client.py\u001b[0m in \u001b[0;36mrequest\u001b[0;34m(self, method, url, content, data, files, json, params, headers, cookies, auth, follow_redirects, timeout, extensions)\u001b[0m\n\u001b[1;32m 823\u001b[0m \u001b[0mextensions\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mextensions\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 824\u001b[0m )\n\u001b[0;32m--> 825\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mauth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mauth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfollow_redirects\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfollow_redirects\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 826\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 827\u001b[0m \u001b[0;34m@\u001b[0m\u001b[0mcontextmanager\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpx/_client.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, request, stream, auth, follow_redirects)\u001b[0m\n\u001b[1;32m 912\u001b[0m \u001b[0mauth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_build_request_auth\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mauth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 913\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 914\u001b[0;31m response = self._send_handling_auth(\n\u001b[0m\u001b[1;32m 915\u001b[0m \u001b[0mrequest\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 916\u001b[0m \u001b[0mauth\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mauth\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpx/_client.py\u001b[0m in \u001b[0;36m_send_handling_auth\u001b[0;34m(self, request, auth, follow_redirects, history)\u001b[0m\n\u001b[1;32m 940\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 941\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 942\u001b[0;31m response = self._send_handling_redirects(\n\u001b[0m\u001b[1;32m 943\u001b[0m \u001b[0mrequest\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 944\u001b[0m \u001b[0mfollow_redirects\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfollow_redirects\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpx/_client.py\u001b[0m in \u001b[0;36m_send_handling_redirects\u001b[0;34m(self, request, follow_redirects, history)\u001b[0m\n\u001b[1;32m 977\u001b[0m \u001b[0mhook\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 978\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 979\u001b[0;31m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_send_single_request\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 980\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 981\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mhook\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_event_hooks\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"response\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpx/_client.py\u001b[0m in \u001b[0;36m_send_single_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 1012\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1013\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mrequest_context\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1014\u001b[0;31m \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtransport\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhandle_request\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1015\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1016\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstream\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mSyncByteStream\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpx/_transports/default.py\u001b[0m in \u001b[0;36mhandle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 248\u001b[0m )\n\u001b[1;32m 249\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mmap_httpcore_exceptions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 250\u001b[0;31m \u001b[0mresp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_pool\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhandle_request\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mreq\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 251\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 252\u001b[0m \u001b[0;32massert\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstream\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtyping\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mIterable\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpcore/_sync/connection_pool.py\u001b[0m in \u001b[0;36mhandle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 254\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 255\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_close_connections\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mclosing\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 256\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mexc\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 257\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 258\u001b[0m \u001b[0;31m# Return the response. Note that in this case we still have to manage\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpcore/_sync/connection_pool.py\u001b[0m in \u001b[0;36mhandle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 234\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 235\u001b[0m \u001b[0;31m# Send the request on the assigned connection.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 236\u001b[0;31m response = connection.handle_request(\n\u001b[0m\u001b[1;32m 237\u001b[0m \u001b[0mpool_request\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 238\u001b[0m )\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpcore/_sync/connection.py\u001b[0m in \u001b[0;36mhandle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 101\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mexc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 102\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 103\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_connection\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhandle_request\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 104\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 105\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_connect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrequest\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mRequest\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mNetworkStream\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpcore/_sync/http11.py\u001b[0m in \u001b[0;36mhandle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 134\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mTrace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"response_closed\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlogger\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrequest\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mtrace\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 135\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_response_closed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 136\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mexc\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 137\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 138\u001b[0m \u001b[0;31m# Sending the request...\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpcore/_sync/http11.py\u001b[0m in \u001b[0;36mhandle_request\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 104\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 105\u001b[0m \u001b[0mtrailing_data\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 106\u001b[0;31m ) = self._receive_response_headers(**kwargs)\n\u001b[0m\u001b[1;32m 107\u001b[0m trace.return_value = (\n\u001b[1;32m 108\u001b[0m \u001b[0mhttp_version\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpcore/_sync/http11.py\u001b[0m in \u001b[0;36m_receive_response_headers\u001b[0;34m(self, request)\u001b[0m\n\u001b[1;32m 175\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 176\u001b[0m \u001b[0;32mwhile\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 177\u001b[0;31m \u001b[0mevent\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_receive_event\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 178\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mevent\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mh11\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mResponse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 179\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpcore/_sync/http11.py\u001b[0m in \u001b[0;36m_receive_event\u001b[0;34m(self, timeout)\u001b[0m\n\u001b[1;32m 215\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 216\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mevent\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mh11\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mNEED_DATA\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 217\u001b[0;31m data = self._network_stream.read(\n\u001b[0m\u001b[1;32m 218\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mREAD_NUM_BYTES\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 219\u001b[0m )\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/httpcore/_backends/sync.py\u001b[0m in \u001b[0;36mread\u001b[0;34m(self, max_bytes, timeout)\u001b[0m\n\u001b[1;32m 126\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mmap_exceptions\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mexc_map\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 127\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_sock\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msettimeout\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtimeout\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 128\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_sock\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmax_bytes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 129\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 130\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mwrite\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbuffer\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mbytes\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mfloat\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.12/ssl.py\u001b[0m in \u001b[0;36mrecv\u001b[0;34m(self, buflen, flags)\u001b[0m\n\u001b[1;32m 1230\u001b[0m \u001b[0;34m\"non-zero flags not allowed in calls to recv() on %s\"\u001b[0m \u001b[0;34m%\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1231\u001b[0m self.__class__)\n\u001b[0;32m-> 1232\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbuflen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1233\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1234\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mbuflen\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflags\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/lib/python3.12/ssl.py\u001b[0m in \u001b[0;36mread\u001b[0;34m(self, len, buffer)\u001b[0m\n\u001b[1;32m 1103\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_sslobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbuffer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1104\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1105\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_sslobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1106\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mSSLError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1107\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mSSL_ERROR_EOF\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msuppress_ragged_eofs\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Now that Gemini has graded each tweet for emotional stability, we need to convert its response to a pandas dataframe. This only needs to be run the first time, because the csv has already been created." + ], + "metadata": { + "id": "-b2hodOHGViO" + } + }, + { + "cell_type": "code", + "source": [ + "scores_df = pd.DataFrame(results)\n", + "print(scores_df)" + ], + "metadata": { + "id": "wIuuaaOFGjgh", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "a53c4925-6cf6-4cf0-fd9e-9fbf2e0a5d8b" + }, + "execution_count": 20, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " index stability_score\n", + "0 0 0.20\n", + "1 1 0.13\n", + "2 2 0.32\n", + "3 3 0.10\n", + "4 4 0.10\n", + ".. ... ...\n", + "495 495 0.30\n", + "496 496 0.70\n", + "497 497 0.55\n", + "498 498 0.55\n", + "499 499 0.50\n", + "\n", + "[500 rows x 2 columns]\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "Now we are going to save it as a file so that it is also backed up on my local machine. This only needs to be run once." + ], + "metadata": { + "id": "Rjsv5qgSLkyj" + } + }, + { + "cell_type": "code", + "source": [ + "\n", + "\n", + "final_df.to_csv(\"tweets_stability_scores.csv\", index=False)\n", + "files.download(\"tweets_stability_scores.csv\")\n" + ], + "metadata": { + "id": "Z27ILu-rLsqw" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "Below is the code to reupload the csv and read the data from it." + ], + "metadata": { + "id": "likB5-Xxs_U9" + } + }, + { + "cell_type": "code", + "source": [ + "uploaded = files.upload()\n", + "\n", + "for filename in uploaded:\n", + " scores_df = pd.read_csv(filename)\n", + " print(f\"Loaded {filename} with {len(scores_df)} rows\")" + ], + "metadata": { + "id": "GDlQswrwtEY2" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "Now we will make a graph to visualize these scores." + ], + "metadata": { + "id": "q_zr4pi2LE6D" + } + }, + { + "cell_type": "code", + "source": [ + "\n", + "plt.figure(figsize=(8, 5))\n", + "plt.hist(scores_df['stability_score'], bins=10, color='skyblue', edgecolor='black')\n", + "plt.title(\"Distribution of Emotional Stability Scores\")\n", + "plt.xlabel(\"Stability Score (0.0 = Unstable, 1.0 = Stable)\")\n", + "plt.ylabel(\"Number of Tweets\")\n", + "plt.grid(axis='y', linestyle='--', alpha=0.7)\n", + "plt.show()" + ], + "metadata": { + "id": "YV5P-KDILIrX", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 487 + }, + "outputId": "5d0f0c2a-9b29-4fe0-83c5-1a7c00e8a93e" + }, + "execution_count": 23, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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//1vtw8Zedpb165ddeONN+q5557T7t271aRJE3333Xf68ssv9fjjj+dYdmENGjRI//znP9WvXz+tX79eNWrU0KeffqpVq1Zp0qRJ+Z4DfTF//vmn23WLswUGBhbZN1GNGjVKc+bMUefOnfXYY4+pfPnymjlzphITE/XZZ5+5jkaX9rq/7bbb9NFHHykkJEQNGjTQ6tWrtWTJknwv05afYcOG6dSpU+revbvq16+v9PR0/fTTT5o3b55q1Kjh9qHJZs2aacmSJXrzzTcVGRmpmjVrqlWrVh73lJ6erptvvln33HOPtm7dqnfffVdt27ZVt27dCjWH8+XVY7YHHnhAd911lyTlGg5zM3HiRK1fv1533nmn6y8tv/76qz788EOVL19ejz/+uCQpODhYb731lgYOHKgWLVrovvvuU7ly5bRhwwadOnVKM2fOVJkyZTRx4kT1799f7dq107333uu6FFiNGjX0xBNPXLSfdu3a6eGHH9aECRMUHx+vW265RWXKlNH27dv1ySef6O2339Zdd92lmTNn6t1331X37t1Vu3ZtnTx5UtOmTVNwcHCRHCUHclVKV2kArmjZlxPKvvn4+JiIiAjTsWNH8/bbb7tdcirbhZcMWrp0qbn99ttNZGSk8fHxMZGRkebee+8127Ztc3vel19+aRo0aGC8vb3dLkPUrl0707Bhw1z7y+tSYHPmzDHPPvusCQ8PN/7+/ubWW281e/bsyfH8N954w1SpUsX4+vqa6667zqxbty7HMvPr7cLLURlz7pJWTzzxhImMjDRlypQxdevWNX//+99dlyfKJskMGTIkR095XaLsQgcPHjT9+/c3YWFhxsfHxzRq1CjXS2YV1aXAzp9n3759TUBAQI7n57Wtcuth586d5q677jKhoaHGz8/PtGzZ0ixYsCDHc0tz3R87dsy1jgMDA01sbKzZsmVLjnEFvRTYt99+ax588EFTv359ExgYaHx8fEydOnXMsGHDzMGDB93Gbtmyxdxwww2uy2Jlv15Be8p+737//fdm0KBBply5ciYwMND07t3bHDlyxO21CnspsLx6zHb27FlTrlw5ExISkuNyXXlZtWqVGTJkiLn66qtNSEiIKVOmjKlevbrp16+f2blzZ47xX331lWnTpo3x9/c3wcHBpmXLlmbOnDluY+bNm2euueYa4+vra8qXL2969+5t9u3b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tyJtDgAAAPCEx+E2MTHR9aUL5/P19VVaWlqRNAUAAAAUhsfhtmbNmoqPj89RX7hwoaKjo4uiJwAAAKBQPP6GshEjRmjIkCE6c+aMjDFau3at5syZowkTJuhf//pXcfQIAAAAFIjH4XbgwIHy9/fX888/r1OnTum+++5TZGSk3n77bfXq1as4egQAAAAKxONwK0m9e/dW7969derUKaWmpio8PLyo+wIAAAA8Vqjr3GZmZmrJkiX66KOP5O/vL0nav3+/UlNTi7Q5AAAAwBMeH7nds2ePOnXqpL179+rs2bPq2LGjgoKCNHHiRJ09e1ZTp04tjj4BAACAi/L4yO3w4cPVvHlzHTt2zHXUVpK6d++upUuXFmlzAAAAgCc8PnK7cuVK/fTTT/Lx8XGr16hRQ3/++WeRNQYAAAB4yuMjt06n0/WVu+fbt2+fgoKCiqQpAAAAoDA8Dre33HKLJk2a5LpvWZZSU1M1ZswYdenSpSh7AwAAADzi8WkJb7zxhmJjY9WgQQOdOXNG9913n7Zv366wsDDNmTOnOHoEAAAACsTjcFu1alVt2LBBc+fO1caNG5WamqoBAwaod+/ebh8wAwAAAEpaob7EwdvbW3369CnqXgAAAIBL4nG4rV69utq3b6927drpxhtvVK1atYqjLwAAAMBjHn+gbPz48fLz89PEiRNVp04dVatWTX369NG0adO0ffv24ugRAAAAKBCPj9z26dPHdUrCgQMH9P3332vBggV69NFH87xMGAAAAFASCnXO7alTp/Tjjz9qxYoVWr58ueLi4nT11Verffv2RdweAAAAUHAeh9s2bdooLi5O0dHRat++vUaNGqUbbrhB5cqVK47+AAAAgALz+JzbLVu2KCAgQPXr11f9+vUVHR1NsAUAAMBlweNwe+TIES1btkytW7fWokWLdN1116lKlSq67777NG3atOLoEQAAACgQj8OtZVlq3LixHnvsMX366af69ttv1bFjR33yySd65JFHiqNHAAAAoEAKHG7HjRunU6dO6ddff9Wbb76pbt26qUKFCoqJidHGjRs1bNgwff7558XZKwAAAJCvAn+gbOzYsXrkkUfUsmVLXXPNNWrXrp0eeugh3XDDDQoJCSnOHgEAAIACKXC4NcZIko4eParg4OBiawgAAAAoLI/OubUsi2ALAACAy5ZH17m96qqrZFlWvmOO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ztSuXbtKuxXADeEWKCE9evRQXFycZs6cqW3btumrr75S+/btdeTIkRJ5/YiICPn6+ub6mI+PjyIiImRZVpG+5tKlS9WzZ0/16NFDa9eu1fr16/XKK68oIyOjSF/nfFlZWXI6nYV67o8//qidO3eqR48erlpiYqJuvfVW3XjjjYqPj9fjjz+ugQMHatGiRXku58SJE7rlllsUFRWl9evX6+9//7tefPFFvf/++4XqC5cmPT1dd999twYPHlzg57z22mt65513NHXqVP38888KCAhQbGyszpw5U2x9lvbPCE+FhYUpNjZW7733Xmm3ArgzAIrdsWPHjCSzYsWKPMdERUUZSa5bVFSUMcaYHTt2mG7dupnw8HATEBBgmjdvbhYvXpzjuePGjTO9evUyZcuWNZGRkeYf//iH2xhJ5osvvjDGGJOYmGgkmbi4OGOMMcuXLzeSzLFjx1z/f/5tzJgxZuzYsaZhw4Y5+m7SpIl5/vnnc53T8OHDTfv27S+6fr766ivTvHlz4+vraypUqGDuuOMO12NHjx41999/vwkNDTX+/v6mU6dOZtu2ba7Hp0+fbkJCQsyXX35poqOjjZeXl0lMTDRnzpwxTz75pImMjDRly5Y1LVu2NMuXL8+3jyFDhpi77rrLrfb000/nmHfPnj1NbGxsnst59913Tbly5czZs2ddtWeeecbUq1fvouuisM7fhheKiooyb731ljHmf9v+s88+M+3btzf+/v6mcePG5qeffnKN3717t7nttttMaGioKVu2rGnQoIH5+uuvXc89/9a3b19jjDHffvutue6660xISIgpX768ufXWW82OHTtcy8x+7pw5c0xMTIzx9fU1DRs2dHtP5DaHlStXmrZt2xo/Pz9TtWpVM2zYMJOamlqodZS9r1yM0+k0ERER5u9//7urdvz4cePr62vmzJlTqNe+mMvtZ4Qxxuzdu9fcfffdJiQkxJQrV85069bNJCYmuj1n5syZpmrVqpc0d6CoceQWKAGBgYEKDAzU/Pnzdfbs2VzH/PLLL5Kk6dOn68CBA677qamp6tKli5YuXaq4uDh16tRJXbt21d69e92e//e//11NmjRRXFycRo0apeHDh2vx4sUe99qmTRtNmjRJwcHBOnDggA4cOKCnnnpKDz74oBISElx9SVJcXJw2btyo/v3757qsiIgI/f7779q0aVOer/f111+re/fu6tKli+Li4rR06VK1bNnS9Xi/fv20bt06ffXVV1q9erWMMerSpYvb0d9Tp05p4sSJ+te//qXff/9d4eHhGjp0qFavXq25c+dq48aNuvvuu9WpU6d8/7S8cuVKNW/e3K22evVqdejQwa0WGxur1atX57mc1atX64YbbpCPj4/bc7Zu3apjx47l+bzs/SSv2yOPPJLncz313HPP6amnnlJ8fLyuuuoq3XvvvcrMzJQkDRkyRGfPntUPP/yg3377TRMnTlRgYKCqVaumzz77TJK0detWHThwQG+//bYkKS0tTSNGjNC6deu0dOlSORwOde/ePcdR9JEjR+rJJ59UXFycYmJi1LVr1zyPTO7cuVOdOnVSjx49tHHjRs2bN08//vijhg4dWmTrITeJiYlKSkpy2+4hISFq1apVvtt9/PjxF92GF75vs11uPyMyMjIUGxuroKAgrVy5UqtWrVJgYKA6deqk9PR017iWLVtq37592r17d57rBShxpZ2ugb+KTz/91JQrV874+fmZNm3amGeffdZs2LDBbYwuOHKSl4YNG5rJkye77kdFRZlOnTq5jenZs6fp3LlzrsvO78itMXkf4ercubMZPHiw6/6wYcPyPTKbmppqunTp4jrK1LNnT/PBBx+YM2fOuMbExMSY3r175/r8bdu2GUlm1apVrlpycrLx9/c3H3/8satXSSY+Pt41Zs+ePcbLy8v8+eefbsu7+eabzbPPPptnvyEhIebDDz90q9WtW9eMHz/erfb1118bSebUqVO5Lqdjx45m0KBBbrXff//dSDKbN2/O8/W3b9+e7+3gwYN5PtfTI7f/+te/cvSWkJBgjDGmUaNG5sUXX/T4dc53+PBhI8n89ttvbq/76quvusZkZGSYqlWrmokTJ+a67AEDBuRYjytXrjQOh8OcPn0639fPTUGP3K5atcpIMvv373er33333eaee+7J83lHjhy56DbMyMjI8/mX08+Ijz76yNSrV884nU7X42fPnjX+/v5m0aJFrlpKSspFjzgDJY0jt0AJ6dGjh/bv36+vvvpKnTp1cn1I6WIfTkpNTdVTTz2l6OhohYaGKjAwUAkJCTmOysTExOS4n5CQUKRzeOihhzRnzhydOXNG6enpmj17th588ME8xwcEBOjrr7/Wjh079PzzzyswMFBPPvmkWrZsqVOnTkmS4uPjdfPNN+f6/ISEBHl7e6tVq1auWoUKFVSvXj23ufn4+Khx48au+7/99puysrJ01VVXuR01+/7777Vz5848+z19+rT8/PwKvD6KWp06dfK9hYeHF9lrnb++KleuLEk6dOiQJOmxxx7Tyy+/rOuuu05jxozRxo0bL7q87du3695771WtWrUUHBysGjVqSFK++6m3t7eaN2+e5366YcMGzZgxw20bxsbGyul0KjEx0aP5loTy5ctfdBt6e3vn+fzL6WfEhg0btGPHDgUFBbnWffny5XXmzBm395C/v78kud7PwOUg73cZgCLn5+enjh07qmPHjnrhhRc0cOBAjRkzRv369cvzOU899ZQWL16s119/XXXq1JG/v7/uuusutz8NlpSuXbvK19dXX3zxhXx8fJSRkaG77rrros+rXbu2ateurYEDB+q5557TVVddpXnz5ql///6ufxwvhb+/v9uH4VJTU+Xl5aX169e7XfVAOvfn37yEhYXlOG0gIiJCBw8edKsdPHhQwcHBefae13OyH8tLfr1JUp8+fTR16tRcHwsODpYkpaSk5LgiwPHjx11XwshWpkwZ1/9nr7vsUwgGDhyo2NhYff311/ruu+80YcIEvfHGG/le9qlr166KiorStGnTFBkZKafTqauvvvqS9tPU1FQ9/PDDeuyxx3I8Vr169UIv92Kyt9HBgwddwT/7ftOmTfN83vjx4zV+/Ph8l7158+Z8e79cfkakpqaqWbNmmjVrVo7HKlas6Pr/o0eP5qgBpY1wC5SiBg0auF3Wp0yZMjmur7pq1Sr169dP3bt3l3TuH53czm9bs2ZNjvvR0dGF6svHxyfX67x6e3urb9++mj59unx8fNSrVy+Pw2mNGjVUtmxZpaWlSTp3BHHp0qW5nrcbHR2tzMxM/fzzz2rTpo0k6ciRI9q6dasaNGiQ52tcc801ysrK0qFDh3T99dcXuLdrrrlGmzdvdqvFxMTom2++castXrw4x1GwC5/z3HPPKSMjwxUiFy9erHr16qlcuXJ5Pi+/a8BK/wuwualbt64cDofWr1+vqKgoV33Xrl1KSUnRVVddle+yL1StWjU98sgjeuSRR/Tss89q2rRpGjZsmOs84vP3j+xtMm3aNNf6/vHHH3Nd7po1a3TDDTdIkjIzM7V+/fo8z6G99tprtXnzZtWpU8ej3i9VzZo1FRERoaVLl7rC7IkTJ/Tzzz/ne8WFRx55RPfcc0++y46MjPSol9L6GXHttddq3rx5Cg8Pz3e/27Rpk8qUKaOGDRsWcEZACSjt8yKAv4Lk5GRz4403mo8++shs2LDB7Nq1y3z88cemUqVK5sEHH3SNq1u3rhk8eLA5cOCAOXr0qDHGmO7du5umTZuauLg4Ex8fb7p27WqCgoLM8OHDXc+LiooywcHBZuLEiWbr1q3mH//4h/Hy8jILFy50jZEH59xmn3O4ZMkSc/jwYZOWluZazrZt24yXl5fx8vIya9asyXfeY8aMMSNHjjTLly83u3btMr/++qvp16+f8ff3N1u2bHG9tsPhMKNHjzabN282GzdudDsv8/bbbzcNGjQwK1euNPHx8aZTp06mTp06Jj093RiT93mUvXv3NjVq1DCfffaZ2bVrl/n555/N+PHjzYIFC/Ls95133jHNmjVzq+3atcuULVvWjBw50iQkJJgpU6bkWLeTJ082N910k+v+8ePHTaVKlcz9999vNm3aZObOnWvKli1r/vnPf+a7vi7VoEGDTI0aNcyXX35pdu3aZb7//nvTunVr07p1a9e5kxdue2P+90n97KtJDB8+3CxcuNDs2rXLrF+/3rRq1cp1rum+ffuMZVlmxowZ5tChQ+bkyZMmKyvLVKhQwfTp08ds377dLF261LRo0SLXfa569erm888/NwkJCWbQoEEmMDDQHD582BiTcz/csGGD8ff3N0OGDDFxcXFm27ZtZv78+WbIkCEerZc9e/aYuLg4M3bsWBMYGGji4uJMXFycOXnypGtMvXr1zOeff+66/+qrr5rQ0FDz5Zdfmo0bN5rbb7/d1KxZs1Dn+hbE5fYzIi0tzdStW9e0b9/e/PDDD2bXrl1m+fLlZtiwYeaPP/5wPWfMmDFu+z5wOSDcAiXgzJkzZtSoUebaa681ISEhpmzZsqZevXrm+eefd/tQ0ldffWXq1KljvL29XZf5SUxMNDfeeKPx9/c31apVM//4xz9Mu3btcvzDNXbsWHP33XebsmXLmoiICPP222+79eBJuDXGmEceecRUqFDBdSmw811//fW5XhbsQsuWLTM9evQw1apVMz4+PqZSpUqmU6dOZuXKlW7jPvvsM9O0aVPj4+NjwsLCzJ133ul6LPtSYCEhIcbf39/ExsbmeimwC6Wnp5vRo0ebGjVqmDJlypjKlSub7t27m40bN+bZ75EjR4yfn58reGdbvny5q79atWqZ6dOnuz0+ZswY1/bKtmHDBtO2bVvj6+trqlSp4hbYi8vp06fNmDFjTP369Y2/v7+pWbOmGTRokCs8GlOwcDt06FBTu3Zt4+vraypWrGjuv/9+k5yc7Bo/btw4ExERYSzLcl0KbPHixSY6Otr4+vqaxo0bmxUrVuS6z82ePdu0bNnS+Pj4mAYNGphly5a5lpvbfrh27VrTsWNHExgYaAICAkzjxo3NK6+84no8t3V/ob59++a4hNn58zXm3Pvj/O3qdDrNCy+8YCpVqmR8fX3NzTffbLZu3Zr/BrgEl9vPCGOMOXDggHnggQdMWFiY8fX1NbVq1TIPPfSQSUlJcY2pV69esV0eDSgsyxhjSuooMYArnzFGdevW1aOPPqoRI0aUdjtFbuTIkTpx4oT++c9/lnYrKIC+ffvKsqwCfWscita3336rJ598Uhs3bsz3g3JASWNvBFBghw8f1ty5c5WUlJTntW2vdM8995zeffddOZ1OORxcUOZyZozRihUr8jy/F8UrLS1N06dPJ9jissORWwAFZlmWwsLC9Pbbb+u+++4r7XYAAMiBX7cAFBi/CwMALnf8zQ0AAAC2QbgFAACAbRBuAQAAYBuEWwAAANgG4RYAAAC2QbgFAACAbRBuAQAAYBuEWwAAANjG/wNfNhh8HCk4PQAAAABJRU5ErkJggg==\n" + }, + "metadata": {} + } + ] + }, + { + "cell_type": "code", + "source": [ + "df['timestamp'] = pd.to_datetime(df['timestamp'])\n", + "df['stability_score'] = scores_df['stability_score']\n", + "\n", + "plt.figure(figsize=(10, 5))\n", + "plt.plot(df.sort_values('timestamp')['timestamp'],\n", + " df.sort_values('timestamp')['stability_score'],\n", + " color='teal', linewidth=2)\n", + "plt.title(\"Emotional Stability Over Time\")\n", + "plt.xlabel(\"Date\")\n", + "plt.ylabel(\"Stability Score\")\n", + "plt.grid(True, linestyle='--', alpha=0.6)\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 561 + }, + "id": "9G9XKLrW6TlB", + "outputId": "14a99978-79c7-439a-91cf-c930e6f0225a" + }, + "execution_count": 24, + "outputs": [ + { + "output_type": "error", + "ename": "KeyError", + "evalue": "'timestamp'", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3804\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3805\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3806\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mindex.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mindex.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mKeyError\u001b[0m: 'timestamp'", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/tmp/ipython-input-2131771154.py\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'timestamp'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_datetime\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'timestamp'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'stability_score'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mscores_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'stability_score'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m10\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m5\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m plt.plot(df.sort_values('timestamp')['timestamp'],\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 4100\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlevels\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4101\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 4102\u001b[0;31m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4103\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_integer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4104\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/usr/local/lib/python3.12/dist-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 3810\u001b[0m ):\n\u001b[1;32m 3811\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0mInvalidIndexError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3812\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3813\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3814\u001b[0m \u001b[0;31m# If we have a listlike key, _check_indexing_error will raise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyError\u001b[0m: 'timestamp'" + ] + } + ] + } + ] +} \ No newline at end of file