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: