Amores Pythónicos

Iniciado por McHouserphy, Ene 29, 2023, 09:15 PM

Tema anterior - Siguiente tema

McHouserphy


Estrenamos hilo, el de los resultados de los escarceos pythónicos. :scare:  :mosking:

Medio añito hace que empecé con el asunto, y al final, se ha convertido en el sucesor de los excel, aquellos que yo siempre usé para las cábalas formulauneras (y más cosas) :mosking:

El propósito de este hilo es, además de presentaros las "cositas" que conseguimos, someterlas a vuestro escrutinio :read: , con el propósito de mejorarlas (si sabemos :umnik2: ), así como para que, si en algún momento os interesa alguna comparación, o concrección a unos metros concretos, o lo que queráis ver en cualquier GP,  solo tenéis que decirlo, y se intentará. :yes4:  :umnik:

Resumiendo, para que trabajéis un poquito :mosking: , nos digáis los errores que veáis, o qué falta, o lo que creáis pertinente :read: .

Todo lo tenemos a partir del módulo Fastf1, desarrollado en python, en conjunción con la api Ergast (base de datos sobre F1) , ambas de acceso gratuito en internet.

Con Fastf1 se accede a los datos de carrera, los mismos que usan los live timing, tanto oficiales de la FIA como los "alternativos". Dichos datos incluyen los específicos de cada coche en puntos concretos, velocidad, marcas de tiempos, rpm del motor...  Pero falta el giro de volante :ireful2: , que no les interesa publicar, ya que entonces se puede saber muuuucho más que no quieren que sepamos. :SHABLON_padonak_06: 

Como todos los datos de gestión de neumáticos, temperaturas, presiones, y demás.  :SHABLON_padonak_06:
Esto si que es una conspiración, y no!, no estoy parranoico!. :ireful2: :mosking:

Con ergast disponemos de los resúmenes de datos, desde 1950 hasta el último GP.

Ergast se puede consultar "en vivo" desde el navegador, o como para nuestros fines, recoger la respuesta y luego trabajarla en python.

Para quien quiera "investigar" Fastf1 : https://theoehrly.github.io/Fast-F1/

Y para el que quiera consultar Ergast : https://ergast.com/mrd/

Para quien no se maneje con la lengua de su graciosa magestad :mosking: (perdón, ahora es gracioso  :laugh2: ), ambas funcionan medianamente bien con los traductores.

Supongo que ya conocéis las ya tradicionales gráficas de telemetrías de cada coche, las que incluyen velocidad, rpm, marcha, acelerador, freno, tiempo delta entre ambos, etc, eso es gracias al Fastf1, que nos proporciona lo siguiente:

The following information is available per lap (one DataFrame column for each):

