{ "cells": [ { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "req WARNING \tDEFAULT CACHE ENABLED! (947.08 MB) /Users/diegomaradona/Library/Caches/fastf1\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING:fastf1.fastf1.req:DEFAULT CACHE ENABLED! (947.08 MB) /Users/diegomaradona/Library/Caches/fastf1\n", "DEFAULT CACHE ENABLED! (947.08 MB) /Users/diegomaradona/Library/Caches/fastf1\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "core INFO \tLoading data for Spanish Grand Prix - Qualifying [v3.3.3]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:fastf1.fastf1.core:Loading data for Spanish Grand Prix - Qualifying [v3.3.3]\n", "Loading data for Spanish Grand Prix - Qualifying [v3.3.3]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "req INFO \tUsing cached data for session_info\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:fastf1.fastf1.req:Using cached data for session_info\n", "Using cached data for session_info\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "req INFO \tUsing cached data for driver_info\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:fastf1.fastf1.req:Using cached data for driver_info\n", "Using cached data for driver_info\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "req INFO \tUsing cached data for session_status_data\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:fastf1.fastf1.req:Using cached data for session_status_data\n", "Using cached data for session_status_data\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "req INFO \tUsing cached data for track_status_data\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:fastf1.fastf1.req:Using cached data for track_status_data\n", "Using cached data for track_status_data\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "req INFO \tUsing cached data for _extended_timing_data\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:fastf1.fastf1.req:Using cached data for _extended_timing_data\n", "Using cached data for _extended_timing_data\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "req INFO \tUsing cached data for timing_app_data\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:fastf1.fastf1.req:Using cached data for timing_app_data\n", "Using cached data for timing_app_data\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "core INFO \tProcessing timing data...\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:fastf1.fastf1.core:Processing timing data...\n", "Processing timing data...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "req INFO \tUsing cached data for car_data\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:fastf1.fastf1.req:Using cached data for car_data\n", "Using cached data for car_data\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "req INFO \tUsing cached data for position_data\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:fastf1.fastf1.req:Using cached data for position_data\n", "Using cached data for position_data\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "req INFO \tUsing cached data for weather_data\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:fastf1.fastf1.req:Using cached data for weather_data\n", "Using cached data for weather_data\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "req INFO \tUsing cached data for race_control_messages\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:fastf1.fastf1.req:Using cached data for race_control_messages\n", "Using cached data for race_control_messages\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "core INFO \tFinished loading data for 20 drivers: ['44', '33', '77', '16', '31', '55', '3', '11', '4', '14', '18', '10', '5', '99', '63', '22', '7', '47', '6', '9']\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:fastf1.fastf1.core:Finished loading data for 20 drivers: ['44', '33', '77', '16', '31', '55', '3', '11', '4', '14', '18', '10', '5', '99', '63', '22', '7', '47', '6', '9']\n", "Finished loading data for 20 drivers: ['44', '33', '77', '16', '31', '55', '3', '11', '4', '14', '18', '10', '5', '99', '63', '22', '7', '47', '6', '9']\n" ] } ], "source": [ "import matplotlib.pyplot as plt\n", "import plotly.express as px\n", "import fastf1.plotting\n", "\n", "session = fastf1.get_session(2021, 'Spanish Grand Prix', 'Q')\n", "session.load()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vamos analisar a primeira curva no GP da Espanha e embbedar esses dados no LLM, para ver se o LLM consegue trazer informações sobre os dados" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "hovertemplate": "Driver=M VERSTAPPEN
Distance in meters=%{x}
Speed in km/h=%{y}", "legendgroup": "M VERSTAPPEN", "line": { "color": "#636efa", "dash": "solid" }, "marker": { "symbol": "circle" }, "mode": "lines", "name": "M VERSTAPPEN", "orientation": "v", "showlegend": true, "type": "scatter", "x": [ 4.108333333333333, 23.508333333333333, 43.04166666666667, 62.775000000000006, 82.57499999999999, 102.57499999999999, 122.64166666666668, 142.775, 159.6925, 180.02583333333334, 200.42583333333332, 220.89249999999998, 241.4258333333333, 265.45916666666665, 286.03972222222217, 306.77305555555546, 327.57305555555547, 348.3730555555555, 369.23972222222216, 390.1063888888888, 411.0397222222221, 431.97305555555545, 452.97305555555545, 473.9730555555554, 495.03972222222205, 516.1063888888888, 540.6841666666666, 561.7508333333332, 582.7508333333332, 607.2508333333332, 628.3174999999999, 649.3174999999998, 670.3174999999998, 691.1841666666664, 712.0508333333331, 729.5266666666665, 750.2599999999998, 767.8599999999998, 784.3933333333331, 798.1933333333332, 811.2599999999999, 823.5419444444443, 835.3419444444443, 846.808611111111, 857.808611111111, 868.8752777777777, 880.0752777777777, 891.9419444444444, 904.4086111111111, 917.4752777777778, 930.8752777777777, 944.6752777777776, 958.9419444444443, 973.4752777777776, 988.3419444444443, 1003.408611111111, 1018.808611111111, 1034.6752777777776, 1050.6086111111108, 1066.6752777777774, 1082.8086111111108, 1099.141944444444, 1115.7441666666664, 1132.3441666666663, 1149.010833333333, 1165.7441666666664, 1182.5441666666663, 1199.4774999999997, 1216.5441666666663, 1233.6061111111107, 1253.6727777777776, 1271.0061111111108, 1288.4727777777775, 1306.0727777777774, 1323.8061111111106, 1341.739444444444, 1359.8061111111106, 1377.939444444444, 1396.2727777777773, 1414.7394444444442, 1433.2061111111107, 1451.8727777777774, 1470.6061111111105, 1489.5394444444437, 1508.472777777777, 1527.5394444444437, 1546.6727777777771, 1565.872777777777, 1585.2061111111104, 1604.6061111111103, 1620.8536111111102, 1639.5202777777768, 1655.4536111111101, 1670.1869444444435, 1683.4536111111104, 1695.8536111111102, 1707.920277777777, 1718.8744444444437, 1729.607777777777, 1740.007777777777, 1752.296666666666, 1763.1633333333325, 1774.296666666666, 1785.9633333333325, 1798.0299999999993, 1810.5633333333326, 1823.496666666666, 1836.8966666666659, 1850.829999999999, 1865.096666666666, 1879.6299999999992, 1894.6299999999994, 1909.896666666666, 1928.0188888888883, 1943.8188888888883, 1959.9522222222217, 1976.3522222222216, 1990.143055555555, 2007.0097222222219, 2026.6874999999995, 2043.220833333333, 2057.8208333333328, 2070.1541666666662, 2081.354166666666, 2091.6208333333325, 2100.8488888888883, 2109.715555555555, 2117.9822222222215, 2125.915555555555, 2133.5822222222214, 2140.848888888888, 2148.4488888888877, 2156.582222222221, 2165.1155555555542, 2174.1155555555542, 2184.048888888887, 2194.5822222222205, 2206.1822222222204, 2218.248888888887, 2230.848888888887, 2244.1822222222204, 2258.048888888887, 2272.58222222222, 2287.5155555555534, 2300.35722222222, 2316.023888888887, 2331.95722222222, 2348.2905555555535, 2365.0905555555537, 2382.0905555555537, 2399.2905555555535, 2416.75722222222, 2434.3572222222206, 2452.0830555555535, 2470.016388888887, 2487.416388888887, 2502.016388888887, 2516.616388888887, 2528.816388888887, 2540.416388888887, 2551.6163888888873, 2562.4163888888875, 2572.883055555554, 2583.6163888888873, 2594.9497222222208, 2606.6830555555543, 2619.216388888887, 2632.216388888887, 2648.083055555554, 2662.083055555554, 2676.683055555554, 2691.6163888888873, 2704.4022222222206, 2720.0688888888876, 2736.002222222221, 2752.202222222221, 2768.802222222221, 2785.668888888888, 2802.8022222222207, 2820.135555555554, 2837.6688888888875, 2855.1291666666652, 2872.7291666666656, 2890.262499999999, 2907.7958333333318, 2925.395833333332, 2942.9291666666654, 2960.4624999999987, 2977.9958333333316, 2995.595833333332, 3013.3291666666655, 3031.2624999999985, 3049.2624999999985, 3067.595833333332, 3086.1291666666652, 3104.8624999999984, 3123.8624999999984, 3142.995833333332, 3162.395833333332, 3178.7549999999983, 3198.4216666666653, 3218.2216666666654, 3238.2216666666654, 3258.2883333333316, 3278.5549999999985, 3298.9549999999986, 3319.421666666665, 3340.088333333332, 3360.8216666666654, 3381.4686111111096, 3400.401944444443, 3418.401944444443, 3432.6686111111094, 3445.535277777776, 3456.801944444443, 3467.201944444443, 3477.001944444443, 3486.135277777776, 3494.9352777777763, 3503.4686111111096, 3511.6686111111094, 3521.001944444443, 3529.135277777776, 3537.535277777776, 3546.135277777776, 3554.9352777777763, 3564.201944444443, 3572.1861111111098, 3582.1861111111098, 3592.7861111111097, 3604.1861111111098, 3618.3416666666653, 3630.9416666666652, 3644.074999999999, 3657.608333333332, 3671.4749999999985, 3685.9416666666652, 3700.480833333332, 3714.1474999999987, 3726.7474999999986, 3738.5474999999988, 3749.3474999999985, 3759.814166666665, 3769.880833333332, 3779.7474999999986, 3789.147499999998, 3798.147499999998, 3807.0808333333316, 3816.3474999999985, 3825.747499999998, 3835.2808333333314, 3845.2808333333314, 3855.7474999999977, 3866.6141666666645, 3876.3291666666646, 3888.462499999998, 3900.795833333331, 3913.995833333331, 3927.5291666666644, 3941.7291666666647, 3958.7624999999975, 3973.895833333331, 3988.2291666666647, 4000.9624999999983, 4012.762499999998, 4023.783055555554, 4034.116388888887, 4044.116388888887, 4053.7163888888867, 4063.04972222222, 4072.7163888888867, 4082.916388888887, 4093.516388888887, 4106.816388888887, 4118.816388888887, 4129.483055555554, 4139.0163888888865, 4147.216388888886, 4155.083055555553, 4162.216388888886, 4168.749722222219, 4174.10972222222, 4180.10972222222, 4185.843055555553, 4191.776388888887, 4198.243055555553, 4205.443055555554, 4212.50972222222, 4219.30972222222, 4226.243055555554, 4233.6430555555535, 4241.576388888887, 4251.998611111109, 4261.55861111111, 4272.091944444443, 4285.547499999998, 4297.880833333332, 4310.814166666665, 4324.080833333332, 4338.014166666666, 4352.347499999999, 4367.214166666666, 4382.4141666666665, 4397.880833333333, 4413.614166666666, 4429.614166666666, 4445.880833333333, 4462.3475, 4479.014166666666, 4493.028333333332, 4510.161666666666, 4527.561666666666, 4545.294999999999, 4563.228333333333, 4581.428333333332, 4599.961666666666, 4618.694999999999, 4637.628333333331, 4656.694999999999, 4675.894999999999 ], "xaxis": "x", "y": [ 290, 291, 293, 296, 297, 300, 301, 302, 303, 305, 306, 307, 308, 309, 310, 311, 312, 312, 313, 313, 314, 314, 315, 315, 316, 316, 316, 316, 315, 315, 316, 315, 315, 313, 313, 313, 311, 264, 248, 207, 196, 185, 177, 172, 165, 166, 168, 178, 187, 196, 201, 207, 214, 218, 223, 226, 231, 238, 239, 241, 242, 245, 248, 249, 250, 251, 252, 254, 256, 257, 258, 260, 262, 264, 266, 269, 271, 272, 275, 277, 277, 280, 281, 284, 284, 286, 287, 288, 290, 291, 291, 280, 239, 221, 199, 186, 181, 165, 161, 156, 158, 163, 167, 175, 181, 188, 194, 201, 209, 214, 218, 225, 229, 233, 237, 242, 246, 247, 253, 253, 248, 219, 185, 168, 154, 139, 133, 124, 119, 115, 109, 114, 122, 128, 135, 149, 158, 174, 181, 189, 200, 208, 218, 224, 230, 235, 239, 245, 252, 255, 258, 262, 264, 267, 269, 261, 219, 219, 183, 174, 168, 162, 157, 161, 170, 176, 188, 195, 204, 210, 219, 224, 229, 235, 239, 243, 249, 253, 257, 260, 263, 263, 264, 263, 263, 264, 263, 263, 263, 264, 266, 269, 270, 275, 278, 281, 285, 287, 291, 293, 295, 297, 300, 301, 304, 306, 307, 310, 311, 311, 284, 270, 214, 193, 169, 156, 147, 137, 132, 128, 123, 120, 122, 126, 129, 132, 139, 143, 150, 159, 171, 182, 189, 197, 203, 208, 217, 219, 205, 189, 177, 162, 157, 151, 148, 141, 135, 134, 139, 141, 143, 150, 157, 163, 174, 182, 185, 198, 203, 213, 219, 227, 215, 191, 177, 166, 155, 150, 144, 140, 145, 153, 159, 171, 180, 160, 143, 123, 118, 107, 98, 96, 90, 86, 89, 97, 108, 106, 102, 104, 111, 119, 134, 144, 158, 173, 185, 194, 199, 209, 215, 223, 228, 232, 236, 240, 244, 247, 250, 251, 257, 261, 266, 269, 273, 278, 281, 284, 286, 288 ], "yaxis": "y" } ], "layout": { "annotations": [ { "showarrow": false, "text": "1", "x": 840.4395031422582, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "2", "x": 925.2192705531843, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "3", "x": 1168.2113212093552, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "4", "x": 1741.685572018549, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "5", "x": 2122.7368569957525, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "6", "x": 2364.579752964712, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "7", "x": 2547.543141403398, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "8", "x": 2637.1095897460923, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "9", "x": 2925.3814319017774, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "10", "x": 3499.034858626689, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "11", "x": 3638.214025589213, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "12", "x": 3781.746397745988, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "13", "x": 4025.864180125063, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "14", "x": 4156.471023673764, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "15", "x": 4203.509638553514, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" }, { "showarrow": false, "text": "16", "x": 4371.906121536575, "xanchor": "left", "xref": "x", "y": 1, "yanchor": "top", "yref": "y domain" } ], "legend": { "title": { "text": "Driver" }, "tracegroupgap": 0 }, "shapes": [ { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 840.4395031422582, "x1": 840.4395031422582, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 925.2192705531843, "x1": 925.2192705531843, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 1168.2113212093552, "x1": 1168.2113212093552, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 1741.685572018549, "x1": 1741.685572018549, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 2122.7368569957525, "x1": 2122.7368569957525, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 2364.579752964712, "x1": 2364.579752964712, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 2547.543141403398, "x1": 2547.543141403398, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 2637.1095897460923, "x1": 2637.1095897460923, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 2925.3814319017774, "x1": 2925.3814319017774, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 3499.034858626689, "x1": 3499.034858626689, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 3638.214025589213, "x1": 3638.214025589213, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 3781.746397745988, "x1": 3781.746397745988, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 4025.864180125063, "x1": 4025.864180125063, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 4156.471023673764, "x1": 4156.471023673764, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 4203.509638553514, "x1": 4203.509638553514, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" }, { "fillcolor": "gray", "line": { "dash": "dash" }, "opacity": 0.2, "type": "line", "x0": 4371.906121536575, "x1": 4371.906121536575, "xref": "x", "y0": 0, "y1": 1, "yref": "y domain" } ], "template": { "data": { "bar": [ { "error_x": { "color": "#f2f5fa" }, "error_y": { "color": "#f2f5fa" }, "marker": { "line": { "color": "rgb(17,17,17)", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "rgb(17,17,17)", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#A2B1C6", "gridcolor": "#506784", "linecolor": "#506784", "minorgridcolor": "#506784", "startlinecolor": "#A2B1C6" }, "baxis": { "endlinecolor": "#A2B1C6", "gridcolor": "#506784", "linecolor": "#506784", "minorgridcolor": "#506784", "startlinecolor": "#A2B1C6" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "line": { "color": "#283442" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "line": { "color": "#283442" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#506784" }, "line": { "color": "rgb(17,17,17)" } }, "header": { "fill": { "color": "#2a3f5f" }, "line": { "color": "rgb(17,17,17)" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#f2f5fa", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#f2f5fa" }, "geo": { "bgcolor": "rgb(17,17,17)", "lakecolor": "rgb(17,17,17)", "landcolor": "rgb(17,17,17)", "showlakes": true, "showland": true, "subunitcolor": "#506784" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "dark" }, "paper_bgcolor": "rgb(17,17,17)", "plot_bgcolor": "rgb(17,17,17)", "polar": { "angularaxis": { "gridcolor": "#506784", "linecolor": "#506784", "ticks": "" }, "bgcolor": "rgb(17,17,17)", "radialaxis": { "gridcolor": "#506784", "linecolor": "#506784", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "rgb(17,17,17)", "gridcolor": "#506784", "gridwidth": 2, "linecolor": "#506784", "showbackground": true, "ticks": "", "zerolinecolor": "#C8D4E3" }, "yaxis": { "backgroundcolor": "rgb(17,17,17)", "gridcolor": "#506784", "gridwidth": 2, "linecolor": "#506784", "showbackground": true, "ticks": "", "zerolinecolor": "#C8D4E3" }, "zaxis": { "backgroundcolor": "rgb(17,17,17)", "gridcolor": "#506784", "gridwidth": 2, "linecolor": "#506784", "showbackground": true, "ticks": "", "zerolinecolor": "#C8D4E3" } }, "shapedefaults": { "line": { "color": "#f2f5fa" } }, "sliderdefaults": { "bgcolor": "#C8D4E3", "bordercolor": "rgb(17,17,17)", "borderwidth": 1, "tickwidth": 0 }, "ternary": { "aaxis": { "gridcolor": "#506784", "linecolor": "#506784", "ticks": "" }, "baxis": { "gridcolor": "#506784", "linecolor": "#506784", "ticks": "" }, "bgcolor": "rgb(17,17,17)", "caxis": { "gridcolor": "#506784", "linecolor": "#506784", "ticks": "" } }, "title": { "x": 0.05 }, "updatemenudefaults": { "bgcolor": "#506784", "borderwidth": 0 }, "xaxis": { "automargin": true, "gridcolor": "#283442", "linecolor": "#506784", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#283442", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "#283442", "linecolor": "#506784", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "#283442", "zerolinewidth": 2 } } }, "title": { "text": "Test" }, "xaxis": { "anchor": "y", "domain": [ 0, 1 ], "title": { "text": "Distance in meters" } }, "yaxis": { "anchor": "x", "domain": [ 0, 1 ], "title": { "text": "Speed in km/h" } } } } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fastest_lap = session.laps.pick_fastest()\n", "car_data = fastest_lap.get_car_data().add_distance()\n", "\n", "circuit_info = session.get_circuit_info()\n", "\n", "\n", "fastest_lap = session.laps.pick_driver(\n", " 'VER').pick_fastest().get_car_data().add_distance()\n", "# print(fastest_lap.keys())\n", "fastest_lap = fastest_lap[['Distance', 'Speed']]\n", "fastest_lap['Driver'] = session.get_driver('VER')['BroadcastName']\n", "\n", "circuit_info = session.get_circuit_info()\n", "\n", "\n", "fig = px.line(fastest_lap, x=\"Distance\", y=\"Speed\", color=\"Driver\", title=\"Test\", template=\"plotly_dark\",\n", " labels=dict(Speed='Speed in km/h', Distance='Distance in meters'))\n", "\n", "for _, corner in circuit_info.corners.iterrows():\n", " txt = f\"{corner['Number']}{corner['Letter']}\"\n", " fig.add_vline(x=corner['Distance'], line_dash=\"dash\", annotation=dict(\n", " text=txt), fillcolor=\"gray\", opacity=0.2)\n", "fig.show()\n", "\n", "# print(fastest_lap)" ] }, { "cell_type": "code", "execution_count": 6, "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", "
DistanceSpeedDriver
40811.260000196M VERSTAPPEN
41823.541944185M VERSTAPPEN
42835.341944177M VERSTAPPEN
43846.808611172M VERSTAPPEN
44857.808611165M VERSTAPPEN
45868.875278166M VERSTAPPEN
46880.075278168M VERSTAPPEN
\n", "
" ], "text/plain": [ " Distance Speed Driver\n", "40 811.260000 196 M VERSTAPPEN\n", "41 823.541944 185 M VERSTAPPEN\n", "42 835.341944 177 M VERSTAPPEN\n", "43 846.808611 172 M VERSTAPPEN\n", "44 857.808611 165 M VERSTAPPEN\n", "45 868.875278 166 M VERSTAPPEN\n", "46 880.075278 168 M VERSTAPPEN" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fastest_lap.loc[(fastest_lap['Distance'] > 800) &\n", " (fastest_lap['Distance'] < 890)]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "core WARNING \tFailed to preserve data type for column 'X' while merging telemetry.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING:fastf1.fastf1.core:Failed to preserve data type for column 'X' while merging telemetry.\n", "Failed to preserve data type for column 'X' while merging telemetry.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "core WARNING \tFailed to preserve data type for column 'Y' while merging telemetry.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING:fastf1.fastf1.core:Failed to preserve data type for column 'Y' while merging telemetry.\n", "Failed to preserve data type for column 'Y' while merging telemetry.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "core WARNING \tFailed to preserve data type for column 'Z' while merging telemetry.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "WARNING:fastf1.fastf1.core:Failed to preserve data type for column 'Z' while merging telemetry.\n", "Failed to preserve data type for column 'Z' while merging telemetry.\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA9QAAAIiCAYAAAApaIA0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAACtBklEQVR4nOzdd1RU1/7+8YcuooJdVOxGRQWk2BXsRuwVkGLvhRhL1GhM1Ng1GmOJJSAi2DXYC4oKKiAo9o4duyC9zPn98b3hd+eiRpGZfWbmea01C+9ad539TpYaPpx99tGTJEkCEREREREREX0RfdEBRERERERERJqIAzURERERERFRPnCgJiIiIiIiIsoHDtRERERERERE+cCBmoiIiIiIiCgfOFATERERERER5QMHaiIiIiIiIqJ84EBNRERERERElA8cqImIiIiIiIjygQM1ERERERERUT5woCYiIiIiIiLKBw7URERERERERPnAgZqIiIiIiIgoHzhQExEREREREeUDB2oiIiIiIiKifOBATURERERERJQPHKiJiIiIiIiI8oEDNREREREREVE+cKAmIiIiIiIiygcO1ERERERERET5wIGaiIiIiIiIKB8MRQcQERERERWEtLQ0PH/+HAkJCXm+vn37FllZWTA0NISRkVGej7m5OcqUKYMKFSqgdu3aqFatGoyMjET/IxGRzHGgJiIiIiKN8vLlS8TExCA2NhYxMTG4fv06Hj58iKSkpAJbw9DQEDVq1ECdOnVQu3Zt1K5dGw0bNkStWrWgp6dXYOsQkWbTkyRJEh1BRERERPQhjx8/RkxMjNIA/fjxY2E9pUqVQvPmzdG+fXt07twZVlZWwlqISDwO1EREREQkG0lJSThx4gSOHDmCI0eO4M6dO6KTPsnOzg5dunRB165dYW9vD319HlFEpEs4UBMRERGRMDk5OYiOjs4doM+ePYucnBzRWfliaWmJzp07o0uXLmjbti1MTU1FJxGRinGgJiIiIiK1SkxMxP79+7Fnzx4cPXoU7969E51U4MzNzeHu7o6BAwfCycmJz10TaSkO1ERERESkci9fvsTevXuxa9cuHDt2DFlZWaKT1KZu3boYOHAgPD09UbZsWdE5RFSAOFATERERkUo8evQIu3fvxq5du3D69GkoFArRSUIZGhqie/fuGDVqFFxcXHjXmkgLcKAmIiIi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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "lap = session.laps.pick_driver(\"VER\").pick_fastest()\n", "telemetry = lap.telemetry\n", "telemetry.loc[(telemetry['Distance'] > 800) & (telemetry['Distance'] < 890)]\n", "# x = lap.telemetry['X']\n", "# y = lap.telemetry['Y']\n", "\n", "fig, ax = plt.subplots(sharex=True, sharey=True, figsize=(12, 6.75))\n", "\n", "# Adjust margins and turn of axis\n", "plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.12)\n", "ax.axis('off')\n", "\n", "\n", "# After this, we plot the data itself.\n", "# Create background track line\n", "ax.plot(telemetry['X'], telemetry['Y'],\n", " color='black', linestyle='-', linewidth=16, zorder=0)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "foo = telemetry.loc[(telemetry['Distance'] > 800) &\n", " (telemetry['Distance'] < 890)]" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "VER", "type": "scatter", "x": [ -3436, -3493.743485461971, -3521, -3587.6818046813873, -3608, -3683.698194465908, -3696, -3778.530471415178, -3783, -3877, -3881.0753786607042, -3981, -3995.0046825776035, -4088, -4112.065451169896, -4197 ], "y": [ -7083, -7135.176121264446, -7157, -7202.919570886845, -7215, -7252.8297721384115, -7258, -7284.186280849798, -7285, -7289, -7288.761155470017, -7275, -7271.8588176138, -7244, -7235.086561725293, -7200 ] } ], "layout": { "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } } } } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import plotly.graph_objects as go\n", "data = [\n", " go.Scatter(x=foo[\"X\"], y=foo[\"Y\"],\n", " name='VER'),\n", "\n", "]\n", "fig = go.Figure(data=data)\n", "# fig.show()\n", "\n", "# fig = px.line(foo, x=\"X\", y=\"Y\")\n", "\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "VER", "type": "scatter", "x": [ -3436, -3493.743485461971, -3521, -3587.6818046813873, -3608, -3683.698194465908, -3696, -3778.530471415178, -3783, -3877, -3881.0753786607042, -3981, -3995.0046825776035, -4088, -4112.065451169896, -4197 ], "y": [ -7083, -7135.176121264446, -7157, -7202.919570886845, -7215, -7252.8297721384115, -7258, -7284.186280849798, -7285, -7289, -7288.761155470017, -7275, -7271.8588176138, -7244, -7235.086561725293, -7200 ] }, { "name": "HAM", "type": "scatter", "x": [ -3433, -3482, -3522, -3565, -3614, -3649, -3706, -3733, -3796, -3817, -3898, -3912, -4009, -4014, -4120, -4124 ], "y": [ -7080, -7124, -7156, -7187, -7218, -7237, -7261, -7271, -7285, -7288, -7286, -7285, -7267, -7266, -7231, -7229 ] } ], "layout": { "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } } } } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ham_lap = session.laps.pick_driver(\"HAM\").pick_fastest()\n", "ham_telemetry = ham_lap.telemetry\n", "ham_telemetry_foo = ham_telemetry.loc[(ham_telemetry['Distance'] > 800) &\n", " (ham_telemetry['Distance'] < 890)]\n", "\n", "data = [\n", " go.Scatter(x=foo[\"X\"], y=foo[\"Y\"],\n", " name='VER'),\n", " go.Scatter(x=ham_telemetry_foo[\"X\"], y=ham_telemetry_foo[\"Y\"],\n", " name='HAM'),\n", "\n", "]\n", "fig = go.Figure(data=data)\n", "# fig.show()\n", "\n", "# fig = px.line(foo, x=\"X\", y=\"Y\")\n", "\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "VER", "type": "scatter", "x": [ 803.307531068644, 811.4174999999999, 815.0904816322574, 823.6994444444443, 826.243882035335, 835.4994444444443, 837.000632094838, 846.966111111111, 847.4790644319326, 857.553962070139, 857.966111111111, 867.6921768066787, 869.0327777777777, 877.9015312942564, 880.2327777777778, 888.6222079929092 ], "y": [ 201, 196, 190, 185, 181, 177, 174, 172, 169, 167, 165, 165, 166, 167, 168, 173 ] }, { "name": "HAM", "type": "scatter", "x": [ 802.2861111111109, 809.0286752785504, 814.486111111111, 819.8584565225278, 825.9527777777776, 830.218732935272, 837.1527777777776, 840.4395031422582, 848.1527777777776, 850.4204524354666, 858.6861111111109, 860.052794913408, 869.4194444444443, 869.8763413790252, 880.1431493159366, 880.6194444444443 ], "y": [ 193, 188, 183, 177, 172, 170, 168, 166, 165, 161, 158, 159, 161, 163, 165, 168 ] } ], "layout": { "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } } } } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "data = [\n", " go.Scatter(x=foo[\"Distance\"], y=foo[\"Speed\"],\n", " name='VER'),\n", " go.Scatter(x=ham_telemetry_foo[\"Distance\"], y=ham_telemetry_foo[\"Speed\"],\n", " name='HAM'),\n", "\n", "]\n", "fig = go.Figure(data=data)\n", "# fig.show()\n", "\n", "# fig = px.line(foo, x=\"X\", y=\"Y\")\n", "\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": 12, "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", "
XYNumberLetterAngleDistance
0-3728.050293-7258.6728521-73.417940840.439503
1-4538.213867-7090.668945282.427713925.219271
2-6846.687012-7532.8237303-123.5215611168.211321
3-5053.705078-3172.251709461.7467051741.685572
4-5760.503418-6343.9653325-151.4674562122.736857
5-3511.338623-5588.6518556-48.1794592364.579753
6-2657.036865-4195.921875714.8586532547.543141
7-3287.300781-3536.3696298-147.3540202637.109590
8-3938.748047-911.7788709155.8211482925.381432
9869.1649171933.0930181013.7368243499.034859
10-326.2638852196.59643611-62.8993643638.214026
11-1556.8873292107.83105512-152.4205403781.746398
12-170.4140623724.0000001389.8882034025.864180
13883.0264893076.24169914-89.0132424156.471024
141272.7481693302.8752441587.9487134203.509639
152294.9897462150.140137161.0370184371.906122
\n", "
" ], "text/plain": [ " X Y Number Letter Angle Distance\n", "0 -3728.050293 -7258.672852 1 -73.417940 840.439503\n", "1 -4538.213867 -7090.668945 2 82.427713 925.219271\n", "2 -6846.687012 -7532.823730 3 -123.521561 1168.211321\n", "3 -5053.705078 -3172.251709 4 61.746705 1741.685572\n", "4 -5760.503418 -6343.965332 5 -151.467456 2122.736857\n", "5 -3511.338623 -5588.651855 6 -48.179459 2364.579753\n", "6 -2657.036865 -4195.921875 7 14.858653 2547.543141\n", "7 -3287.300781 -3536.369629 8 -147.354020 2637.109590\n", "8 -3938.748047 -911.778870 9 155.821148 2925.381432\n", "9 869.164917 1933.093018 10 13.736824 3499.034859\n", "10 -326.263885 2196.596436 11 -62.899364 3638.214026\n", "11 -1556.887329 2107.831055 12 -152.420540 3781.746398\n", "12 -170.414062 3724.000000 13 89.888203 4025.864180\n", "13 883.026489 3076.241699 14 -89.013242 4156.471024\n", "14 1272.748169 3302.875244 15 87.948713 4203.509639\n", "15 2294.989746 2150.140137 16 1.037018 4371.906122" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "circuit_info.corners" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "name": "ver sector 1", "type": "scatter", "x": [ 0.1526650582852524, 4.2658333333333385, 8.381643835262555, 23.66583333333334, 26.179838328669724, 43.19916666666667, 44.09964123165262, 62.19129537122707, 62.932500000000005, 80.33003750545197, 82.73249999999999, 98.64067909390006, 102.73249999999999, 117.02389791687678, 122.79916666666668, 135.4589896819038, 142.9325, 153.94796889859393, 159.85, 172.5467164415138, 180.18333333333334, 191.22594013654495, 200.58333333333331, 209.95539297590526, 221.05, 228.7424433250737, 241.58333333333331, 247.58390487071085, 265.6166666666667, 266.4765507173787, 285.42107719876867, 286.1972222222222, 304.4211416279263, 306.9305555555555, 323.4834689860842, 327.7305555555555, 342.5450395780867, 348.5305555555555, 361.65689728234963, 369.3972222222222, 380.78212077595055, 390.2638888888888, 399.9408399240232, 411.19722222222214, 419.13205680686485, 432.1305555555555, 438.3375630807045, 453.1305555555555, 457.59235790041953, 474.1305555555554, 476.84804191737294, 495.1972222222221, 496.0752499792953, 515.3861842920229, 516.2638888888888, 534.6960489649971, 540.8416666666666, 552.3458520556237, 561.9083333333332, 571.627093868598, 582.9083333333332, 590.865673880295, 607.4083333333332, 610.1272700797855, 628.4749999999999, 629.4390535325988, 648.6873535280303, 649.4749999999998, 667.9441221686442, 670.4749999999998, 687.0836318289588, 691.3416666666665, 706.2140020417718, 712.2083333333331, 725.3131453606624, 729.6841666666666, 744.6332146213789, 750.4174999999998, 761.6251714576442, 768.0174999999998, 777.2193158664428, 784.5508333333331, 791.129145918363, 798.3508333333332, 803.307531068644, 811.4174999999999, 815.0904816322574, 823.6994444444443, 826.243882035335, 835.4994444444443, 837.000632094838, 846.966111111111, 847.4790644319326, 857.553962070139, 857.966111111111, 867.6921768066787, 869.0327777777777, 877.9015312942564, 880.2327777777778, 888.6222079929092, 892.0994444444444, 899.8706418204189, 904.5661111111111, 911.6427819182951, 917.6327777777778, 923.7892901561377, 931.0327777777777, 936.2123206455755, 944.8327777777777, 948.9515941647893, 959.0994444444443, 962.1056529259885, 973.6327777777776, 975.4737204404055, 987.9381582627874, 988.4994444444443, 1001.7310029354595, 1003.566111111111, 1015.7816757456251, 1018.966111111111, 1030.25292754613, 1034.8327777777777, 1044.846531723532, 1050.7661111111108, 1059.5241765044132, 1066.8327777777774, 1074.2799686699916, 1082.9661111111109, 1089.132755782155, 1099.2994444444441, 1104.174075414123, 1115.9016666666664, 1119.3559139997092, 1132.5016666666663, 1134.581174733455, 1149.168333333333, 1149.864280327916, 1165.2033105074545, 1165.9016666666664, 1180.5951832341598, 1182.7016666666664, 1196.0953245397402, 1199.6349999999998, 1211.7148453248317, 1216.7016666666664, 1227.4039508289347, 1233.7636111111108, 1243.136790239292, 1253.8302777777776, 1258.9440960684997, 1271.1636111111109, 1274.8640942922875, 1288.6302777777778, 1290.8962601337284, 1306.2302777777777, 1307.0398752869862, 1323.2950663579534, 1323.9636111111108, 1339.7214485809288, 1341.8969444444442, 1356.2700479148682, 1359.9636111111108, 1372.8668871078155, 1378.0969444444443, 1389.6101189366907, 1396.4302777777775, 1406.4292461970342, 1414.8969444444444, 1423.34960513272, 1433.363611111111, 1440.3441859374805, 1452.0302777777777, 1456.003921806699, 1470.7636111111108, 1473.199180002193, 1489.696944444444, 1490.564926635099, 1507.9182077997696, 1508.6302777777773, 1525.3884244387339, 1527.696944444444, 1542.9196237684455, 1546.8302777777774, 1560.4977032713455, 1566.0302777777772, 1578.1830655590484, 1585.3636111111107, 1595.9458704312267 ], "y": [ 289, 290, 290, 291, 292, 293, 294, 295, 296, 296, 297, 298, 300, 300, 301, 301, 302, 302, 303, 304, 305, 305, 306, 306, 307, 307, 308, 308, 309, 309, 309, 310, 310, 311, 311, 312, 312, 312, 312, 313, 313, 313, 313, 314, 314, 314, 314, 315, 315, 315, 315, 316, 316, 316, 316, 316, 316, 316, 316, 315, 315, 315, 315, 315, 316, 315, 315, 315, 315, 315, 314, 313, 313, 313, 313, 313, 312, 311, 287, 264, 256, 248, 227, 207, 201, 196, 190, 185, 181, 177, 174, 172, 169, 167, 165, 165, 166, 167, 168, 173, 178, 182, 187, 191, 196, 198, 201, 204, 207, 210, 214, 216, 218, 219, 221, 223, 224, 226, 228, 231, 234, 238, 238, 239, 240, 241, 241, 242, 243, 245, 246, 248, 248, 249, 249, 250, 250, 250, 251, 251, 252, 253, 254, 255, 256, 256, 257, 257, 258, 259, 260, 261, 262, 263, 264, 264, 265, 266, 267, 269, 270, 271, 271, 272, 273, 275, 276, 277, 277, 277, 278, 280, 280, 281, 282, 284, 284, 284, 284, 285, 286, 286, 287, 287, 288, 289, 290, 290 ] }, { "name": "ham sector 1", "type": "scatter", "x": [ -0.014979930006654204, 2.4661489187907564, 16.05555555555555, 20.177516172689387, 32.358888888888885, 38.074541155802955, 52.02555555555555, 56.142234495347736, 71.82555555555555, 74.30428131002701, 91.69222222222221, 92.52381701735133, 110.90825734825324, 115.10333333333332, 129.4023740848032, 135.3033333333333, 147.96959496636896, 155.48555555555552, 166.5372198765811, 175.7522222222222, 185.1778281269208, 196.15222222222218, 203.88310627042213, 216.5522222222222, 222.6127307101862, 237.08555555555552, 241.458817595063, 257.68555555555554, 260.35013406938873, 278.35222222222217, 279.30291310883274, 298.37177484579064, 299.1522222222222, 317.43973786715844, 319.95222222222213, 336.50052054957405, 340.75222222222214, 355.61824575732476, 361.6188888888888, 374.65623360475115, 382.48555555555544, 393.81466145834554, 403.4188888888888, 413.03932460094705, 424.4188888888888, 430.63261650461897, 445.4188888888888, 449.8796938990168, 466.4188888888888, 469.13650104699906, 487.4855555555554, 488.45136110123116, 507.76226751107407, 508.55222222222204, 527.073297398174, 529.6188888888887, 546.3846082877468, 550.6855555555554, 565.6945275566444, 571.752222222222, 585.0128880711139, 592.8188888888888, 604.2844932827134, 610.4063888888888, 623.5251762535806, 631.4063888888887, 642.8124611623931, 652.4730555555554, 662.1334797893137, 673.5397222222222, 681.4220319154987, 694.539722222222, 700.6571043620428, 719.0397222222222, 719.9191264648813, 739.0703724019365, 739.8194444444443, 756.3568161134808, 758.486111111111, 771.696453649648, 774.886111111111, 785.4287552862936, 789.4194444444443, 797.6310538452315, 802.2861111111109, 809.0286752785504, 814.486111111111, 819.8584565225278, 825.9527777777776, 830.218732935272, 837.1527777777776, 840.4395031422582, 848.1527777777776, 850.4204524354666, 858.6861111111109, 860.052794913408, 869.4194444444443, 869.8763413790252, 880.1431493159366, 880.6194444444443, 890.8365792127481, 894.386111111111, 901.2632039421019, 907.1194444444443, 913.1297273421529, 920.186111111111, 925.2192705531843, 935.8194444444443, 937.5770356723305, 949.5527777777777, 950.1879846591871, 963.019801311909, 963.5527777777777, 976.2487946328608, 978.0194444444444, 989.821161495745, 992.8861111111111, 1003.6935120509214, 1008.0861111111111, 1017.749646487468, 1020.983611111111, 1032.1398397033706, 1036.783611111111, 1046.805357374465, 1052.8502777777776, 1061.6107162027513, 1069.0502777777776, 1076.514714556757, 1085.383611111111, 1091.5648790287878, 1101.9169444444442, 1106.7538931813447, 1118.4477777777774, 1121.9822816796268, 1135.1144444444442, 1137.2763494461171, 1151.9144444444441, 1152.6878997105641, 1168.2113212093552, 1168.8477777777775, 1183.7913491379684, 1185.8477777777775, 1199.4147573417727, 1202.9144444444444, 1215.2062806523202, 1220.181111111111, 1231.075328621803, 1237.5144444444445, 1247.0290834655866, 1254.981111111111, 1263.1134542998825, 1272.581111111111, 1279.2505620601933, 1290.181111111111, 1295.3371086974767, 1307.9144444444446, 1311.6278301196853, 1325.7811111111112, 1328.017857260911, 1343.0383385957937, 1343.7144444444443, 1359.652659214312, 1361.8477777777778, 1376.3172048225454, 1380.0477777777776, 1393.1473532941122, 1398.4477777777777, 1410.0527581803676, 1416.9144444444441, 1427.060188254448, 1435.5144444444443, 1444.1120886558615, 1454.1144444444442, 1461.1959629596975, 1472.8477777777778, 1478.4315891070419, 1491.86, 1495.81436246971, 1510.8599999999997, 1513.2395141984766, 1529.9266666666663, 1530.7225822139694, 1548.261470908613, 1549.0599999999997, 1565.8561852263472, 1568.2599999999995, 1583.5087713483554, 1587.5266666666664 ], "y": [ 289, 289, 289, 290, 292, 293, 295, 296, 297, 297, 298, 299, 300, 301, 302, 303, 303, 304, 304, 304, 305, 306, 306, 306, 307, 308, 308, 309, 309, 310, 310, 311, 312, 312, 312, 312, 312, 312, 313, 313, 313, 313, 314, 314, 315, 315, 315, 315, 315, 315, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 316, 315, 315, 315, 315, 315, 316, 316, 316, 315, 315, 315, 315, 314, 313, 313, 296, 280, 263, 246, 232, 218, 205, 193, 188, 183, 177, 172, 170, 168, 166, 165, 161, 158, 159, 161, 163, 165, 168, 172, 177, 184, 191, 193, 196, 198, 201, 203, 206, 207, 208, 210, 213, 217, 220, 223, 225, 228, 229, 231, 234, 237, 239, 241, 242, 243, 244, 245, 246, 248, 248, 249, 249, 250, 251, 252, 252, 253, 254, 254, 255, 255, 256, 257, 259, 259, 260, 261, 262, 263, 264, 264, 264, 265, 266, 267, 268, 268, 268, 269, 270, 272, 272, 273, 274, 276, 276, 277, 278, 279, 279, 279, 280, 281, 282, 284, 284, 285, 285, 286, 286, 286, 287, 287, 288, 288, 289 ] } ], "layout": { "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } } } } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ver_sector1 = telemetry.loc[(telemetry['Distance'] < 1600)]\n", "ham_sector1 = ham_telemetry.loc[(ham_telemetry['Distance'] < 1600)]\n", "\n", "data = [\n", " go.Scatter(x=ver_sector1[\"Distance\"], y=ver_sector1[\"Speed\"],\n", " name='ver sector 1'),\n", " go.Scatter(x=ham_sector1[\"Distance\"], y=ham_sector1[\"Speed\"],\n", " name='ham sector 1'),\n", "]\n", "fig = go.Figure(data=data)\n", "# fig.show()\n", "\n", "# fig = px.line(foo, x=\"X\", y=\"Y\")\n", "\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "188" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(ver_sector1)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Date', 'SessionTime', 'DriverAhead', 'DistanceToDriverAhead', 'Time',\n", " 'RPM', 'Speed', 'nGear', 'Throttle', 'Brake', 'DRS', 'Source',\n", " 'Distance', 'RelativeDistance', 'Status', 'X', 'Y', 'Z'],\n", " dtype='object')" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ver_sector1.keys()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hamilton Sector 1 Time: 21.798 seconds\n", "Verstappen Sector 1 Time: 21.759 seconds\n" ] } ], "source": [ "print(f\"Hamilton Sector 1 Time: {\n", " ham_lap['Sector1Time'].total_seconds():.3f} seconds\")\n", "print(f\"Verstappen Sector 1 Time: {\n", " lap['Sector1Time'].total_seconds():.3f} seconds\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now using the LlamaIndex" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting llama-index\n", " Downloading llama_index-0.10.43-py3-none-any.whl.metadata (11 kB)\n", "Collecting llama-index-experimental\n", " Downloading llama_index_experimental-0.1.3-py3-none-any.whl.metadata (814 bytes)\n", "Collecting llama-index-agent-openai<0.3.0,>=0.1.4 (from llama-index)\n", " Downloading llama_index_agent_openai-0.2.7-py3-none-any.whl.metadata (678 bytes)\n", "Collecting llama-index-cli<0.2.0,>=0.1.2 (from llama-index)\n", " Downloading llama_index_cli-0.1.12-py3-none-any.whl.metadata (1.5 kB)\n", "Collecting llama-index-core==0.10.43 (from llama-index)\n", " Downloading llama_index_core-0.10.43-py3-none-any.whl.metadata (2.4 kB)\n", "Collecting llama-index-embeddings-openai<0.2.0,>=0.1.5 (from llama-index)\n", " Downloading llama_index_embeddings_openai-0.1.10-py3-none-any.whl.metadata (604 bytes)\n", "Collecting llama-index-indices-managed-llama-cloud<0.2.0,>=0.1.2 (from llama-index)\n", " Downloading llama_index_indices_managed_llama_cloud-0.1.6-py3-none-any.whl.metadata (3.8 kB)\n", "Collecting llama-index-legacy<0.10.0,>=0.9.48 (from llama-index)\n", " Downloading llama_index_legacy-0.9.48-py3-none-any.whl.metadata (8.5 kB)\n", "Collecting llama-index-llms-openai<0.2.0,>=0.1.13 (from llama-index)\n", " Downloading llama_index_llms_openai-0.1.22-py3-none-any.whl.metadata (559 bytes)\n", "Collecting llama-index-multi-modal-llms-openai<0.2.0,>=0.1.3 (from llama-index)\n", " Downloading llama_index_multi_modal_llms_openai-0.1.6-py3-none-any.whl.metadata (677 bytes)\n", "Collecting llama-index-program-openai<0.2.0,>=0.1.3 (from llama-index)\n", " Downloading llama_index_program_openai-0.1.6-py3-none-any.whl.metadata (715 bytes)\n", "Collecting llama-index-question-gen-openai<0.2.0,>=0.1.2 (from llama-index)\n", " Downloading llama_index_question_gen_openai-0.1.3-py3-none-any.whl.metadata (785 bytes)\n", "Collecting llama-index-readers-file<0.2.0,>=0.1.4 (from llama-index)\n", " Downloading llama_index_readers_file-0.1.23-py3-none-any.whl.metadata (5.4 kB)\n", "Collecting llama-index-readers-llama-parse<0.2.0,>=0.1.2 (from llama-index)\n", " Downloading llama_index_readers_llama_parse-0.1.4-py3-none-any.whl.metadata (3.5 kB)\n", "Requirement already satisfied: PyYAML>=6.0.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (6.0.1)\n", "Requirement already satisfied: SQLAlchemy>=1.4.49 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from SQLAlchemy[asyncio]>=1.4.49->llama-index-core==0.10.43->llama-index) (2.0.30)\n", "Requirement already satisfied: aiohttp<4.0.0,>=3.8.6 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (3.9.5)\n", "Requirement already satisfied: dataclasses-json in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (0.6.6)\n", "Requirement already satisfied: deprecated>=1.2.9.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (1.2.14)\n", "Collecting dirtyjson<2.0.0,>=1.0.8 (from llama-index-core==0.10.43->llama-index)\n", " Downloading dirtyjson-1.0.8-py3-none-any.whl.metadata (11 kB)\n", "Requirement already satisfied: fsspec>=2023.5.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (2024.5.0)\n", "Requirement already satisfied: httpx in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (0.27.0)\n", "Collecting llamaindex-py-client<0.2.0,>=0.1.18 (from llama-index-core==0.10.43->llama-index)\n", " Downloading llamaindex_py_client-0.1.19-py3-none-any.whl.metadata (760 bytes)\n", "Requirement already satisfied: nest-asyncio<2.0.0,>=1.5.8 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (1.6.0)\n", "Collecting networkx>=3.0 (from llama-index-core==0.10.43->llama-index)\n", " Downloading networkx-3.3-py3-none-any.whl.metadata (5.1 kB)\n", "Collecting nltk<4.0.0,>=3.8.1 (from llama-index-core==0.10.43->llama-index)\n", " Downloading nltk-3.8.1-py3-none-any.whl.metadata (2.8 kB)\n", "Requirement already satisfied: numpy in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (1.26.4)\n", "Requirement already satisfied: openai>=1.1.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (1.30.4)\n", "Requirement already satisfied: pandas in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (2.2.2)\n", "Requirement already satisfied: pillow>=9.0.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (10.3.0)\n", "Requirement already satisfied: requests>=2.31.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (2.31.0)\n", "Requirement already satisfied: tenacity<9.0.0,>=8.2.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (8.3.0)\n", "Requirement already satisfied: tiktoken>=0.3.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (0.5.2)\n", "Requirement already satisfied: tqdm<5.0.0,>=4.66.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (4.66.4)\n", "Requirement already satisfied: typing-extensions>=4.5.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (4.11.0)\n", "Requirement already satisfied: typing-inspect>=0.8.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (0.9.0)\n", "Requirement already satisfied: wrapt in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (1.14.1)\n", "Requirement already satisfied: beautifulsoup4<5.0.0,>=4.12.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-readers-file<0.2.0,>=0.1.4->llama-index) (4.12.3)\n", "Collecting pypdf<5.0.0,>=4.0.1 (from llama-index-readers-file<0.2.0,>=0.1.4->llama-index)\n", " Downloading pypdf-4.2.0-py3-none-any.whl.metadata (7.4 kB)\n", "Collecting striprtf<0.0.27,>=0.0.26 (from llama-index-readers-file<0.2.0,>=0.1.4->llama-index)\n", " Downloading striprtf-0.0.26-py3-none-any.whl.metadata (2.1 kB)\n", "Collecting llama-parse<0.5.0,>=0.4.0 (from llama-index-readers-llama-parse<0.2.0,>=0.1.2->llama-index)\n", " Downloading llama_parse-0.4.4-py3-none-any.whl.metadata (3.5 kB)\n", "Requirement already satisfied: aiosignal>=1.1.2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core==0.10.43->llama-index) (1.3.1)\n", "Requirement already satisfied: attrs>=17.3.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core==0.10.43->llama-index) (23.2.0)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core==0.10.43->llama-index) (1.4.1)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core==0.10.43->llama-index) (6.0.5)\n", "Requirement already satisfied: yarl<2.0,>=1.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core==0.10.43->llama-index) (1.9.4)\n", "Requirement already satisfied: soupsieve>1.2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from beautifulsoup4<5.0.0,>=4.12.3->llama-index-readers-file<0.2.0,>=0.1.4->llama-index) (2.5)\n", "Requirement already satisfied: pydantic>=1.10 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llamaindex-py-client<0.2.0,>=0.1.18->llama-index-core==0.10.43->llama-index) (2.7.2)\n", "Requirement already satisfied: anyio in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core==0.10.43->llama-index) (4.3.0)\n", "Requirement already satisfied: certifi in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core==0.10.43->llama-index) (2024.2.2)\n", "Requirement already satisfied: httpcore==1.* in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core==0.10.43->llama-index) (1.0.5)\n", "Requirement already satisfied: idna in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core==0.10.43->llama-index) (3.6)\n", "Requirement already satisfied: sniffio in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core==0.10.43->llama-index) (1.3.1)\n", "Requirement already satisfied: h11<0.15,>=0.13 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpcore==1.*->httpx->llama-index-core==0.10.43->llama-index) (0.14.0)\n", "Requirement already satisfied: click in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from nltk<4.0.0,>=3.8.1->llama-index-core==0.10.43->llama-index) (8.1.7)\n", "Requirement already satisfied: joblib in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from nltk<4.0.0,>=3.8.1->llama-index-core==0.10.43->llama-index) (1.4.0)\n", "Requirement already satisfied: regex>=2021.8.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from nltk<4.0.0,>=3.8.1->llama-index-core==0.10.43->llama-index) (2023.12.25)\n", "Requirement already satisfied: distro<2,>=1.7.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from openai>=1.1.0->llama-index-core==0.10.43->llama-index) (1.9.0)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from requests>=2.31.0->llama-index-core==0.10.43->llama-index) (3.3.2)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from requests>=2.31.0->llama-index-core==0.10.43->llama-index) (2.2.1)\n", "Collecting greenlet!=0.4.17 (from SQLAlchemy[asyncio]>=1.4.49->llama-index-core==0.10.43->llama-index)\n", " Downloading greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl.metadata (3.8 kB)\n", "Requirement already satisfied: mypy-extensions>=0.3.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from typing-inspect>=0.8.0->llama-index-core==0.10.43->llama-index) (1.0.0)\n", "Requirement already satisfied: marshmallow<4.0.0,>=3.18.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from dataclasses-json->llama-index-core==0.10.43->llama-index) (3.21.2)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pandas->llama-index-core==0.10.43->llama-index) (2.9.0)\n", "Requirement already satisfied: pytz>=2020.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pandas->llama-index-core==0.10.43->llama-index) (2024.1)\n", "Requirement already satisfied: tzdata>=2022.7 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pandas->llama-index-core==0.10.43->llama-index) (2024.1)\n", "Requirement already satisfied: packaging>=17.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from marshmallow<4.0.0,>=3.18.0->dataclasses-json->llama-index-core==0.10.43->llama-index) (23.2)\n", "Requirement already satisfied: annotated-types>=0.4.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pydantic>=1.10->llamaindex-py-client<0.2.0,>=0.1.18->llama-index-core==0.10.43->llama-index) (0.7.0)\n", "Requirement already satisfied: pydantic-core==2.18.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pydantic>=1.10->llamaindex-py-client<0.2.0,>=0.1.18->llama-index-core==0.10.43->llama-index) (2.18.3)\n", "Requirement already satisfied: six>=1.5 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas->llama-index-core==0.10.43->llama-index) (1.16.0)\n", "Downloading llama_index-0.10.43-py3-none-any.whl (6.8 kB)\n", "Downloading llama_index_core-0.10.43-py3-none-any.whl (15.4 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m15.4/15.4 MB\u001b[0m \u001b[31m6.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0mm\n", "\u001b[?25hDownloading llama_index_experimental-0.1.3-py3-none-any.whl (11 kB)\n", "Downloading llama_index_agent_openai-0.2.7-py3-none-any.whl (12 kB)\n", "Downloading llama_index_cli-0.1.12-py3-none-any.whl (26 kB)\n", "Downloading llama_index_embeddings_openai-0.1.10-py3-none-any.whl (6.2 kB)\n", "Downloading llama_index_indices_managed_llama_cloud-0.1.6-py3-none-any.whl (6.7 kB)\n", "Downloading llama_index_legacy-0.9.48-py3-none-any.whl (2.0 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.0/2.0 MB\u001b[0m \u001b[31m1.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0mm\n", "\u001b[?25hDownloading llama_index_llms_openai-0.1.22-py3-none-any.whl (11 kB)\n", "Downloading llama_index_multi_modal_llms_openai-0.1.6-py3-none-any.whl (5.8 kB)\n", "Downloading llama_index_program_openai-0.1.6-py3-none-any.whl (5.2 kB)\n", "Downloading llama_index_question_gen_openai-0.1.3-py3-none-any.whl (2.9 kB)\n", "Downloading llama_index_readers_file-0.1.23-py3-none-any.whl (36 kB)\n", "Downloading llama_index_readers_llama_parse-0.1.4-py3-none-any.whl (2.5 kB)\n", "Downloading dirtyjson-1.0.8-py3-none-any.whl (25 kB)\n", "Downloading llama_parse-0.4.4-py3-none-any.whl (8.0 kB)\n", "Downloading llamaindex_py_client-0.1.19-py3-none-any.whl (141 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m141.9/141.9 kB\u001b[0m \u001b[31m357.2 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hDownloading networkx-3.3-py3-none-any.whl (1.7 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.7/1.7 MB\u001b[0m \u001b[31m637.9 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading nltk-3.8.1-py3-none-any.whl (1.5 MB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.5/1.5 MB\u001b[0m \u001b[31m1.6 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m0m\n", "\u001b[?25hDownloading pypdf-4.2.0-py3-none-any.whl (290 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m290.4/290.4 kB\u001b[0m \u001b[31m2.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n", "\u001b[?25hDownloading striprtf-0.0.26-py3-none-any.whl (6.9 kB)\n", "Downloading greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl (271 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m271.7/271.7 kB\u001b[0m \u001b[31m2.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hInstalling collected packages: striprtf, dirtyjson, pypdf, nltk, networkx, greenlet, llamaindex-py-client, llama-index-legacy, llama-index-core, llama-parse, llama-index-readers-file, llama-index-llms-openai, llama-index-indices-managed-llama-cloud, llama-index-experimental, llama-index-embeddings-openai, llama-index-readers-llama-parse, llama-index-multi-modal-llms-openai, llama-index-cli, llama-index-agent-openai, llama-index-program-openai, llama-index-question-gen-openai, llama-index\n", " Attempting uninstall: pypdf\n", " Found existing installation: pypdf 3.17.4\n", " Uninstalling pypdf-3.17.4:\n", " Successfully uninstalled pypdf-3.17.4\n", "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", "embedchain 0.1.102 requires pypdf<4.0.0,>=3.11.0, but you have pypdf 4.2.0 which is incompatible.\u001b[0m\u001b[31m\n", "\u001b[0mSuccessfully installed dirtyjson-1.0.8 greenlet-3.0.3 llama-index-0.10.43 llama-index-agent-openai-0.2.7 llama-index-cli-0.1.12 llama-index-core-0.10.43 llama-index-embeddings-openai-0.1.10 llama-index-experimental-0.1.3 llama-index-indices-managed-llama-cloud-0.1.6 llama-index-legacy-0.9.48 llama-index-llms-openai-0.1.22 llama-index-multi-modal-llms-openai-0.1.6 llama-index-program-openai-0.1.6 llama-index-question-gen-openai-0.1.3 llama-index-readers-file-0.1.23 llama-index-readers-llama-parse-0.1.4 llama-parse-0.4.4 llamaindex-py-client-0.1.19 networkx-3.3 nltk-3.8.1 pypdf-4.2.0 striprtf-0.0.26\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install llama-index llama-index-experimental" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import logging\n", "import sys\n", "from IPython.display import Markdown, display\n", "\n", "import pandas as pd\n", "from llama_index.experimental.query_engine import PandasQueryEngine\n", "\n", "\n", "logging.basicConfig(stream=sys.stdout, level=logging.INFO)\n", "logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['Date', 'SessionTime', 'DriverAhead', 'DistanceToDriverAhead', 'Time',\n", " 'RPM', 'Speed', 'nGear', 'Throttle', 'Brake', 'DRS', 'Source',\n", " 'Distance', 'RelativeDistance', 'Status', 'X', 'Y', 'Z'],\n", " dtype='object')" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ver_sector1.keys()" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "from dotenv import load_dotenv\n", "\n", "load_dotenv()\n", "\n", "ver_query_engine = PandasQueryEngine(df=ver_sector1[[\n", " 'Distance', 'Speed', 'RPM', 'nGear', 'Throttle', 'Brake']], verbose=True, synthesize_response=True, use_async=True)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "> Pandas Instructions:\n", "```\n", "df['Speed'].mean()\n", "```\n", "> Pandas Output: 268.6223404255319\n", "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" ] } ], "source": [ "response = ver_query_engine.query(\n", " \"What is the mean speed of Verstappen Sector 1?\",\n", ")" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "268.6223404255319" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(Markdown(f\"{response}\"))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: llama-index in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (0.10.43)\n", "Requirement already satisfied: llama-index-agent-openai<0.3.0,>=0.1.4 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index) (0.2.7)\n", "Requirement already satisfied: llama-index-cli<0.2.0,>=0.1.2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index) (0.1.12)\n", "Requirement already satisfied: llama-index-core==0.10.43 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index) (0.10.43)\n", "Requirement already satisfied: llama-index-embeddings-openai<0.2.0,>=0.1.5 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index) (0.1.10)\n", "Requirement already satisfied: llama-index-indices-managed-llama-cloud<0.2.0,>=0.1.2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index) (0.1.6)\n", "Requirement already satisfied: llama-index-legacy<0.10.0,>=0.9.48 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index) (0.9.48)\n", "Requirement already satisfied: llama-index-llms-openai<0.2.0,>=0.1.13 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index) (0.1.22)\n", "Requirement already satisfied: llama-index-multi-modal-llms-openai<0.2.0,>=0.1.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index) (0.1.6)\n", "Requirement already satisfied: llama-index-program-openai<0.2.0,>=0.1.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index) (0.1.6)\n", "Requirement already satisfied: llama-index-question-gen-openai<0.2.0,>=0.1.2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index) (0.1.3)\n", "Requirement already satisfied: llama-index-readers-file<0.2.0,>=0.1.4 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index) (0.1.23)\n", "Requirement already satisfied: llama-index-readers-llama-parse<0.2.0,>=0.1.2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index) (0.1.4)\n", "Requirement already satisfied: PyYAML>=6.0.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (6.0.1)\n", "Requirement already satisfied: SQLAlchemy>=1.4.49 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from SQLAlchemy[asyncio]>=1.4.49->llama-index-core==0.10.43->llama-index) (2.0.30)\n", "Requirement already satisfied: aiohttp<4.0.0,>=3.8.6 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (3.9.5)\n", "Requirement already satisfied: dataclasses-json in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (0.6.6)\n", "Requirement already satisfied: deprecated>=1.2.9.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (1.2.14)\n", "Requirement already satisfied: dirtyjson<2.0.0,>=1.0.8 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (1.0.8)\n", "Requirement already satisfied: fsspec>=2023.5.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (2024.5.0)\n", "Requirement already satisfied: httpx in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (0.27.0)\n", "Requirement already satisfied: llamaindex-py-client<0.2.0,>=0.1.18 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (0.1.19)\n", "Requirement already satisfied: nest-asyncio<2.0.0,>=1.5.8 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (1.6.0)\n", "Requirement already satisfied: networkx>=3.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (3.3)\n", "Requirement already satisfied: nltk<4.0.0,>=3.8.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (3.8.1)\n", "Requirement already satisfied: numpy in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (1.26.4)\n", "Requirement already satisfied: openai>=1.1.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (1.30.4)\n", "Requirement already satisfied: pandas in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (2.2.2)\n", "Requirement already satisfied: pillow>=9.0.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (10.3.0)\n", "Requirement already satisfied: requests>=2.31.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (2.31.0)\n", "Requirement already satisfied: tenacity<9.0.0,>=8.2.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (8.3.0)\n", "Requirement already satisfied: tiktoken>=0.3.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (0.5.2)\n", "Requirement already satisfied: tqdm<5.0.0,>=4.66.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (4.66.4)\n", "Requirement already satisfied: typing-extensions>=4.5.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (4.11.0)\n", "Requirement already satisfied: typing-inspect>=0.8.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (0.9.0)\n", "Requirement already satisfied: wrapt in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core==0.10.43->llama-index) (1.14.1)\n", "Requirement already satisfied: beautifulsoup4<5.0.0,>=4.12.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-readers-file<0.2.0,>=0.1.4->llama-index) (4.12.3)\n", "Requirement already satisfied: pypdf<5.0.0,>=4.0.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-readers-file<0.2.0,>=0.1.4->llama-index) (4.2.0)\n", "Requirement already satisfied: striprtf<0.0.27,>=0.0.26 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-readers-file<0.2.0,>=0.1.4->llama-index) (0.0.26)\n", "Requirement already satisfied: llama-parse<0.5.0,>=0.4.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-readers-llama-parse<0.2.0,>=0.1.2->llama-index) (0.4.4)\n", "Requirement already satisfied: aiosignal>=1.1.2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core==0.10.43->llama-index) (1.3.1)\n", "Requirement already satisfied: attrs>=17.3.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core==0.10.43->llama-index) (23.2.0)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core==0.10.43->llama-index) (1.4.1)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core==0.10.43->llama-index) (6.0.5)\n", "Requirement already satisfied: yarl<2.0,>=1.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core==0.10.43->llama-index) (1.9.4)\n", "Requirement already satisfied: soupsieve>1.2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from beautifulsoup4<5.0.0,>=4.12.3->llama-index-readers-file<0.2.0,>=0.1.4->llama-index) (2.5)\n", "Requirement already satisfied: pydantic>=1.10 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llamaindex-py-client<0.2.0,>=0.1.18->llama-index-core==0.10.43->llama-index) (2.7.2)\n", "Requirement already satisfied: anyio in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core==0.10.43->llama-index) (4.3.0)\n", "Requirement already satisfied: certifi in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core==0.10.43->llama-index) (2024.2.2)\n", "Requirement already satisfied: httpcore==1.* in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core==0.10.43->llama-index) (1.0.5)\n", "Requirement already satisfied: idna in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core==0.10.43->llama-index) (3.6)\n", "Requirement already satisfied: sniffio in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core==0.10.43->llama-index) (1.3.1)\n", "Requirement already satisfied: h11<0.15,>=0.13 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpcore==1.*->httpx->llama-index-core==0.10.43->llama-index) (0.14.0)\n", "Requirement already satisfied: click in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from nltk<4.0.0,>=3.8.1->llama-index-core==0.10.43->llama-index) (8.1.7)\n", "Requirement already satisfied: joblib in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from nltk<4.0.0,>=3.8.1->llama-index-core==0.10.43->llama-index) (1.4.0)\n", "Requirement already satisfied: regex>=2021.8.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from nltk<4.0.0,>=3.8.1->llama-index-core==0.10.43->llama-index) (2023.12.25)\n", "Requirement already satisfied: distro<2,>=1.7.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from openai>=1.1.0->llama-index-core==0.10.43->llama-index) (1.9.0)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from requests>=2.31.0->llama-index-core==0.10.43->llama-index) (3.3.2)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from requests>=2.31.0->llama-index-core==0.10.43->llama-index) (2.2.1)\n", "Requirement already satisfied: greenlet!=0.4.17 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from SQLAlchemy[asyncio]>=1.4.49->llama-index-core==0.10.43->llama-index) (3.0.3)\n", "Requirement already satisfied: mypy-extensions>=0.3.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from typing-inspect>=0.8.0->llama-index-core==0.10.43->llama-index) (1.0.0)\n", "Requirement already satisfied: marshmallow<4.0.0,>=3.18.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from dataclasses-json->llama-index-core==0.10.43->llama-index) (3.21.2)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pandas->llama-index-core==0.10.43->llama-index) (2.9.0)\n", "Requirement already satisfied: pytz>=2020.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pandas->llama-index-core==0.10.43->llama-index) (2024.1)\n", "Requirement already satisfied: tzdata>=2022.7 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pandas->llama-index-core==0.10.43->llama-index) (2024.1)\n", "Requirement already satisfied: packaging>=17.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from marshmallow<4.0.0,>=3.18.0->dataclasses-json->llama-index-core==0.10.43->llama-index) (23.2)\n", "Requirement already satisfied: annotated-types>=0.4.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pydantic>=1.10->llamaindex-py-client<0.2.0,>=0.1.18->llama-index-core==0.10.43->llama-index) (0.7.0)\n", "Requirement already satisfied: pydantic-core==2.18.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pydantic>=1.10->llamaindex-py-client<0.2.0,>=0.1.18->llama-index-core==0.10.43->llama-index) (2.18.3)\n", "Requirement already satisfied: six>=1.5 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas->llama-index-core==0.10.43->llama-index) (1.16.0)\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install llama-index" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting llama-index-question-gen-guidance\n", " Downloading llama_index_question_gen_guidance-0.1.2-py3-none-any.whl.metadata (737 bytes)\n", "Requirement already satisfied: llama-index-core<0.11.0,>=0.10.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-question-gen-guidance) (0.10.43)\n", "Collecting llama-index-program-guidance<0.2.0,>=0.1.1 (from llama-index-question-gen-guidance)\n", " Downloading llama_index_program_guidance-0.1.2-py3-none-any.whl.metadata (693 bytes)\n", "Requirement already satisfied: PyYAML>=6.0.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (6.0.1)\n", "Requirement already satisfied: SQLAlchemy>=1.4.49 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from SQLAlchemy[asyncio]>=1.4.49->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (2.0.30)\n", "Requirement already satisfied: aiohttp<4.0.0,>=3.8.6 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (3.9.5)\n", "Requirement already satisfied: dataclasses-json in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (0.6.6)\n", "Requirement already satisfied: deprecated>=1.2.9.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.2.14)\n", "Requirement already satisfied: dirtyjson<2.0.0,>=1.0.8 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.0.8)\n", "Requirement already satisfied: fsspec>=2023.5.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (2024.5.0)\n", "Requirement already satisfied: httpx in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (0.27.0)\n", "Requirement already satisfied: llamaindex-py-client<0.2.0,>=0.1.18 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (0.1.19)\n", "Requirement already satisfied: nest-asyncio<2.0.0,>=1.5.8 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.6.0)\n", "Requirement already satisfied: networkx>=3.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (3.3)\n", "Requirement already satisfied: nltk<4.0.0,>=3.8.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (3.8.1)\n", "Requirement already satisfied: numpy in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.26.4)\n", "Requirement already satisfied: openai>=1.1.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.30.4)\n", "Requirement already satisfied: pandas in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (2.2.2)\n", "Requirement already satisfied: pillow>=9.0.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (10.3.0)\n", "Requirement already satisfied: requests>=2.31.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (2.31.0)\n", "Requirement already satisfied: tenacity<9.0.0,>=8.2.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (8.3.0)\n", "Requirement already satisfied: tiktoken>=0.3.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (0.5.2)\n", "Requirement already satisfied: tqdm<5.0.0,>=4.66.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (4.66.4)\n", "Requirement already satisfied: typing-extensions>=4.5.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (4.11.0)\n", "Requirement already satisfied: typing-inspect>=0.8.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (0.9.0)\n", "Requirement already satisfied: wrapt in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.14.1)\n", "Collecting guidance<0.2.0,>=0.1.10 (from llama-index-program-guidance<0.2.0,>=0.1.1->llama-index-question-gen-guidance)\n", " Downloading guidance-0.1.15-cp311-cp311-macosx_11_0_arm64.whl.metadata (2.2 kB)\n", "Requirement already satisfied: aiosignal>=1.1.2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.3.1)\n", "Requirement already satisfied: attrs>=17.3.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (23.2.0)\n", "Requirement already satisfied: frozenlist>=1.1.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.4.1)\n", "Requirement already satisfied: multidict<7.0,>=4.5 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (6.0.5)\n", "Requirement already satisfied: yarl<2.0,>=1.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.6->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.9.4)\n", "Collecting diskcache (from guidance<0.2.0,>=0.1.10->llama-index-program-guidance<0.2.0,>=0.1.1->llama-index-question-gen-guidance)\n", " Downloading diskcache-5.6.3-py3-none-any.whl.metadata (20 kB)\n", "Collecting ordered-set (from guidance<0.2.0,>=0.1.10->llama-index-program-guidance<0.2.0,>=0.1.1->llama-index-question-gen-guidance)\n", " Downloading ordered_set-4.1.0-py3-none-any.whl.metadata (5.3 kB)\n", "Requirement already satisfied: platformdirs in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from guidance<0.2.0,>=0.1.10->llama-index-program-guidance<0.2.0,>=0.1.1->llama-index-question-gen-guidance) (4.2.0)\n", "Collecting pyformlang (from guidance<0.2.0,>=0.1.10->llama-index-program-guidance<0.2.0,>=0.1.1->llama-index-question-gen-guidance)\n", " Downloading pyformlang-1.0.10-py3-none-any.whl.metadata (2.4 kB)\n", "Requirement already satisfied: protobuf in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from guidance<0.2.0,>=0.1.10->llama-index-program-guidance<0.2.0,>=0.1.1->llama-index-question-gen-guidance) (4.24.4)\n", "Requirement already satisfied: pydantic in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from guidance<0.2.0,>=0.1.10->llama-index-program-guidance<0.2.0,>=0.1.1->llama-index-question-gen-guidance) (2.7.2)\n", "Requirement already satisfied: anyio in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (4.3.0)\n", "Requirement already satisfied: certifi in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (2024.2.2)\n", "Requirement already satisfied: httpcore==1.* in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.0.5)\n", "Requirement already satisfied: idna in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (3.6)\n", "Requirement already satisfied: sniffio in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpx->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.3.1)\n", "Requirement already satisfied: h11<0.15,>=0.13 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from httpcore==1.*->httpx->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (0.14.0)\n", "Requirement already satisfied: click in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from nltk<4.0.0,>=3.8.1->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (8.1.7)\n", "Requirement already satisfied: joblib in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from nltk<4.0.0,>=3.8.1->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.4.0)\n", "Requirement already satisfied: regex>=2021.8.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from nltk<4.0.0,>=3.8.1->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (2023.12.25)\n", "Requirement already satisfied: distro<2,>=1.7.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from openai>=1.1.0->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.9.0)\n", "Requirement already satisfied: charset-normalizer<4,>=2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from requests>=2.31.0->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (3.3.2)\n", "Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from requests>=2.31.0->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (2.2.1)\n", "Requirement already satisfied: greenlet!=0.4.17 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from SQLAlchemy[asyncio]>=1.4.49->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (3.0.3)\n", "Requirement already satisfied: mypy-extensions>=0.3.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from typing-inspect>=0.8.0->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.0.0)\n", "Requirement already satisfied: marshmallow<4.0.0,>=3.18.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from dataclasses-json->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (3.21.2)\n", "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pandas->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (2.9.0)\n", "Requirement already satisfied: pytz>=2020.1 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pandas->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (2024.1)\n", "Requirement already satisfied: tzdata>=2022.7 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pandas->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (2024.1)\n", "Requirement already satisfied: packaging>=17.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from marshmallow<4.0.0,>=3.18.0->dataclasses-json->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (23.2)\n", "Requirement already satisfied: annotated-types>=0.4.0 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pydantic->guidance<0.2.0,>=0.1.10->llama-index-program-guidance<0.2.0,>=0.1.1->llama-index-question-gen-guidance) (0.7.0)\n", "Requirement already satisfied: pydantic-core==2.18.3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pydantic->guidance<0.2.0,>=0.1.10->llama-index-program-guidance<0.2.0,>=0.1.1->llama-index-question-gen-guidance) (2.18.3)\n", "Requirement already satisfied: six>=1.5 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas->llama-index-core<0.11.0,>=0.10.1->llama-index-question-gen-guidance) (1.16.0)\n", "Collecting pydot (from pyformlang->guidance<0.2.0,>=0.1.10->llama-index-program-guidance<0.2.0,>=0.1.1->llama-index-question-gen-guidance)\n", " Downloading pydot-2.0.0-py3-none-any.whl.metadata (9.6 kB)\n", "Requirement already satisfied: pyparsing>=3 in /Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages (from pydot->pyformlang->guidance<0.2.0,>=0.1.10->llama-index-program-guidance<0.2.0,>=0.1.1->llama-index-question-gen-guidance) (3.1.2)\n", "Downloading llama_index_question_gen_guidance-0.1.2-py3-none-any.whl (2.5 kB)\n", "Downloading llama_index_program_guidance-0.1.2-py3-none-any.whl (4.6 kB)\n", "Downloading guidance-0.1.15-cp311-cp311-macosx_11_0_arm64.whl (192 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m193.0/193.0 kB\u001b[0m \u001b[31m583.6 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hDownloading diskcache-5.6.3-py3-none-any.whl (45 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m45.5/45.5 kB\u001b[0m \u001b[31m1.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", "\u001b[?25hDownloading ordered_set-4.1.0-py3-none-any.whl (7.6 kB)\n", "Downloading pyformlang-1.0.10-py3-none-any.whl (126 kB)\n", "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m126.8/126.8 kB\u001b[0m \u001b[31m2.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m \u001b[36m0:00:01\u001b[0m\n", "\u001b[?25hDownloading pydot-2.0.0-py3-none-any.whl (22 kB)\n", "Installing collected packages: pydot, ordered-set, diskcache, pyformlang, guidance, llama-index-program-guidance, llama-index-question-gen-guidance\n", "Successfully installed diskcache-5.6.3 guidance-0.1.15 llama-index-program-guidance-0.1.2 llama-index-question-gen-guidance-0.1.2 ordered-set-4.1.0 pydot-2.0.0 pyformlang-1.0.10\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install llama-index-question-gen-guidance" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "ename": "ImportError", "evalue": "cannot import name 'OpenAIChat' from 'guidance.models' (/Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages/guidance/models/__init__.py)", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[28], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mllama_index\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mquestion_gen\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mguidance\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m GuidanceQuestionGenerator\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mguidance\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mllms\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m OpenAI \u001b[38;5;28;01mas\u001b[39;00m GuidanceOpenAI\n\u001b[1;32m 4\u001b[0m question_gen \u001b[38;5;241m=\u001b[39m GuidanceQuestionGenerator\u001b[38;5;241m.\u001b[39mfrom_defaults(\n\u001b[1;32m 5\u001b[0m guidance_llm\u001b[38;5;241m=\u001b[39mGuidanceOpenAI(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtext-davinci-003\u001b[39m\u001b[38;5;124m\"\u001b[39m), verbose\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 6\u001b[0m )\n", "File \u001b[0;32m~/miniforge3/envs/formula-1/lib/python3.11/site-packages/llama_index/question_gen/guidance/__init__.py:1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mllama_index\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mquestion_gen\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mguidance\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mbase\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m GuidanceQuestionGenerator\n\u001b[1;32m 3\u001b[0m __all__ \u001b[38;5;241m=\u001b[39m [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mGuidanceQuestionGenerator\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", "File \u001b[0;32m~/miniforge3/envs/formula-1/lib/python3.11/site-packages/llama_index/question_gen/guidance/base.py:16\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mllama_index\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mschema\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m QueryBundle\n\u001b[1;32m 15\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mllama_index\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mcore\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtools\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mtypes\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m ToolMetadata\n\u001b[0;32m---> 16\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mllama_index\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mprogram\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mguidance\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m GuidancePydanticProgram\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m TYPE_CHECKING:\n\u001b[1;32m 19\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mguidance\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmodels\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Model \u001b[38;5;28;01mas\u001b[39;00m GuidanceLLM\n", "File \u001b[0;32m~/miniforge3/envs/formula-1/lib/python3.11/site-packages/llama_index/program/guidance/__init__.py:1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mllama_index\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mprogram\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mguidance\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mbase\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m GuidancePydanticProgram\n\u001b[1;32m 3\u001b[0m __all__ \u001b[38;5;241m=\u001b[39m [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mGuidancePydanticProgram\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n", "File \u001b[0;32m~/miniforge3/envs/formula-1/lib/python3.11/site-packages/llama_index/program/guidance/base.py:13\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mguidance\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m assistant, gen, user\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mguidance\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmodels\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m Model \u001b[38;5;28;01mas\u001b[39;00m GuidanceLLM\n\u001b[0;32m---> 13\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mguidance\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mmodels\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m OpenAIChat\n\u001b[1;32m 16\u001b[0m \u001b[38;5;28;01mclass\u001b[39;00m \u001b[38;5;21;01mGuidancePydanticProgram\u001b[39;00m(BaseLLMFunctionProgram[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mGuidanceLLM\u001b[39m\u001b[38;5;124m\"\u001b[39m]):\n\u001b[1;32m 17\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;124;03m A guidance-based function that returns a pydantic model.\u001b[39;00m\n\u001b[1;32m 19\u001b[0m \n\u001b[1;32m 20\u001b[0m \u001b[38;5;124;03m Note: this interface is not yet stable.\u001b[39;00m\n\u001b[1;32m 21\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n", "\u001b[0;31mImportError\u001b[0m: cannot import name 'OpenAIChat' from 'guidance.models' (/Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages/guidance/models/__init__.py)" ] } ], "source": [ "# from llama_index.question_gen.guidance import GuidanceQuestionGenerator\n", "# from guidance.llms import OpenAI as GuidanceOpenAI\n", "\n", "# question_gen = GuidanceQuestionGenerator.from_defaults(\n", "# guidance_llm=GuidanceOpenAI(\"text-davinci-003\"), verbose=False\n", "# )" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "from llama_index.core.tools import QueryEngineTool, ToolMetadata\n", "from llama_index.core.query_engine import SubQuestionQueryEngine\n", "\n", "import nest_asyncio\n", "nest_asyncio.apply()\n", "\n", "ham_query_engine = PandasQueryEngine(df=ham_sector1[[\n", " 'Distance', 'Speed', 'RPM', 'nGear', 'Throttle', 'Brake']], verbose=True, synthesize_response=True, use_async=True)\n", "\n", "query_engine_tools = [\n", " QueryEngineTool(\n", " query_engine=ver_query_engine,\n", " metadata=ToolMetadata(\n", " name=\"ver_sector1_telemetry\",\n", " description=(\n", " \"Provides telemetry data about Verstappen fastest lap on Sector 1 of Spanish GP\"\n", " ),\n", " ),\n", " ),\n", " QueryEngineTool(\n", " query_engine=ham_query_engine,\n", " metadata=ToolMetadata(\n", " name=\"ham_sector1_telemetry\",\n", " description=(\n", " \"Provides telemetry data about Hamilton fastest lap on Sector 1 of Spanish GP\"\n", " ),\n", " ),\n", " ),\n", "]\n", "\n", "s_engine = SubQuestionQueryEngine.from_defaults(\n", " # question_gen=question_gen, # use guidance based question_gen defined above\n", " query_engine_tools=query_engine_tools,\n", " use_async=True\n", ")" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "Generated 2 sub questions.\n", "\u001b[1;3;38;2;237;90;200m[ver_sector1_telemetry] Q: What was Verstappen's speed on Sector 1 of the Spanish GP?\n", "\u001b[0mINFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "> Pandas Instructions:\n", "```\n", "df.loc[2, 'Speed']\n", "```\n", "> Pandas Output: 289\n", "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "\u001b[1;3;38;2;237;90;200m[ver_sector1_telemetry] A: Verstappen's speed on Sector 1 of the Spanish GP was 289 km/h.\n", "\u001b[0m\u001b[1;3;38;2;90;149;237m[ham_sector1_telemetry] Q: What was Hamilton's speed on Sector 1 of the Spanish GP?\n", "\u001b[0mINFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "> Pandas Instructions:\n", "```\n", "df.loc[2, 'Speed']\n", "```\n", "> Pandas Output: 289\n", "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "\u001b[1;3;38;2;90;149;237m[ham_sector1_telemetry] A: Hamilton's speed on Sector 1 of the Spanish GP was 289 km/h.\n", "\u001b[0mINFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" ] } ], "source": [ "response = s_engine.query(\n", " \"Compare and contrast the race on Sector 1 from Verstappen and Hamilton knowing that Verstappen was faster than Hamilton\"\n", ")" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "Verstappen had a faster speed than Hamilton on Sector 1 of the Spanish GP." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(Markdown(f\"{response}\"))" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "Generated 2 sub questions.\n", "\u001b[1;3;38;2;237;90;200m[ver_sector1_telemetry] Q: What was Verstappen's speed in Sector 1 of the Spanish GP?\n", "\u001b[0mINFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "> Pandas Instructions:\n", "```\n", "df.loc[2, 'Speed']\n", "```\n", "> Pandas Output: 289\n", "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "\u001b[1;3;38;2;237;90;200m[ver_sector1_telemetry] A: Verstappen's speed in Sector 1 of the Spanish GP was 289 km/h.\n", "\u001b[0m\u001b[1;3;38;2;90;149;237m[ham_sector1_telemetry] Q: What was Hamilton's speed in Sector 1 of the Spanish GP?\n", "\u001b[0mINFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "> Pandas Instructions:\n", "```\n", "df.loc[df['Sector'] == 1, 'Speed'].mean()\n", "```\n", "> Pandas Output: There was an error running the output as Python code. Error message: 'Sector'\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Traceback (most recent call last):\n", " File \"/Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages/llama_index/core/async_utils.py\", line 31, in asyncio_run\n", " raise RuntimeError(\n", "RuntimeError: Nested async detected. Use async functions where possible (`aquery`, `aretrieve`, `arun`, etc.). Otherwise, use `import nest_asyncio; nest_asyncio.apply()` to enable nested async or use in a jupyter notebook.\n", "\n", "If you are experiencing while using async functions and not in a notebook, please raise an issue on github, as it indicates a bad design pattern.\n", "\n", "During handling of the above exception, another exception occurred:\n", "\n", "Traceback (most recent call last):\n", " File \"/Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages/pandas/core/indexes/base.py\", line 3805, in get_loc\n", " return self._engine.get_loc(casted_key)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"index.pyx\", line 167, in pandas._libs.index.IndexEngine.get_loc\n", " File \"index.pyx\", line 196, in pandas._libs.index.IndexEngine.get_loc\n", " File \"pandas/_libs/hashtable_class_helper.pxi\", line 7081, in pandas._libs.hashtable.PyObjectHashTable.get_item\n", " File \"pandas/_libs/hashtable_class_helper.pxi\", line 7089, in pandas._libs.hashtable.PyObjectHashTable.get_item\n", "KeyError: 'Sector'\n", "\n", "The above exception was the direct cause of the following exception:\n", "\n", "Traceback (most recent call last):\n", " File \"/Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages/llama_index/experimental/query_engine/pandas/output_parser.py\", line 54, in default_output_processor\n", " output_str = str(safe_eval(module_end_str, global_vars, local_vars))\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"/Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages/llama_index/experimental/exec_utils.py\", line 159, in safe_eval\n", " return eval(__source, _get_restricted_globals(__globals), __locals)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"\", line 1, in \n", " File \"/Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages/pandas/core/frame.py\", line 4102, in __getitem__\n", " indexer = self.columns.get_loc(key)\n", " ^^^^^^^^^^^^^^^^^^^^^^^^^\n", " File \"/Users/diegomaradona/miniforge3/envs/formula-1/lib/python3.11/site-packages/pandas/core/indexes/base.py\", line 3812, in get_loc\n", " raise KeyError(key) from err\n", "KeyError: 'Sector'\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "INFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "\u001b[1;3;38;2;90;149;237m[ham_sector1_telemetry] A: There was an error running the output as Python code. It seems there was an issue with the 'Sector' column in the dataset.\n", "\u001b[0mINFO:httpx:HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n", "HTTP Request: POST https://api.openai.com/v1/chat/completions \"HTTP/1.1 200 OK\"\n" ] }, { "data": { "text/markdown": [ "Verstappen finished 2 centesimae ahead of Hamilton due to his faster speed in Sector 1 of the Spanish GP, which allowed him to gain a slight advantage over Hamilton during that part of the race." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "response = s_engine.query(\n", " \"Explain why Verstappen finished 2 centesimae ahead of Hamilton\"\n", ")\n", "\n", "display(Markdown(f\"{response}\"))" ] } ], "metadata": { "kernelspec": { "display_name": "formula-1", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.0" } }, "nbformat": 4, "nbformat_minor": 2 }