Sim Raccing Eng Challenge Lectura CSV
Sim Raccing Eng Challenge Lectura CSV
December 1, 2024
1 Sim-Racing 25
1.1 Librerias
• Para la lectura de csv estamos usando Pandas y CSV.
• Para la representación gáfica Matplotlib.
#df1 = pd.read_csv('~/UM25/SimRacEngChallenge/
↪charlotte_motor_speedway_&_ks_mazda_mx5_cup_&_05-VIGO-VALIÑAS_&_stint_2.
#df2 = pd.read_csv('~/UM25/SimRacEngChallenge/
↪charlotte_motor_speedway_&_ks_mazda_mx5_cup_&_05-VIGO-VALIÑAS_&_stint_3.
#df3 = pd.read_csv('~/UM25/SimRacEngChallenge/
↪charlotte_motor_speedway_&_ks_mazda_mx5_cup_&_05-VIGO-VALIÑAS_&_stint_4.
#df4 = pd.read_csv('~/UM25/SimRacEngChallenge/
↪ks_barcelona_&_rss_formula_rss_2_v8_&_EC-40-VIGO-JAVI_&_stint_32.csv',␣
#df5 = pd.read_csv('~/UM25/SimRacEngChallenge/
↪charlotte_motor_speedway_&_ks_mazda_mx5_cup_&_05-VIGO-VALIÑAS_&_stint_5.
#df6 = pd.read_csv('~/UM25/SimRacEngChallenge/
↪charlotte_motor_speedway_&_ks_mazda_mx5_cup_&_05-VIGO-VALIÑAS_&_stint_6.
1
#df = pd.read_csv('~/UM25/SimRacEngChallenge//archivo_combinado.csv',␣
↪header=None, skiprows=16, quoting=csv.QUOTE_ALL, encoding='utf-8')
df = pd.read_csv('~/UM25/SimRacEngChallenge/
↪ks_barcelona_&_rss_formula_rss_2_v8_&_EC-40-VIGO-JAVI_&_stint_32.csv',␣
ballast = df.iloc[:,15]
Ballast
0 0.0
1 0.0
2 0.0
2
3 0.0
4 0.0
.. …
826 0.0
827 0.0
828 0.0
829 0.0
830 0.0
df_resumen = pd.DataFrame({
'Altura_DI': altura_delantera_izquierda,
'Altura_DD': altura_delantera_derecha,
'Altura_TI': altura_trasera_izquierda,
'Altura_TD': altura_trasera_derecha,
'Mejor_Vuelta': mejor_vuelta,
'Lap_time': lap_time,
'Ballast': ballast
})
time_altura_atras = df_resumen.groupby(['Altura_DD','Ballast']).
↪agg(list)[['Altura_TD', 'Lap_time']]
time_ballast = df_resumen.groupby(['Altura_TD','Altura_DD']).
↪agg(list)[['Ballast','Lap_time' ]]
print(time_altura_atras)
print(time_altura_delante)
print(time_ballast)
Altura_TD Lap_time
Altura_DD Ballast
10.3 0.0 [39.7] [559.09]
10.5 0.0 [36.6] [558.59]
10.6 0.0 [39.4] [558.9]
11.1 0.0 [39.6] [558.69]
11.5 0.0 [33.9] [558.29]
… … …
30.6 0.0 [51.3] [564.84]
3
30.7 0.0 [52.2] [564.89]
30.8 0.0 [53.0] [564.54]
31.0 0.0 [52.0] [565.1]
31.1 0.0 [50.2] [565.99]
4
time_altura_atras_exploded = time_altura_atras.explode('Altura_TD').
↪explode('Lap_time')
# Etiquetas y título
plt.xlabel('Altura_TD')
plt.ylabel('Lap_time')
plt.title('Tiempo (Lap_time) vs Altura_TD')
# Mostrar la gráfica
plt.grid(True)
plt.show()
Valores promedio
[15]: import pandas as pd
5
}).reset_index()
# Ver el resultado
print(media_por_altura_td)
Altura_TD Lap_time
0 31.7 571.356667
1 31.9 558.158571
2 32.8 557.765
3 32.9 555.88
4 33.1 556.91
.. … …
195 54.4 562.022222
196 54.7 561.824118
197 55.1 565.823
198 55.3 564.59
199 57.2 569.148571
# Etiquetas y título
plt.xlabel('Altura_TD')
plt.ylabel('Promedio de Lap_time')
plt.title('Promedio de Lap_time por Altura_TD')
# Mostrar la gráfica
plt.grid(True)
plt.show()
6
2.2.3 Altura delante
[17]: import seaborn as sns
import matplotlib.pyplot as plt
# Con los datos separados
# Desempaquetar las listas para crear un DataFrame adecuado para graficar
time_altura_delante_exploded = time_altura_delante.explode('Altura_DD').
↪explode('Lap_time')
# Etiquetas y título
plt.xlabel('Altura_DD')
plt.ylabel('Lap_time')
plt.title('Tiempo (Lap_time) vs Altura_DD')
# Mostrar la gráfica
plt.grid(True)
plt.show()
7
Valores promedio
[18]: import pandas as pd
# Ver el resultado
print(media_por_altura_dd)
Altura_DD Lap_time
0 10.3 556.606667
1 10.5 561.772
2 10.6 568.395
3 11.1 556.24
4 11.5 557.29
.. … …
175 30.6 548.73
176 30.7 562.32875
177 30.8 550.405625
178 31.0 558.078333
179 31.1 564.562
8
[180 rows x 2 columns]
# Etiquetas y título
plt.xlabel('Altura_DD')
plt.ylabel('Promedio de Lap_time')
plt.title('Promedio de Lap_time por Altura_DD')
# Mostrar la gráfica
plt.grid(True)
plt.show()
9
2.2.4 Peso
[20]: import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# Con los datos separados
# Desempaquetar las listas para crear un DataFrame adecuado para graficar
data = {
'Ballast': [50, 38, 25], # Peso en kg
'Lap_time': [91.781, 91.739, 91.673] # Tiempo en segundos
}
time_ballast_fixed = pd.DataFrame(data)
time_ballast_exploded = time_ballast_fixed.explode('Ballast').
↪explode('Lap_time')
# Etiquetas y título
plt.xlabel('Ballast')
plt.ylabel('Lap_time')
plt.title('Tiempo (Lap_time) vs Ballast')
# Mostrar la gráfica
plt.grid(True)
plt.show()
10
2.2.5 Valores promedio
# Ver el resultado
print(media_por_ballast)
Ballast Lap_time
0 25 91.673
1 38 91.739
2 50 91.781
11
# Etiquetas y título
plt.xlabel('Ballast')
plt.ylabel('Promedio de Lap_time')
plt.title('Promedio de Lap_time por Ballast')
# Mostrar la gráfica
plt.grid(True)
plt.show()
3 Regresiones
Para el peso en principio se usa una lineal y otra no lineal, para las alturas no lineales ## Regre-
siones no lineales
12
#Separar las variables independientes (X) y dependientes (y)
X = media_por_altura_dd[['Altura_DD']] # Variable independiente
y = media_por_altura_dd['Lap_time'] # Variable dependiente
X_poly = poly.fit_transform(X)
# Realizar predicciones
y_pred = model.predict(X_test)
print("Intercepto:", intercepto)
print("Coeficientes:", coeficientes)
13
# Crear la fórmula de la curva
formula = f'Lap_time = {intercepto:.3f}'
for i in range(1, len(coeficientes)):
formula += f' + ({coeficientes[i]:.3f}) * (Altura_TD^{i})'
Intercepto: 490.7921883337176
Coeficientes: [ 0.00000000e+00 9.54491296e+00 -3.69780302e-01 4.05257336e-03]
14
[25]: import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
X_poly = poly.fit_transform(X)
# Realizar predicciones
y_pred = model.predict(X_test)
15
# Para una regresión polinómica, también necesitamos los coeficientes de los␣
↪términos polinómicos
print("Intercepto:", intercepto)
print("Coeficientes:", coeficientes)
Intercepto: 225.2807509583784
Coeficientes: [ 0.00000000e+00 1.97583598e+01 -3.64300644e-01 2.07298260e-03]
16
Fórmula de la regresión polinómica:
Lap_time = 225.281 + (19.758) * (Altura_DD^1) + (-0.364) * (Altura_DD^2) +
(0.002) * (Altura_DD^3)
3.0.2 Peso
[26]: import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
X_poly = poly.fit_transform(X)
17
# Realizar predicciones
y_pred = model.predict(X_test)
print("Intercepto:", intercepto)
print("Coeficientes:", coeficientes)
18
Intercepto: 91.70613131994622
Coeficientes: [0.00000000e+00 1.02458773e-10 9.01637206e-09 5.98769072e-07]
19
# Dividir los datos en conjunto de entrenamiento y prueba
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,␣
↪random_state=42)
# Realizar predicciones
y_pred = regresion_lineal.predict(X_test)
# Evaluar el modelo
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
# Imprimir métricas
print(f'Mean Squared Error (MSE): {mse:.4f}')
print(f'Coeficiente de determinación (R²): {r2:.4f}')
# Títulos y etiquetas
plt.title('Regresión Lineal de Lap Time vs Ballast')
plt.xlabel('Ballast')
plt.ylabel('Lap Time')
plt.legend()
plt.show()
20
Fórmula de la regresión lineal:
y = 91.6060 + (0.0035) * X
/home/eva/.local/lib/python3.13/site-
packages/sklearn/metrics/_regression.py:1211: UndefinedMetricWarning: R^2 score
is not well-defined with less than two samples.
warnings.warn(msg, UndefinedMetricWarning)
21