•    Time (pandas.Timedelta): Session time when the lap time was set (end of lap)
•    Driver (string): Three letter driver identifier
•    DriverNumber (str): Driver number
•    LapTime (pandas.Timedelta): Recorded lap time. Officially deleted lap times will not be deleted here. Deleting laps is currently not supported.
•    LapNumber (int): Recorded lap number
•    Stint (int): Stint number
•    PitOutTime (pandas.Timedelta): Session time when car exited the pit
•    PitInTime (pandas.Timedelta): Session time when car entered the pit
•    Sector1Time (pandas.Timedelta): Sector 1 recorded time
•    Sector2Time (pandas.Timedelta): Sector 2 recorded time
•    Sector3Time (pandas.Timedelta): Sector 3 recorded time
•    Sector1SessionTime (pandas.Timedelta): Session time when the Sector 1 time was set
•    Sector2SessionTime (pandas.Timedelta): Session time when the Sector 2 time was set
•    Sector3SessionTime (pandas.Timedelta): Session time when the Sector 3 time was set
•    SpeedI1 (float): Speedtrap sector 1 [km/h]
•    SpeedI2 (float): Speedtrap sector 2 [km/h]
•    SpeedFL (float): Speedtrap at finish line [km/h]
•    SpeedST (float): Speedtrap on longest straight (Not sure) [km/h]
•    IsPersonalBest (bool): Flag that indicates whether this lap is the official personal best lap of a driver. If any lap of a driver is quicker than their respective personal best lap, this means that the quicker lap is invalid and not counted. This can happen it the track limits were execeeded, for example.
•    Compound (str): Tyres event specific compound name: SOFT, MEDIUM, HARD, INTERMEDIATE, WET (the actual underlying compounds C1 to C5 are not differentiated).
•    TyreLife (float): Laps driven on this tire (includes laps in other sessions for used sets of tires)
•    FreshTyre (bool): Tyre had TyreLife=0 at stint start, i.e. was a new tire
•    Team (str): Team name
•    LapStartTime (pandas.Timedelta): Session time at the start of the lap
•    LapStartDate (pandas.Timestamp): Timestamp at the start of the lap
•    TrackStatus (str): A string that contains track status numbers for all track status that occurred during this lap. The meaning of the track status numbers is explained in fastf1.api.track_status_data(). For filtering laps by track status, you may want to use Laps.pick_track_status().
•    IsAccurate (bool): Indicates that the lap start and end time are synced correctly with other laps. Do not confuse this with the accuracy of the lap time or sector times. They are always considered to be accurate if they exist! If this value is True, the lap has passed as basic accuracy check for timing data. This does not guarantee accuracy but laps marked as inaccurate need to be handled with caution. They might contain errors which can not be spotted easily. Laps need to satisfy the following criteria to be marked as accurate:

  • o    not an inlap or outlap
  • o    set under green or yellow flag (the api sometimes has issues with data from SC/VSC laps)
  • o    is not the first lap after a safety car period (issues with SC/VSC might still appear on the first lap after it has ended)
  • o    has a value for lap time and all sector times
  • o    the sum of the sector times matches the lap time (If this were to ever occur, it would also be logged separately as a data integrity error. You usually don't need to worry about this.)

Y en telemetrías del coche :

The following telemetry channels existed in the original API data:

•    Car data:

  • o    Speed (float): Car speed [km/h]
  • o    RPM (int): Car RPM
  • o    nGear (int): Car gear number
  • o    Throttle (float): 0-100 Throttle pedal pressure [%]
  • o    Brake (bool): Brakes are applied or not.
  • o    DRS (int): DRS indicator (See fastf1.api.car_data() for more info)
•    Position data:
  • o    X (float): X position [1/10 m]
  • o    Y (float): Y position [1/10 m]
  • o    Z (float): Z position [1/10 m]
  • o    Status (string): Flag - OffTrack/OnTrack
•    For both of the above:
  • o    Time (timedelta): Time (0 is start of the data slice)
  • o    SessionTime (timedelta): Time elapsed since the start of the session
  • o    Date (datetime): The full date + time at which this sample was created
  • o    Source (str): Flag indicating how this sample was created:
  • �    'car': sample from original api car data
  • �    'pos': sample from original api position data
  • �    'interpolated': this sample was artificially created; all values are computed/interpolated

Example:
A sample's source is indicated as 'car'. It contains values for speed, rpm and x, y, z coordinates. Originally, this sample (with its timestamp) was received when loading car data. This means that the speed and rpm value are original values as received from the api. The coordinates are interpolated for this sample.

All methods of Telemetry which resample or interpolate data will preserve and adjust the source flag correctly when modifying data.

Through merging/slicing it is possible to obtain any combination of telemetry channels! The following additional computed data channels can be added:

•    Distance driven between two samples: add_differential_distance()
•    Distance driven since the first sample: add_distance()
•    Relative distance driven since the first sample: add_relative_distance()
•    Distance to driver ahead and car number of said driver: add_driver_ahead()

Timing app data provides the following data channels per sample:

•    LapNumber (float or nan): Current lap number
•    Driver (str): Driver number
•    LapTime (pandas.Timedelta or None): Lap time of last lap
•    Stint (int): Counter for the number of driven stints
•    TotalLaps (float or nan): Total number of laps driven on this set of tires (includes laps driven in other sessions!)
•    Compound (str or None): Tire compound
•    New (bool or None): Whether the tire was new when fitted
•    TyresNotChanged (int or None): ??? Probably a flag to mark pit stops without tire changes
•    Time (pandas.Timedelta): Session time
•    LapFlags (float or nan): ??? unknown
•    LapCountTime (None or ???): ??? unknown; no data
•    StartLaps (float or nan): ??? Tire age when fitted (same as 'TotalLaps' in the same sample?!?)
•    Outlap (None or ???): ??? unknown; no data

Car data provides the following data channels per sample:
•    Time (pandas.Timedelta): session timestamp (time only); inaccurate, has duplicate values; use Date instead
•    Date (pandas.Timestamp): timestamp for this sample as Date + Time; more or less exact
•    Speed (int): Km/h
•    RPM (int)
•    Gear (int): [called 'nGear' in the data!]
•    Throttle (int): 0-100%
•    Brake (bool)
•    DRS (int): 0-14 (Odd DRS is Disabled, Even DRS is Enabled?) (More Research Needed?)

  • o    0 = Off
  • o    1 = Off
  • o    2 = (?)
  • o    3 = (?)
  • o    8 = Detected, Eligible once in Activation Zone (Noted Sometimes)
  • o    10 = On (Unknown Distinction)
  • o    12 = On (Unknown Distinction)
  • o    14 = On (Unknown Distinction)
•    Source (str): Indicates the source of a sample; 'car' for all values here
The data stream has a sample rate of (usually) 240ms. The samples from the data streams for position data and car data do not line up. Resampling/interpolation is required to merge them.

Y eso es todo. No hay más.

A partir de ahí sale todo lo relativo a cada coche.

Si se trata de datos de pilotos, equipos, puntos, posiciones y similares, los datos se pueden sacar más fácilmente del Ergast.

Lo malo es que Ergast lo actualizan obviamente tras cada GP, pero eso puede ser hasta dos o tres horas después, depende del país, por lo que a veces no queda otra que esperar, o intentar extraer esos mismos datos con el fastf1, cuyos datos están disponibles unos quince o treinta minutos espués del GP.

Repito, todo esto se maneja en lenguaje python, y soy un aprendiz, así que ... siux cantimploro pazyencía :scratch_one-s_head: ;D 

Y dejamos la introinducción y pasamos a lo bueno.

Ya habíamos visto aparecer algunas gráficas como estas:

































Y en este letargo invernal, han hecho aparición las siguientes :









Con certeza, seguro que queda algún tipo por presentar, las iré poniendo según las encuentre en sus correspondientes GP, ya que no se generan todas en todas las carreras, pero... tras todo esto... :read:


Preguntas???
Dudas???
Aclaraciones???
Errores???
Nuevas ideas???


McHouserphy

#1
Esta es una de las ausentes anteriormente mencionadas :



Pero el método de determinación de vueltas perdidas, es farragoso ypoco fiable, ya que hay muchas condiciones que hacen que se descontrole o falle.
No es el caso del GP de esta mostrada, pero estoy maquinando otra manera de sacar lo mismo.  :umnik:  :yes4:

Otra de las tareas "en cartera", y que voy ejecutando poco a poco, es ir colocando las tablas de datos en la parte inferior de las gráficas que lo admitan, ya que es una buena aclaración general.

Tiempo límite, jueves 2 de marzo  :read:  ;D  :yes4:

McHouserphy

Otra de las ya disponibles el año pasado y ausentes en el catálogo del primer post:

McHouserphy

#3
Otro olvido de las del primer post :  :scratch_one-s_head:




Y otra novedad recién sacada del horno  :read:


McHouserphy

Dos modelitos nuevos que acaban de pasar satisfactoriamente los cash test  :mosking:  :read:





Son modelitos nuevos en "Monty Pythónico", aunque ya los conocíamos en "Excélico"  :read:  :yes4:

McHouserphy

#5
Un nuevo modelito en la pasarella Pythónica, y que sin duda, veremos más de una vez en las pasarelas de cada GP.
Esta creación de la factoría "Proyecto Manhattan", es ... :scratch_one-s_head:

Mi tesoooorooooo... es míííaaaa... :laugh2:

vaaaa.... os la enseño...  :read:  pero mirarlas despacito, que aún queman... :mosking:

Se ve claro el coste del trompo de Verstappen :read: 


Y en esta, Ham controlando a Alo :read: 

McHouserphy

Recién sacado del horno: :read: Otro "conjuro pythónico" :mosking:



Creo que :read: ... "me ha quedao nikelá"
ya me queda menos para alcanzar al Jarry Potter :laugh2:

McHouserphy

A TENSIÓN

He de comunicar, que la causa de los problemas encontrados durante el comienzo de este evento en Mónaco, cuando de repente, las rutinas que uso empezaron a dar problemas y errores, son debidas a las actualizaciones que, aún a fecha de hoy (martes 30), siguen llevando a cabo en las bases de datos que se usan para el manejo de los datos de F1 (Ergast), así como en las librerías de Fastf1 (python).

Están adaptando la base de datos (Ergast) a las nuevas prestaciones de las librerías de Fastf1, y también a los cambiantes formatos de cada evento, ya que no paran de cambiar, con las Sprint, Sprint Shootout, F.P varias, Q , R, y no se descartan más rarezas.

También han publicado varias actualizaciónes de FastF1 v:3, que cambia algunos procedimientos ya presentes en la v:2.3.3 que uso yo (la última v:2).

La conjunción de todo esto, y mi poca experiencia en python, da como resultado que algunas de mis rutinas generen errores y no sean útiles. Otras solo dan alertas, indicando que esa función "x" ha cambiado y su resultado puede no ser preciso, que se implemente según los métodos actualizados en las versiones 3, y algunas opciones de gráficas cambian en detalles que pueden ser visibles en ellas (las gráficas). Por ejemplo, los pilotos en la leyenda no están en ningún orden concreto (cuando deberían de estar en orden de fin de carrera), pero los datos de la gráfia son correctos.

Resumiendo, que  :SHABLON_padonak_06:  :aggressive:  :ireful2:

Y justo en una carrera en la que de repente llueve :punish: , cuando se juegan el triunfo entre dos que tenían opciones reales de ganar :punish: , se dilucida la pole en las dos últimas curvas :punish: , hay mil cosas interesantes para ver :punish: , y esto falla como una escopeta de feria :punish: ... Por culpa de terceros!. :ireful2: 

La única solución correcta es actualizar todo, Ergast lo hacen ellos.
Es un lío que te cambien las estructuras de las bases de datos, pero supongo que solo añadiran capacidades, manteniendo lo ya presente. :read:

Pero el Fastf1 de python, supone cambiar procedimientos que tenía aprendidos :SHABLON_padonak_06: , y aprender los nuevos, que son legión :scare: , y cambiarlos en las más de 50 rutinas que ya tengo, algunas son de cálculo, y del resto más de 30 son de gráficas...  :SHABLON_padonak_06:

SOCOOOORRROOOOOOOOOO :help: , no se si es so o corroooo  :help:

Que lo sepáis. :read:
 

McHouserphy

Johé... la de tiempo que hace que no cuento cómo va el "porroabyecto" :scare:  "Manhattan" :read:

Tras superar la crisis de las actualizaciones universales  :scare: , en la que en un mes se actualizaron la base de datos de Ergast, el propio conjunto de Fastf1, el propio lenguaje python y multitud de librerías comunes como pandas, numpy, matplot... :read:  :scare:  :read:  :swoon:  :read: :umnik: ...

Al final, con todo ello asumido, he rehecho el entorno del Manhattan y le he añadido todos los modelos de gráficas que han ido apareciendo en este hilo... y bastantes más.  :yes4:  :mosking:

por ejemplo, estos son los tres últimos "modelitos" sacados a la pasarela :

con datos del GP de Mónaco






con datos del GP de España






Con datos del GP de Qatar





 
 

McHouserphy

#9
Tengo la másquina de garraficar :scare: ... a tope!  :mosking:

Otro modelito para la temporada Oh! tó ñó que viesne :laugh2:

 No me caben más en una misma :rofl:


P.D.: Y ahora que la veo publicada :read: le faltan los colores de los puntos según el compuesto :read:
P'al horno que vuelve. :yes4:

McHouserphy

#10
Yatta! :mosking:


La pongo algo más?? :read: ? una antena pala radio?... :rofl:

... me vy al pitiestó... 🥗 🍝 🥛

McHouserphy

#11
Los avances "semianales" 😨 , digo, semanales: :mosking:
tras la aparición de los ápices de curva:


la evolución lógica: :read:


que ha llevado a la mejora de estos dos tipos:




Y de todas las del mundial, estas son las cuatro peores, las que aún pueden mejorar 🕵








McHouserphy

Los avances "seminales" 😨 , digo, semanales: :mosking:

Nuevo modelito "pret a porter" (en francés, NO en inglés🤣)

Pit stops en carrera según la posición en parrilla:



Mejorado las de agresividad :read:

Cambia bastante saber cuándo hubo incidentes o llovió 👀




Esta es una recopilación de todos los modelos de gráfica que se usan entre todas las rutinas que ya están en el "porroabyecto Manjatan" , digo, proyecto Manhattan.


Si os aburrís mucho, podéis pasar el rato asignando las rutinas a los modelos de gráfica 😜 :mosking:
Hay rutinas que pueden generar hasta 10 gráficas distintas,  p.ej. "Tandas Largas FP", que aunque la haya "desdoblado en dos", Niveles y Compuestos, es la misma rutina la que genera gráficas de tº de vuelta, de tº S1, de tº S2, de tº S3, de velocidad en ST, de velocidad en Finish line, y/o por cada compuesto usado en carrera).
Puntos extra, para el que acierte más. :mosking: :laugh1:




McHouserphy

#13
Garraficando a toda vela... :mosking:

Nuevo modelito :
👀



Necesita explicación??
Tal vez indicar que los tiempos de Q son de Q3 :umnik2:  y los de carrera son el tiempo promedio por vuelta del vencedor. :umnik2:

McHouserphy

#14
Garraficando a toda vela... :mosking:
Garraficando la ciudá! 😂

Nuevos modelitos de garraficas :
👀
:scare: :rofl:

:read:👀
Telemetrías en sesiones Q y/o SS



Posiciones en Clasificatorias y Sprint Shootout



Ya manejo el pythonico garrafero...
Como la Mamba negra a los jakuzas japoneses!



Podéis añadirlas al catálogo también. :mosking:

:laugh1: 😂  ;D  🤣