{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "d44219ba-b2cf-45c8-98fa-69a43e27f5b0", "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", "
ModelCategoryClassPrecisionRecallF1 ScoreAccuracyBalanced Acc.Support
0GPT-4omain-eventcollision0.8245610.0561190.105087NaNNaN1675
1GPT-4omain-eventnear-collision0.6701030.0074730.014781NaNNaN8698
2GPT-4omain-eventOverall (main-event)0.7473320.0317960.0599340.0153280.03179610373
3GPT-4olocationalley0.3387100.0917030.144330NaNNaN229
4GPT-4olocationhighway0.8145290.8778460.845003NaNNaN1801
\n", "
" ], "text/plain": [ " Model Category Class Precision Recall F1 Score \\\n", "0 GPT-4o main-event collision 0.824561 0.056119 0.105087 \n", "1 GPT-4o main-event near-collision 0.670103 0.007473 0.014781 \n", "2 GPT-4o main-event Overall (main-event) 0.747332 0.031796 0.059934 \n", "3 GPT-4o location alley 0.338710 0.091703 0.144330 \n", "4 GPT-4o location highway 0.814529 0.877846 0.845003 \n", "\n", " Accuracy Balanced Acc. Support \n", "0 NaN NaN 1675 \n", "1 NaN NaN 8698 \n", "2 0.015328 0.031796 10373 \n", "3 NaN NaN 229 \n", "4 NaN NaN 1801 " ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import os\n", "import pandas as pd\n", "from comparison import ModelEvaluator, ModelComparison\n", "\n", "def load_data(directory='results', labels_filename='Labels.csv'):\n", " labels_path = os.path.join(directory, labels_filename)\n", " df_labels = pd.read_csv(labels_path)\n", "\n", " evaluators = []\n", " for filename in os.listdir(directory):\n", " if filename.endswith('.csv') and filename != labels_filename:\n", " model_name = os.path.splitext(filename)[0]\n", " df_model = pd.read_csv(os.path.join(directory, filename))\n", " evaluator = ModelEvaluator(df_labels, df_model, model_name)\n", " evaluators.append(evaluator)\n", "\n", " model_comparison = ModelComparison(evaluators)\n", " return model_comparison\n", "\n", "model_comparison = load_data()\n", "\n", "combined_df = model_comparison.combined_df\n", "\n", "\n", "combined_df.head()" ] }, { "cell_type": "code", "execution_count": 2, "id": "eaa0047b-aa72-4c4e-8089-472432b62123", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelCategoryClassPrecisionRecallF1 ScoreAccuracyBalanced Acc.Support
0GPT-4omain-eventcollision0.8245610.0561190.105087NaNNaN1675
1GPT-4omain-eventnear-collision0.6701030.0074730.014781NaNNaN8698
2GPT-4omain-eventOverall (main-event)0.7473320.0317960.0599340.0153280.03179610373
3GPT-4olocationalley0.3387100.0917030.144330NaNNaN229
4GPT-4olocationhighway0.8145290.8778460.845003NaNNaN1801
5GPT-4olocationmain-road0.9450360.9443430.944689NaNNaN8175
6GPT-4olocationparking-lot0.7014930.8392860.764228NaNNaN168
7GPT-4olocationOverall (location)0.6999420.6882940.6745620.9122720.68829410373
8GPT-4ozonerural0.5116280.0574410.103286NaNNaN383
9GPT-4ozonesuburbs0.4950000.2145950.299395NaNNaN1384
10GPT-4ozoneunknown0.2500000.0021690.004301NaNNaN461
11GPT-4ozoneurban0.8160600.9744630.888255NaNNaN8145
12GPT-4ozoneOverall (zone)0.5181720.3121670.3238090.7960090.31216710373
13GPT-4olight-conditionsdaylight0.9720070.9680890.970044NaNNaN5954
14GPT-4olight-conditionsnight0.9661590.9772670.971681NaNNaN3827
15GPT-4olight-conditionstwilight0.6013990.5810810.591065NaNNaN592
16GPT-4olight-conditionsOverall (light-conditions)0.8465210.8421460.8442630.9493880.84214610373
17GPT-4oweather-conditionsclear-sky0.8580410.9781250.914156NaNNaN7817
18GPT-4oweather-conditionscloudy0.7781200.2764090.407916NaNNaN1827
19GPT-4oweather-conditionsrain0.7982780.8902610.841764NaNNaN729
20GPT-4oweather-conditionsOverall (weather-conditions)0.8114800.7149320.7212790.8483560.71493210373
21GPT-4ovehicles-densityhigh0.8123750.0690530.127287NaNNaN5894
22GPT-4ovehicles-densitylow0.4996610.3156540.386894NaNNaN2338
23GPT-4ovehicles-densitymedium0.2200120.8626810.350607NaNNaN2141
24GPT-4ovehicles-densityOverall (vehicles-density)0.5106830.4157960.2882630.2884410.41579610373
\n", "
" ], "text/plain": [ " Model Category Class Precision \\\n", "0 GPT-4o main-event collision 0.824561 \n", "1 GPT-4o main-event near-collision 0.670103 \n", "2 GPT-4o main-event Overall (main-event) 0.747332 \n", "3 GPT-4o location alley 0.338710 \n", "4 GPT-4o location highway 0.814529 \n", "5 GPT-4o location main-road 0.945036 \n", "6 GPT-4o location parking-lot 0.701493 \n", "7 GPT-4o location Overall (location) 0.699942 \n", "8 GPT-4o zone rural 0.511628 \n", "9 GPT-4o zone suburbs 0.495000 \n", "10 GPT-4o zone unknown 0.250000 \n", "11 GPT-4o zone urban 0.816060 \n", "12 GPT-4o zone Overall (zone) 0.518172 \n", "13 GPT-4o light-conditions daylight 0.972007 \n", "14 GPT-4o light-conditions night 0.966159 \n", "15 GPT-4o light-conditions twilight 0.601399 \n", "16 GPT-4o light-conditions Overall (light-conditions) 0.846521 \n", "17 GPT-4o weather-conditions clear-sky 0.858041 \n", "18 GPT-4o weather-conditions cloudy 0.778120 \n", "19 GPT-4o weather-conditions rain 0.798278 \n", "20 GPT-4o weather-conditions Overall (weather-conditions) 0.811480 \n", "21 GPT-4o vehicles-density high 0.812375 \n", "22 GPT-4o vehicles-density low 0.499661 \n", "23 GPT-4o vehicles-density medium 0.220012 \n", "24 GPT-4o vehicles-density Overall (vehicles-density) 0.510683 \n", "\n", " Recall F1 Score Accuracy Balanced Acc. Support \n", "0 0.056119 0.105087 NaN NaN 1675 \n", "1 0.007473 0.014781 NaN NaN 8698 \n", "2 0.031796 0.059934 0.015328 0.031796 10373 \n", "3 0.091703 0.144330 NaN NaN 229 \n", "4 0.877846 0.845003 NaN NaN 1801 \n", "5 0.944343 0.944689 NaN NaN 8175 \n", "6 0.839286 0.764228 NaN NaN 168 \n", "7 0.688294 0.674562 0.912272 0.688294 10373 \n", "8 0.057441 0.103286 NaN NaN 383 \n", "9 0.214595 0.299395 NaN NaN 1384 \n", "10 0.002169 0.004301 NaN NaN 461 \n", "11 0.974463 0.888255 NaN NaN 8145 \n", "12 0.312167 0.323809 0.796009 0.312167 10373 \n", "13 0.968089 0.970044 NaN NaN 5954 \n", "14 0.977267 0.971681 NaN NaN 3827 \n", "15 0.581081 0.591065 NaN NaN 592 \n", "16 0.842146 0.844263 0.949388 0.842146 10373 \n", "17 0.978125 0.914156 NaN NaN 7817 \n", "18 0.276409 0.407916 NaN NaN 1827 \n", "19 0.890261 0.841764 NaN NaN 729 \n", "20 0.714932 0.721279 0.848356 0.714932 10373 \n", "21 0.069053 0.127287 NaN NaN 5894 \n", "22 0.315654 0.386894 NaN NaN 2338 \n", "23 0.862681 0.350607 NaN NaN 2141 \n", "24 0.415796 0.288263 0.288441 0.415796 10373 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "model_comparison.evaluators[0].metrics_df" ] }, { "cell_type": "code", "execution_count": 3, "id": "a0777e36-cfe4-44ac-85fd-8bf297cc3152", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ModelCategoryClassPrecisionRecallF1 ScoreAccuracyBalanced Acc.Support
0GPT-4omain-eventcollision0.8245610.0561190.105087NaNNaN1675
1GPT-4omain-eventnear-collision0.6701030.0074730.014781NaNNaN8698
2GPT-4omain-eventOverall (main-event)0.7473320.0317960.0599340.0153280.03179610373
3GPT-4olocationalley0.3387100.0917030.144330NaNNaN229
4GPT-4olocationhighway0.8145290.8778460.845003NaNNaN1801
5GPT-4olocationmain-road0.9450360.9443430.944689NaNNaN8175
6GPT-4olocationparking-lot0.7014930.8392860.764228NaNNaN168
7GPT-4olocationOverall (location)0.6999420.6882940.6745620.9122720.68829410373
8GPT-4ozonerural0.5116280.0574410.103286NaNNaN383
9GPT-4ozonesuburbs0.4950000.2145950.299395NaNNaN1384
10GPT-4ozoneunknown0.2500000.0021690.004301NaNNaN461
11GPT-4ozoneurban0.8160600.9744630.888255NaNNaN8145
12GPT-4ozoneOverall (zone)0.5181720.3121670.3238090.7960090.31216710373
13GPT-4olight-conditionsdaylight0.9720070.9680890.970044NaNNaN5954
14GPT-4olight-conditionsnight0.9661590.9772670.971681NaNNaN3827
15GPT-4olight-conditionstwilight0.6013990.5810810.591065NaNNaN592
16GPT-4olight-conditionsOverall (light-conditions)0.8465210.8421460.8442630.9493880.84214610373
17GPT-4oweather-conditionsclear-sky0.8580410.9781250.914156NaNNaN7817
18GPT-4oweather-conditionscloudy0.7781200.2764090.407916NaNNaN1827
19GPT-4oweather-conditionsrain0.7982780.8902610.841764NaNNaN729
20GPT-4oweather-conditionsOverall (weather-conditions)0.8114800.7149320.7212790.8483560.71493210373
21GPT-4ovehicles-densityhigh0.8123750.0690530.127287NaNNaN5894
22GPT-4ovehicles-densitylow0.4996610.3156540.386894NaNNaN2338
23GPT-4ovehicles-densitymedium0.2200120.8626810.350607NaNNaN2141
24GPT-4ovehicles-densityOverall (vehicles-density)0.5106830.4157960.2882630.2884410.41579610373
\n", "
" ], "text/plain": [ " Model Category Class Precision \\\n", "0 GPT-4o main-event collision 0.824561 \n", "1 GPT-4o main-event near-collision 0.670103 \n", "2 GPT-4o main-event Overall (main-event) 0.747332 \n", "3 GPT-4o location alley 0.338710 \n", "4 GPT-4o location highway 0.814529 \n", "5 GPT-4o location main-road 0.945036 \n", "6 GPT-4o location parking-lot 0.701493 \n", "7 GPT-4o location Overall (location) 0.699942 \n", "8 GPT-4o zone rural 0.511628 \n", "9 GPT-4o zone suburbs 0.495000 \n", "10 GPT-4o zone unknown 0.250000 \n", "11 GPT-4o zone urban 0.816060 \n", "12 GPT-4o zone Overall (zone) 0.518172 \n", "13 GPT-4o light-conditions daylight 0.972007 \n", "14 GPT-4o light-conditions night 0.966159 \n", "15 GPT-4o light-conditions twilight 0.601399 \n", "16 GPT-4o light-conditions Overall (light-conditions) 0.846521 \n", "17 GPT-4o weather-conditions clear-sky 0.858041 \n", "18 GPT-4o weather-conditions cloudy 0.778120 \n", "19 GPT-4o weather-conditions rain 0.798278 \n", "20 GPT-4o weather-conditions Overall (weather-conditions) 0.811480 \n", "21 GPT-4o vehicles-density high 0.812375 \n", "22 GPT-4o vehicles-density low 0.499661 \n", "23 GPT-4o vehicles-density medium 0.220012 \n", "24 GPT-4o vehicles-density Overall (vehicles-density) 0.510683 \n", "\n", " Recall F1 Score Accuracy Balanced Acc. Support \n", "0 0.056119 0.105087 NaN NaN 1675 \n", "1 0.007473 0.014781 NaN NaN 8698 \n", "2 0.031796 0.059934 0.015328 0.031796 10373 \n", "3 0.091703 0.144330 NaN NaN 229 \n", "4 0.877846 0.845003 NaN NaN 1801 \n", "5 0.944343 0.944689 NaN NaN 8175 \n", "6 0.839286 0.764228 NaN NaN 168 \n", "7 0.688294 0.674562 0.912272 0.688294 10373 \n", "8 0.057441 0.103286 NaN NaN 383 \n", "9 0.214595 0.299395 NaN NaN 1384 \n", "10 0.002169 0.004301 NaN NaN 461 \n", "11 0.974463 0.888255 NaN NaN 8145 \n", "12 0.312167 0.323809 0.796009 0.312167 10373 \n", "13 0.968089 0.970044 NaN NaN 5954 \n", "14 0.977267 0.971681 NaN NaN 3827 \n", "15 0.581081 0.591065 NaN NaN 592 \n", "16 0.842146 0.844263 0.949388 0.842146 10373 \n", "17 0.978125 0.914156 NaN NaN 7817 \n", "18 0.276409 0.407916 NaN NaN 1827 \n", "19 0.890261 0.841764 NaN NaN 729 \n", "20 0.714932 0.721279 0.848356 0.714932 10373 \n", "21 0.069053 0.127287 NaN NaN 5894 \n", "22 0.315654 0.386894 NaN NaN 2338 \n", "23 0.862681 0.350607 NaN NaN 2141 \n", "24 0.415796 0.288263 0.288441 0.415796 10373 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "combined_df.loc[combined_df['Model']=='GPT-4o']" ] }, { "cell_type": "code", "execution_count": 4, "id": "9b59f972-27c1-439e-a974-cb642a54febd", "metadata": {}, "outputs": [ { "data": { "image/png": "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apRq1Kih06dPa+DAgapRo4Zeeuklx3v/vr/Ubrdr8eLF6tChg0JCQlS/fn0NGDBAR44cccyze/du9ezZU7Vr11aNGjXUunVrvf3226n+HL788ku1bt1aISEh6tKli3788UfHe99//72Cg4O1efPmFMutXbtWwcHBOnjw4B3bXr58uSIiIjRq1KgUQV6SChYsqOeee+6OyyckJOjdd99Vly5dVKtWLVWvXl29evW6bYj86quv1KVLF9WoUUM1a9ZUhw4dtHjxYsf7iYmJCg8P1yOPPKKQkBDVq1dPPXv21O7du++4/rCwMDVv3lySNHXqVAUHBzv9jH799Vf95z//Uc2aNVWjRg3169dPP/30k1Mbq1atUnBwsH744QeNHz9eoaGhatq06R3XuWHDBv3xxx969tlnUwT5ZI0aNbprG8ludzy6X1988YX++OMPjRgx4o7zxMbGasqUKY79pHXr1lq4cGGqrjzZtm2bkpKS1KBBA8e0qKgoVapUSR999JFj2tWrV1WxYkXVq1fPqd3XX39dDRs2dGrz0KFDGjBggGrVqqVq1aqpT58+2r9/v9M8586d0/jx49W6dWtVrVpV9erV0/PPP+/02a1atUrDhw+XJD355JOO/Xvv3r1ObaX2OHe3Y4l08+cWHByshQsXatGiRWrZsqVCQkL0559/3vHzS83x88qVKxozZowaNGigkJAQdezYUatXr3Zq59Z1r1ixwvF3pmvXrjp8+HCK9X7zzTdq3769QkJC1L59+9seMyTne+bDwsI0depUSdLDDz/s+DyTP/Pb3TN/5swZPf/886pbt66qVaumJ554Qtu2bXOa59a/be+9957jpHu/fv106tQpp3n/+usvDRs2TA0bNlRISIiaNGmiESNGKDo62mm+Bg0aaP/+/bp27dodPnkAGY2eeQBZ7vTp05KkfPnySZLee+89vfvuu2rbtq26deumq1evaunSperdu7fWrFnj1Nt37do1DRw4UO3atVPHjh1VoEABValSRStXrtThw4c1adIkSVLNmjUl3bxndfXq1WrdurWeeuopHT58WPPmzdOff/6p2bNnO9V18uRJjRw5Ut27d9cTTzyhgIAAx3vz58+Xl5eXBg0apFOnTmnp0qVyd3eXxWJx9KweOnRIq1atUokSJTR06FDHssuWLVOFChXUokULubu769tvv9WECRNkGIZ69+7tVMOpU6c0fPhwdevWTZ07d9bnn3+uUaNGqXLlyqpQoYIk6fr16+rdu7f+/PNPde3aVQ899JD++ecfbd26VREREfL395fdbtezzz6r/fv364knnlC5cuX0xx9/aPHixfrrr780Z86cVP2sWrVqpddff12bNm1y9LasW7dOgYGBeuihh1LMHxcXpz59+igiIkI9evRQsWLFdPDgQb399tu6dOmSxo4dK39/f40fP17jx49Xq1at1KpVK0nOly4nJSU5gsWrr7561yskxo4dq1WrVqlJkybq1q2bbDab9u3bp0OHDikkJETHjh3T4MGDFRwcrOeff16enp46deqUDhw4kKrP4Mcff9TXX3+tvn37ytPTU8uWLdN//vMfffrppwoKClK9evVUrFgxrV271rEtydauXavSpUurRo0ad2x/69at8vLycoxBkFYxMTH69NNP1b59ez3++OO6fv26PvvsM0eNlSpVknTzhMaLL76o0NBQx8mREydO6MCBA+rXr5+kmydX5s2bp8cff1xVq1ZVTEyMfv75Z/3yyy8pwl+yVq1aKW/evHrzzTfVvn17NWnSRD4+PpKkY8eOqXfv3vLx8dF//vMfubu7a8WKFerbt6+WLl2qatWqObU1YcIE+fv7a8iQIYqNjb3jNn/77beSlCEDXf77eHS/YmJiNH36dD3zzDMqVKjQbecxDEPPPvus9u7dq27duqlSpUrauXOnpk6dqoiICI0ZM+au6zh48KDy5cunEiVKOKb5+vqqQoUK2rdvn2NsgAMHDshisejatWs6fvy44xiyf/9+p5Mg3333nQYOHKgqVapo6NChslgsWrVqlfr166dPPvlEVatWlXTz1oGDBw+qXbt2Klq0qM6dO6dly5bpySef1FdffSVvb2/VqVNHffv2TXF7wq0nqlJznEvNseRWq1at0o0bN/TEE0/I09NTfn5+t/3sUnP8jI+PV9++fXX69Gn17t1bJUuW1IYNGzRq1ChFRUU59pdk69at0/Xr19W9e3dZLBYtWLBAw4YN0zfffOO4mmjXrl0aNmyYypcvr5EjR+qff/7R6NGjVbRo0bv+rFu1aqW//vpL69at0+jRox3jwfj7+992/suXL6tHjx6Ki4tT3759lT9/fq1evVrPPvus4+Turd5//31ZLBY9/fTTiomJ0YIFC/TSSy/p008/lXTzZOGAAQOUkJCgPn36qGDBgoqIiNC2bdsUFRWlvHnzOtqqXLmyDMPQwYMHHSf4AGQyAwAyyeeff24EBQUZe/bsMa5cuWL8/fffxldffWXUrVvXqFq1qnHhwgXj7NmzRqVKlYz33nvPadmjR48aDz30kNP0Pn36GEFBQcayZctSrOvVV181qlev7jTtt99+M4KCgoyxY8c6TZ8yZYoRFBRkfPfdd45pzZs3N4KCgowdO3Y4zfv9998bQUFBRvv27Y2EhATH9BdffNEIDg42/vOf/zjN3717d6N58+ZO0+Li4lLU+/TTTxsPP/yw07TkGn788UfHtCtXrhhVqlQxpkyZ4pj27rvvGkFBQcamTZtStGu32w3DMIw1a9YYFStWdGrLMAxj2bJlRlBQkLF///4Uy97q1s9z2LBhRr9+/QzDMAybzWY0bNjQCAsLM86cOWMEBQUZCxYscCw3e/Zso3r16sbJkyed2ps+fbpRqVIl4/z5847tCgoKMmbNmnXbdQcFBRnTp0+/7Xu3fr7fffedERQUZEycOPGOn8WHH35oBAUFGVeuXLnrNt9OUFCQERQUZBw5csQx7dy5c0ZISIgxZMgQx7QZM2YYVapUMaKiohzTrly5Yjz00EO33cZb1alTx+jYsWOqa+rTp4/Rp08fx+ukpCTjxo0bTvNERkYaDRo0MEaPHu2YNmnSJKNmzZpGUlLSHdvu2LGjMWjQoFTXkux2vwuGYRjPPfecUblyZeP06dOOaREREUaNGjWM3r17O6YlHyt69ux51/qSPfbYY0bt2rVTTL9+/bpx5coVx7/o6GjHe8n78meffWZcuXLFiIiIMLZt22Y0b97cCA4ONg4fPpyivfXr1xtBQUHG999/n6rPwTBuHl9atGjh+Jk0b948xWe6efNmIygoyJgzZ47T9GHDhhnBwcHGqVOn7rqOnj17Gp07d04xfcKECUaDBg0cr998802jd+/eRmhoqPHJJ58YhmEY//zzjxEcHGwsXrzYMIyb+8kjjzxiPP300459xjBuHrdatGhhPPXUU07T/u3gwYNGUFCQsXr1ase0u31uqT3OpfZYkvy7V7NmzVTt46k5fi5atMgICgoyvvjiC8d7CQkJRvfu3Y3q1as7fq+S1123bl3j2rVrjnm/+eYbIygoyNi6datjWqdOnYyGDRs6HSN27dplBAUFpfib8e9j44IFC4ygoCDjzJkzKWpu3ry58eqrrzpeT548OcXnGxMTY7Ro0cJo3ry5YbPZDMP4v/2hbdu2TsePxYsXG0FBQcbRo0cNwzCMX3/91QgKCjLWr19/28/zVhEREUZQUJAxf/78e84LIGNwmT2ATNe/f3/HZbMjRoyQj4+PwsPDVaRIEW3evFl2u11t27bV1atXHf8KFiyoMmXKpLg009PTU126dEnVerdv3y5Jeuqpp5ymP/30007vJytZsqQaN25827Y6derkdL921apVZRiGunbt6jRf1apV9ffffyspKckx7dZe5ejoaF29elV169bVmTNnUlymWL58edWuXdvx2t/fXwEBATpz5oxj2qZNm1SxYsUUPSySHAMhbdiwQeXKlVNgYKDT55p8SfG/P9e76dChg3744QddunRJ33//vS5duqQOHTrcdt4NGzaoVq1a8vX1dVpvgwYNZLPZnC5Pv5eePXvec55NmzbJYrE4XQmRLPmzSL6yY8uWLU6X56ZWjRo1nEZmL168uB5++GGne7I7deqkhIQEbdiwwTHf119/raSkJHXs2PGu7cfExDh6stPDzc3Ncd+s3W7XtWvXlJSUpCpVqujXX391zOfr66u4uLi7XjLv6+urY8eO6a+//kp3PclsNpt2796tli1bqlSpUo7phQsXVvv27bV//37FxMQ4LfPEE084Dfx1JzExMbe9n37mzJkKDQ11/Bs5cmSKecaMGaPQ0FA1btxYgwYNUlxcnKZMmeIY1+N+nDx5UkuWLNErr7xy13uZd+zYITc3txSPGHz66adlGIZ27Nhx1/Vcu3bttj3PtWvX1uXLl3XixAlJNy9lr127tmrXrq19+/ZJutkrbxiG4zjz22+/6a+//lKHDh30zz//OPbZ2NhYhYaG6scff3TsN7ceyxITE/XPP/+odOnS8vX1dfpdu5fUHOfSeix55JFH7thbfavUHD937NihQoUKOd1K5OHhob59+yo2NjbFuh999FGnn0fytiVvz8WLF/Xbb7+pc+fOTj3ZDRs2VPny5e9Zc1ps375dVatWdfp8fXx81L17d507d07Hjx93mr9Lly5Ov6v/rj1PnjySbl5ZEBcXd9d1J38G//zzz/1vCIBU4TJ7AJlu3LhxCggIkJubmwoWLKiAgABZrTfPJf71118yDEOPPPLIbZd1d3c+TBUpUiTVA/6cO3dOVqtVpUuXdppeqFAh+fr66ty5c07T7zbqcvHixZ1eJ38hK1asWIrpdrtd0dHRjssh9+/fr7CwMP30008pvgxFR0c7fbn7d3vSzS9IkZGRjtenT5++4+eV7NSpU/rzzz8d96b/25UrV+66/K2aNm0qHx8fff311/r9998VEhKiMmXK3PYe41OnTuno0aN3XO+t96TeTfJjw+7l9OnTKly48F0vkX700Uf16aef6rXXXtOMGTMUGhqqVq1aqU2bNo7fw7u53WjhZcuWVVxcnK5evapChQqpXLlyCgkJ0dq1a/X4449LunmJffXq1e852niePHl0/fr1e9ZxN6tXr9YHH3ygkydPKjEx0TH91t/pXr16af369Ro4cKCKFCmihg0bqm3btmrSpIljnueff17PPfecWrduraCgIDVq1EidOnVSxYoV01zT1atXFRcX53S7SrJy5crJbrfr77//dlxW/e9678bHx+e29+X26tXLcXnvyy+/fNtlhwwZotq1a8tqtSp//vwqV65ciuPM3SQkJDjtj9LNMOrm5qbJkyc7xmS4m3Pnzqlw4cKOoJQs+VL0fx+bbse4zb31yZfO79+/X0WLFtVvv/2mF154Qf7+/o6nIezbt0958uRx/EyTT9y8+uqrd1xXdHS0/Pz8FB8fr3nz5mnVqlWKiIhwquHfJybvJjXHubQeS/79u3Pp0iWn13nz5pWXl1eqjp/nzp1TmTJlUhwfkn8+58+fv+v2JIfa5LFGkue/3bEgICAgTSdC7uX8+fMpbl+R5Ljd4fz58woKCnJM//fftuSTn8m1lypVSk899ZQ+/PBDrV27VrVr11aLFi3UsWNHp79d0v/9TmaH0fWBnIIwDyDTVa1a9Y69Xna7XRaLRe+///5te+T+3fuWntHlU/vF4m5t3yn03Wl68pea06dPq3///goMDNSoUaNUrFgxeXh4aPv27Vq0aFGKnuLU9Eqmht1uV1BQkEaPHn3b91MTlJN5enqqVatWWrNmjc6cOXPbXvBb19uwYUP95z//ue37ZcuWTfU6UxO0U8PLy0sff/yx9u7dq23btmnnzp36+uuvtWLFCn3wwQcZ9pk/9thjmjx5si5cuKCEhAT99NNPGjdu3D2XCwwM1G+//aaEhIR0jUz9xRdfaNSoUWrZsqUGDBigAgUKyM3NTfPmzXPq6SxQoIDWrFmjXbt2aceOHdqxY4dWrVqlxx57TG+99ZYkqU6dOtq8ebO2bNmi3bt367PPPtPixYs1YcIEx0mKzJTaUbyTP7OIiAgVKVLEMT0gIMBx8uBObQUFBTkNHJdWBw8edHpevXTzqo8zZ85o586dCg8PdzrRlZSUpPj4eJ09e1b58uVLEeDTI1++fE6DUiYrUqSISpYsqR9//FElSpSQYRiqXr26/P39NXnyZJ07d0779+9XjRo1HPtX8rHqlVdecYyv8G/Jx+GJEyc67qWvXr268ubNK4vFohEjRqTpkZGp2efSeiz59/G7UaNGTq/ffPPNVF/VlVZ32p60fCaucq+/YdLNgUc7d+7sOC5MmjRJ8+bN08qVK53+liSfjEk+kQ0g8xHmAbhU6dKlZRiGSpYsedsevPtRokQJ2e12nTp1ymnwpcuXLysqKspp8KjMsnXrViUkJOi9995z6gFJy2Xu/1a6dGkdO3bsnvP8/vvvCg0NzZBekg4dOujzzz+X1WpVu3bt7rre2NjYe4aljOq5KV26tHbt2qVr167dtXfearU6Lr0ePXq05s6dq5kzZ2rv3r33rPXfIztLN3szvb29nS7rffTRRzVlyhStW7dO8fHx8vDwUNu2be+5Dc2bN9fBgwe1adOmdD2qcePGjSpVqpTCw8OdPtdZs2almNfT01MtWrRQixYtZLfbNX78eK1YsULPPfeco9cwX7586tq1q7p27arr16+rT58+CgsLS3OY9/f3l7e3t06ePJnivRMnTshqtd62hzY1mjVrpq+++kpffvmlBg4cmK420qtixYr68MMPnaYVKlRIP/zwgyTd9mRXRESEHn74YY0ePVr9+/dXiRIl9N133ykmJsYp3CdfHn+vY1NgYKA2bdp02/dq166tH3/8USVLllTFihUdvfB58+bVzp079euvv2rYsGGO+ZNvgciTJ88994WNGzfqsccecxo9/caNGyl65TNi/07tseRO/v0zSr6cPTXHzxIlSujo0aOy2+1OYTf55/Pv3ux7SZ7/dseS2+0f/5aWz7N48eJ33OdurSWtkkfRf+6553TgwAH17NlTy5Ytc3piQ/JJrNs9lQNA5uCeeQAu9cgjj8jNzU3h4eEpejEMw7ive++SH0t166O3pP/7kpeax1bdr+Qem39fjvr555+nu81HHnlEv//++20fa5S8nrZt2yoiIuK2zyePj4+/60jht1OvXj0NHz5c//3vf+84Qnfyeg8ePKidO3emeC8qKsoxloC3t7dj2v145JFHZBiGwsPDU7yX/Fnc7nLs5B7I1Dym7+DBg/rll18cr//++29t2bJFDRs2dOqR8/f3V+PGjfXll19q7dq1atSoUaru4e3Ro4cKFSqkKVOm3PZL+JUrV+769IHb/Y4dOnQoxePf/r0vWa1WxxMEkj+Hf8/j4+Oj0qVLp+lxhrfW1bBhQ23ZssWpp/ry5ctat26datWqle5e6rZt26p8+fKaM2dOiu1Mllm9on5+fmrQoIHTv1y5cql+/fqaPXt2in/+/v6qUqWKZs+e7XhkX5MmTWSz2fTxxx87tb1o0SJZLBanWx9up3r16oqMjHS68iJZ7dq1de7cOX399deO+5+tVqtq1KihDz/8UImJiU4j2VepUkWlS5fWBx98cNvbPW69nP12PdBLlixxjB2RLHn/Tsul9/+W2mPJnfz7Z1S4cGFJqTt+NmnSRJcuXdLXX3/teC8pKUlLlixR7ty5VadOnTRtS+HChVWpUiWtXr3a6TPZvXt3invYbyctn2fTpk11+PBhp8dhxsbGauXKlSpRokSa79GPiYlJ8VkHBQXJarWmOC788ssvslgsql69eprWASD96JkH4FKlS5fWCy+8oBkzZujcuXNq2bKlfHx8dPbsWX3zzTd64oknNGDAgHS1XbFiRXXu3FkrVqxQVFSU6tSpoyNHjmj16tVq2bKlYzC4zNSwYUN5eHjomWeeUY8ePXT9+nV9+umnKlCgQIp7OlNrwIAB2rhxo4YPH66uXbuqcuXKioyM1NatWzVhwgRVrFhRnTp10vr16/X6669r7969qlmzpmw2m06cOKENGzZowYIFaRrwy2q13vVZ57fWtnXrVj3zzDPq3LmzKleurLi4OP3xxx/auHGjtmzZIn9/f3l5eal8+fJav369ypYtq3z58qlChQpO93KmRv369dWpUyctWbJEp06dUuPGjWW327V//37Vq1dPffr00ezZs7Vv3z41bdpUJUqU0JUrV/TJJ5+oaNGid3xG+a2CgoI0YMAAp0fTSXLq3Uz22GOP6fnnn5ckx7O278XPz0+zZ8/WoEGD9Nhjj6ljx46qXLmypJvPaF+3bt1dH23XrFkzbdq0SUOGDFGzZs109uxZLV++XOXLl3c6afPaa68pMjJS9evXV5EiRXT+/HktXbpUlSpVcvSktWvXTnXr1lXlypWVL18+HTlyRBs3blSfPn1StS3/9sILL2jPnj3q1auXevXqJTc3N61YsUIJCQl3vKc9NTw8PBQeHq4BAwaoV69eatWqlWrXri1vb29FRERo69atOn/+fJacsEtWvHjx2/Z6/u9//1PBggXVsmVLx7QWLVqoXr16mjlzps6dO6fg4GDt3r1bW7ZsUb9+/VKM8/FvzZo1k7u7u/bs2aPu3bs7vZf8O33y5Em9+OKLjul16tTRjh075Onp6XjUnHRz3540aZIGDhyo9u3bq0uXLipSpIgiIiK0d+9e5cmTR3PnznWs94svvlCePHlUvnx5/fTTT9qzZ0+Kq2IqVaokNzc3vf/++4qOjpanp6fq16+vAgUKpO7DVOqPJWmVmuNn9+7dtWLFCo0aNUq//PKLSpQooY0bN+rAgQMaM2ZMuk5Cvfjiixo8eLB69eqlrl276tq1a1q6dKkqVKhwz5OryceDmTNn6tFHH5WHh4eaN29+20EgBw0apK+++koDBw5U37595efnpzVr1ujs2bMKCwtL8+1L33//vd544w21adNGZcuWlc1m0xdffCE3N7cUY0Ps2bNHNWvW5DJ7IAsR5gG43KBBg1S2bFktWrTI8ez3okWLqmHDho6erPSaNGmSSpYsqdWrV+ubb75RwYIFNXjw4Lve952RAgMDNWvWLL3zzjt66623VLBgQfXs2VP+/v73fJb0nfj4+Ojjjz9WWFiYNm/erNWrV6tAgQIKDQ113D9stVo1e/ZsLVq0SF988YU2b94sb29vlSxZUn379s3wWxqSeXt7a8mSJZo3b542bNigNWvWKE+ePCpbtqyGDRvmNGDSpEmTNHHiRL355ptKTEzU0KFD0xzmpZv3wgYHB+uzzz7T1KlTlTdvXlWpUsURgFu0aKFz587p888/1z///KP8+fOrbt26Keq5kzp16qh69eqaPXu2zp8/r/Lly+vNN9+87aBwzZs3l5+fn+x2ux5++OFUb0O1atW0du1aLVy4UNu2bdMXX3whq9WqwMBADRo06K5hukuXLrp8+bJWrFihXbt2qXz58po2bZo2bNjguPRbkjp27KiVK1fqk08+UVRUlAoVKqS2bdtq2LBhji/4ffv21datW7V7924lJCSoePHieuGFF9J9Qq1ChQr6+OOPNWPGDM2bN0+GYahq1aqaNm3abQfpSouAgAB98cUX+uijj/TNN99ox44dSkxMVMGCBVW1alUNHTo02z7r2mq16r333tOsWbP09ddfa9WqVSpRooReeeUVx9M27qZgwYJq0qSJ1q9fnyLMBwYGqkCBArpy5YrTyark/65atWqKsRnq1aunFStWaM6cOVq6dKliY2NVqFAhVa1a1an9sWPHymq1au3atbpx44Zq1qypDz/8MMV97YUKFdKECRM0b948jR07VjabTR999FGawnxajiVpkZrjp5eXl5YsWaLp06dr9erViomJUUBAwH3dd9+kSRO9++67eueddzRjxgyVLl1ab775prZs2eK0n95O1apVNXz4cC1fvlw7d+6U3W7Xli1bbhvmCxYsqOXLl2vatGlaunSpbty4oeDgYM2dO1fNmjVLc93BwcFq1KiRvv32W0VERMjb21vBwcF6//33nXrgo6OjtWvXLr3++utpXgeA9LMYZhidAwAAE0hKSlLjxo3VvHlz/e9//3N1OXiA7du3T3379nVc3QK40qJFi7RgwQJ988036RqoFkD6cM88AAAZ5JtvvtHVq1f12GOPuboUPOBq166thg0basGCBa4uBTlcYmKiFi1apGeffZYgD2SxbNUzf+rUKS1cuFCHDh3SsWPHFBgYqHXr1t1zOcMw9P777+uTTz7R1atXValSJY0ePZoBOAAAWeLQoUM6evSo5syZo/z582v16tWuLgkAADzgslXP/LFjx7R9+3aVKVMmTY+1eP/99zVr1iz1799f8+bNU6FChfT000/fdpRXAAAy2rJlyzR+/Hj5+/s7ntkOAACQmbJVz/ytz/McNWqUfv7553v2zN+4cUMNGjRQ7969HaO2JiQkqE2bNmrSpInGjx+f2WUDAAAAAJClslXPfFoflyFJBw4cUExMjNq2beuY5unpqVatWmnHjh0ZWR4AAAAAANlCtgrz6XHixAlJNx/Fcqty5crp/Pnzio+Pd0VZAAAAAABkGtM/Zz4qKkqenp7KlSuX03RfX18ZhqHIyMh0jax58OBBGYYhDw+PjCoVAAAAAIA7SkxMlMViUY0aNe45r+nDfGYxDEOGYSghIcHVpQAAAAAA4MT0Yd7X11cJCQm6ceOGU+98VFSULBaL/Pz80tWuh4eHDMNQ+fLlM6pUAAAAAADu6Pjx47JYLKma1/RhPvle+ZMnT6pixYqO6SdOnFDx4sXTdYl9MovFoty5c993jQAAAAAA3Etqg7z0AAyAV7NmTeXJk0fr1693TEtMTNSmTZvUpEkTF1YGAAAAAEDmyFY983Fxcdq+fbsk6dy5c4qJidGGDRskSXXr1pW/v7/69eun8+fPa/PmzZKkXLlyafDgwQoLC5O/v7+CgoK0bNkyXbt2TQMGDHDZtgAAAAAAkFmyVZi/cuWKhg8f7jQt+fVHH32kevXqyW63y2azOc0zcOBAGYahDz74QFevXlWlSpW0cOFClSpVKstqBwAAAAAgq1gMwzBcXUR2dOTIEUlSSEiIiysBAAAAkFPYbDYlJia6ugxkAg8PD7m5ud11nrTk0GzVMw8AAAAAOZFhGLpw4YIiIyNFf+uDKflpa0WLFk3TQHd3QpgHAAAAABeLjIzUtWvXVKhQIfn4+GRI2EP2YRiGrl+/rkuXLsnb21v58uW77zYJ8wAAAADgQoZh6OLFi/L19VXBggVdXQ4yibe3t27cuKGLFy/Kz8/vvk/YmP7RdIAZ2A27q0twiZy63QAAAGlhs9lks9nk6+vr6lKQyXx9fR0/7/tFzzyQBawWqxb//JEuxEa4upQsUzR3EfWr8qSrywAAAMj2kpKSJEnu7sSzB13yzzgpKem+f978tgBZ5EJshM5Gn3V1GQAAAMimuE/+wZeRP2MuswcAAAAAwGQI8wAAAAAAU1i1apWCg4N19ixXvBLmAQAAAAApJAfn4OBg7du3L8X7hmGoadOmCg4O1uDBg9Pc/scff6xVq1ZlRKk5EmEeAAAAAHBHuXLl0rp161JM/+GHH3ThwgV5enqmq91ly5Zp9erVaVqmU6dOOnz4sEqUKJGudT5ICPMAAAAAgDtq2rSpNmzY4Bh1P9m6detUuXJlFSpUKNNriI2NlSS5ubkpV65cDBYowjwAAAAA4C7atWuna9euaffu3Y5pCQkJ2rhxozp06JBifrvdrkWLFqldu3YKCQlRgwYNNG7cOEVGRjrmadGihY4dO6YffvjBcSl/3759Jf3f5f0//PCDxo8fr9DQUDVt2tTpvX/fM799+3b16dNHNWrUUM2aNdW1a1etXbs2Mz6ObINH0wEAAAAA7qhEiRKqXr26vvrqK0eo3rFjh6Kjo/Xoo49qyZIlTvOPGzdOq1evVpcuXdS3b1+dPXtWH3/8sX799VctW7ZMHh4eGjNmjCZOnKjcuXPrmWeekSQVLFjQqZ0JEybI399fQ4YMcfTM386qVas0ZswYVahQQYMHD1bevHn122+/aefOnbc92fCgIMwDAAAAAO6qQ4cOmjFjhuLj4+Xl5aW1a9eqTp06KlKkiNN8+/bt06effqrp06c7Bel69erpP//5jzZs2KAOHTqoZcuWeuedd5Q/f3516tTptuv08/PTokWL5Obmdse6oqOjNWnSJFWtWlVLlixRrly5HO8ZhnGfW529cZk9AAAAAOCu2rZtqxs3bujbb79VTEyMtm3bdtte7w0bNihv3rxq2LChrl696vhXuXJl5c6dW3v37k31Op944om7BnlJ2r17t65fv65BgwY5BXlJD/x99fTMAwAAAADuyt/fX6GhoVq3bp3i4+Nls9nUunXrFPOdOnVK0dHRCg0NvW07V65cSfU6S5Ysec95Tp8+LUmqUKFCqtt9UBDmAQAAAAD31L59e/33v//V5cuX1aRJE/n6+qaYx263q0CBApo+ffpt2/D390/1+v7d0w5nhHkAAAAAwD21atVKr7/+un766SfNnDnztvOULl1a3333nWrWrCkvL6+7tpcRl8GXLl1aknTs2DGVKVPmvtszE+6ZBwAAAADck4+Pj8aPH69hw4apRYsWt52nbdu2stlsmjNnTor3kpKSFBUV5Xjt7e3t9Do9GjVqJB8fH82bN083btxweu9BHwCPnnkAAAAAQKp07tz5ru/XrVtX3bt317x58/Tbb7+pYcOG8vDw0F9//aUNGzZo7NixatOmjSSpcuXKWrZsmebMmaMyZco47stPizx58mj06NF67bXX1K1bN7Vv316+vr76/fffFR8fr7feeivd25rdEeYBAAAAABnmjTfeUJUqVbR8+XLNnDlTbm5uKlGihDp27KiaNWs65hsyZIjOnz+vBQsW6Pr166pbt26aw7wkPf744ypQoIDmz5+vOXPmyN3dXYGBgerfv38GblX2YzEe9GsP0unIkSOSpJCQEBdXggfFWz9M09nos64uI8uUzFtSr9Z92dVlAAAAZHvx8fE6efKkAgIC7nmfOcztXj/rtORQ7pkHAAAAAMBkCPMAAAAAAJgMYR4AAAAAAJMhzAMAAAAAYDKEeQAAAAAATIYwDwAAAACAyRDmAQAAAAAwGcI8AAAAAAAmQ5gH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OXPUv39/rVq1SkFBQRldppPnnntOsbGxqZ6/WbNmWrFihXx9fTOxqsxBmAcAAACAbMrNatWYNZ/rxOXLWbrewIIF9b/HuqZrWavVqurVqzteV61aVS1atNDy5cs1btw4p3kNw1BiYqI8PT3vp1yH0qVLp2l+f39/+fv7Z8i6sxphHlkmv5+PS88sAgAAAGZ04vJl/X7hb1eXkW7FixeXv7+/zp49q1GjRunnn3/Wyy+/rBkzZujEiROaPn262rRpo4MHD2rmzJk6fPiw3Nzc1KxZM40ZM0YFChRwtJWQkKDZs2dr3bp1ioiIkL+/vxo0aKApU6ZIkqP9devWSZKioqI0depUbd++XdeuXZO/v79q1qypmTNnSrp5mf3o0aP13XffOUL9tWvX9NZbb2nr1q2Ki4vTQw89pJEjR6pOnTqOOvr27avcuXOrc+fOmjlzpi5evKiQkBBNmjQpzScU0oswjyyTx8fLZWcWXalRufIa2vxhV5cBAAAAuERMTIyuXbumwoULKykpSRcvXtSkSZP07LPPqlixYipevLgOHjyovn37qmnTppo5c6bi4uL0zjvv6LnnntOKFSscbQ0bNkzff/+9Bg8erOrVq+vq1avatGnTHdf95ptvaufOnRo5cqRKlCihS5cuaceOHXec32azaeDAgTpz5oxeeuklFSxYUEuWLNFTTz2l5cuXq0qVKo55f/vtN129elUvvfSSbDabpkyZopdfftmp3sxEmEeWM/uZxbQqW6Cgq0sAAAAAslRSUpKkm/fMv/XWW7LZbGrdurW++uorRUZG6v3331e1atUc848dO1ZVqlRReHi4LBaLJCkoKEjt27fX9u3b1bRpU+3evVvbtm3TjBkznAa5u9uAd0eOHFH79u3VuXNnx7R27drdcf5t27bp8OHDWrBggRo3bixJatSokR555BHNmzdPYWFhjnmjo6O1Zs0aR49+bGysRo8erQsXLqho0aJp+bjSheudAQAAAAAZJjY2VpUrV1blypX18MMPa+/evRo3bpwjHOfLl88pyMfFxenAgQNq06aNbDabkpKSlJSUpLJly6pYsWI6cuSIJOm7776Tt7f3XcP4vz300ENavXq1Fi5cqD/++OOe8+/bt0958uRx1CpJHh4eatWqlfbv3+80b8WKFZ3uty9fvrykmycwsgI98wAAAACADOPl5aWlS5fK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qHnz5pKk9evXa968ebLZbJo8ebKqVq3qOJFttVq1a9cuFStWTOXKlXNl+QBymISEBI0ZM0YeHh568803JUnx8fEKDw/X9evXlT9/fg0ePFi5cuWSdPMKpNatW+upp57SgAEDXFn6fUk5TDeQwxQpUkRdu3bVggUL5OXlpSeeeEL58uVT7ty5lSdPHhmG4fhSk3w/Tv78+dWqVSvVrl1b3377rWbOnKm9e/eqXr16rt4cwNRsNps8PDwUExOjcePGKSEhQXny5NHmzZt148YNzZgxQ3nz5nXsk3369JEkdejQQTNmzNDu3bvVpUuXB2KEWsCV3Nzc9Pvvv2vatGkKDQ2Vl5eXQkND1bZtW9lsNi1atEhjx451CvR2u12NGjVydekAciBPT0/FxcXpjz/+0Pnz57V3717NnDlTHh4e8vLyUlxcnJKSkjRixAjZbDb5+Pioa9euOnv2rKtLvy9cZg9Ieu211/Tkk09q5syZWr58uWJjY5WQkCAvLy+5ubnJzc3N6X6c5F6I/Pnzq1atWkpISGDQHyADuLm56caNG+rVq5cuX76sTp06af78+Ro0aJAOHTqkYcOGKTo62rFPSjfvlatdu7Z69uypr776SidPniTIAxmgYsWKeu+993TixAm9//772rNnjySpffv26t+/v3LlyqXx48frwIEDslqtjB0DIEvc7rZWwzDUuXNnxcbGqmXLlpo9e7YaNmyoL7/8Up999pnKlCmjY8eOyWKxOB473aBBA9ntdlPfFkTPPHK0W3vvXnrpJRmGoXfffVceHh6KiorSmTNn9OeffyouLk5Wq1W+vr6yWq06deqUQkNDJUlFixZV8eLFdf78+RRtAki7ffv26eLFixo9erRjPwsICFCVKlX03//+VyNHjtT06dNTXHJftmxZFStWTFeuXHG6Tw7Avd06EvStmjVrptdff12vv/66FixYIOnmF+D27dvLarXqnXfe0bRp07Ro0SJ5enry9w9Aprr1WPXDDz/o+vXrKlKkiB566CE1b95cAQEBOnnypPz9/VWzZk1JN2/f8/f3l7e3txITE2W1WuXm5qZ69eqpcuXKjsfdmhFhHjlW8mW6SUlJMgxDHh4eevnllyVJ06dPV6VKlRQZGamnnnpKV69elcVikZubmxISElSjRg3Vr19fFotFixcv1tGjRzVjxgxJ4osMcJ88PDwU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cuXKGjhwoHr06HHf83Tmfx+m2SPPsNvtKleunBYuXCir1apJkybp6NGjstlsatCggYYNG6a9e/eqSZMmeumll2Sz2XT8+HFFREQoKytLw4YNc/crAIWa0WiUxWJxBfmce+cAAEDB8suesMFgkK+vr5o2baqdO3cqKSlJZrNZNptNktSqVSvVr19fNptNy5cv17Vr13J9B0H+96Mzjzwhu3tns9mUkpKi9PR0jRgxQikpKZoyZYqeeOIJJSUlad26dVq4cKEaNWqkO3fuyGg0ytPTU6tXr5bZbGaPPAAAAPCQORyOXP9473Q6XT/v2rVLkZGRqlmzpv7617/K399fkpSUlKTw8HC1atVKjRo1Up06ddxWf0FBmIfbZQfw5ORkjR8/XqVLl9Zzzz2ngIAADR48WBkZGZo2bZpryuXRo0d1+PBh2e12Pf744+rQoQNT6wEAAIBHIOdy+FWrVunQoUPy9PTUk08+qS5dukiSIiMjtWPHDpUqVUoTJ05UWlqajhw5oo0bN2rdunUqU6aMO1+hwCDMw62y/2eQkpKi559/XiVLllSvXr3Url07Wa1WXbt2zRXop06dqvr168tisdy3p4aOPAAAAPBw5fwdfMGCBVq6dKkaNGigW7du6cSJExo+fLhGjRolSVq7dq02bdqk7777TkWKFJHRaNSUKVPUqVMnd75CgUKYh9s5nU5NnjxZx44d07x581ShQgVJ/1y+kx3obTabpkyZouDgYDrwAAAAgJskJCRowYIFat68uTp37qwbN24oNjZW8+fP18CBA10nTKWmpio+Pl4mk0klSpTQ448/zqC7B4hEBLez2+06e/as6tat6wrykuTh4SGHw6HSpUtryZIlCgsLU2hoqFavXq1atWq5sWIAAACgcMpeWn/t2jUNGjRIHh4eKlWqlPr16yeLxaLIyEgZDAaNGzdOXl5eatGihbtLLrAI83A7u92u27dvKzMz875rHh4eSklJUWJioqKiovTuu++qevXqbqgSAAAAQFJSkg4cOCCLxaL09HTX535+fvrv//5vSdK8efOUlZWlV1999b7n6co/OBxNB7czGo167LHHFB8frxMnTuS65nQ6tXfvXv3v//6vfHx8NHPmTBmNRtntdjdVCwAAABQOOXdkZ/953LhxGjt2rNLS0rRo0SKdP3/edY+fn5969eqloUOHatmyZfrhhx8eec2FCWEebmcymRQaGqpr165p/vz5+u6771zXLly4oFWrVunGjRsqWrSo63OG3QEAAAAPj8PhcHXRHQ6HUlNTXdcGDBigESNG6IsvvlBMTIx+/PFH1zVfX1/169dPn3zyiapUqfKoyy5UGICHPGPfvn0aNWqUAgICVK9ePVksFh07dkyenp7auHGjTCYTAzMAAACAhyznOfIrV67UkSNHdOrUKTVp0kRNmjRRt27dJP28nH7NmjX685//rMGDB6ty5cr3fRe/vz88hHnkKadOnVJMTIxOnz4tf39/BQUFKTw8XCaTiXPkAQAAgEcoMjJSq1atUtu2beXn56f9+/fL4XCoY8eOeuWVVyRJ7777rtavX68mTZooLCyMbvwjRJhHnmO322W322UymVz/IkiQBwAAAB6db7/9VsOGDdO4cePUqVMneXp66vz581q5cqXi4uLUr18/DR48WJIUFRWl1atXa82aNQyrfoTYM488x2g0ymKxuIK80+kkyAMAAACP0L1793Tv3j099thj8vT0lMPhUNWqVTVw4EDVrFlT27dvV1JSkiRp9OjR2rRpE0H+ESPMI89jjw0AAADw8Dgcjvs+czqdSk9Pdw2+czqdstvtqlChggYNGqQTJ07o0qVLrvsrVar0yOrFzwjzAAAAAFBI5Rx2d/z4cV24cEF2u121atVS/fr1NWvWLP34448yGo25mmx+fn6yWq3uKhsizAMAAABAoZQzyL/77ruaMGGCtm7dqjt37qhYsWLq1q2b7ty5o2nTpun777+Xh4eH7ty5o8OHD8vb21u+vr5ufoPCjQF4AAAAAFCIzZ8/X8uWLdOrr76qJ554IteS+ffee08ffPCBLl++rLp168pms+nkyZN666231KFDBzdWDcI8AAAAABRSCQkJGjp0qLp27aoBAwbIYrFIyn2a1JdffqkjR47o66+/VlBQkNq2baumTZtyhrybMSIcAAAAAAqpGzdu6MKFC2rQoIEryEs/nzCVrXHjxmrcuHGu8E5P2P3YMw8AAAAAhZTJZJKnp6euXr3q+ixnaP/yyy8VHx8vKfcpUwaDga68mxHmAQAAAKCQqly5sooVK6YtW7bo+vXrcjgcMhgMcjqdunnzptavX6+///3vysrKcnep+AXCPAAAAAAUYP9qSXxWVpZ8fHw0efJk/f3vf9e0adN04sQJSdLV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WpWcnKyXXnpJdevW1YgRI+Tj46PExETXEvvdu3crKCjI3WUD/xHCPAAAAIB8I+cu4YyMDEmS2WxWenq6a3hdz5495enpqXfffVeBgYHatWuX1qxZo5SUFElS+fLl7/suIL9hmT0AAACAfCM7sMfExKh48eJ67rnnVLx4cXl7e2vlypU6dOiQvL29NXfuXAUGBiolJUWff/65rl27JpvN9qvfBeRHdOYBAAAA5DtxcXFatmyZJKlmzZrq37+/Vq9erbt37yoiIkKBgYG6fv26VqxYoY8++ki9evVSiRIl3Fw18OAwzR4AAABAvuF0OmUwGHTgwAG98cYbGjp0qHr27ClJio6OVlRUlFq1aiWr1ar09HTFx8drypQp6tixo+tZoCAgzAMAAADIs7LPkf9lEL9z546GDh2qokWLatGiRa7Pt27dqm+++UYnT55U48aN1bRpUzVq1IggjwKHMA8AAAAgzzt16pRq1KiR67PDhw9rwIABevvttxUSEpLrWvY/AmQjzKOgYc88AAAAgDwtLi5O3bp10/Dhw7VhwwbX5/Xq1VPLli21fft23b59Ww6Hw3UtZ5CXGHaHgofOPAAAAIA848yZM7p8+bLS09NVs2ZNBQYGymQy6dNPP9WyZct06dIllSlTRkOGDFHz5s116NAhjR49WmvWrFG9evXu68gDBRVhHgAAAECe8Morr+jkyZM6e/asTCaTzGazgoODNXHiRAUFBen69es6efKkoqOjdeHCBQUEBGjkyJGKjIxUiRIlFB0dLavV6u7XAB4JwjwAAAAAtxs4cKCuXr2qwYMHq2rVqjIYDFqzZo127dolo9GouXPnqlmzZq77t23bpri4OG3btk1Op1PFihXTBx98oLJly7rxLYBHhzAPAAAAwK2WL1+udevWafbs2apdu3auZfIfffSRFi5cqOvXr2v16tW/OgRv48aN6tatm1q2bPmoSwfchjAPAAAAwK3GjRunlJQULVy40DWozm63y2g0Svq5Cz99+nQVL15cK1asUIkSJXI9n56eLqvVysR6FCpMhgAAAADgFk6nUykpKTpz5oyKFi0qg8GgzMxMSZLRaFR23zEkJETPPfeczpw5o2+++cb1bLbsffIEeRQmhHkAAAAAbmEwGOTt7a2AgAB9++23kiSz2ewK6gaDwXXc3KBBg1S0aFEdPXrUdQ0ozAjzAAAA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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "categories = combined_df[\"Category\"].unique()\n", "models = combined_df[\"Model\"].unique()\n", "metrics = ['F1 Score', 'Precision', 'Recall']\n", "\n", "selected_category = categories[4]\n", "selected_model = models[0]\n", "\n", "model_data = combined_df[(combined_df[\"Category\"] == selected_category) & (combined_df[\"Model\"] == selected_model)]\n", "\n", "sns.set(style=\"whitegrid\")\n", "\n", "plt.figure(figsize=(12, 6))\n", "df_melted = model_data.melt(id_vars=[\"Class\"], value_vars=metrics, var_name=\"Metric\", value_name=\"Score\")\n", "sns.barplot(data=df_melted, x=\"Class\", y=\"Score\", hue=\"Metric\", palette=\"viridis\")\n", "plt.xticks(rotation=45)\n", "plt.title(f\"Performance Metrics by Class for {selected_model} ({selected_category})\")\n", "plt.ylabel(\"Score\")\n", "plt.ylim(0, 1)\n", "plt.legend(title=\"Metric\")\n", "plt.show()\n", "\n", "performance_table = model_data.pivot(index=\"Class\", columns=\"Model\", values=metrics).round(4)" ] }, { "cell_type": "code", "execution_count": 5, "id": "8f97a9ad-4de3-49ea-883c-ebe8a5c55f2c", "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", "
F1 ScorePrecisionRecall
ModelGPT-4oGPT-4oGPT-4o
Class
Overall (weather-conditions)0.72130.81150.7149
clear-sky0.91420.85800.9781
cloudy0.40790.77810.2764
rain0.84180.79830.8903
\n", "
" ], "text/plain": [ " F1 Score Precision Recall\n", "Model GPT-4o GPT-4o GPT-4o\n", "Class \n", "Overall (weather-conditions) 0.7213 0.8115 0.7149\n", "clear-sky 0.9142 0.8580 0.9781\n", "cloudy 0.4079 0.7781 0.2764\n", "rain 0.8418 0.7983 0.8903" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "performance_table" ] }, { "cell_type": "code", "execution_count": 6, "id": "d640dd28-4acd-49ea-9b30-add33f4717a4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Classes in 'weather-conditions': ['clear-sky' 'cloudy' 'rain' 'Overall (weather-conditions)']\n" ] } ], "source": [ "all_classes_in_category = combined_df[combined_df[\"Category\"] == \"weather-conditions\"][\"Class\"].unique()\n", "print(\"Classes in 'weather-conditions':\", all_classes_in_category)\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "3364ab40-dc38-4cbd-8667-7ab13afbae85", "metadata": {}, "outputs": [], "source": [ "df_labels = pd.read_csv('results/Labels.csv')\n", "df_predictions = pd.read_csv('results/GPT-4o.csv')" ] }, { "cell_type": "code", "execution_count": 7, "id": "b475f167-3b27-44d0-9ffc-b16dd4232bad", "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", "
ClassF1 Score
0clear-sky0.910311
1cloudy0.404647
2fog0.000000
3rain0.834827
4snow0.000000
5unknown0.000000
\n", "
" ], "text/plain": [ " Class F1 Score\n", "0 clear-sky 0.910311\n", "1 cloudy 0.404647\n", "2 fog 0.000000\n", "3 rain 0.834827\n", "4 snow 0.000000\n", "5 unknown 0.000000" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import f1_score\n", "\n", "merged_df = pd.merge(df_labels, df_predictions, on='id', suffixes=('_true', '_pred'))\n", "y_true = merged_df[\"weather-conditions_true\"].astype(str)\n", "y_pred = merged_df[\"weather-conditions_pred\"].astype(str)\n", "\n", "labels = sorted(set(y_true) | set(y_pred))\n", "\n", "class_f1_scores = f1_score(y_true, y_pred, labels=labels, average=None, zero_division=0)\n", "\n", "f1_per_class = pd.DataFrame({\"Class\": labels, \"F1 Score\": class_f1_scores})\n", "f1_per_class" ] }, { "cell_type": "code", "execution_count": 8, "id": "7dc70d74-0169-4062-8595-d2c62a6aa3d4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.3582976364012411" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "overall_f1 = f1_score(y_true, y_pred, average='macro', zero_division=0)\n", "overall_f1" ] }, { "cell_type": "code", "execution_count": 9, "id": "8e5e359b-98de-4cb9-a737-f0f3ef3001ca", "metadata": {}, "outputs": [], "source": [ "merged_df = pd.merge(df_labels, df_predictions, on='id', suffixes=('_true', '_pred'))" ] }, { "cell_type": "code", "execution_count": 10, "id": "706aa9fa-82ea-4ad8-b3d9-133b635a1f53", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idmain-event_truelocation_truezone_truelight-conditions_trueweather-conditions_truevehicles-density_truemain-event_predlocation_predzone_predlight-conditions_predweather-conditions_predvehicles-density_pred
0clgr0y79557jk076o681egs6pnear-collisionmain-roadurbannightclear-skyhighnormal-drivingmain-roadurbannightclear-skymedium
1clgr0y79657lc076o46dt0xjbnear-collisionmain-roadurbantwilightclear-skyhighnormal-drivingmain-roadurbantwilightclear-skyhigh
2clgr0y79657n0076og7w6grt8near-collisionmain-roadurbandaylightcloudymediumnormal-drivingmain-roadurbandaylightrainmedium
3clgr0y7973glw0791gwwz2vd4near-collisionmain-roadurbandaylightclear-skymediumnormal-drivinghighwayurbandaylightclear-skymedium
4clgr0y7973gm407912vru07ydnear-collisionmain-roadurbannightclear-skylownormal-drivingmain-roadurbannightclear-skymedium
..........................................
10491cljex08nl2m93077n9t2jc06nnear-collisionmain-roadurbannightclear-skyhighnormal-drivingmain-roadurbannightclear-skymedium
10492cljex08nn19z507403nkf20fkcollisionhighwayunknowndaylightclear-skyhighnormal-drivinghighwayurbandaylightclear-skymedium
10493cljex08sa1eg507409e539opynear-collisionmain-roadurbandaylightclear-skyhighnormal-drivingmain-roadurbandaylightclear-skymedium
10494cljex09rl26px075u2woa9ziznear-collisionhighwayruraldaylightclear-skymediumnormal-drivinghighwaysuburbsdaylightclear-skymedium
10495cljex09rr276l075u01ec2k67near-collisionmain-roadsuburbstwilightclear-skymediumnormal-drivingmain-roadurbannightclear-skymedium
\n", "

10496 rows × 13 columns

\n", "
" ], "text/plain": [ " id main-event_true location_true zone_true \\\n", "0 clgr0y79557jk076o681egs6p near-collision main-road urban \n", "1 clgr0y79657lc076o46dt0xjb near-collision main-road urban \n", "2 clgr0y79657n0076og7w6grt8 near-collision main-road urban \n", "3 clgr0y7973glw0791gwwz2vd4 near-collision main-road urban \n", "4 clgr0y7973gm407912vru07yd near-collision main-road urban \n", "... ... ... ... ... \n", "10491 cljex08nl2m93077n9t2jc06n near-collision main-road urban \n", "10492 cljex08nn19z507403nkf20fk collision highway unknown \n", "10493 cljex08sa1eg507409e539opy near-collision main-road urban \n", "10494 cljex09rl26px075u2woa9ziz near-collision highway rural \n", "10495 cljex09rr276l075u01ec2k67 near-collision main-road suburbs \n", "\n", " light-conditions_true weather-conditions_true vehicles-density_true \\\n", "0 night clear-sky high \n", "1 twilight clear-sky high \n", "2 daylight cloudy medium \n", "3 daylight clear-sky medium \n", "4 night clear-sky low \n", "... ... ... ... \n", "10491 night clear-sky high \n", "10492 daylight clear-sky high \n", "10493 daylight clear-sky high \n", "10494 daylight clear-sky medium \n", "10495 twilight clear-sky medium \n", "\n", " main-event_pred location_pred zone_pred light-conditions_pred \\\n", "0 normal-driving main-road urban night \n", "1 normal-driving main-road urban twilight \n", "2 normal-driving main-road urban daylight \n", "3 normal-driving highway urban daylight \n", "4 normal-driving main-road urban night \n", "... ... ... ... ... \n", "10491 normal-driving main-road urban night \n", "10492 normal-driving highway urban daylight \n", "10493 normal-driving main-road urban daylight \n", "10494 normal-driving highway suburbs daylight \n", "10495 normal-driving main-road urban night \n", "\n", " weather-conditions_pred vehicles-density_pred \n", "0 clear-sky medium \n", "1 clear-sky high \n", "2 rain medium \n", "3 clear-sky medium \n", "4 clear-sky medium \n", "... ... ... \n", "10491 clear-sky medium \n", "10492 clear-sky medium \n", "10493 clear-sky medium \n", "10494 clear-sky medium \n", "10495 clear-sky medium \n", "\n", "[10496 rows x 13 columns]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged_df" ] }, { "cell_type": "code", "execution_count": 11, "id": "19481708-1dd4-4dff-8643-d3ba5bf9ae43", "metadata": {}, "outputs": [], "source": [ "for category in ['main-event', 'location', 'zone', 'light-conditions', 'weather-conditions', 'vehicles-density']:\n", " valid_values = df_labels[f\"{category}\"].unique().astype(str)\n", " merged_df = merged_df[merged_df[f\"{category}_pred\"].astype(str).isin(valid_values)]" ] }, { "cell_type": "code", "execution_count": 12, "id": "c55af0fe-1e02-45cb-a9ba-4d2fbd437355", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idmain-event_truelocation_truezone_truelight-conditions_trueweather-conditions_truevehicles-density_truemain-event_predlocation_predzone_predlight-conditions_predweather-conditions_predvehicles-density_pred
79clgr0v0823dag075s64swej3mnear-collisionmain-roadurbannightrainlownear-collisionmain-roadurbannightclear-skymedium
84cljewyyws223z075j0gmr2a68near-collisionmain-roadurbantwilightclear-skyhighnear-collisionmain-roadurbannightclear-skymedium
111clgr0yhnq0wxa078v64tf1faxcollisionmain-roadurbandaylightclear-skylownear-collisionmain-roadurbandaylightclear-skylow
218clgr0y77i5d960796etl94khdnear-collisionmain-roadurbannightclear-skyhighnear-collisionmain-roadurbannightclear-skymedium
264clgr0vkmb1zr80791fpno41uhnear-collisionmain-roadurbandaylightclear-skyhighnear-collisionmain-roadurbandaylightclear-skymedium
..........................................
10236clgr0y77u5e060796b73g9yzccollisionmain-roadurbannightclear-skyhighnear-collisionmain-roadurbannightclear-skymedium
10249clgr0y7a84wo8075s40bm20wbcollisionhighwaysuburbsdaylightrainmediumcollisionhighwayurbandaylightrainlow
10282clgr0wqyj0m1v078o5s9edrchcollisionmain-roadurbandaylightclear-skymediumcollisionmain-roadurbandaylightclear-skymedium
10301clgr0xb9p1jfm0775dvg8h13jcollisionmain-roadurbannightclear-skymediumcollisionmain-roadurbannightclear-skymedium
10359clgr0yhoi4mqx076l7msodxutnear-collisionmain-roadurbannightclear-skyhighnear-collisionmain-roadurbannightclear-skymedium
\n", "

211 rows × 13 columns

\n", "
" ], "text/plain": [ " id main-event_true location_true zone_true \\\n", "79 clgr0v0823dag075s64swej3m near-collision main-road urban \n", "84 cljewyyws223z075j0gmr2a68 near-collision main-road urban \n", "111 clgr0yhnq0wxa078v64tf1fax collision main-road urban \n", "218 clgr0y77i5d960796etl94khd near-collision main-road urban \n", "264 clgr0vkmb1zr80791fpno41uh near-collision main-road urban \n", "... ... ... ... ... \n", "10236 clgr0y77u5e060796b73g9yzc collision main-road urban \n", "10249 clgr0y7a84wo8075s40bm20wb collision highway suburbs \n", "10282 clgr0wqyj0m1v078o5s9edrch collision main-road urban \n", "10301 clgr0xb9p1jfm0775dvg8h13j collision main-road urban \n", "10359 clgr0yhoi4mqx076l7msodxut near-collision main-road urban \n", "\n", " light-conditions_true weather-conditions_true vehicles-density_true \\\n", "79 night rain low \n", "84 twilight clear-sky high \n", "111 daylight clear-sky low \n", "218 night clear-sky high \n", "264 daylight clear-sky high \n", "... ... ... ... \n", "10236 night clear-sky high \n", "10249 daylight rain medium \n", "10282 daylight clear-sky medium \n", "10301 night clear-sky medium \n", "10359 night clear-sky high \n", "\n", " main-event_pred location_pred zone_pred light-conditions_pred \\\n", "79 near-collision main-road urban night \n", "84 near-collision main-road urban night \n", "111 near-collision main-road urban daylight \n", "218 near-collision main-road urban night \n", "264 near-collision main-road urban daylight \n", "... ... ... ... ... \n", "10236 near-collision main-road urban night \n", "10249 collision highway urban daylight \n", "10282 collision main-road urban daylight \n", "10301 collision main-road urban night \n", "10359 near-collision main-road urban night \n", "\n", " weather-conditions_pred vehicles-density_pred \n", "79 clear-sky medium \n", "84 clear-sky medium \n", "111 clear-sky low \n", "218 clear-sky medium \n", "264 clear-sky medium \n", "... ... ... \n", "10236 clear-sky medium \n", "10249 rain low \n", "10282 clear-sky medium \n", "10301 clear-sky medium \n", "10359 clear-sky medium \n", "\n", "[211 rows x 13 columns]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "merged_df" ] } ], "metadata": { "kernelspec": { "display_name": "BabyDriver", "language": "python", "name": "babydriver" }, "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.14" } }, "nbformat": 4, "nbformat_minor": 5 }