Détection des boiteries d'un cheval à l'aide d'un smartphone¶

@author : Armand & Albane COIFFE
@email : armandcoiffe@gmail.com , albanecoiffe@gmail.com

Introduction¶

Le bien-être animal est un enjeu crucial dans le monde de l’équitation, aussi bien pour les cavaliers de loisir que pour les professionnels de la compétition. L'une des principales préoccupations concerne la boiterie des chevaux, qui peut être détectée grâce à des changements dans l'appui et l'accélération lors de leur locomotion. Lorsque le cheval ressent une douleur, il allège son appui sur le membre affecté, entraînant des modifications de ses mouvements qui peuvent être mesurées. Nous nous intéresserons donc aux indices de symétrie (ISG).

Dans ce contexte, le projet est construit dans l’optique de mettre au point un système accessible à tous les cavaliers pour effectuer un suivi quantitatif de la biomécanique du cheval.
Ce suivi est réalisé par la mesure et l'analyse de l’accélération verticale via par exemple l’ application *PhysicsToolboxAccelerometer* disponible sur smartphone.

Problématique retenue :¶

La mesure de l’accélération du cheval lors de sa locomotion à partir d’un smartphone constitue- t-elle une évaluation fiable de sa santé ?

Sommaire :¶
  • Import des libraries
  • 1 - Données au trot en ligne 1
  • 2 - Données au trot en ligne 2
  • 3 - Données au trot en cercle à droite
  • 4 - Données au trot en cercle à gauche
  • Récapitulatif

Import des libraries

In [406]:
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from scipy.signal import butter, filtfilt
from scipy.integrate import cumtrapz
from scipy.signal import find_peaks
import plotly.express as px

1 - Données au trot en ligne 1¶

Relevé de données du 2024-06-08

Charger les données¶

In [407]:
Trot_ligne1 = pd.read_csv('data/Trot_ligne2.csv', sep=';')
Trot_ligne1.reset_index(inplace=True)
In [408]:
Trot_ligne1.columns = ['time', 'gFx', 'gFy', 'gFz', 'alpha']
Trot_ligne1['time'] = Trot_ligne1['time'].map(pd.to_datetime)
Trot_ligne1.set_index('time', inplace=True)
Trot_ligne1.head()
Out[408]:
gFx gFy gFz alpha
time
2024-06-08 14:30:11.291 0.022 -0.836 -0.573 1.014
2024-06-08 14:30:11.298 -0.018 -0.776 -0.607 0.985
2024-06-08 14:30:11.309 -0.111 -0.804 -0.660 1.046
2024-06-08 14:30:11.322 -0.105 -0.824 -0.608 1.029
2024-06-08 14:30:11.345 -0.014 -0.831 -0.532 0.987
In [409]:
Trot_ligne1.tail()
Out[409]:
gFx gFy gFz alpha
time
2024-06-08 14:33:32.608 0.059 -0.878 -0.406 0.969
2024-06-08 14:33:32.608 0.059 -0.878 -0.406 0.969
2024-06-08 14:33:32.610 0.048 -0.869 -0.400 0.958
2024-06-08 14:33:32.621 0.022 -0.853 -0.401 0.943
2024-06-08 14:33:32.631 -0.010 -0.832 -0.419 0.932
In [410]:
len(Trot_ligne1)
Out[410]:
20160

Travail sur les données¶

Visualisation de alpha pour trier¶

In [411]:
plt.figure(figsize=(15, 5))
px.line(Trot_ligne1, x=Trot_ligne1.index, y='alpha', title='Évolution de alpha en fonction du temps')
No description has been provided for this image
<Figure size 1500x500 with 0 Axes>

On peut remarquer des passage au pas lors des changement visible sur le graphe comme entre 14:31:25 et 14:31:35. Il nous faut garder que les moments de trot pour le calcul de l'ISG.
Privilégions la partie de droite qui est plus stable

Filtrer les données¶

In [412]:
Trot_ligne1_sort = Trot_ligne1['2024-06-08 14:31:45.000':'2024-06-08 14:32:30.631']
print(Trot_ligne1_sort.head())
print(len(Trot_ligne1_sort))
                           gFx    gFy    gFz  alpha
time                                               
2024-06-08 14:31:45.005  0.015  0.309  0.027  0.311
2024-06-08 14:31:45.036 -0.264 -0.011  0.038  0.267
2024-06-08 14:31:45.036 -0.264 -0.011  0.038  0.267
2024-06-08 14:31:45.036 -0.264 -0.011  0.038  0.267
2024-06-08 14:31:45.042 -0.336 -0.149 -0.099  0.381
4569

Données de la 5ème Colonne (alpha) vs Temps¶

In [413]:
plt.figure(figsize=(15, 5))
px.line(Trot_ligne1_sort, x=Trot_ligne1_sort.index, y='alpha', title='Évolution de alpha en fonction du temps')
<Figure size 1500x500 with 0 Axes>

Données de alpha sur 5 secondes¶

In [414]:
start_time1 = pd.Timestamp('2024-06-08 14:31:46.000')
end_time1 = start_time1 + pd.Timedelta(seconds=5)
Trot_ligne1_sort_5s = Trot_ligne1_sort[start_time1:end_time1]
In [415]:
plt.figure(figsize=(12, 6))
px.line(Trot_ligne1_sort_5s, x=Trot_ligne1_sort_5s.index, y='alpha', title='Évolution de alpha en fonction du temps (5s)')
<Figure size 1200x600 with 0 Axes>

Calcul de d2Z¶

d2Z = (alpha - 1) * 9.81.

In [416]:
Trot_ligne1_new = Trot_ligne1_sort.copy()
Trot_ligne1_new['d2z'] = (Trot_ligne1_new['alpha'] - 1) * 9.81
Trot_ligne1_new.head()
Out[416]:
gFx gFy gFz alpha d2z
time
2024-06-08 14:31:45.005 0.015 0.309 0.027 0.311 -6.75909
2024-06-08 14:31:45.036 -0.264 -0.011 0.038 0.267 -7.19073
2024-06-08 14:31:45.036 -0.264 -0.011 0.038 0.267 -7.19073
2024-06-08 14:31:45.036 -0.264 -0.011 0.038 0.267 -7.19073
2024-06-08 14:31:45.042 -0.336 -0.149 -0.099 0.381 -6.07239

Données de d2Z en fonction du temps¶

In [417]:
plt.figure(figsize=(12, 6))
px.line(Trot_ligne1_new, x=Trot_ligne1_new.index, y='d2z', title='Évolution de d2z en fonction du temps')
<Figure size 1200x600 with 0 Axes>

Données de d2z sur 5 secondes¶

In [418]:
start_time1 = pd.Timestamp('2024-06-08 14:31:46.000')
end_time1 = start_time1 + pd.Timedelta(seconds=5)
Trot_ligne1_new_5s = Trot_ligne1_new[start_time1:end_time1]
In [419]:
plt.figure(figsize=(12, 6))
px.line(Trot_ligne1_new_5s, x=Trot_ligne1_new_5s.index, y='d2z', title='Évolution de d2z en fonction du temps (5s)')
<Figure size 1200x600 with 0 Axes>

Calcul du déplacement¶

Calcul de la fréquence d'échantillonnage à partir des données¶

fs = 1 / (Durée médiane entre les échantillons en secondes)

In [420]:
fs1 = 1.0 / (Trot_ligne1_new.index.to_series().diff().median().total_seconds())
In [421]:
print("Fréquence d'échantillonnage : ", fs1)
Fréquence d'échantillonnage :  100.0

Étape 1 : Filtrer passe-haut pour retirer la gravité des données d'accélération¶

In [422]:
def butter_highpass(cutoff, fs, order=5):
    nyq = 0.5 * fs
    normal_cutoff = cutoff / nyq
    b, a = butter(order, normal_cutoff, btype='high', analog=False)
    return b, a
In [423]:
cutoff1 = 1
fs1 = fs1
order1 = 5
b, a = butter_highpass(cutoff1, fs1, order=order1)
Trot_ligne1_new['d2z_filtre'] = filtfilt(b, a, Trot_ligne1_new['d2z'])

Étape 2 : Intégrer l'accélération filtrée passe-haut pour obtenir la vitesse¶

In [424]:
velocity = cumtrapz(Trot_ligne1_new['d2z_filtre'], dx=1/fs1, initial=0)

Étape 3 : Filtrer passe-haut la vitesse pour retirer les dérives de basse fréquence¶

In [425]:
b, a = butter_highpass(cutoff1, fs1, order=order1)
Trot_ligne1_new['velocity'] = filtfilt(b, a, velocity)

Étape 4 : Intégrer la vitesse filtrée passe-haut pour obtenir le déplacement¶

In [426]:
Trot_ligne1_new['deplacement'] = cumtrapz(Trot_ligne1_new['velocity'], dx=1/fs1, initial=0)
Trot_ligne1_new.head()
Out[426]:
gFx gFy gFz alpha d2z d2z_filtre velocity deplacement
time
2024-06-08 14:31:45.005 0.015 0.309 0.027 0.311 -6.75909 -0.206053 -0.106817 0.000000
2024-06-08 14:31:45.036 -0.264 -0.011 0.038 0.267 -7.19073 -1.075140 -0.127083 -0.001170
2024-06-08 14:31:45.036 -0.264 -0.011 0.038 0.267 -7.19073 -1.510116 -0.153917 -0.002574
2024-06-08 14:31:45.036 -0.264 -0.011 0.038 0.267 -7.19073 -1.941992 -0.185110 -0.004270
2024-06-08 14:31:45.042 -0.336 -0.149 -0.099 0.381 -6.07239 -1.251809 -0.215015 -0.006270

Correction de l'index temporel pour correspondre aux dimensions après intégration¶

In [427]:
time_index1 = Trot_ligne1_new.index
time_index_velocit1 = time_index1[:len(velocity)]
time_index_displacement1 = time_index1[:len(Trot_ligne1_new['deplacement'])]

start_20s_window1 = time_index1[0] 
end_20s_window1 = start_20s_window1 + pd.Timedelta(seconds=20)

Visualisation sur une fenetre de 20 secondes¶

In [428]:
window_data1 = Trot_ligne1_new[(Trot_ligne1_new.index >= start_20s_window1) & (Trot_ligne1_new.index <= end_20s_window1)]
In [429]:
fig, axs = plt.subplots(4, 1, figsize=(23, 17), sharex=True)
axs[0].plot(window_data1.index, window_data1['d2z'], label='d2z')
axs[0].set_ylabel('Accélération (d2z)')
axs[0].legend()
axs[0].title.set_text('d2z original')
axs[0].set_xlabel('Temps')

axs[1].plot(window_data1.index, window_data1['d2z_filtre'], label='d2z_filtre', color='orange')
axs[1].set_ylabel('d2z_filtre')
axs[1].legend()
axs[1].title.set_text('d2z filtré (passe-haut)')
axs[1].set_xlabel('Temps')

axs[2].plot(window_data1.index, window_data1['velocity'], label='velocity', color='red')
axs[2].set_ylabel('velocity')
axs[2].legend()
axs[2].title.set_text('Vitesse filtrée (passe-haut)')
axs[2].set_xlabel('Temps')

axs[3].plot(window_data1.index, window_data1['deplacement'], label='deplacement', color='green')
axs[3].set_ylabel('deplacement')
axs[3].legend()
axs[3].title.set_text('Déplacement')
axs[3].set_xlabel('Temps')

plt.xlabel('Temps')
plt.suptitle('Signaux de la fenêtre de 20 secondes')
plt.show()
No description has been provided for this image

Calcul des foulées¶

Trouver les pics dans le signal de déplacement¶

Les pics de deplacements correspondent aux foulées du cheval.

In [430]:
def trouver_foulees(displacement, prominence=0.01):
    peaks, _ = find_peaks(displacement, prominence=prominence)
    if len(peaks) >= 2:
        return peaks[0], peaks[1]
    else:
        return None, None
In [431]:
def afficher_foulees(displacement, peak1, peak2, time_index_displacement):
    
    plt.figure(figsize=(10, 4))
    
    plt.plot(time_index_displacement, displacement, label='Déplacement', color='green')
    
    plt.plot(time_index_displacement[peak1], displacement[peak1], 'ro', label='Pic maximum d\'une foulée')
    plt.plot(time_index_displacement[peak2], displacement[peak2], 'bo', label='Pic minimum d\'une foulée')
    
    plt.title('Foulées du cheval')
    plt.xlabel('Temps')
    plt.ylabel('Déplacement')
    plt.legend()
    plt.grid(True)
    
    plt.xlim(time_index_displacement[peak1] - pd.Timedelta(seconds=2), time_index_displacement[peak2] + pd.Timedelta(seconds=2))
    
    plt.show()
In [432]:
def identifier_foulees(displacement, prominence=0.01):
    peaks, _ = find_peaks(displacement, prominence=prominence)
    troughs, _ = find_peaks(-displacement, prominence=prominence)
    
    min_length = min(len(peaks), len(troughs))
    peaks = peaks[:min_length]
    troughs = troughs[:min_length]
    
    return peaks, troughs, min_length
In [433]:
def identifier_foulees(displacement, prominence=0.01):
    peaks, _ = find_peaks(displacement, prominence=prominence)
    troughs, _ = find_peaks(-displacement, prominence=prominence)
    
    min_length = min(len(peaks), len(troughs))
    peaks = peaks[:min_length]
    troughs = troughs[:min_length]
    
    return peaks, troughs, min_length
In [434]:
displacement1 = Trot_ligne1_new['deplacement']
time_index_displacement1 = Trot_ligne1_new.index
peak1, peak2 = trouver_foulees(displacement1)
if peak1 is not None and peak2 is not None:
    afficher_foulees(displacement1, peak1, peak2, time_index_displacement1)
else:
    print("Unable to find a stride within the signal based on the given prominence.")
/var/folders/dy/p7g7n6253j76sj1k7y99nbv80000gn/T/ipykernel_17124/1520386640.py:7: FutureWarning:

Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`

/var/folders/dy/p7g7n6253j76sj1k7y99nbv80000gn/T/ipykernel_17124/1520386640.py:8: FutureWarning:

Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`

No description has been provided for this image

Calcul des ISG¶

Pour identifier les foulées, on doit trouver les pics de grande amplitude et les pics de petite amplitude sur le signal de déplacement.

ISG = indice de symétrie
Plus il est proche de 100, plus le cheval est symétrique et donc non boiteux.

$ISG = (A2)^2 /((A1)^2 + (A2)^2) * 100$
A1 & A2 les deux premiers coefficients de Fourier du déplacement z

In [435]:
peaks, troughs, min_length = identifier_foulees(displacement1)

Liste des ISG et des harmoniques pour chaque foulée¶

In [436]:
def calculate_ISG(min_length, troughs, displacement):
    ISGs = []
    A1_values = []
    A2_values = []
    for i in range(min_length - 2):
        # La foulée est entre un trou (troughs[i]) et le trou d'apres (troughs[i+2])
        stride = displacement[troughs[i]:troughs[i+2]]

        # Tranformée de fourier de la foulée
        stride_fft = np.fft.rfft(stride)  
        # Removing the mean for zero-centering
        stride_fft_magnitude = np.abs(stride_fft)

        # coefficient de fourier (A1 et A2) : premiere et deuxieme harmonique
        A1 = stride_fft_magnitude[1]  
        A2 = stride_fft_magnitude[2]  

        # calculer ISG pour chaque foulée
        ISG = (A2**2 / (A1**2 + A2**2)) * 100
        ISGs.append(ISG)
        A1_values.append(A1)
        A2_values.append(A2)
    #supprimer les trois derniers ISGs, A1_values, A2_values
    
    return ISGs, A1_values, A2_values
In [437]:
def print_values(A1, A2, ISG):
    print("A1: {:.6f} | A2: {:.6f} | ISG: {:.6f}".format(A1, A2, ISG))
In [438]:
ISGs1, A1, A2 = calculate_ISG(min_length, troughs, displacement1)

for i in range(len(ISGs1)):
    print_values(A1[i], A2[i], ISGs1[i])
A1: 0.281506 | A2: 1.559755 | ISG: 96.845428
A1: 0.094891 | A2: 1.395536 | ISG: 99.539785
A1: 0.292811 | A2: 1.391029 | ISG: 95.757000
A1: 0.557208 | A2: 1.439293 | ISG: 86.965802
A1: 0.899410 | A2: 1.741680 | ISG: 78.947000
A1: 0.785653 | A2: 1.686813 | ISG: 82.173712
A1: 0.688260 | A2: 1.481967 | ISG: 82.257871
A1: 0.718264 | A2: 1.378029 | ISG: 78.636390
A1: 0.624892 | A2: 1.459518 | ISG: 84.508570
A1: 0.570793 | A2: 1.510040 | ISG: 87.498030
A1: 0.592394 | A2: 1.483213 | ISG: 86.242613
A1: 0.716001 | A2: 1.315232 | ISG: 77.138937
A1: 0.745324 | A2: 1.408319 | ISG: 78.119847
A1: 0.730587 | A2: 1.415992 | ISG: 78.975916
A1: 0.667913 | A2: 1.333136 | ISG: 79.935424
A1: 0.693872 | A2: 1.469799 | ISG: 81.775145
A1: 1.087337 | A2: 1.499884 | ISG: 65.550167
A1: 1.313221 | A2: 1.248455 | ISG: 47.473351
A1: 1.208551 | A2: 1.314758 | ISG: 54.201590
A1: 1.062100 | A2: 1.526337 | ISG: 67.376099
A1: 1.080413 | A2: 1.669007 | ISG: 70.469825
A1: 0.980126 | A2: 1.658580 | ISG: 74.117247
A1: 0.831305 | A2: 1.485560 | ISG: 76.153254
A1: 0.708955 | A2: 1.581403 | ISG: 83.265364
A1: 0.773178 | A2: 1.482073 | ISG: 78.606630
A1: 0.871079 | A2: 1.469150 | ISG: 73.989314
A1: 0.869963 | A2: 1.535506 | ISG: 75.700528
A1: 0.844482 | A2: 1.460841 | ISG: 74.952644
A1: 0.682701 | A2: 1.411771 | ISG: 81.047295
A1: 0.643933 | A2: 1.515614 | ISG: 84.709078
A1: 0.600210 | A2: 1.553793 | ISG: 87.015735
A1: 0.544194 | A2: 1.524322 | ISG: 88.695406
A1: 0.487034 | A2: 1.540994 | ISG: 90.918267
A1: 0.476339 | A2: 1.494808 | ISG: 90.781538
A1: 0.397308 | A2: 1.337341 | ISG: 91.889709
A1: 0.530600 | A2: 1.390743 | ISG: 87.293577
A1: 0.770601 | A2: 1.486064 | ISG: 78.808682
A1: 0.869096 | A2: 1.307194 | ISG: 69.346498
A1: 0.938295 | A2: 1.406474 | ISG: 69.201444
A1: 0.922185 | A2: 1.479128 | ISG: 72.009302
A1: 0.878624 | A2: 1.389397 | ISG: 71.433605
A1: 0.911828 | A2: 1.482949 | ISG: 72.565200
A1: 0.925419 | A2: 1.449138 | ISG: 71.032316
A1: 0.850303 | A2: 1.628281 | ISG: 78.572987
A1: 1.060664 | A2: 1.657933 | ISG: 70.958163
A1: 1.206297 | A2: 1.411311 | ISG: 57.784360
A1: 1.013741 | A2: 1.371009 | ISG: 64.652502
A1: 0.975638 | A2: 1.447915 | ISG: 68.774063
A1: 0.966015 | A2: 1.552528 | ISG: 72.089809
A1: 0.896588 | A2: 1.676075 | ISG: 77.751243
A1: 1.090518 | A2: 1.528518 | ISG: 66.268674
A1: 1.203662 | A2: 1.284337 | ISG: 53.239151
A1: 1.088608 | A2: 1.310610 | ISG: 59.174524
A1: 0.959877 | A2: 1.490449 | ISG: 70.683391
A1: 0.914269 | A2: 1.433810 | ISG: 71.093543
A1: 0.990406 | A2: 1.459641 | ISG: 68.474425
A1: 0.935498 | A2: 1.756005 | ISG: 77.892876
A1: 0.815223 | A2: 1.728254 | ISG: 81.799316
A1: 0.724822 | A2: 1.442849 | ISG: 79.849222
A1: 0.774952 | A2: 1.408455 | ISG: 76.761544
A1: 1.016856 | A2: 1.743795 | ISG: 74.624724
A1: 1.178922 | A2: 1.510411 | ISG: 62.141601
A1: 1.140859 | A2: 1.401035 | ISG: 60.129390
A1: 1.103075 | A2: 1.589012 | ISG: 67.480989
A1: 1.192496 | A2: 1.587079 | ISG: 63.915387
A1: 1.183128 | A2: 1.633301 | ISG: 65.585638
A1: 1.092755 | A2: 1.522565 | ISG: 66.002154
A1: 0.990127 | A2: 1.526637 | ISG: 70.390808
A1: 0.919073 | A2: 1.558189 | ISG: 74.189252
A1: 0.906048 | A2: 1.319332 | ISG: 67.952223
A1: 0.602631 | A2: 1.336573 | ISG: 83.105451
A1: 0.412678 | A2: 1.624052 | ISG: 93.934756
A1: 0.542577 | A2: 1.599069 | ISG: 89.675644
A1: 0.625766 | A2: 1.417115 | ISG: 83.682661
A1: 0.734694 | A2: 1.520390 | ISG: 81.069570
A1: 0.763674 | A2: 1.515852 | ISG: 79.757130
A1: 0.714030 | A2: 1.456230 | ISG: 80.617785
A1: 0.687227 | A2: 1.470077 | ISG: 82.065775
A1: 0.634828 | A2: 1.373132 | ISG: 82.389903
A1: 0.732939 | A2: 1.603170 | ISG: 82.712009
A1: 1.121135 | A2: 1.703038 | ISG: 69.765253
A1: 1.259147 | A2: 1.436717 | ISG: 56.558305
A1: 1.147456 | A2: 1.531314 | ISG: 64.041300
A1: 1.009393 | A2: 1.781126 | ISG: 75.690667
A1: 1.126931 | A2: 1.663747 | ISG: 68.549662
A1: 1.347226 | A2: 1.593650 | ISG: 58.320860
A1: 1.396826 | A2: 1.671580 | ISG: 58.883070
A1: 1.355751 | A2: 1.515912 | ISG: 55.560019
A1: 1.106435 | A2: 1.498856 | ISG: 64.728291
A1: 1.068412 | A2: 1.426711 | ISG: 64.069851
A1: 1.192772 | A2: 1.532668 | ISG: 62.280259
A1: 1.217719 | A2: 1.491555 | ISG: 60.005123
A1: 1.041592 | A2: 1.294962 | ISG: 60.717730
A1: 1.078783 | A2: 1.487768 | ISG: 65.540584
A1: 1.291198 | A2: 1.726294 | ISG: 64.125414
A1: 1.049937 | A2: 1.775582 | ISG: 74.092771
A1: 1.019523 | A2: 1.523534 | ISG: 69.070026
A1: 1.256321 | A2: 1.369492 | ISG: 54.301949
A1: 1.301819 | A2: 1.457595 | ISG: 55.627326
A1: 1.274168 | A2: 1.422151 | ISG: 55.471853
A1: 1.215306 | A2: 1.393729 | ISG: 56.806817
A1: 1.230994 | A2: 1.585055 | ISG: 62.377336
A1: 1.095296 | A2: 1.671767 | ISG: 69.966700
A1: 1.035509 | A2: 1.867811 | ISG: 76.490262
A1: 1.052879 | A2: 1.960993 | ISG: 77.623253
A1: 0.967867 | A2: 1.611364 | ISG: 73.487182
A1: 0.698503 | A2: 1.538610 | ISG: 82.911821
A1: 0.579062 | A2: 1.795475 | ISG: 90.578572
A1: 0.912648 | A2: 1.734844 | ISG: 78.323951
A1: 1.208965 | A2: 1.375037 | ISG: 56.400496
A1: 1.224826 | A2: 1.504780 | ISG: 60.149462
A1: 1.107292 | A2: 1.528096 | ISG: 65.570460
A1: 0.945513 | A2: 1.441453 | ISG: 69.917211
A1: 0.800042 | A2: 1.520651 | ISG: 78.320791
A1: 0.485602 | A2: 1.425991 | ISG: 89.608537
A1: 0.156517 | A2: 1.569243 | ISG: 99.014988
A1: 0.313410 | A2: 1.646509 | ISG: 96.503453
A1: 0.870635 | A2: 1.409465 | ISG: 72.381883
In [439]:
values_list1 = []
In [440]:
def append_values_to_list(A1, A2, ISG, values_list):
    values_list.append({'A1': A1, 'A2': A2, 'ISG': ISG})
    
for i in range(len(ISGs1)):
    append_values_to_list(A1[i], A2[i], ISGs1[i], values_list1)

Création d'un dataframe¶

In [441]:
df_ISG1 = pd.DataFrame(values_list1)
df_ISG1.head()
Out[441]:
A1 A2 ISG
0 0.281506 1.559755 96.845428
1 0.094891 1.395536 99.539785
2 0.292811 1.391029 95.757000
3 0.557208 1.439293 86.965802
4 0.899410 1.741680 78.947000

Valeur de l'ISG¶

In [442]:
df_ISG1.describe()
Out[442]:
A1 A2 ISG
count 118.000000 118.000000 118.000000
mean 0.890455 1.513142 73.940655
std 0.273549 0.131681 11.248176
min 0.094891 1.248455 47.473351
25% 0.710223 1.418374 65.574254
50% 0.916671 1.496832 74.105009
75% 1.092196 1.586573 81.793273
max 1.396826 1.960993 99.539785

ISG de 73.940655 pour ce jeu de données

In [443]:
plt.figure(figsize=(10, 4))
px.line(df_ISG1, x=df_ISG1.index, y='ISG', title='ISG pour chaque foulée')
<Figure size 1000x400 with 0 Axes>

Boxplot des ISG pour visualiser les valeurs aberantes¶

In [444]:
plt.figure(figsize=(10, 4))
plt.boxplot(df_ISG1)
plt.title('Boxplot de ISG')
plt.ylabel('ISG')
plt.grid(True)
plt.show()
No description has been provided for this image

Pas de valeurs abérantes a signaler sur le boxplot

2 - Données au trot en ligne 2¶

Relevé de données effectués le 2024-04-13

Charger les données¶

In [445]:
Trot_ligne = pd.read_csv('data/Trot_ligne.csv')
Trot_ligne.reset_index(inplace=True)
Trot_ligne.columns = ['time', 'gFx', 'gFy', 'gFz', 'alpha']
Trot_ligne['time'] = Trot_ligne['time'].map(pd.to_datetime)
Trot_ligne.set_index('time', inplace=True)
Trot_ligne.head()
Out[445]:
gFx gFy gFz alpha
time
2024-04-13 18:49:37.079 0.103 -0.856 -0.512 1.003
2024-04-13 18:49:37.084 0.099 -0.856 -0.509 1.001
2024-04-13 18:49:37.098 0.108 -0.856 -0.509 1.002
2024-04-13 18:49:37.104 0.105 -0.851 -0.515 1.000
2024-04-13 18:49:37.124 0.100 -0.846 -0.508 0.992
In [446]:
Trot_ligne.tail()
Out[446]:
gFx gFy gFz alpha
time
2024-04-13 18:52:48.771 0.053 -0.777 -0.618 0.994
2024-04-13 18:52:48.781 0.047 -0.782 -0.613 0.995
2024-04-13 18:52:48.791 0.045 -0.781 -0.624 1.001
2024-04-13 18:52:48.801 0.035 -0.770 -0.635 0.999
2024-04-13 18:52:48.811 0.036 -0.768 -0.644 1.003
In [447]:
len(Trot_ligne)
Out[447]:
19280

Travail sur les données¶

Visualisation de alpha pour trier¶

In [448]:
plt.figure(figsize=(15, 5))
px.line(Trot_ligne, x=Trot_ligne.index, y='alpha', title='Évolution de alpha en fonction du temps')
<Figure size 1500x500 with 0 Axes>

On peut remarquer un passage au pas entre 18:51:00 et 18:51:15

Filtrer les données¶

In [449]:
Trot_ligne_sort = Trot_ligne['2024-04-13 18:49:50.079':'2024-04-13 18:50:51.000']
print(Trot_ligne_sort.head())
print(len(Trot_ligne_sort))
                           gFx    gFy    gFz  alpha
time                                               
2024-04-13 18:49:50.082  1.014 -0.701 -1.399  1.865
2024-04-13 18:49:50.092  0.708 -0.716 -1.682  1.960
2024-04-13 18:49:50.102  0.419 -0.624 -1.606  1.773
2024-04-13 18:49:50.113  0.217 -0.642 -1.379  1.537
2024-04-13 18:49:50.128  0.178 -0.814 -1.113  1.390
6126

Données de la 5ème Colonne (alpha) vs Temps¶

In [450]:
plt.figure(figsize=(12, 6))
plt.plot(Trot_ligne_sort['alpha'])
plt.xlabel("Temps")
plt.ylabel("Valeur de la 5ème Colonne (alpha)")
plt.title("Données de la 5ème Colonne (alpha) vs Temps")
plt.legend()
plt.show()
No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.
No description has been provided for this image

Données de alpha sur 5 secondes¶

In [451]:
start_time2 = pd.Timestamp('2024-04-13 18:50:09.083')
end_time2 = start_time2 + pd.Timedelta(seconds=5)
Trot_ligne_5s = Trot_ligne_sort[start_time2:end_time2]
In [452]:
plt.figure(figsize=(12, 6))
px.line(Trot_ligne_5s, x=Trot_ligne_5s.index, y='alpha', title='Évolution de alpha en fonction du temps (5s)')
<Figure size 1200x600 with 0 Axes>

Calcul de d2Z¶

d2Z = (alpha - 1) * 9.81.

In [453]:
# Calculate d2Z = (alpha - 1) * 9.81.
Trot_ligne_new = Trot_ligne_sort.copy()
Trot_ligne_new['d2z'] = (Trot_ligne_new['alpha'] - 1) * 9.81
Trot_ligne_new.head()
Out[453]:
gFx gFy gFz alpha d2z
time
2024-04-13 18:49:50.082 1.014 -0.701 -1.399 1.865 8.48565
2024-04-13 18:49:50.092 0.708 -0.716 -1.682 1.960 9.41760
2024-04-13 18:49:50.102 0.419 -0.624 -1.606 1.773 7.58313
2024-04-13 18:49:50.113 0.217 -0.642 -1.379 1.537 5.26797
2024-04-13 18:49:50.128 0.178 -0.814 -1.113 1.390 3.82590

Données de d2Z en fonction du temps¶

In [454]:
plt.figure(figsize=(12, 6))
plt.plot(Trot_ligne_new['d2z'])
plt.xlabel("Temps")
plt.ylabel("Valeur de d2Z")
plt.title("Valeur de d2Z vs Temps")
plt.legend()
plt.show()
No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.
No description has been provided for this image

Données de d2z sur 5 secondes¶

In [455]:
start_time2 = pd.Timestamp('2024-04-13 18:49:50.079')
end_time2 = start_time2 + pd.Timedelta(seconds=5)
Trot_ligne_5s = Trot_ligne_new[start_time2:end_time2]
In [456]:
plt.figure(figsize=(12, 6))
px.line(Trot_ligne_5s, x=Trot_ligne_5s.index, y='d2z', title='Évolution de d2z en fonction du temps')
<Figure size 1200x600 with 0 Axes>

Calcul du déplacement¶

Calcul de la fréquence d'échantillonnage à partir des données¶

fs = 1 / (Durée médiane entre les échantillons en secondes)

In [457]:
fs2 = 1.0 / (Trot_ligne_new.index.to_series().diff().median().total_seconds())
In [458]:
print("Fréquence d'échantillonnage : ", fs2)
Fréquence d'échantillonnage :  100.0

Étape 1 : Filtrer passe-haut pour retirer la gravité des données d'accélération¶

In [459]:
cutoff2 = 1
fs2 = fs2
order2 = 5
b, a = butter_highpass(cutoff2, fs2, order=order2)
Trot_ligne_new['d2z_filtre'] = filtfilt(b, a, Trot_ligne_new['d2z'])

Étape 2 : Intégrer l'accélération filtrée passe-haut pour obtenir la vitesse¶

In [460]:
velocity = cumtrapz(Trot_ligne_new['d2z_filtre'], dx=1/fs2, initial=0)

Étape 3 : Filtrer passe-haut la vitesse pour retirer les dérives de basse fréquence¶

In [461]:
b, a = butter_highpass(cutoff2, fs2, order=order2)
Trot_ligne_new['velocity'] = filtfilt(b, a, velocity)

Étape 4 : Intégrer la vitesse filtrée passe-haut pour obtenir le déplacement¶

In [462]:
Trot_ligne_new['deplacement'] = cumtrapz(Trot_ligne_new['velocity'], dx=1/fs2, initial=0)
Trot_ligne_new.head()
Out[462]:
gFx gFy gFz alpha d2z d2z_filtre velocity deplacement
time
2024-04-13 18:49:50.082 1.014 -0.701 -1.399 1.865 8.48565 -1.115190 0.095935 0.000000
2024-04-13 18:49:50.092 0.708 -0.716 -1.682 1.960 9.41760 0.240224 0.136634 0.001163
2024-04-13 18:49:50.102 0.419 -0.624 -1.606 1.773 7.58313 -1.175838 0.176632 0.002729
2024-04-13 18:49:50.113 0.217 -0.642 -1.379 1.537 5.26797 -3.078283 0.199569 0.004610
2024-04-13 18:49:50.128 0.178 -0.814 -1.113 1.390 3.82590 -4.113953 0.207274 0.006644

Correction de l'index temporel pour correspondre aux dimensions après intégration¶

In [463]:
time_index2 = Trot_ligne_new.index
time_index_velocity2 = time_index2[:len(velocity)]
time_index_displacement2 = time_index2[:len(Trot_ligne_new['deplacement'])]

start_20s_window2 = time_index2[0] 
end_20s_window2 = start_20s_window2 + pd.Timedelta(seconds=20)

Visualisation sur une fenetre de 20 secondes¶

In [464]:
window_data2 = Trot_ligne_new[(Trot_ligne_new.index >= start_20s_window2) & (Trot_ligne_new.index <= end_20s_window2)]

fig, axs = plt.subplots(4, 1, figsize=(23, 17), sharex=True)
axs[0].plot(window_data2.index, window_data2['d2z'], label='d2z')
axs[0].set_ylabel('Accélération (d2z)')
axs[0].legend()
axs[0].title.set_text('d2z original')
axs[0].set_xlabel('Temps')

axs[1].plot(window_data2.index, window_data2['d2z_filtre'], label='d2z_filtre', color='orange')
axs[1].set_ylabel('d2z_filtre')
axs[1].legend()
axs[1].title.set_text('d2z filtré (passe-haut)')
axs[1].set_xlabel('Temps')

axs[2].plot(window_data2.index, window_data2['velocity'], label='velocity', color='red')
axs[2].set_ylabel('velocity')
axs[2].legend()
axs[2].title.set_text('Vitesse filtrée (passe-haut)')
axs[2].set_xlabel('Temps')

axs[3].plot(window_data2.index, window_data2['deplacement'], label='deplacement', color='green')
axs[3].set_ylabel('deplacement')
axs[3].legend()
axs[3].title.set_text('Déplacement')
axs[3].set_xlabel('Temps')

plt.xlabel('Temps')
plt.suptitle('Signaux de la fenêtre de 20 secondes')
plt.show()
No description has been provided for this image

Calcul des foulées¶

Trouver les pics dans le signal de déplacement¶

Les pics de deplacements correspondent aux foulées du cheval.

In [465]:
displacement2 = Trot_ligne_new['deplacement']
time_index_displacement2 = Trot_ligne_new.index
peak1, peak2 = trouver_foulees(displacement2)
if peak1 is not None and peak2 is not None:
    afficher_foulees(displacement2, peak1, peak2, time_index_displacement2)
else:
    print("Unable to find a stride within the signal based on the given prominence.")
/var/folders/dy/p7g7n6253j76sj1k7y99nbv80000gn/T/ipykernel_17124/1520386640.py:7: FutureWarning:

Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`

/var/folders/dy/p7g7n6253j76sj1k7y99nbv80000gn/T/ipykernel_17124/1520386640.py:8: FutureWarning:

Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`

No description has been provided for this image

Calcul des ISG¶

Pour identifier les foulées, on doit trouver les pics de grande amplitude et les pics de petite amplitude sur le signal de déplacement.

In [466]:
peaks, troughs, min_length = identifier_foulees(displacement2)

Liste des ISG et des harmoniques pour chaque foulée¶

In [467]:
ISGs2, A1, A2 = calculate_ISG(min_length, troughs, displacement2)

for i in range(len(ISGs2)):
    print_values(A1[i], A2[i], ISGs2[i])
A1: 1.509935 | A2: 1.360365 | ISG: 44.803175
A1: 1.323199 | A2: 1.345411 | ISG: 50.832310
A1: 1.040984 | A2: 1.122180 | ISG: 53.748315
A1: 1.035396 | A2: 1.200197 | ISG: 57.331860
A1: 0.974916 | A2: 1.297933 | ISG: 63.930614
A1: 0.906928 | A2: 1.329279 | ISG: 68.236438
A1: 0.743920 | A2: 1.265725 | ISG: 74.325108
A1: 0.704441 | A2: 1.210217 | ISG: 74.692932
A1: 0.634925 | A2: 1.185191 | ISG: 77.700625
A1: 0.533962 | A2: 1.341369 | ISG: 86.321370
A1: 0.463738 | A2: 1.271944 | ISG: 88.267041
A1: 0.564008 | A2: 1.313815 | ISG: 84.438781
A1: 0.784159 | A2: 1.438792 | ISG: 77.098743
A1: 0.827808 | A2: 1.201817 | ISG: 67.822320
A1: 0.799933 | A2: 1.203653 | ISG: 69.363653
A1: 0.828225 | A2: 1.161733 | ISG: 66.301694
A1: 0.844090 | A2: 1.186547 | ISG: 66.398162
A1: 0.810938 | A2: 1.217555 | ISG: 69.270960
A1: 0.657597 | A2: 1.026348 | ISG: 70.896050
A1: 0.660732 | A2: 1.156343 | ISG: 75.386608
A1: 0.768097 | A2: 1.266400 | ISG: 73.106573
A1: 0.812836 | A2: 1.204863 | ISG: 68.722640
A1: 0.904268 | A2: 1.244446 | ISG: 65.444583
A1: 0.937095 | A2: 1.297133 | ISG: 65.706786
A1: 0.997637 | A2: 1.347526 | ISG: 64.594700
A1: 0.950406 | A2: 1.258251 | ISG: 63.672528
A1: 0.730085 | A2: 1.194666 | ISG: 72.808373
A1: 0.580336 | A2: 1.276797 | ISG: 82.877992
A1: 0.415367 | A2: 1.171930 | ISG: 88.839859
A1: 0.360591 | A2: 1.215927 | ISG: 91.916335
A1: 0.320105 | A2: 1.147570 | ISG: 92.780851
A1: 0.332546 | A2: 1.159058 | ISG: 92.394311
A1: 0.464897 | A2: 1.267989 | ISG: 88.150344
A1: 0.423420 | A2: 1.264047 | ISG: 89.911408
A1: 0.271534 | A2: 1.196081 | ISG: 95.098806
A1: 0.252329 | A2: 1.261490 | ISG: 96.152941
A1: 0.249391 | A2: 1.252764 | ISG: 96.188075
A1: 0.325233 | A2: 1.240670 | ISG: 93.569966
A1: 0.369858 | A2: 1.192877 | ISG: 91.229714
A1: 0.390178 | A2: 1.133172 | ISG: 89.400755
A1: 0.548059 | A2: 1.216762 | ISG: 83.133697
A1: 0.618461 | A2: 1.202650 | ISG: 79.085688
A1: 0.672319 | A2: 1.189400 | ISG: 75.785259
A1: 0.755955 | A2: 1.086619 | ISG: 67.385835
A1: 0.777772 | A2: 1.164364 | ISG: 69.146852
A1: 0.687329 | A2: 1.229197 | ISG: 76.180607
A1: 0.628636 | A2: 1.156817 | ISG: 77.201951
A1: 0.495698 | A2: 1.170942 | ISG: 84.802501
A1: 0.322898 | A2: 1.071311 | ISG: 91.672072
A1: 0.280154 | A2: 1.229604 | ISG: 95.065046
A1: 0.296474 | A2: 1.294868 | ISG: 95.018818
A1: 0.466049 | A2: 1.142819 | ISG: 85.740788
A1: 0.560927 | A2: 1.203121 | ISG: 82.144472
A1: 0.614447 | A2: 1.034202 | ISG: 73.910533
A1: 0.518479 | A2: 0.933122 | ISG: 76.409650
A1: 0.524250 | A2: 0.983910 | ISG: 77.887684
A1: 0.535001 | A2: 0.987552 | ISG: 77.310378
A1: 0.447850 | A2: 1.137932 | ISG: 86.588068
A1: 0.588684 | A2: 1.216599 | ISG: 81.028332
A1: 0.674303 | A2: 1.123961 | ISG: 73.533669
A1: 0.676679 | A2: 1.208437 | ISG: 76.129147
A1: 0.580685 | A2: 1.153044 | ISG: 79.768755
A1: 0.386671 | A2: 0.991830 | ISG: 86.806482
A1: 0.333698 | A2: 1.170080 | ISG: 92.478293
A1: 0.394646 | A2: 1.254316 | ISG: 90.992432
A1: 0.428602 | A2: 1.242586 | ISG: 89.367507
A1: 0.424607 | A2: 1.258623 | ISG: 89.781851
A1: 0.507064 | A2: 1.252315 | ISG: 85.914717
A1: 0.664790 | A2: 1.284485 | ISG: 78.872939
A1: 0.698015 | A2: 1.128975 | ISG: 72.345196
A1: 0.641424 | A2: 1.089310 | ISG: 74.254095
A1: 0.617349 | A2: 1.148151 | ISG: 77.572911
A1: 0.522598 | A2: 1.145050 | ISG: 82.760967
A1: 0.380262 | A2: 1.212215 | ISG: 91.041301
A1: 0.386963 | A2: 1.225731 | ISG: 90.936659
A1: 0.487565 | A2: 1.175786 | ISG: 85.327707
A1: 0.451981 | A2: 1.103388 | ISG: 85.631348
A1: 0.415041 | A2: 1.130120 | ISG: 88.115386
A1: 0.459060 | A2: 1.134465 | ISG: 85.929808
A1: 0.485727 | A2: 1.103027 | ISG: 83.758014
A1: 0.530459 | A2: 1.208142 | ISG: 83.837584
A1: 0.551705 | A2: 1.258652 | ISG: 83.883256
A1: 0.683677 | A2: 1.195891 | ISG: 75.367751
A1: 0.774527 | A2: 1.181189 | ISG: 69.931736
A1: 0.740261 | A2: 1.270193 | ISG: 74.646411
A1: 0.655218 | A2: 1.345618 | ISG: 80.834343
A1: 0.537894 | A2: 1.303700 | ISG: 85.453230
A1: 0.510079 | A2: 1.304806 | ISG: 86.743734
A1: 0.648917 | A2: 1.352442 | ISG: 81.286320
A1: 0.709780 | A2: 1.217521 | ISG: 74.634922
A1: 0.722940 | A2: 1.207691 | ISG: 73.619386
A1: 0.728050 | A2: 1.153323 | ISG: 71.505530
A1: 0.608708 | A2: 1.113245 | ISG: 76.983742
A1: 0.447815 | A2: 1.308994 | ISG: 89.522571
A1: 0.365118 | A2: 1.246097 | ISG: 92.093371
A1: 0.414706 | A2: 1.160315 | ISG: 88.672904
A1: 0.396805 | A2: 1.160346 | ISG: 89.529980
A1: 0.424096 | A2: 1.205212 | ISG: 88.981998
A1: 0.566815 | A2: 1.256669 | ISG: 83.095001
A1: 0.675210 | A2: 1.220041 | ISG: 76.552834
A1: 0.750799 | A2: 1.296302 | ISG: 74.880818
A1: 0.728219 | A2: 1.222416 | ISG: 73.807088
A1: 0.595509 | A2: 1.081963 | ISG: 76.749706
A1: 0.514501 | A2: 1.096672 | ISG: 81.960514
A1: 0.433860 | A2: 1.075573 | ISG: 86.005823
A1: 0.386688 | A2: 1.115740 | ISG: 89.276593
A1: 0.359028 | A2: 1.089911 | ISG: 90.211086
A1: 0.300976 | A2: 1.217176 | ISG: 94.237876
A1: 0.325906 | A2: 1.293933 | ISG: 94.034492
A1: 0.311127 | A2: 1.319109 | ISG: 94.730096
A1: 0.302515 | A2: 1.203849 | ISG: 94.060399
A1: 0.426117 | A2: 1.163541 | ISG: 88.174098
A1: 0.456521 | A2: 1.176458 | ISG: 86.912665
A1: 0.528975 | A2: 1.171674 | ISG: 83.068561
A1: 0.620994 | A2: 1.309389 | ISG: 81.637674
A1: 0.601362 | A2: 1.325248 | ISG: 82.924933
A1: 0.578866 | A2: 1.301178 | ISG: 83.478260
A1: 0.552626 | A2: 1.217708 | ISG: 82.921707
A1: 0.556015 | A2: 1.116846 | ISG: 80.137924
A1: 0.546739 | A2: 1.178812 | ISG: 82.296721
A1: 0.565138 | A2: 1.255434 | ISG: 83.150543
A1: 0.560800 | A2: 1.193266 | ISG: 81.908630
A1: 0.571577 | A2: 1.225907 | ISG: 82.143141
A1: 0.632045 | A2: 1.166603 | ISG: 77.307946
A1: 0.641113 | A2: 1.099000 | ISG: 74.609616
A1: 0.605934 | A2: 1.145238 | ISG: 78.128909
A1: 0.450324 | A2: 1.161303 | ISG: 86.928609
A1: 0.351126 | A2: 1.269965 | ISG: 92.898474
A1: 0.213818 | A2: 1.217093 | ISG: 97.006087
A1: 0.289201 | A2: 1.263581 | ISG: 95.022396
A1: 0.467904 | A2: 1.334858 | ISG: 89.057558
A1: 0.569756 | A2: 1.176236 | ISG: 80.995706
A1: 0.754460 | A2: 1.250914 | ISG: 73.326546
A1: 0.788236 | A2: 1.320375 | ISG: 73.725416
A1: 0.747243 | A2: 1.344357 | ISG: 76.396841
A1: 0.707637 | A2: 1.236862 | ISG: 75.339541
A1: 0.649719 | A2: 1.178027 | ISG: 76.676138
A1: 0.592467 | A2: 1.272023 | ISG: 82.173359
A1: 0.436788 | A2: 1.238382 | ISG: 88.936069
A1: 0.361913 | A2: 1.360697 | ISG: 93.393060
A1: 0.435990 | A2: 1.332249 | ISG: 90.326225
A1: 0.454930 | A2: 1.273998 | ISG: 88.690860
A1: 0.462263 | A2: 1.192085 | ISG: 86.928470
A1: 0.522356 | A2: 1.171977 | ISG: 83.426976
A1: 0.577335 | A2: 1.255192 | ISG: 82.538152
A1: 0.587268 | A2: 1.258514 | ISG: 82.118692
A1: 0.543122 | A2: 1.269972 | ISG: 84.538200
A1: 0.468048 | A2: 1.295187 | ISG: 88.449253
A1: 0.561692 | A2: 1.349860 | ISG: 85.240710
A1: 0.732759 | A2: 1.087403 | ISG: 68.771560
A1: 0.788161 | A2: 1.038965 | ISG: 63.472816
A1: 0.886686 | A2: 0.999406 | ISG: 55.955094
A1: 0.947207 | A2: 1.124408 | ISG: 58.491645
A1: 0.914290 | A2: 1.161718 | ISG: 61.751524
A1: 0.798561 | A2: 1.042503 | ISG: 63.021438
A1: 0.744021 | A2: 1.059698 | ISG: 66.981279
A1: 0.705262 | A2: 1.090418 | ISG: 70.505604
A1: 0.664591 | A2: 1.158697 | ISG: 75.245672
A1: 0.682971 | A2: 1.097608 | ISG: 72.088804
A1: 0.678351 | A2: 1.195991 | ISG: 75.660075
A1: 0.651206 | A2: 1.248518 | ISG: 78.613345
A1: 0.638906 | A2: 1.246896 | ISG: 79.204706
A1: 0.600753 | A2: 1.243920 | ISG: 81.087084
A1: 0.672603 | A2: 1.119047 | ISG: 73.461340
A1: 0.929119 | A2: 1.111481 | ISG: 58.865915
A1: 0.950178 | A2: 1.232769 | ISG: 62.731987
A1: 0.792779 | A2: 1.103151 | ISG: 65.943165
A1: 0.520154 | A2: 1.237873 | ISG: 84.992983
A1: 0.921143 | A2: 1.350490 | ISG: 68.248471
In [468]:
values_list2 = []
In [469]:
for i in range(len(ISGs2)):
    append_values_to_list(A1[i], A2[i], ISGs2[i], values_list2)

Création d'un dataframe¶

In [470]:
df_ISG2 = pd.DataFrame(values_list2)
df_ISG2.head()
Out[470]:
A1 A2 ISG
0 1.509935 1.360365 44.803175
1 1.323199 1.345411 50.832310
2 1.040984 1.122180 53.748315
3 1.035396 1.200197 57.331860
4 0.974916 1.297933 63.930614

Valeur de l'ISG¶

In [471]:
df_ISG2.describe()
Out[471]:
A1 A2 ISG
count 169.000000 169.000000 169.000000
mean 0.596587 1.203086 79.832615
std 0.203118 0.087750 10.165059
min 0.213818 0.933122 44.803175
25% 0.450324 1.153044 73.807088
50% 0.578866 1.205212 81.637674
75% 0.709780 1.261490 88.150344
max 1.509935 1.438792 97.006087

ISG de 79.832615 pour ce jeu de données

In [472]:
plt.figure(figsize=(10, 4))
px.line(df_ISG2, x=df_ISG2.index, y='ISG', title='ISG pour chaque foulée')
<Figure size 1000x400 with 0 Axes>

Boxplot des ISG pour visualiser les valeurs aberantes¶

In [473]:
plt.figure(figsize=(10, 4))
plt.boxplot(df_ISG2)
plt.title('Boxplot de ISG')
plt.ylabel('ISG')
plt.grid(True)
plt.show()
No description has been provided for this image

Tri des valeurs aberantes¶

Les points qui apparaissent en dehors des moustaches représentent des valeurs aberrantes.

In [474]:
def ISG_min_max(ISGs, min_value, max_value):
    ISGs_filtered = [ISG for ISG in ISGs if ISG >= min_value and ISG <= max_value]
    return ISGs_filtered
In [475]:
# Supprimer les valeurs aberrantes
min_value2 = 55
max_value2 = 100
ISGs_filtered2 = ISG_min_max(ISGs2, min_value2, max_value2)
In [476]:
plt.figure(figsize=(10, 4))
px.line(ISGs_filtered2, title='ISG pour chaque foulée (Filtré)')
<Figure size 1000x400 with 0 Axes>
In [477]:
plt.figure(figsize=(10, 4))
plt.boxplot(ISGs_filtered2)
plt.title('Boxplot de ISG (Filtré)')
Out[477]:
Text(0.5, 1.0, 'Boxplot de ISG (Filtré)')
No description has been provided for this image

Les données filtrées¶

In [478]:
df_ISG_filtered2 = df_ISG2[(df_ISG2['ISG'] >= min_value2) & (df_ISG2['ISG'] <= max_value2)]
df_ISG_filtered2.describe()
Out[478]:
A1 A2 ISG
count 166.000000 166.000000 166.000000
mean 0.584031 1.201768 80.375471
std 0.179989 0.086753 9.394320
min 0.213818 0.933122 55.955094
25% 0.448469 1.153114 74.271849
50% 0.574456 1.205038 81.934572
75% 0.705057 1.258645 88.168159
max 1.035396 1.438792 97.006087

Apres un filtre des données, l'ISG moyen est de 80.375471

3 - Données au trot en cercle à droite¶

Relevé de données effectués le 2024-01-01
En cercle à droite, le téléphone est à l'extérieur du cercle

Charger les données¶

In [479]:
Trot_droit = pd.read_csv('data/Trot_Droit_Cercle.csv')
Trot_droit.reset_index(inplace=True)
Trot_droit.columns = ['time', 'gFx', 'gFy', 'gFz', 'alpha']
Trot_droit['time'] = Trot_droit['time'].map(pd.to_datetime)
Trot_droit.set_index('time', inplace=True)
Trot_droit.head()
Out[479]:
gFx gFy gFz alpha
time
2024-01-01 15:14:07.885 0.070 -0.741 -0.666 0.999
2024-01-01 15:14:07.886 0.070 -0.741 -0.666 0.999
2024-01-01 15:14:07.893 0.078 -0.744 -0.662 0.999
2024-01-01 15:14:07.903 0.088 -0.742 -0.658 0.996
2024-01-01 15:14:07.913 0.095 -0.743 -0.656 0.996
In [480]:
Trot_droit.tail()
Out[480]:
gFx gFy gFz alpha
time
2024-01-01 15:19:18.875 0.041 -0.734 -0.672 0.996
2024-01-01 15:19:18.887 0.028 -0.718 -0.696 1.000
2024-01-01 15:19:18.895 0.030 -0.707 -0.711 1.003
2024-01-01 15:19:18.910 0.009 -0.688 -0.735 1.007
2024-01-01 15:19:18.915 -0.009 -0.689 -0.732 1.005

Travail sur les données¶

Visualisation de alpha pour trier¶

In [481]:
plt.figure(figsize=(15, 5))
px.line(Trot_droit, x=Trot_droit.index, y='alpha', title='Évolution de alpha en fonction du temps')
<Figure size 1500x500 with 0 Axes>

Filtrer les données¶

In [482]:
Trot_droit_sort = Trot_droit['2024-01-01 15:14:30.000':'2024-01-01 15:18:30.000']
Trot_droit_sort.head() 
Out[482]:
gFx gFy gFz alpha
time
2024-01-01 15:14:30.004 -0.871 -1.959 -0.718 2.261
2024-01-01 15:14:30.034 0.575 -1.166 -1.257 1.808
2024-01-01 15:14:30.035 0.575 -1.166 -1.257 1.808
2024-01-01 15:14:30.035 0.575 -1.166 -1.257 1.808
2024-01-01 15:14:30.043 0.893 -1.037 -1.156 1.791

Données de alpha vs Temps¶

In [483]:
plt.figure(figsize=(12, 6))
px.line(Trot_droit_sort, x=Trot_droit_sort.index, y='alpha', title='Évolution de alpha en fonction du temps')
<Figure size 1200x600 with 0 Axes>

Données de alpha sur 5 secondes¶

In [484]:
start_time3 = Trot_droit_sort.index.min()
end_time3 = start_time3 + pd.Timedelta(seconds=5)
Trot_droit_sort_5s = Trot_droit_sort[start_time3:end_time3]
In [485]:
plt.figure(figsize=(12, 6))
px.line(Trot_droit_sort_5s, x=Trot_droit_sort_5s.index, y='alpha', title='Évolution de alpha en fonction du temps (5s)')
<Figure size 1200x600 with 0 Axes>

Calcul de d2Z¶

d2Z = (alpha - 1) * 9.81.

In [486]:
Trot_droit_new = Trot_droit_sort.copy()
Trot_droit_new['d2z'] = (Trot_droit_new['alpha'] - 1) * 9.81
Trot_droit_new.head()
Out[486]:
gFx gFy gFz alpha d2z
time
2024-01-01 15:14:30.004 -0.871 -1.959 -0.718 2.261 12.37041
2024-01-01 15:14:30.034 0.575 -1.166 -1.257 1.808 7.92648
2024-01-01 15:14:30.035 0.575 -1.166 -1.257 1.808 7.92648
2024-01-01 15:14:30.035 0.575 -1.166 -1.257 1.808 7.92648
2024-01-01 15:14:30.043 0.893 -1.037 -1.156 1.791 7.75971

Tracer d2Z en fonction du temps¶

In [487]:
plt.figure(figsize=(12, 6))
px.line(Trot_droit_new, x=Trot_droit_new.index, y='d2z', title='Évolution de d2z en fonction du temps')
<Figure size 1200x600 with 0 Axes>

Données de d2Z sur 5 secondes¶

In [488]:
start_time3 = Trot_droit_new.index.min()
end_time3 = start_time3 + pd.Timedelta(seconds=5)
Trot_droit_new_5s = Trot_droit_new[start_time3:end_time3]
In [489]:
plt.figure(figsize=(12, 6))
px.line(Trot_droit_new_5s, x=Trot_droit_new_5s.index, y='d2z', title='Évolution de d2z en fonction du temps (5s)')
<Figure size 1200x600 with 0 Axes>

Calcul du déplacement¶

Calcul de la fréquence d'échantillonnage à partir des données¶

In [490]:
fs3 = 1.0 / (Trot_droit_new.index.to_series().diff().median().total_seconds())
In [491]:
print("Fréquence d'échantillonnage : ", fs3)
Fréquence d'échantillonnage :  100.0

Étape 1 : Filtrer passe-haut pour retirer la gravité des données d'accélération¶

In [492]:
cutoff3 = 1
fs3 = fs3
order3 = 5
b, a = butter_highpass(cutoff3, fs3, order=order3)
Trot_droit_new['d2z_filtre'] = filtfilt(b, a, Trot_droit_new['d2z'])

Étape 2 : Intégrer l'accélération filtrée passe-haut pour obtenir la vitesse¶

In [493]:
velocity = cumtrapz(Trot_droit_new['d2z_filtre'], dx=1/fs3, initial=0)

Étape 3 : Filtrer passe-haut la vitesse pour retirer les dérives de basse fréquence¶

In [494]:
b, a = butter_highpass(cutoff3, fs3, order=order3)
Trot_droit_new['velocity'] = filtfilt(b, a, velocity)

Étape 4 : Intégrer la vitesse filtrée passe-haut pour obtenir le déplacement¶

In [495]:
Trot_droit_new['deplacement'] = cumtrapz(Trot_droit_new['velocity'], dx=1/fs3, initial=0)
Trot_droit_new.head()
Out[495]:
gFx gFy gFz alpha d2z d2z_filtre velocity deplacement
time
2024-01-01 15:14:30.004 -0.871 -1.959 -0.718 2.261 12.37041 0.244910 0.133267 0.000000
2024-01-01 15:14:30.034 0.575 -1.166 -1.257 1.808 7.92648 -3.757422 0.126081 0.001297
2024-01-01 15:14:30.035 0.575 -1.166 -1.257 1.808 7.92648 -3.319735 0.101239 0.002433
2024-01-01 15:14:30.035 0.575 -1.166 -1.257 1.808 7.92648 -2.886554 0.080900 0.003344
2024-01-01 15:14:30.043 0.893 -1.037 -1.156 1.791 7.75971 -2.625231 0.064160 0.004069

Correction de l'index temporel pour correspondre aux dimensions après intégration¶

In [496]:
time_index3 = Trot_droit_new.index
time_index_velocity3 = time_index3[:len(velocity)]
time_index_displacement3 = time_index3[:len(Trot_droit_new['deplacement'])]

start_20s_window3 = time_index3[0] 
end_20s_window3 = start_20s_window3 + pd.Timedelta(seconds=20)

Visualisation sur une fenetre de 20 secondes¶

In [497]:
# Tracé des signaux d2z, d2z_filtre, velocity, deplacement de la fenêtre de 20 secondes uniquement
window_data3 = Trot_droit_new[(Trot_droit_new.index >= start_20s_window3) & (Trot_droit_new.index <= end_20s_window3)]


fig, axs = plt.subplots(4, 1, figsize=(23, 17), sharex=True)
axs[0].plot(window_data3.index, window_data3['d2z'], label='d2z')
axs[0].set_ylabel('Accélération (d2z)')
axs[0].legend()
axs[0].title.set_text('d2z original')
axs[0].set_xlabel('Temps')

axs[1].plot(window_data3.index, window_data3['d2z_filtre'], label='d2z_filtre', color='orange')
axs[1].set_ylabel('d2z_filtre')
axs[1].legend()
axs[1].title.set_text('d2z filtré (passe-haut)')
axs[1].set_xlabel('Temps')

axs[2].plot(window_data3.index, window_data3['velocity'], label='velocity', color='red')
axs[2].set_ylabel('velocity')
axs[2].legend()
axs[2].title.set_text('Vitesse filtrée (passe-haut)')
axs[2].set_xlabel('Temps')

axs[3].plot(window_data3.index, window_data3['deplacement'], label='deplacement', color='green')
axs[3].set_ylabel('deplacement')
axs[3].legend()
axs[3].title.set_text('Déplacement')
axs[3].set_xlabel('Temps')

plt.xlabel('Temps')
plt.suptitle('Signaux de la fenêtre de 20 secondes')
plt.show()
No description has been provided for this image

Calcul des foulées¶

Trouver les pics dans le signal de déplacement¶

Les pics de deplacements correspondent aux foulées du cheval.

In [498]:
displacement3 = Trot_droit_new['deplacement']
time_index_displacement3 = Trot_droit_new.index
peak1, peak2 = trouver_foulees(displacement3)
if peak1 is not None and peak2 is not None:
    afficher_foulees(displacement3, peak1, peak2, time_index_displacement3)
else:
    print("Unable to find a stride within the signal based on the given prominence.")
/var/folders/dy/p7g7n6253j76sj1k7y99nbv80000gn/T/ipykernel_17124/1520386640.py:7: FutureWarning:

Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`

/var/folders/dy/p7g7n6253j76sj1k7y99nbv80000gn/T/ipykernel_17124/1520386640.py:8: FutureWarning:

Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`

No description has been provided for this image

Calcul des ISG¶

In [499]:
peaks, troughs, min_length = identifier_foulees(displacement3)

Liste des ISG et des harmoniques pour chaque foulée¶

In [500]:
ISGs3, A1, A2 = calculate_ISG(min_length, troughs, displacement3)

for i in range(len(ISGs3)):
    print_values(A1[i], A2[i], ISGs3[i])
A1: 0.698939 | A2: 1.240083 | ISG: 75.891516
A1: 0.748643 | A2: 1.238705 | ISG: 73.245629
A1: 0.703944 | A2: 1.052106 | ISG: 69.076556
A1: 0.816757 | A2: 1.216737 | ISG: 68.936940
A1: 0.740528 | A2: 1.333697 | ISG: 76.435304
A1: 0.598091 | A2: 1.375213 | ISG: 84.094046
A1: 0.442680 | A2: 1.353905 | ISG: 90.341890
A1: 0.326693 | A2: 1.347250 | ISG: 94.446459
A1: 0.297279 | A2: 1.257692 | ISG: 94.708608
A1: 0.287086 | A2: 1.336657 | ISG: 95.590406
A1: 0.293073 | A2: 1.500849 | ISG: 96.326957
A1: 0.249537 | A2: 1.471015 | ISG: 97.202853
A1: 0.295299 | A2: 1.334943 | ISG: 95.335014
A1: 0.411954 | A2: 1.385066 | ISG: 91.872737
A1: 0.474667 | A2: 1.423121 | ISG: 89.988862
A1: 0.528701 | A2: 1.310348 | ISG: 85.999516
A1: 0.549651 | A2: 1.391768 | ISG: 86.507449
A1: 0.576443 | A2: 1.377058 | ISG: 85.089717
A1: 0.576454 | A2: 1.416456 | ISG: 85.790963
A1: 0.521870 | A2: 1.450615 | ISG: 88.540564
A1: 0.424253 | A2: 1.369611 | ISG: 91.244838
A1: 0.381134 | A2: 1.395743 | ISG: 93.060767
A1: 0.442170 | A2: 1.435675 | ISG: 91.336194
A1: 0.375590 | A2: 1.385193 | ISG: 93.151477
A1: 0.303477 | A2: 1.416880 | ISG: 95.613640
A1: 0.329666 | A2: 1.367089 | ISG: 94.504514
A1: 0.266552 | A2: 1.307302 | ISG: 96.008638
A1: 0.285481 | A2: 1.363293 | ISG: 95.799151
A1: 0.353367 | A2: 1.218665 | ISG: 92.244289
A1: 0.552015 | A2: 1.344589 | ISG: 85.576335
A1: 0.701945 | A2: 1.482356 | ISG: 81.683741
A1: 0.563602 | A2: 1.260788 | ISG: 83.345145
A1: 0.487576 | A2: 1.136207 | ISG: 84.448841
A1: 0.577674 | A2: 1.193396 | ISG: 81.016742
A1: 0.552777 | A2: 1.292023 | ISG: 84.527590
A1: 0.435554 | A2: 1.295612 | ISG: 89.846106
A1: 0.347360 | A2: 1.337586 | ISG: 93.682114
A1: 0.319945 | A2: 1.325863 | ISG: 94.497348
A1: 0.356126 | A2: 1.109399 | ISG: 90.658051
A1: 0.463594 | A2: 1.191994 | ISG: 86.861265
A1: 0.438543 | A2: 1.317432 | ISG: 90.024610
A1: 0.367440 | A2: 1.350087 | ISG: 93.103682
A1: 0.356354 | A2: 1.427534 | ISG: 94.134066
A1: 0.326648 | A2: 1.358806 | ISG: 94.536831
A1: 0.339103 | A2: 1.336240 | ISG: 93.949548
A1: 0.459083 | A2: 1.374044 | ISG: 89.958003
A1: 0.567895 | A2: 1.413393 | ISG: 86.100025
A1: 0.503176 | A2: 1.257611 | ISG: 86.200661
A1: 0.328402 | A2: 1.130688 | ISG: 92.220451
A1: 0.423887 | A2: 1.334264 | ISG: 90.832348
A1: 0.458030 | A2: 1.342447 | ISG: 89.572769
A1: 0.419234 | A2: 1.228498 | ISG: 89.569095
A1: 0.360979 | A2: 1.279073 | ISG: 92.622786
A1: 0.406166 | A2: 1.364889 | ISG: 91.864928
A1: 0.477483 | A2: 1.404080 | ISG: 89.634142
A1: 0.563850 | A2: 1.388642 | ISG: 85.846363
A1: 0.586371 | A2: 1.393827 | ISG: 84.963123
A1: 0.522779 | A2: 1.336085 | ISG: 86.722927
A1: 0.468747 | A2: 1.341083 | ISG: 89.113030
A1: 0.353575 | A2: 1.503552 | ISG: 94.759777
A1: 0.514948 | A2: 1.319224 | ISG: 86.777923
A1: 0.643930 | A2: 1.338390 | ISG: 81.203149
A1: 0.665560 | A2: 1.365081 | ISG: 80.793997
A1: 0.583204 | A2: 1.193506 | ISG: 80.724820
A1: 0.469174 | A2: 1.286750 | ISG: 88.265370
A1: 0.308277 | A2: 1.208488 | ISG: 93.890306
A1: 0.176114 | A2: 1.251830 | ISG: 98.059180
A1: 0.203909 | A2: 1.297009 | ISG: 97.587965
A1: 0.240235 | A2: 1.268764 | ISG: 96.538905
A1: 0.296380 | A2: 1.228200 | ISG: 94.497264
A1: 0.332230 | A2: 1.158099 | ISG: 92.396027
A1: 0.404582 | A2: 1.300017 | ISG: 91.169877
A1: 0.535825 | A2: 1.413398 | ISG: 87.433992
A1: 0.504432 | A2: 1.459086 | ISG: 89.323919
A1: 0.528152 | A2: 1.268791 | ISG: 85.231476
A1: 0.693019 | A2: 1.248610 | ISG: 76.449046
A1: 0.636031 | A2: 1.474454 | ISG: 84.311530
A1: 0.387903 | A2: 1.382138 | ISG: 92.698433
A1: 0.294244 | A2: 1.279596 | ISG: 94.977822
A1: 0.282595 | A2: 1.412727 | ISG: 96.152549
A1: 0.276488 | A2: 1.482318 | ISG: 96.637862
A1: 0.281741 | A2: 1.349909 | ISG: 95.825784
A1: 0.209017 | A2: 1.322111 | ISG: 97.561599
A1: 0.269273 | A2: 1.404550 | ISG: 96.454831
A1: 0.385691 | A2: 1.352947 | ISG: 92.484052
A1: 0.483022 | A2: 1.321042 | ISG: 88.207494
A1: 0.566162 | A2: 1.529293 | ISG: 87.946378
A1: 0.429667 | A2: 1.444920 | ISG: 91.875852
A1: 0.366054 | A2: 1.231346 | ISG: 91.880093
A1: 0.459087 | A2: 1.208691 | ISG: 87.392379
A1: 0.530408 | A2: 1.371265 | ISG: 86.985581
A1: 0.575591 | A2: 1.397497 | ISG: 85.496469
A1: 0.602706 | A2: 1.386242 | ISG: 84.102094
A1: 0.637996 | A2: 1.379723 | ISG: 82.384424
A1: 0.664297 | A2: 1.319161 | ISG: 79.771040
A1: 0.529174 | A2: 1.318137 | ISG: 86.120248
A1: 0.345338 | A2: 1.286614 | ISG: 93.279829
A1: 0.424953 | A2: 1.406037 | ISG: 91.629972
A1: 0.478036 | A2: 1.352383 | ISG: 88.893182
A1: 0.515710 | A2: 1.254756 | ISG: 85.548734
A1: 0.652764 | A2: 1.379101 | ISG: 81.696839
A1: 0.675800 | A2: 1.340696 | ISG: 79.739526
A1: 0.593669 | A2: 1.273068 | ISG: 82.138033
A1: 0.500160 | A2: 1.315727 | ISG: 87.373932
A1: 0.341791 | A2: 1.307488 | ISG: 93.603567
A1: 0.322773 | A2: 1.448884 | ISG: 95.271841
A1: 0.312818 | A2: 1.403880 | ISG: 95.269798
A1: 0.253414 | A2: 1.449163 | ISG: 97.032817
A1: 0.225056 | A2: 1.493501 | ISG: 97.779671
A1: 0.184056 | A2: 1.216016 | ISG: 97.760339
A1: 0.091963 | A2: 1.126662 | ISG: 99.338151
A1: 0.147783 | A2: 1.270143 | ISG: 98.664320
A1: 0.304057 | A2: 1.425514 | ISG: 95.648440
A1: 0.385781 | A2: 1.402392 | ISG: 92.965025
A1: 0.456321 | A2: 1.438677 | ISG: 90.859221
A1: 0.473378 | A2: 1.390235 | ISG: 89.610427
A1: 0.520370 | A2: 1.364403 | ISG: 87.301291
A1: 0.559114 | A2: 1.376656 | ISG: 85.840668
A1: 0.598497 | A2: 1.372796 | ISG: 84.028697
A1: 0.513919 | A2: 1.345208 | ISG: 87.263672
A1: 0.345528 | A2: 1.263275 | ISG: 93.039528
A1: 0.289098 | A2: 1.318251 | ISG: 95.411266
A1: 0.342230 | A2: 1.275624 | ISG: 93.285628
A1: 0.379549 | A2: 1.337147 | ISG: 92.543674
A1: 0.396756 | A2: 1.382858 | ISG: 92.394345
A1: 0.461348 | A2: 1.443928 | ISG: 90.737030
A1: 0.559460 | A2: 1.500526 | ISG: 87.795414
A1: 0.533633 | A2: 1.327025 | ISG: 86.080267
A1: 0.549496 | A2: 1.376035 | ISG: 86.246530
A1: 0.573181 | A2: 1.404820 | ISG: 85.728576
A1: 0.542161 | A2: 1.400170 | ISG: 86.961646
A1: 0.550552 | A2: 1.323550 | ISG: 85.249476
A1: 0.448366 | A2: 1.206278 | ISG: 87.861381
A1: 0.465188 | A2: 1.301651 | ISG: 88.674296
A1: 0.501790 | A2: 1.259492 | ISG: 86.301542
A1: 0.515959 | A2: 1.216655 | ISG: 84.756961
A1: 0.578654 | A2: 1.332493 | ISG: 84.133615
A1: 0.469674 | A2: 1.345946 | ISG: 89.144896
A1: 0.252502 | A2: 1.284317 | ISG: 96.278539
A1: 0.210006 | A2: 1.392273 | ISG: 97.775446
A1: 0.270037 | A2: 1.371093 | ISG: 96.265898
A1: 0.347836 | A2: 1.362685 | ISG: 93.882924
A1: 0.482616 | A2: 1.615439 | ISG: 91.806033
A1: 0.421155 | A2: 1.564103 | ISG: 93.239882
A1: 0.327437 | A2: 1.343644 | ISG: 94.394265
A1: 0.432256 | A2: 1.333381 | ISG: 90.490115
A1: 0.424528 | A2: 1.365145 | ISG: 91.182115
A1: 0.357221 | A2: 1.415602 | ISG: 94.013376
A1: 0.340796 | A2: 1.363370 | ISG: 94.119154
A1: 0.351569 | A2: 1.376686 | ISG: 93.877724
A1: 0.403406 | A2: 1.493961 | ISG: 93.204172
A1: 0.468953 | A2: 1.442875 | ISG: 90.445895
A1: 0.528494 | A2: 1.441613 | ISG: 88.152726
A1: 0.648066 | A2: 1.226429 | ISG: 78.172336
A1: 0.662908 | A2: 1.095717 | ISG: 73.205144
A1: 0.703597 | A2: 1.171162 | ISG: 73.479530
A1: 0.660687 | A2: 1.189438 | ISG: 76.421200
A1: 0.734931 | A2: 1.358418 | ISG: 77.357292
A1: 0.738469 | A2: 1.434394 | ISG: 79.048281
A1: 0.640490 | A2: 1.396550 | ISG: 82.621751
A1: 0.462784 | A2: 1.312870 | ISG: 88.947813
A1: 0.533587 | A2: 1.529383 | ISG: 89.148435
A1: 0.671995 | A2: 1.490848 | ISG: 83.113613
A1: 0.724189 | A2: 1.239821 | ISG: 74.561109
A1: 0.738574 | A2: 1.368512 | ISG: 77.443324
A1: 0.584896 | A2: 1.287648 | ISG: 82.896015
A1: 0.431359 | A2: 1.146001 | ISG: 87.590219
A1: 0.576299 | A2: 1.346225 | ISG: 84.512507
A1: 0.774316 | A2: 1.470507 | ISG: 78.292004
A1: 0.722280 | A2: 1.355417 | ISG: 77.883733
A1: 0.666448 | A2: 1.063761 | ISG: 71.813089
A1: 0.688498 | A2: 1.021783 | ISG: 68.774178
A1: 0.691706 | A2: 1.204497 | ISG: 75.200085
A1: 0.605069 | A2: 1.226867 | ISG: 80.435732
A1: 0.447132 | A2: 1.257958 | ISG: 88.783157
A1: 0.476730 | A2: 1.259723 | ISG: 87.472429
A1: 0.411899 | A2: 1.234106 | ISG: 89.976760
A1: 0.385865 | A2: 1.348606 | ISG: 92.432951
A1: 0.403811 | A2: 1.342858 | ISG: 91.707231
A1: 0.430487 | A2: 1.333841 | ISG: 90.566368
A1: 0.536341 | A2: 1.474425 | ISG: 88.314010
A1: 0.559671 | A2: 1.381477 | ISG: 85.901310
A1: 0.528141 | A2: 1.432569 | ISG: 88.034714
A1: 0.548783 | A2: 1.433479 | ISG: 87.217328
A1: 0.587062 | A2: 1.366492 | ISG: 84.419016
A1: 0.547795 | A2: 1.384129 | ISG: 86.457836
A1: 0.568480 | A2: 1.332289 | ISG: 84.597490
A1: 0.663107 | A2: 1.169597 | ISG: 75.675251
A1: 0.636722 | A2: 1.232118 | ISG: 78.923368
A1: 0.576848 | A2: 1.400914 | ISG: 85.502925
A1: 0.541592 | A2: 1.394380 | ISG: 86.891333
A1: 0.545615 | A2: 1.481308 | ISG: 88.053797
A1: 0.601273 | A2: 1.329517 | ISG: 83.019956
A1: 0.619981 | A2: 1.302996 | ISG: 81.539664
A1: 0.586195 | A2: 1.373256 | ISG: 84.587075
A1: 0.580538 | A2: 1.393076 | ISG: 85.203220
A1: 0.641826 | A2: 1.444560 | ISG: 83.513747
A1: 0.642326 | A2: 1.414456 | ISG: 82.903585
A1: 0.609663 | A2: 1.449946 | ISG: 84.976370
A1: 0.586352 | A2: 1.371890 | ISG: 84.554090
A1: 0.463273 | A2: 1.457626 | ISG: 90.825353
A1: 0.247257 | A2: 1.576728 | ISG: 97.599871
A1: 0.296526 | A2: 1.435537 | ISG: 95.907857
A1: 0.402079 | A2: 1.453228 | ISG: 92.889182
A1: 0.478678 | A2: 1.532834 | ISG: 91.114468
A1: 0.553121 | A2: 1.407465 | ISG: 86.621945
A1: 0.602404 | A2: 1.446511 | ISG: 85.220022
A1: 0.586996 | A2: 1.370306 | ISG: 84.495168
A1: 0.417329 | A2: 1.183376 | ISG: 88.938776
A1: 0.537165 | A2: 1.345969 | ISG: 86.260886
A1: 0.627218 | A2: 1.438453 | ISG: 84.024585
A1: 0.628703 | A2: 1.392591 | ISG: 83.068999
A1: 0.652552 | A2: 1.412623 | ISG: 82.413594
A1: 0.622493 | A2: 1.378537 | ISG: 83.062875
A1: 0.573053 | A2: 1.458320 | ISG: 86.624116
A1: 0.427136 | A2: 1.485732 | ISG: 92.365823
A1: 0.365539 | A2: 1.367082 | ISG: 93.327506
A1: 0.417045 | A2: 1.455488 | ISG: 92.412805
A1: 0.381326 | A2: 1.452552 | ISG: 93.552589
A1: 0.416289 | A2: 1.375434 | ISG: 91.608383
A1: 0.502259 | A2: 1.582271 | ISG: 90.846226
A1: 0.482237 | A2: 1.458000 | ISG: 90.139041
A1: 0.298594 | A2: 1.215173 | ISG: 94.305892
A1: 0.241151 | A2: 1.284705 | ISG: 96.596455
A1: 0.316115 | A2: 1.354588 | ISG: 94.835283
A1: 0.397268 | A2: 1.378392 | ISG: 92.330494
A1: 0.370427 | A2: 1.176217 | ISG: 90.976807
A1: 0.475919 | A2: 1.285750 | ISG: 87.949967
A1: 0.528859 | A2: 1.443053 | ISG: 88.159158
A1: 0.469549 | A2: 1.394944 | ISG: 89.822654
A1: 0.419831 | A2: 1.427508 | ISG: 92.039055
A1: 0.346673 | A2: 1.441256 | ISG: 94.530723
A1: 0.360037 | A2: 1.494629 | ISG: 94.515575
A1: 0.314138 | A2: 1.468101 | ISG: 95.621895
A1: 0.278129 | A2: 1.504443 | ISG: 96.695190
A1: 0.260833 | A2: 1.545339 | ISG: 97.230019
A1: 0.321951 | A2: 1.410806 | ISG: 95.050086
A1: 0.473307 | A2: 1.404725 | ISG: 89.804643
A1: 0.626938 | A2: 1.438731 | ISG: 84.041762
A1: 0.668795 | A2: 1.296085 | ISG: 78.972203
A1: 0.579814 | A2: 1.338937 | ISG: 84.208839
A1: 0.533725 | A2: 1.368959 | ISG: 86.805300
A1: 0.493207 | A2: 1.481230 | ISG: 90.019533
A1: 0.333835 | A2: 1.582861 | ISG: 95.741291
A1: 0.323898 | A2: 1.508168 | ISG: 95.591056
A1: 0.524998 | A2: 1.575815 | ISG: 90.009380
A1: 0.599266 | A2: 1.661736 | ISG: 88.491550
A1: 0.582619 | A2: 1.453458 | ISG: 86.156310
A1: 0.439433 | A2: 1.308061 | ISG: 89.858798
A1: 0.438991 | A2: 1.244483 | ISG: 88.933744
A1: 0.320594 | A2: 1.168434 | ISG: 92.998681
A1: 0.321103 | A2: 1.392942 | ISG: 94.954132
A1: 0.439596 | A2: 1.422299 | ISG: 91.280286
A1: 0.555539 | A2: 1.324610 | ISG: 85.041620
A1: 0.555506 | A2: 1.418166 | ISG: 86.697601
A1: 0.341066 | A2: 1.391838 | ISG: 94.335354
A1: 0.268646 | A2: 1.285213 | ISG: 95.813634
A1: 0.267424 | A2: 1.326817 | ISG: 96.096216
A1: 0.338079 | A2: 1.322643 | ISG: 93.867119
A1: 0.420696 | A2: 1.262563 | ISG: 90.006777
A1: 0.468275 | A2: 1.339929 | ISG: 89.115862
A1: 0.461493 | A2: 1.324925 | ISG: 89.180260
A1: 0.452423 | A2: 1.328985 | ISG: 89.614499
A1: 0.505157 | A2: 1.425329 | ISG: 88.840748
A1: 0.503954 | A2: 1.611264 | ISG: 91.089216
A1: 0.366034 | A2: 1.609785 | ISG: 95.083964
A1: 0.344974 | A2: 1.460304 | ISG: 94.714315
A1: 0.405091 | A2: 1.539769 | ISG: 93.526649
A1: 0.491373 | A2: 1.402291 | ISG: 89.064242
A1: 0.509387 | A2: 1.330420 | ISG: 87.214786
A1: 0.538829 | A2: 1.454130 | ISG: 87.926950
A1: 0.592883 | A2: 1.470603 | ISG: 86.018918
A1: 0.568285 | A2: 1.440170 | ISG: 86.527236
A1: 0.535107 | A2: 1.254521 | ISG: 84.606750
A1: 0.427833 | A2: 1.241878 | ISG: 89.390765
A1: 0.449546 | A2: 1.401257 | ISG: 90.668138
A1: 0.494605 | A2: 1.430775 | ISG: 89.325461
A1: 0.517962 | A2: 1.385128 | ISG: 87.731999
A1: 0.478666 | A2: 1.444431 | ISG: 90.104895
A1: 0.379189 | A2: 1.435276 | ISG: 93.475626
A1: 0.348842 | A2: 1.433169 | ISG: 94.406729
A1: 0.413964 | A2: 1.472312 | ISG: 92.673749
A1: 0.409043 | A2: 1.462329 | ISG: 92.743422
A1: 0.402573 | A2: 1.427290 | ISG: 92.630797
A1: 0.428772 | A2: 1.433092 | ISG: 91.783790
A1: 0.345019 | A2: 1.405157 | ISG: 94.313936
A1: 0.309513 | A2: 1.314345 | ISG: 94.745898
A1: 0.390458 | A2: 1.439417 | ISG: 93.146063
A1: 0.465038 | A2: 1.341470 | ISG: 89.271747
A1: 0.476806 | A2: 1.238749 | ISG: 87.096216
A1: 0.427391 | A2: 1.281852 | ISG: 89.995511
A1: 0.433888 | A2: 1.213049 | ISG: 88.657392
A1: 0.426730 | A2: 1.400359 | ISG: 91.503058
A1: 0.426826 | A2: 1.621058 | ISG: 93.516742
A1: 0.417302 | A2: 1.586904 | ISG: 93.532147
A1: 0.369316 | A2: 1.436532 | ISG: 93.800310
A1: 0.423969 | A2: 1.469301 | ISG: 92.313766
A1: 0.260386 | A2: 1.470337 | ISG: 96.959174
A1: 0.181039 | A2: 1.380698 | ISG: 98.309781
A1: 0.282339 | A2: 1.490730 | ISG: 96.537125
A1: 0.375266 | A2: 1.349491 | ISG: 92.822203
A1: 0.383460 | A2: 1.252205 | ISG: 91.426427
A1: 0.473297 | A2: 1.355905 | ISG: 89.138849
A1: 0.476756 | A2: 1.224834 | ISG: 86.842597
A1: 0.366735 | A2: 1.217247 | ISG: 91.678271
A1: 0.419160 | A2: 1.243622 | ISG: 89.798738
A1: 0.347603 | A2: 1.261631 | ISG: 92.944514
A1: 0.320164 | A2: 1.268048 | ISG: 94.007143
A1: 0.318085 | A2: 1.394155 | ISG: 95.052046
A1: 0.268029 | A2: 1.546659 | ISG: 97.084424
A1: 0.306038 | A2: 1.437660 | ISG: 95.664975
A1: 0.345663 | A2: 1.336155 | ISG: 93.727249
A1: 0.444387 | A2: 1.346583 | ISG: 90.178879
A1: 0.408977 | A2: 1.360764 | ISG: 91.715356
A1: 0.364997 | A2: 1.333643 | ISG: 93.031658
A1: 0.398534 | A2: 1.369048 | ISG: 92.187898
A1: 0.400614 | A2: 1.413980 | ISG: 92.569241
A1: 0.441959 | A2: 1.455167 | ISG: 91.554638
A1: 0.557485 | A2: 1.463780 | ISG: 87.332496
A1: 0.594210 | A2: 1.209885 | ISG: 80.566662
A1: 0.434123 | A2: 1.157110 | ISG: 87.660942
A1: 0.358072 | A2: 1.167614 | ISG: 91.403801
A1: 0.305658 | A2: 1.097327 | ISG: 92.799754
A1: 0.372903 | A2: 1.284217 | ISG: 92.223956
A1: 0.518434 | A2: 1.502730 | ISG: 89.363794
A1: 0.422776 | A2: 1.532574 | ISG: 92.928256
A1: 0.377522 | A2: 1.519565 | ISG: 94.186530
A1: 0.455791 | A2: 1.484883 | ISG: 91.389214
A1: 0.435872 | A2: 1.323086 | ISG: 90.209738
A1: 0.421942 | A2: 1.384513 | ISG: 91.501562
A1: 0.550717 | A2: 1.476876 | ISG: 87.792525
A1: 0.561944 | A2: 1.397532 | ISG: 86.082056
A1: 0.487051 | A2: 1.349547 | ISG: 88.476107
A1: 0.547584 | A2: 1.314598 | ISG: 85.214701
A1: 0.504292 | A2: 1.378243 | ISG: 88.192847
A1: 0.458861 | A2: 1.444063 | ISG: 90.829053
A1: 0.525056 | A2: 1.334320 | ISG: 86.591863
A1: 0.511920 | A2: 1.312849 | ISG: 86.802109
A1: 0.398099 | A2: 1.493897 | ISG: 93.369505
A1: 0.267271 | A2: 1.579079 | ISG: 97.214975
A1: 0.324988 | A2: 1.323114 | ISG: 94.310187
A1: 0.414382 | A2: 1.332347 | ISG: 91.180019
A1: 0.391764 | A2: 1.500427 | ISG: 93.617696
A1: 0.400839 | A2: 1.395985 | ISG: 92.383214
A1: 0.408424 | A2: 1.348539 | ISG: 91.598014
A1: 0.411116 | A2: 1.337729 | ISG: 91.370256
A1: 0.376979 | A2: 1.237357 | ISG: 91.506316
A1: 0.398236 | A2: 1.249516 | ISG: 90.778928
A1: 0.363792 | A2: 1.409254 | ISG: 93.752448
A1: 0.302507 | A2: 1.467853 | ISG: 95.925808
A1: 0.372152 | A2: 1.358787 | ISG: 93.022112
A1: 0.375893 | A2: 1.260545 | ISG: 91.833902
A1: 0.353851 | A2: 1.276272 | ISG: 92.861767
A1: 0.336024 | A2: 1.417150 | ISG: 94.677037
A1: 0.389348 | A2: 1.445519 | ISG: 93.235880
A1: 0.502281 | A2: 1.365678 | ISG: 88.084878
A1: 0.547376 | A2: 1.333228 | ISG: 85.575190
A1: 0.514156 | A2: 1.363917 | ISG: 87.557512
A1: 0.452903 | A2: 1.482558 | ISG: 91.464306
A1: 0.291331 | A2: 1.529565 | ISG: 96.499247
A1: 0.311635 | A2: 1.397574 | ISG: 95.263378
A1: 0.464824 | A2: 1.356976 | ISG: 89.498572
A1: 0.551527 | A2: 1.517050 | ISG: 88.325944
A1: 0.557525 | A2: 1.329298 | ISG: 85.040697
A1: 0.530347 | A2: 1.279143 | ISG: 85.331343
A1: 0.484000 | A2: 1.489864 | ISG: 90.453943
A1: 0.443088 | A2: 1.486633 | ISG: 91.841462
A1: 0.503692 | A2: 1.547386 | ISG: 90.419387
A1: 0.523829 | A2: 1.501925 | ISG: 89.155037
A1: 0.479313 | A2: 1.405238 | ISG: 89.578259
A1: 0.351657 | A2: 1.324731 | ISG: 93.417213
A1: 0.336151 | A2: 1.427766 | ISG: 94.747985
A1: 0.343328 | A2: 1.505068 | ISG: 95.053760
A1: 0.380414 | A2: 1.445115 | ISG: 93.519479
A1: 0.491384 | A2: 1.394534 | ISG: 88.955262
A1: 0.476745 | A2: 1.346774 | ISG: 88.864465
A1: 0.532450 | A2: 1.443515 | ISG: 88.023883
A1: 0.585941 | A2: 1.443570 | ISG: 85.855162
A1: 0.510830 | A2: 1.401695 | ISG: 88.275701
A1: 0.409852 | A2: 1.304735 | ISG: 91.018691
A1: 0.391057 | A2: 1.313365 | ISG: 91.856365
A1: 0.405101 | A2: 1.262799 | ISG: 90.669218
A1: 0.349876 | A2: 1.288174 | ISG: 93.129840
A1: 0.239624 | A2: 1.491676 | ISG: 97.484365
A1: 0.282298 | A2: 1.472572 | ISG: 96.455223
A1: 0.314428 | A2: 1.425108 | ISG: 95.357998
A1: 0.350378 | A2: 1.439553 | ISG: 94.407262
A1: 0.466659 | A2: 1.454107 | ISG: 90.662431
A1: 0.479230 | A2: 1.516462 | ISG: 90.920039
A1: 0.372750 | A2: 1.447182 | ISG: 93.778543
A1: 0.232246 | A2: 1.340704 | ISG: 97.086660
A1: 0.188159 | A2: 1.307839 | ISG: 97.972114
A1: 0.259231 | A2: 1.201381 | ISG: 95.551133
A1: 0.440344 | A2: 1.179828 | ISG: 87.773295
A1: 0.562090 | A2: 1.338301 | ISG: 85.004925
A1: 0.645951 | A2: 1.286185 | ISG: 79.857683
A1: 0.603347 | A2: 1.372641 | ISG: 83.807837
A1: 0.416655 | A2: 1.449798 | ISG: 92.370912
A1: 0.331109 | A2: 1.424726 | ISG: 94.875696
A1: 0.253932 | A2: 1.473263 | ISG: 97.114905
A1: 0.309472 | A2: 1.460161 | ISG: 95.701103
A1: 0.477765 | A2: 1.336090 | ISG: 88.662952
A1: 0.511949 | A2: 1.313501 | ISG: 86.812178
A1: 0.592670 | A2: 1.297184 | ISG: 82.730194
A1: 0.639418 | A2: 1.316969 | ISG: 80.923682
A1: 0.554087 | A2: 1.417953 | ISG: 86.753008
A1: 0.499735 | A2: 1.424142 | ISG: 89.036705
A1: 0.535465 | A2: 1.567783 | ISG: 89.553464
A1: 0.532938 | A2: 1.648485 | ISG: 90.537377
A1: 0.403531 | A2: 1.586312 | ISG: 93.922227
A1: 0.359126 | A2: 1.553634 | ISG: 94.927884
A1: 0.266039 | A2: 1.566949 | ISG: 97.198184
A1: 0.232541 | A2: 1.491656 | ISG: 97.627351
A1: 0.341046 | A2: 1.435825 | ISG: 94.659446
A1: 0.307727 | A2: 1.519902 | ISG: 96.062207
A1: 0.258879 | A2: 1.591867 | ISG: 97.423428
A1: 0.340672 | A2: 1.477668 | ISG: 94.953067
A1: 0.445190 | A2: 1.494669 | ISG: 91.851340
A1: 0.514659 | A2: 1.621852 | ISG: 90.851514
A1: 0.456450 | A2: 1.553144 | ISG: 92.049666
A1: 0.290971 | A2: 1.311236 | ISG: 95.306878
A1: 0.375296 | A2: 1.272178 | ISG: 91.994053
A1: 0.405450 | A2: 1.343530 | ISG: 91.653068
A1: 0.361965 | A2: 1.381401 | ISG: 93.575266
A1: 0.486013 | A2: 1.361582 | ISG: 88.698768
A1: 0.561380 | A2: 1.344057 | ISG: 85.146014
A1: 0.502993 | A2: 1.460006 | ISG: 89.390245
A1: 0.412945 | A2: 1.445115 | ISG: 92.450966
A1: 0.370780 | A2: 1.309825 | ISG: 92.581296
A1: 0.450991 | A2: 1.367185 | ISG: 90.186532
A1: 0.418125 | A2: 1.583589 | ISG: 93.482838
A1: 0.407635 | A2: 1.430495 | ISG: 92.489584
A1: 0.277807 | A2: 1.288134 | ISG: 95.555537
A1: 0.273368 | A2: 1.222151 | ISG: 95.235210
A1: 0.211000 | A2: 1.162011 | ISG: 96.808049
A1: 0.179372 | A2: 1.419887 | ISG: 98.429179
A1: 0.444311 | A2: 1.541657 | ISG: 92.330887
A1: 0.514431 | A2: 1.472638 | ISG: 89.124272
A1: 0.557823 | A2: 1.569865 | ISG: 88.789384
A1: 0.620058 | A2: 1.549268 | ISG: 86.193431
A1: 0.737611 | A2: 1.699354 | ISG: 84.146568
A1: 0.506116 | A2: 1.840437 | ISG: 92.969323
A1: 0.310581 | A2: 1.665513 | ISG: 96.639472
A1: 0.330723 | A2: 1.636757 | ISG: 96.077332
A1: 0.320484 | A2: 1.526300 | ISG: 95.777249
A1: 0.315709 | A2: 1.460072 | ISG: 95.533376
A1: 0.235764 | A2: 1.467600 | ISG: 97.484223
A1: 0.244951 | A2: 1.406289 | ISG: 97.055383
A1: 0.249856 | A2: 1.440000 | ISG: 97.077381
A1: 0.233812 | A2: 1.502374 | ISG: 97.635256
A1: 0.234176 | A2: 1.466445 | ISG: 97.513328
A1: 0.285575 | A2: 1.362555 | ISG: 95.792134
A1: 0.264999 | A2: 1.264044 | ISG: 95.789987
A1: 0.229493 | A2: 1.277861 | ISG: 96.875473
A1: 0.182809 | A2: 1.364908 | ISG: 98.237760
A1: 0.142803 | A2: 1.477625 | ISG: 99.074639
A1: 0.347163 | A2: 1.480002 | ISG: 94.784676
A1: 0.398649 | A2: 1.441071 | ISG: 92.891364
A1: 0.409907 | A2: 1.492687 | ISG: 92.987732
A1: 0.444155 | A2: 1.423506 | ISG: 91.128361
A1: 0.374171 | A2: 1.402444 | ISG: 93.354821
A1: 0.447385 | A2: 1.275049 | ISG: 89.038122
A1: 0.435712 | A2: 1.205580 | ISG: 88.447115
A1: 0.432927 | A2: 1.211998 | ISG: 88.684519
A1: 0.469503 | A2: 1.304615 | ISG: 88.533782
A1: 0.277932 | A2: 1.552640 | ISG: 96.895167
A1: 0.332164 | A2: 1.496800 | ISG: 95.306461
A1: 0.572512 | A2: 1.248092 | ISG: 82.616342
A1: 0.553551 | A2: 1.372755 | ISG: 86.013869
A1: 0.501233 | A2: 1.394733 | ISG: 88.562125
A1: 0.409194 | A2: 1.288129 | ISG: 90.833816
A1: 0.333338 | A2: 1.464112 | ISG: 95.071977
A1: 0.433742 | A2: 1.565346 | ISG: 92.869557
A1: 0.376566 | A2: 1.515444 | ISG: 94.184578
A1: 0.322716 | A2: 1.358639 | ISG: 94.659335
A1: 0.493213 | A2: 1.273413 | ISG: 86.955496
A1: 0.540341 | A2: 1.369517 | ISG: 86.530016
A1: 0.485293 | A2: 1.469856 | ISG: 90.170681
A1: 0.494515 | A2: 1.401731 | ISG: 88.931565
A1: 0.534091 | A2: 1.398508 | ISG: 87.271588
A1: 0.575611 | A2: 1.346181 | ISG: 84.542866
A1: 0.544763 | A2: 1.241658 | ISG: 83.858032
A1: 0.390336 | A2: 1.187961 | ISG: 90.255760
A1: 0.340627 | A2: 1.211456 | ISG: 92.673483
A1: 0.379478 | A2: 1.288166 | ISG: 92.014776
A1: 0.320848 | A2: 1.239465 | ISG: 93.719966
A1: 0.170010 | A2: 1.158231 | ISG: 97.890893
A1: 0.213467 | A2: 1.328036 | ISG: 97.481380
A1: 0.321043 | A2: 1.421797 | ISG: 95.148730
A1: 0.422047 | A2: 1.387176 | ISG: 91.527516
A1: 0.536851 | A2: 1.377084 | ISG: 86.807054
A1: 0.514288 | A2: 1.301614 | ISG: 86.496503
A1: 0.378520 | A2: 1.297340 | ISG: 92.155064
A1: 0.308215 | A2: 1.369173 | ISG: 95.176945
A1: 0.341609 | A2: 1.215472 | ISG: 92.679295
A1: 0.461933 | A2: 1.339570 | ISG: 89.372506
A1: 0.562473 | A2: 1.469281 | ISG: 87.217990
A1: 0.586533 | A2: 1.315908 | ISG: 83.425739
A1: 0.655812 | A2: 1.369682 | ISG: 81.350084
A1: 0.650235 | A2: 1.354585 | ISG: 81.272756
A1: 0.552024 | A2: 1.292770 | ISG: 84.578287
A1: 0.472121 | A2: 1.212409 | ISG: 86.832838
A1: 0.381167 | A2: 1.180593 | ISG: 90.560114
A1: 0.496521 | A2: 1.361612 | ISG: 88.263234
A1: 0.576427 | A2: 1.502588 | ISG: 87.171307
A1: 0.612002 | A2: 1.237019 | ISG: 80.336309
A1: 0.666035 | A2: 1.274919 | ISG: 78.559770
A1: 0.619964 | A2: 1.447063 | ISG: 84.491466
A1: 0.612649 | A2: 1.511444 | ISG: 85.888453
A1: 0.528483 | A2: 1.529111 | ISG: 89.329625
A1: 0.497130 | A2: 1.508050 | ISG: 90.198207
A1: 0.441535 | A2: 1.617846 | ISG: 93.068025
A1: 0.510248 | A2: 1.454728 | ISG: 89.045069
A1: 0.720863 | A2: 1.110425 | ISG: 70.351626
A1: 0.665674 | A2: 1.015281 | ISG: 69.935785
A1: 0.625423 | A2: 1.162620 | ISG: 77.556489
A1: 0.526489 | A2: 1.130992 | ISG: 82.189536
A1: 0.581699 | A2: 1.202950 | ISG: 81.048384
A1: 0.610291 | A2: 1.475269 | ISG: 85.387478
A1: 0.600131 | A2: 1.375380 | ISG: 84.006018
A1: 0.522415 | A2: 1.349984 | ISG: 86.975249
A1: 0.457819 | A2: 1.380142 | ISG: 90.087048
A1: 0.418677 | A2: 1.353602 | ISG: 91.268352
A1: 0.238022 | A2: 1.388335 | ISG: 97.144621
A1: 0.208690 | A2: 1.403016 | ISG: 97.835420
A1: 0.204646 | A2: 1.521252 | ISG: 98.222484
A1: 0.132886 | A2: 1.476156 | ISG: 99.196124
A1: 0.276464 | A2: 1.420841 | ISG: 96.352078
A1: 0.335917 | A2: 1.409962 | ISG: 94.628798
A1: 0.269340 | A2: 1.385263 | ISG: 96.357317
A1: 0.257108 | A2: 1.346141 | ISG: 96.480420
A1: 0.311608 | A2: 1.334868 | ISG: 94.832306
A1: 0.347141 | A2: 1.399995 | ISG: 94.207790
A1: 0.331554 | A2: 1.377092 | ISG: 94.520872
A1: 0.348467 | A2: 1.436444 | ISG: 94.442102
A1: 0.397288 | A2: 1.457428 | ISG: 93.083153
A1: 0.470679 | A2: 1.404780 | ISG: 89.906887
A1: 0.594558 | A2: 1.298821 | ISG: 82.675311
A1: 0.578375 | A2: 1.206102 | ISG: 81.303491
A1: 0.575613 | A2: 1.231147 | ISG: 82.061658
A1: 0.639836 | A2: 1.374070 | ISG: 82.180718
A1: 0.537625 | A2: 1.332675 | ISG: 86.003304
A1: 0.454688 | A2: 1.483514 | ISG: 91.412806
A1: 0.260135 | A2: 1.639212 | ISG: 97.543449
A1: 0.056615 | A2: 1.317163 | ISG: 99.815591
A1: 0.210041 | A2: 1.481844 | ISG: 98.030458
A1: 0.315857 | A2: 1.483904 | ISG: 95.665633
A1: 0.306795 | A2: 1.370790 | ISG: 95.229878
A1: 0.367078 | A2: 1.347333 | ISG: 93.090125
A1: 0.483084 | A2: 1.242478 | ISG: 86.868093
A1: 0.462157 | A2: 1.160586 | ISG: 86.313195
A1: 0.500740 | A2: 1.215608 | ISG: 85.493284
A1: 0.517690 | A2: 1.335819 | ISG: 86.942081
A1: 0.582820 | A2: 1.482823 | ISG: 86.618622
A1: 0.575955 | A2: 1.623378 | ISG: 88.819838
A1: 0.406396 | A2: 1.525595 | ISG: 93.374063
A1: 0.419973 | A2: 1.414556 | ISG: 91.899439
A1: 0.446782 | A2: 1.470656 | ISG: 91.550511
A1: 0.446630 | A2: 1.587689 | ISG: 92.666861
A1: 0.440712 | A2: 1.452553 | ISG: 91.570499
A1: 0.279233 | A2: 1.445128 | ISG: 96.400839
A1: 0.088769 | A2: 1.470000 | ISG: 99.636667
A1: 0.127311 | A2: 1.321321 | ISG: 99.080183
A1: 0.200931 | A2: 1.428287 | ISG: 98.059337
A1: 0.136847 | A2: 1.561531 | ISG: 99.237838
A1: 0.102395 | A2: 1.488429 | ISG: 99.528967
A1: 0.103884 | A2: 1.490846 | ISG: 99.516796
A1: 0.125190 | A2: 1.487610 | ISG: 99.296766
A1: 0.090071 | A2: 1.455270 | ISG: 99.618391
A1: 0.080424 | A2: 1.525556 | ISG: 99.722851
A1: 0.251713 | A2: 1.432376 | ISG: 97.004366
A1: 0.470516 | A2: 1.261864 | ISG: 87.793637
A1: 0.509714 | A2: 1.331714 | ISG: 87.222135
A1: 0.442654 | A2: 1.342975 | ISG: 90.200527
A1: 0.391606 | A2: 1.454788 | ISG: 93.243555
A1: 0.296147 | A2: 1.489490 | ISG: 96.197207
A1: 0.340303 | A2: 1.211971 | ISG: 92.692133
A1: 0.473972 | A2: 1.032076 | ISG: 82.583018
A1: 0.567317 | A2: 1.240137 | ISG: 82.694371
A1: 0.493281 | A2: 1.377547 | ISG: 88.634732
A1: 0.460206 | A2: 1.342822 | ISG: 89.489141
A1: 0.570048 | A2: 1.432941 | ISG: 86.336540
A1: 0.599277 | A2: 1.449617 | ISG: 85.404183
A1: 0.537612 | A2: 1.364658 | ISG: 86.565154
A1: 0.560624 | A2: 1.404069 | ISG: 86.249369
A1: 0.494836 | A2: 1.530558 | ISG: 90.536602
A1: 0.447960 | A2: 1.373406 | ISG: 90.384461
A1: 0.519338 | A2: 1.379755 | ISG: 87.590531
A1: 0.496552 | A2: 1.425862 | ISG: 89.184094
A1: 0.470030 | A2: 1.436286 | ISG: 90.326474
A1: 0.493679 | A2: 1.586900 | ISG: 91.175901
A1: 0.522466 | A2: 1.531067 | ISG: 89.569861
A1: 0.455378 | A2: 1.512348 | ISG: 91.687181
A1: 0.466577 | A2: 1.547594 | ISG: 91.667976
A1: 0.516025 | A2: 1.487451 | ISG: 89.257603
A1: 0.591885 | A2: 1.464255 | ISG: 85.955246
A1: 0.655190 | A2: 1.428775 | ISG: 82.625211
A1: 0.644581 | A2: 1.366046 | ISG: 81.789511
A1: 0.656444 | A2: 1.408749 | ISG: 82.160206
A1: 0.499600 | A2: 1.368769 | ISG: 88.243747
A1: 0.317968 | A2: 1.275082 | ISG: 94.145496
A1: 0.383132 | A2: 1.450654 | ISG: 93.479431
A1: 0.396183 | A2: 1.424272 | ISG: 92.818127
A1: 0.444300 | A2: 1.420412 | ISG: 91.087814
A1: 0.482642 | A2: 1.510532 | ISG: 90.736566
A1: 0.418616 | A2: 1.332796 | ISG: 91.020650
A1: 0.429333 | A2: 1.366840 | ISG: 91.019732
A1: 0.431473 | A2: 1.432230 | ISG: 91.679406
A1: 0.415070 | A2: 1.336851 | ISG: 91.207586
A1: 0.556283 | A2: 1.328262 | ISG: 85.077571
A1: 0.615470 | A2: 1.371641 | ISG: 83.240310
A1: 0.508297 | A2: 1.329367 | ISG: 87.244871
A1: 0.398922 | A2: 1.338526 | ISG: 91.842351
A1: 0.393416 | A2: 1.449548 | ISG: 93.139245
A1: 0.415589 | A2: 1.403236 | ISG: 91.935975
A1: 0.505835 | A2: 1.330164 | ISG: 87.365763
A1: 0.587161 | A2: 1.397530 | ISG: 84.996478
A1: 0.525718 | A2: 1.360610 | ISG: 87.010030
A1: 0.475058 | A2: 1.449629 | ISG: 90.302108
A1: 0.268017 | A2: 1.530064 | ISG: 97.022983
A1: 0.299254 | A2: 1.555931 | ISG: 96.432837
A1: 0.834359 | A2: 1.094550 | ISG: 63.247965

Création d'un dataframe¶

In [501]:
values_list3 = []
for i in range(len(ISGs3)):
    append_values_to_list(A1[i], A2[i], ISGs3[i], values_list3)
df_ISG3 = pd.DataFrame(values_list3)
df_ISG3.head()
Out[501]:
A1 A2 ISG
0 0.698939 1.240083 75.891516
1 0.748643 1.238705 73.245629
2 0.703944 1.052106 69.076556
3 0.816757 1.216737 68.936940
4 0.740528 1.333697 76.435304

Valeur de l'ISG¶

In [502]:
df_ISG3.describe()
Out[502]:
A1 A2 ISG
count 622.000000 622.000000 622.000000
mean 0.441486 1.377915 89.973741
std 0.133383 0.112100 5.575059
min 0.056615 1.015281 63.247965
25% 0.345562 1.314880 86.759237
50% 0.442667 1.377320 90.736798
75% 0.535735 1.449909 93.942718
max 0.834359 1.840437 99.815591

ISG de 89.973741 pour ce jeu de données

In [503]:
plt.figure(figsize=(10, 4))
px.line(df_ISG3, x=df_ISG3.index, y='ISG', title='ISG pour chaque foulée')
<Figure size 1000x400 with 0 Axes>

Boxplot des ISG pour visualiser les valeurs aberantes¶

In [504]:
plt.figure(figsize=(10, 4))
plt.boxplot(ISGs3)
plt.title('Boxplot de ISG')
plt.ylabel('ISG')
plt.grid(True)
plt.show()
No description has been provided for this image

Tri des valeurs aberantes¶

Les points qui apparaissent en dehors des moustaches représentent des valeurs aberrantes.

In [505]:
min_value3 = 76
max_value3 = 100
ISGs_filtered3 = ISG_min_max(ISGs3, min_value3, max_value3)
In [506]:
plt.figure(figsize=(10, 4))
plt.plot(np.arange(len(ISGs_filtered3)), ISGs_filtered3, label='ISG', color='green')
plt.title('ISG pour chaque foulée (Filtré)')
plt.xlabel('Foulée')
plt.ylabel('ISG')
plt.legend()
plt.grid(True)
No description has been provided for this image
In [507]:
plt.figure(figsize=(10, 4))
plt.boxplot(ISGs_filtered3)
plt.title('Boxplot de ISG (Filtré)')
Out[507]:
Text(0.5, 1.0, 'Boxplot de ISG (Filtré)')
No description has been provided for this image

Les données filtrées¶

In [508]:
df_ISG_filtered3 = df_ISG3[(df_ISG3['ISG'] >= min_value3) & (df_ISG3['ISG'] <= max_value3)]
df_ISG_filtered3.describe()
Out[508]:
A1 A2 ISG
count 608.000000 608.000000 608.000000
mean 0.435221 1.383436 90.395185
std 0.128034 0.106547 4.860927
min 0.056615 1.032076 76.421200
25% 0.344562 1.321251 86.929394
50% 0.439514 1.379948 90.848870
75% 0.529467 1.452552 94.122882
max 0.774316 1.840437 99.815591

Apres un filtre des données, l'ISG moyen est de 90.725321

4 - Données au trot en cercle à gauche¶

Relevé de données effectués le 2024-01-01
En cercle à gauche, le téléphone est à l'interieux du cercle

Charger les données¶

In [509]:
Trot_gauche = pd.read_csv('data/Trot_Gauche_Cercle.csv')
Trot_gauche.reset_index(inplace=True)
Trot_gauche.columns = ['time', 'gFx', 'gFy', 'gFz', 'alpha']
Trot_gauche['time'] = Trot_gauche['time'].map(pd.to_datetime)
Trot_gauche.set_index('time', inplace=True)
Trot_gauche.head()
Out[509]:
gFx gFy gFz alpha
time
2024-01-01 15:03:45.018 0.117 -0.787 -0.608 1.001
2024-01-01 15:03:45.018 0.117 -0.787 -0.608 1.001
2024-01-01 15:03:45.018 0.117 -0.787 -0.608 1.001
2024-01-01 15:03:45.024 0.104 -0.785 -0.616 1.003
2024-01-01 15:03:45.034 0.096 -0.784 -0.609 0.997
In [510]:
Trot_gauche.tail()
Out[510]:
gFx gFy gFz alpha
time
2024-01-01 15:08:25.834 0.046 -0.738 -0.679 1.004
2024-01-01 15:08:25.844 0.045 -0.742 -0.674 1.003
2024-01-01 15:08:25.875 0.046 -0.733 -0.692 1.009
2024-01-01 15:08:25.875 0.046 -0.733 -0.692 1.009
2024-01-01 15:08:25.876 0.046 -0.733 -0.692 1.009

Travail sur les données¶

Visualisation de alpha pour trier¶

In [511]:
plt.figure(figsize=(15, 5))
plt.plot(Trot_gauche.index, Trot_gauche['alpha'], label='alpha')
plt.xlabel('Time')
plt.ylabel('alpha')
plt.legend()
plt.grid(True)
No description has been provided for this image

Filtrer les données¶

In [512]:
Trot_gauche_sort = Trot_gauche['2024-01-01 15:04:00.018':'2024-01-01 15:08:00.876']
Trot_gauche_sort.head()
Out[512]:
gFx gFy gFz alpha
time
2024-01-01 15:04:00.030 0.001 -0.341 -0.702 0.780
2024-01-01 15:04:00.031 0.001 -0.341 -0.702 0.780
2024-01-01 15:04:00.038 -0.118 -0.320 -0.619 0.707
2024-01-01 15:04:00.051 -0.229 -0.243 -0.489 0.592
2024-01-01 15:04:00.058 -0.255 -0.186 -0.254 0.405

Données de alpha vs Temps¶

In [513]:
plt.figure(figsize=(12, 6))
plt.plot(Trot_gauche_sort['alpha'])
plt.xlabel("Temps")
plt.ylabel("Valeur de la 5ème Colonne (alpha)")
plt.title("Données de la 5ème Colonne (alpha) vs Temps (Entre 40s et 1 Après le Début)")
plt.legend()
plt.show()
No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.
No description has been provided for this image

Données de alpha sur 5 secondes¶

In [514]:
start_time4 = Trot_gauche_sort.index.min()
end_time4 = start_time4 + pd.Timedelta(seconds=5)
Trot_gauche_sort_5s = Trot_gauche_sort[start_time4:end_time4]

plt.figure(figsize=(12, 6))
plt.plot(Trot_gauche_sort_5s['alpha'])
plt.xlabel("Temps")
plt.ylabel("Valeur de la 5ème Colonne (alpha)")
plt.title("Données de la 5ème Colonne (alpha) vs Temps (5s)")
plt.legend()
plt.show()
No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.
No description has been provided for this image

Calcul de d2Z¶

d2Z = (alpha - 1) * 9.81.

In [515]:
# Calculate d2Z = (alpha - 1) * 9.81.
Trot_gauche_new = Trot_gauche_sort.copy()
Trot_gauche_new['d2z'] = (Trot_gauche_new['alpha'] - 1) * 9.81
Trot_gauche_new.head()
Out[515]:
gFx gFy gFz alpha d2z
time
2024-01-01 15:04:00.030 0.001 -0.341 -0.702 0.780 -2.15820
2024-01-01 15:04:00.031 0.001 -0.341 -0.702 0.780 -2.15820
2024-01-01 15:04:00.038 -0.118 -0.320 -0.619 0.707 -2.87433
2024-01-01 15:04:00.051 -0.229 -0.243 -0.489 0.592 -4.00248
2024-01-01 15:04:00.058 -0.255 -0.186 -0.254 0.405 -5.83695

Tracer d2Z en fonction du temps¶

In [516]:
plt.figure(figsize=(12, 6))
plt.plot(Trot_gauche_new['d2z'])
plt.xlabel("Temps")
plt.ylabel("Valeur de d2Z")
plt.title("Valeur de d2Z vs Temps (Entre 40s et 1 Après le Début)")
plt.legend()
plt.show()
No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.
No description has been provided for this image

Données de d2Z sur 5 secondes¶

In [517]:
start_time4 = Trot_gauche_new.index.min()
end_time4 = start_time4 + pd.Timedelta(seconds=5)
Trot_gauche_new_5s = Trot_gauche_new[start_time4:end_time4]

plt.figure(figsize=(12, 6))
plt.plot(Trot_gauche_new_5s['d2z'])
plt.xlabel("Temps")
plt.ylabel("Valeur de d2Z")
plt.title("Valeur de d2Z vs Temps (5s)")
plt.legend()
plt.show()
No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.
No description has been provided for this image

Calcul du déplacement¶

Calcul de la fréquence d'échantillonnage à partir des données¶

In [518]:
fs4 = 1.0 / (Trot_gauche_new.index.to_series().diff().median().total_seconds())
In [519]:
print("Fréquence d'échantillonnage : ", fs4)
Fréquence d'échantillonnage :  100.0

Étape 1 : Filtrer passe-haut pour retirer la gravité des données d'accélération¶

In [520]:
cutoff4 = 1
fs4 = fs4
order4 = 5
b, a = butter_highpass(cutoff4, fs4, order=order4)
Trot_gauche_new['d2z_filtre'] = filtfilt(b, a, Trot_gauche_new['d2z'])

Étape 2 : Intégrer l'accélération filtrée passe-haut pour obtenir la vitesse¶

In [521]:
velocity = cumtrapz(Trot_gauche_new['d2z_filtre'], dx=1/fs4, initial=0)

Étape 3 : Filtrer passe-haut la vitesse pour retirer les dérives de basse fréquence¶

In [522]:
b, a = butter_highpass(cutoff4, fs4, order=order4)
Trot_gauche_new['velocity'] = filtfilt(b, a, velocity)

Étape 4 : Intégrer la vitesse filtrée passe-haut pour obtenir le déplacement¶

In [523]:
Trot_gauche_new['deplacement'] = cumtrapz(Trot_gauche_new['velocity'], dx=1/fs4, initial=0)
Trot_gauche_new.head()
Out[523]:
gFx gFy gFz alpha d2z d2z_filtre velocity deplacement
time
2024-01-01 15:04:00.030 0.001 -0.341 -0.702 0.780 -2.15820 -0.179675 -0.126557 0.000000
2024-01-01 15:04:00.031 0.001 -0.341 -0.702 0.780 -2.15820 -0.409435 -0.118838 -0.001227
2024-01-01 15:04:00.038 -0.118 -0.320 -0.619 0.707 -2.87433 -1.350684 -0.117144 -0.002407
2024-01-01 15:04:00.051 -0.229 -0.243 -0.489 0.592 -4.00248 -2.699022 -0.127077 -0.003628
2024-01-01 15:04:00.058 -0.255 -0.186 -0.254 0.405 -5.83695 -4.748473 -0.154188 -0.005034

Correction de l'index temporel pour correspondre aux dimensions après intégration¶

In [524]:
time_index4 = Trot_gauche_new.index
time_index_velocity4 = time_index4[:len(velocity)]
time_index_displacement4 = time_index4[:len(Trot_gauche_new['deplacement'])]

start_20s_window4 = time_index4[0] 
end_20s_window4 = start_20s_window4 + pd.Timedelta(seconds=20)

Visualisation sur une fenetre de 20 secondes¶

In [525]:
# Tracé des signaux d2z, d2z_filtre, velocity, deplacement de la fenêtre de 20 secondes uniquement
window_data4 = Trot_gauche_new[(Trot_gauche_new.index >= start_20s_window4) & (Trot_gauche_new.index <= end_20s_window4)]


fig, axs = plt.subplots(4, 1, figsize=(23, 17), sharex=True)
axs[0].plot(window_data4.index, window_data4['d2z'], label='d2z')
axs[0].set_ylabel('Accélération (d2z)')
axs[0].legend()
axs[0].title.set_text('d2z original')
axs[0].set_xlabel('Temps')

axs[1].plot(window_data4.index, window_data4['d2z_filtre'], label='d2z_filtre', color='orange')
axs[1].set_ylabel('d2z_filtre')
axs[1].legend()
axs[1].title.set_text('d2z filtré (passe-haut)')
axs[1].set_xlabel('Temps')

axs[2].plot(window_data4.index, window_data4['velocity'], label='velocity', color='red')
axs[2].set_ylabel('velocity')
axs[2].legend()
axs[2].title.set_text('Vitesse filtrée (passe-haut)')
axs[2].set_xlabel('Temps')

axs[3].plot(window_data4.index, window_data4['deplacement'], label='deplacement', color='green')
axs[3].set_ylabel('deplacement')
axs[3].legend()
axs[3].title.set_text('Déplacement')
axs[3].set_xlabel('Temps')

plt.xlabel('Temps')
plt.suptitle('Signaux de la fenêtre de 20 secondes')
plt.show()
No description has been provided for this image

Calcul des foulées¶

Trouver les pics dans le signal de déplacement, donc les foulées du cheval.

In [526]:
displacement4 = Trot_gauche_new['deplacement']
time_index_displacement4 = Trot_gauche_new.index
peak1, peak2 = trouver_foulees(displacement4)
if peak1 is not None and peak2 is not None:
    afficher_foulees(displacement4, peak1, peak2, time_index_displacement4)
else:
    print("Unable to find a stride within the signal based on the given prominence.")
/var/folders/dy/p7g7n6253j76sj1k7y99nbv80000gn/T/ipykernel_17124/1520386640.py:7: FutureWarning:

Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`

/var/folders/dy/p7g7n6253j76sj1k7y99nbv80000gn/T/ipykernel_17124/1520386640.py:8: FutureWarning:

Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`

No description has been provided for this image

Calcul des ISG¶

In [527]:
peaks, troughs, min_length = identifier_foulees(displacement4)

Liste des ISG et des harmoniques pour chaque foulée¶

In [528]:
ISGs4, A1, A2 = calculate_ISG(min_length, troughs, displacement4)

for i in range(len(ISGs4)):
    print_values(A1[i], A2[i], ISGs4[i])
A1: 0.969723 | A2: 1.478746 | ISG: 69.928130
A1: 0.761792 | A2: 1.431815 | ISG: 77.937868
A1: 0.703605 | A2: 1.403140 | ISG: 79.907148
A1: 0.627063 | A2: 1.339420 | ISG: 82.022778
A1: 0.619129 | A2: 1.369755 | ISG: 83.035501
A1: 0.662991 | A2: 1.406840 | ISG: 81.827152
A1: 0.639881 | A2: 1.480145 | ISG: 84.253673
A1: 0.588927 | A2: 1.462729 | ISG: 86.050777
A1: 0.620294 | A2: 1.345051 | ISG: 82.462295
A1: 0.541775 | A2: 1.272708 | ISG: 84.659020
A1: 0.423092 | A2: 1.468203 | ISG: 92.332538
A1: 0.419196 | A2: 1.432132 | ISG: 92.108366
A1: 0.622866 | A2: 1.195944 | ISG: 78.662803
A1: 0.716530 | A2: 1.320739 | ISG: 77.260029
A1: 0.649610 | A2: 1.369086 | ISG: 81.623656
A1: 0.620752 | A2: 1.330057 | ISG: 82.114015
A1: 0.676317 | A2: 1.319051 | ISG: 79.183337
A1: 0.768937 | A2: 1.397966 | ISG: 76.772830
A1: 0.818638 | A2: 1.293051 | ISG: 71.386635
A1: 0.664933 | A2: 1.083250 | ISG: 72.632731
A1: 0.612849 | A2: 1.098313 | ISG: 76.257085
A1: 0.791952 | A2: 1.268891 | ISG: 71.966409
A1: 0.841045 | A2: 1.264279 | ISG: 69.322156
A1: 0.760264 | A2: 1.201424 | ISG: 71.406158
A1: 0.668038 | A2: 1.295893 | ISG: 79.004903
A1: 0.736929 | A2: 1.342771 | ISG: 76.852447
A1: 0.717448 | A2: 1.396632 | ISG: 79.121055
A1: 0.592563 | A2: 1.323029 | ISG: 83.291721
A1: 0.523559 | A2: 1.384075 | ISG: 87.482111
A1: 0.521121 | A2: 1.452798 | ISG: 88.600089
A1: 0.510991 | A2: 1.378793 | ISG: 87.923683
A1: 0.459213 | A2: 1.306575 | ISG: 89.005461
A1: 0.486327 | A2: 1.328694 | ISG: 88.185773
A1: 0.524031 | A2: 1.327872 | ISG: 86.524623
A1: 0.558728 | A2: 1.299779 | ISG: 84.403660
A1: 0.600912 | A2: 1.325816 | ISG: 82.958237
A1: 0.627151 | A2: 1.324566 | ISG: 81.687335
A1: 0.661583 | A2: 1.366329 | ISG: 81.007461
A1: 0.560533 | A2: 1.486581 | ISG: 87.552227
A1: 0.521106 | A2: 1.458976 | ISG: 88.686139
A1: 0.621945 | A2: 1.388867 | ISG: 83.296410
A1: 0.714806 | A2: 1.549612 | ISG: 82.455218
A1: 0.711830 | A2: 1.529859 | ISG: 82.203332
A1: 0.635991 | A2: 1.373628 | ISG: 82.347244
A1: 0.793310 | A2: 1.146349 | ISG: 67.617432
A1: 0.925646 | A2: 1.297189 | ISG: 66.260535
A1: 0.839050 | A2: 1.448338 | ISG: 74.872131
A1: 0.646018 | A2: 1.230431 | ISG: 78.390755
A1: 0.540826 | A2: 1.271707 | ISG: 84.684066
A1: 0.449889 | A2: 1.192084 | ISG: 87.532834
A1: 0.501495 | A2: 1.229231 | ISG: 85.730716
A1: 0.519961 | A2: 1.394569 | ISG: 87.795177
A1: 0.279044 | A2: 1.624186 | ISG: 97.132908
A1: 0.265989 | A2: 1.501935 | ISG: 96.959027
A1: 0.168295 | A2: 1.306549 | ISG: 98.367919
A1: 0.155027 | A2: 1.177320 | ISG: 98.295649
A1: 0.098916 | A2: 1.290538 | ISG: 99.415949
A1: 0.246462 | A2: 1.447467 | ISG: 97.182448
A1: 0.447928 | A2: 1.331414 | ISG: 89.832295
A1: 0.636437 | A2: 1.462908 | ISG: 84.085340
A1: 0.756151 | A2: 1.352774 | ISG: 76.193986
A1: 0.768604 | A2: 1.353467 | ISG: 75.615226
A1: 0.682147 | A2: 1.486621 | ISG: 82.607067
A1: 0.511135 | A2: 1.335587 | ISG: 87.224840
A1: 0.465694 | A2: 1.400288 | ISG: 90.041182
A1: 0.607458 | A2: 1.518036 | ISG: 86.197342
A1: 0.577769 | A2: 1.507377 | ISG: 87.190451
A1: 0.605592 | A2: 1.458349 | ISG: 85.292235
A1: 0.645926 | A2: 1.399984 | ISG: 82.448882
A1: 0.754414 | A2: 1.469048 | ISG: 79.131273
A1: 0.839470 | A2: 1.254431 | ISG: 69.068703
A1: 0.907869 | A2: 1.302990 | ISG: 67.318653
A1: 0.894562 | A2: 1.453207 | ISG: 72.519664
A1: 0.855229 | A2: 1.435767 | ISG: 73.811022
A1: 0.908759 | A2: 1.306437 | ISG: 67.391733
A1: 0.848723 | A2: 1.290849 | ISG: 69.817957
A1: 0.778191 | A2: 1.306659 | ISG: 73.817668
A1: 0.737300 | A2: 1.252102 | ISG: 74.253127
A1: 0.761849 | A2: 1.212898 | ISG: 71.708334
A1: 0.740019 | A2: 1.199455 | ISG: 72.429999
A1: 0.667314 | A2: 1.282178 | ISG: 78.686132
A1: 0.661474 | A2: 1.268775 | ISG: 78.628434
A1: 0.675159 | A2: 1.323032 | ISG: 79.338739
A1: 0.702130 | A2: 1.352070 | ISG: 78.760471
A1: 0.715504 | A2: 1.332695 | ISG: 77.624962
A1: 0.793765 | A2: 1.443860 | ISG: 76.791492
A1: 0.741820 | A2: 1.563307 | ISG: 81.621404
A1: 0.648133 | A2: 1.435435 | ISG: 83.065216
A1: 0.650355 | A2: 1.368418 | ISG: 81.574553
A1: 0.686005 | A2: 1.401450 | ISG: 80.670755
A1: 0.744954 | A2: 1.281435 | ISG: 74.740643
A1: 0.684411 | A2: 1.199717 | ISG: 75.446419
A1: 0.642644 | A2: 1.351464 | ISG: 81.558342
A1: 0.753252 | A2: 1.467608 | ISG: 79.149823
A1: 0.850246 | A2: 1.288603 | ISG: 69.668794
A1: 0.977994 | A2: 1.454056 | ISG: 68.852191
A1: 0.946299 | A2: 1.529827 | ISG: 72.326246
A1: 0.729752 | A2: 1.246873 | ISG: 74.485907
A1: 0.655834 | A2: 1.221525 | ISG: 77.624119
A1: 0.699467 | A2: 1.313871 | ISG: 77.916885
A1: 0.796422 | A2: 1.237520 | ISG: 70.712714
A1: 0.822540 | A2: 1.237248 | ISG: 69.349204
A1: 0.814361 | A2: 1.364240 | ISG: 73.728361
A1: 0.857897 | A2: 1.337393 | ISG: 70.847450
A1: 0.877307 | A2: 1.208461 | ISG: 65.486471
A1: 0.900291 | A2: 1.266643 | ISG: 66.436652
A1: 0.781356 | A2: 1.467159 | ISG: 77.904389
A1: 0.665173 | A2: 1.447182 | ISG: 82.558487
A1: 0.591900 | A2: 1.452185 | ISG: 85.753573
A1: 0.588210 | A2: 1.460348 | ISG: 86.040909
A1: 0.635834 | A2: 1.413329 | ISG: 83.167290
A1: 0.569938 | A2: 1.267652 | ISG: 83.184872
A1: 0.647011 | A2: 1.179122 | ISG: 76.858232
A1: 0.804833 | A2: 1.378819 | ISG: 74.586820
A1: 0.831731 | A2: 1.256308 | ISG: 69.526434
A1: 0.700567 | A2: 1.109550 | ISG: 71.496897
A1: 0.526722 | A2: 1.376946 | ISG: 87.235036
A1: 0.502312 | A2: 1.341247 | ISG: 87.699386
A1: 0.616063 | A2: 1.259591 | ISG: 80.696114
A1: 0.763583 | A2: 1.417837 | ISG: 77.516886
A1: 0.799195 | A2: 1.380583 | ISG: 74.900519
A1: 0.731071 | A2: 1.342015 | ISG: 77.115321
A1: 0.591463 | A2: 1.470638 | ISG: 86.077041
A1: 0.694837 | A2: 1.565749 | ISG: 83.546779
A1: 0.890733 | A2: 1.307571 | ISG: 68.303718
A1: 0.901877 | A2: 1.234639 | ISG: 65.206138
A1: 0.962594 | A2: 1.154953 | ISG: 59.009701
A1: 0.996974 | A2: 1.203524 | ISG: 59.304546
A1: 0.905907 | A2: 1.433933 | ISG: 71.473202
A1: 0.887456 | A2: 1.406391 | ISG: 71.521449
A1: 0.968473 | A2: 1.309599 | ISG: 64.645942
A1: 0.890003 | A2: 1.294959 | ISG: 67.918275
A1: 0.767864 | A2: 1.372173 | ISG: 76.152810
A1: 0.752816 | A2: 1.346785 | ISG: 76.193319
A1: 0.788507 | A2: 1.274797 | ISG: 72.328238
A1: 0.760163 | A2: 1.257437 | ISG: 73.235325
A1: 0.695884 | A2: 1.310157 | ISG: 77.996075
A1: 0.720943 | A2: 1.314235 | ISG: 76.868465
A1: 0.759045 | A2: 1.296243 | ISG: 74.465938
A1: 0.836356 | A2: 1.390281 | ISG: 73.427330
A1: 0.876456 | A2: 1.370048 | ISG: 70.959742
A1: 0.875437 | A2: 1.330969 | ISG: 69.801826
A1: 0.918425 | A2: 1.368295 | ISG: 68.940091
A1: 0.827851 | A2: 1.362178 | ISG: 73.027435
A1: 0.590640 | A2: 1.550771 | ISG: 87.331611
A1: 0.522846 | A2: 1.542718 | ISG: 89.697246
A1: 0.632248 | A2: 1.378630 | ISG: 82.622831
A1: 0.617935 | A2: 1.350187 | ISG: 82.681628
A1: 0.672545 | A2: 1.323134 | ISG: 79.468117
A1: 0.819452 | A2: 1.398151 | ISG: 74.431910
A1: 0.884167 | A2: 1.410921 | ISG: 71.802851
A1: 0.786074 | A2: 1.326129 | ISG: 73.999404
A1: 0.697137 | A2: 1.282694 | ISG: 77.197040
A1: 0.764604 | A2: 1.411211 | ISG: 77.306371
A1: 0.735216 | A2: 1.425834 | ISG: 78.996183
A1: 0.606463 | A2: 1.311440 | ISG: 82.382434
A1: 0.474770 | A2: 1.555350 | ISG: 91.476453
A1: 0.532706 | A2: 1.555402 | ISG: 89.501659
A1: 0.651547 | A2: 1.376033 | ISG: 81.686079
A1: 0.678792 | A2: 1.472224 | ISG: 82.468676
A1: 0.658924 | A2: 1.444474 | ISG: 82.775307
A1: 0.580841 | A2: 1.280873 | ISG: 82.943682
A1: 0.622594 | A2: 1.316946 | ISG: 81.732866
A1: 0.719268 | A2: 1.415138 | ISG: 79.470075
A1: 0.796869 | A2: 1.292082 | ISG: 72.444887
A1: 0.920017 | A2: 1.448503 | ISG: 71.254729
A1: 0.869726 | A2: 1.518216 | ISG: 75.291615
A1: 0.610312 | A2: 1.234468 | ISG: 80.358464
A1: 0.462492 | A2: 1.353478 | ISG: 89.544500
A1: 0.524573 | A2: 1.367939 | ISG: 87.179816
A1: 0.618563 | A2: 1.286076 | ISG: 81.212884
A1: 0.768952 | A2: 1.417956 | ISG: 77.274674
A1: 0.825237 | A2: 1.266629 | ISG: 70.200991
A1: 0.751270 | A2: 1.236469 | ISG: 73.036965
A1: 0.671303 | A2: 1.376459 | ISG: 80.784955
A1: 0.595007 | A2: 1.290927 | ISG: 82.478176
A1: 0.623424 | A2: 1.245482 | ISG: 79.964890
A1: 0.684417 | A2: 1.247444 | ISG: 76.862610
A1: 0.700610 | A2: 1.197143 | ISG: 74.487871
A1: 0.757519 | A2: 1.294661 | ISG: 74.496017
A1: 0.743345 | A2: 1.347549 | ISG: 76.669931
A1: 0.734877 | A2: 1.298101 | ISG: 75.729546
A1: 0.766238 | A2: 1.264858 | ISG: 73.153875
A1: 0.864157 | A2: 1.419350 | ISG: 72.956184
A1: 0.843565 | A2: 1.411865 | ISG: 73.692757
A1: 0.708347 | A2: 1.297260 | ISG: 77.032570
A1: 0.602195 | A2: 1.398902 | ISG: 84.366107
A1: 0.492665 | A2: 1.279326 | ISG: 87.085276
A1: 0.452070 | A2: 1.365425 | ISG: 90.121224
A1: 0.598454 | A2: 1.486220 | ISG: 86.048011
A1: 0.764212 | A2: 1.343494 | ISG: 75.553751
A1: 0.858326 | A2: 1.399991 | ISG: 72.680522
A1: 0.819548 | A2: 1.484669 | ISG: 76.645253
A1: 0.777866 | A2: 1.479981 | ISG: 78.354777
A1: 0.736773 | A2: 1.484680 | ISG: 80.239804
A1: 0.703594 | A2: 1.396219 | ISG: 79.748396
A1: 0.680999 | A2: 1.391986 | ISG: 80.687811
A1: 0.682873 | A2: 1.382512 | ISG: 80.387597
A1: 0.749737 | A2: 1.362078 | ISG: 76.747139
A1: 0.764861 | A2: 1.462033 | ISG: 78.512339
A1: 0.704218 | A2: 1.521175 | ISG: 82.350828
A1: 0.624125 | A2: 1.518692 | ISG: 85.551234
A1: 0.614897 | A2: 1.459365 | ISG: 84.923357
A1: 0.582785 | A2: 1.378577 | ISG: 84.838351
A1: 0.604223 | A2: 1.385569 | ISG: 84.021729
A1: 0.779016 | A2: 1.486444 | ISG: 78.452268
A1: 0.911768 | A2: 1.377666 | ISG: 69.540685
A1: 0.873406 | A2: 1.276990 | ISG: 68.129309
A1: 0.888733 | A2: 1.259444 | ISG: 66.757931
A1: 0.963397 | A2: 1.407372 | ISG: 68.092561
A1: 0.850390 | A2: 1.490405 | ISG: 75.439970
A1: 0.739526 | A2: 1.317757 | ISG: 76.048755
A1: 0.815829 | A2: 1.310902 | ISG: 72.081988
A1: 0.872671 | A2: 1.445975 | ISG: 73.301225
A1: 0.792028 | A2: 1.412058 | ISG: 76.068061
A1: 0.574033 | A2: 1.272389 | ISG: 83.088756
A1: 0.500106 | A2: 1.376438 | ISG: 88.338359
A1: 0.596326 | A2: 1.411017 | ISG: 84.845792
A1: 0.687026 | A2: 1.304089 | ISG: 78.275194
A1: 0.827522 | A2: 1.427993 | ISG: 74.860383
A1: 0.903965 | A2: 1.409839 | ISG: 70.865900
A1: 0.859028 | A2: 1.360720 | ISG: 71.502891
A1: 0.708875 | A2: 1.538394 | ISG: 82.486053
A1: 0.619949 | A2: 1.470318 | ISG: 84.905318
A1: 0.594987 | A2: 1.452410 | ISG: 85.629832
A1: 0.625760 | A2: 1.496865 | ISG: 85.123540
A1: 0.720662 | A2: 1.316443 | ISG: 76.941959
A1: 0.716956 | A2: 1.296194 | ISG: 76.572828
A1: 0.733551 | A2: 1.335238 | ISG: 76.815735
A1: 0.750718 | A2: 1.338164 | ISG: 76.061393
A1: 0.700105 | A2: 1.439334 | ISG: 80.867319
A1: 0.812749 | A2: 1.545773 | ISG: 78.342076
A1: 0.967031 | A2: 1.304910 | ISG: 64.550025
A1: 0.819930 | A2: 1.117268 | ISG: 64.995603
A1: 0.706514 | A2: 1.234361 | ISG: 75.323309
A1: 0.724094 | A2: 1.274787 | ISG: 75.606532
A1: 0.701384 | A2: 1.345754 | ISG: 78.639098
A1: 0.765290 | A2: 1.459659 | ISG: 78.438522
A1: 0.831157 | A2: 1.360035 | ISG: 72.807809
A1: 0.904221 | A2: 1.364684 | ISG: 69.491675
A1: 0.983380 | A2: 1.272423 | ISG: 62.606333
A1: 0.916399 | A2: 1.184371 | ISG: 62.551654
A1: 0.826478 | A2: 1.282149 | ISG: 70.645726
A1: 0.837493 | A2: 1.236237 | ISG: 68.542745
A1: 0.894398 | A2: 1.142567 | ISG: 62.005070
A1: 1.065399 | A2: 1.344348 | ISG: 61.422785
A1: 0.953914 | A2: 1.553273 | ISG: 72.613331
A1: 0.818172 | A2: 1.458672 | ISG: 76.068136
A1: 0.827191 | A2: 1.416244 | ISG: 74.563286
A1: 0.690177 | A2: 1.299313 | ISG: 77.993493
A1: 0.602340 | A2: 1.361738 | ISG: 83.635974
A1: 0.693771 | A2: 1.452898 | ISG: 81.432248
A1: 0.881740 | A2: 1.277130 | ISG: 67.720265
A1: 0.943888 | A2: 1.260660 | ISG: 64.078346
A1: 0.927775 | A2: 1.275261 | ISG: 65.390168
A1: 0.869109 | A2: 1.270607 | ISG: 68.125851
A1: 0.697141 | A2: 1.520221 | ISG: 82.624511
A1: 0.588753 | A2: 1.470783 | ISG: 86.189128
A1: 0.630182 | A2: 1.364116 | ISG: 82.411892
A1: 0.678425 | A2: 1.401500 | ISG: 81.015975
A1: 0.705905 | A2: 1.406068 | ISG: 79.869265
A1: 0.672787 | A2: 1.370558 | ISG: 80.582219
A1: 0.554959 | A2: 1.520253 | ISG: 88.241240
A1: 0.610880 | A2: 1.596254 | ISG: 87.225330
A1: 0.754492 | A2: 1.363917 | ISG: 76.569218
A1: 0.782334 | A2: 1.395557 | ISG: 76.088442
A1: 0.781257 | A2: 1.417646 | ISG: 76.704483
A1: 0.726870 | A2: 1.346723 | ISG: 77.440694
A1: 0.754868 | A2: 1.325150 | ISG: 75.500308
A1: 0.716024 | A2: 1.249498 | ISG: 75.279380
A1: 0.760830 | A2: 1.182806 | ISG: 70.733368
A1: 0.770866 | A2: 1.212608 | ISG: 71.218653
A1: 0.683839 | A2: 1.314097 | ISG: 78.690409
A1: 0.696256 | A2: 1.279285 | ISG: 77.147826
A1: 0.755818 | A2: 1.194107 | ISG: 71.396242
A1: 0.756010 | A2: 1.227695 | ISG: 72.505505
A1: 0.719754 | A2: 1.252614 | ISG: 75.178533
A1: 0.814902 | A2: 1.350271 | ISG: 73.301730
A1: 0.916216 | A2: 1.295060 | ISG: 66.643811
A1: 0.900504 | A2: 1.271631 | ISG: 66.601200
A1: 0.813108 | A2: 1.521202 | ISG: 77.778150
A1: 0.972035 | A2: 1.644942 | ISG: 74.118529
A1: 0.942732 | A2: 1.545901 | ISG: 72.892196
A1: 0.843690 | A2: 1.458095 | ISG: 74.917237
A1: 0.857932 | A2: 1.346323 | ISG: 71.119925
A1: 0.670798 | A2: 1.228380 | ISG: 77.029297
A1: 0.636601 | A2: 1.269690 | ISG: 79.911487
A1: 0.710250 | A2: 1.296644 | ISG: 76.920612
A1: 0.788850 | A2: 1.202541 | ISG: 69.914556
A1: 0.757701 | A2: 1.168001 | ISG: 70.381282
A1: 0.647651 | A2: 1.388238 | ISG: 82.125582
A1: 0.664160 | A2: 1.477453 | ISG: 83.189316
A1: 0.680244 | A2: 1.415565 | ISG: 81.239758
A1: 0.637838 | A2: 1.378052 | ISG: 82.356403
A1: 0.531121 | A2: 1.514625 | ISG: 89.050060
A1: 0.594585 | A2: 1.616755 | ISG: 88.086286
A1: 0.640125 | A2: 1.547474 | ISG: 85.388873
A1: 0.618461 | A2: 1.476209 | ISG: 85.068666
A1: 0.677576 | A2: 1.413357 | ISG: 81.311854
A1: 0.729238 | A2: 1.458344 | ISG: 79.997099
A1: 0.682963 | A2: 1.590888 | ISG: 84.438360
A1: 0.666134 | A2: 1.538238 | ISG: 84.208240
A1: 0.739056 | A2: 1.417888 | ISG: 78.635598
A1: 0.776022 | A2: 1.471429 | ISG: 78.238450
A1: 0.696967 | A2: 1.422536 | ISG: 80.642050
A1: 0.395731 | A2: 1.094288 | ISG: 88.434647
A1: 0.375781 | A2: 1.153293 | ISG: 90.402228
A1: 0.700254 | A2: 1.403550 | ISG: 80.069352
A1: 0.739695 | A2: 1.352691 | ISG: 76.980800
A1: 0.641929 | A2: 1.294741 | ISG: 80.268732
A1: 0.541144 | A2: 1.464510 | ISG: 87.986806
A1: 0.658785 | A2: 1.595938 | ISG: 85.441299
A1: 0.729281 | A2: 1.468149 | ISG: 80.208807
A1: 0.808812 | A2: 1.519755 | ISG: 77.928005
A1: 0.909317 | A2: 1.408189 | ISG: 70.572913
A1: 0.924288 | A2: 1.321520 | ISG: 67.151140
A1: 0.994232 | A2: 1.248422 | ISG: 61.190579
A1: 1.060858 | A2: 1.339190 | ISG: 61.443045
A1: 0.972697 | A2: 1.460515 | ISG: 69.273653
A1: 0.960596 | A2: 1.427942 | ISG: 68.844762
A1: 0.984763 | A2: 1.353358 | ISG: 65.382281
A1: 0.838722 | A2: 1.217127 | ISG: 67.803123
A1: 0.740414 | A2: 1.375544 | ISG: 77.535325
A1: 0.693136 | A2: 1.378067 | ISG: 79.809365
A1: 0.789917 | A2: 1.352115 | ISG: 74.554557
A1: 0.927583 | A2: 1.468238 | ISG: 71.473081
A1: 0.852924 | A2: 1.514469 | ISG: 75.920047
A1: 0.871084 | A2: 1.545121 | ISG: 75.882316
A1: 0.854235 | A2: 1.581908 | ISG: 77.423130
A1: 0.871553 | A2: 1.644749 | ISG: 78.076557
A1: 0.882997 | A2: 1.617897 | ISG: 77.049726
A1: 0.682271 | A2: 1.321522 | ISG: 78.955154
A1: 0.663241 | A2: 1.332621 | ISG: 80.147333
A1: 0.744765 | A2: 1.447756 | ISG: 79.074184
A1: 0.780872 | A2: 1.313229 | ISG: 73.878545
A1: 0.744492 | A2: 1.276926 | ISG: 74.630812
A1: 0.708255 | A2: 1.276484 | ISG: 76.460969
A1: 0.714027 | A2: 1.285101 | ISG: 76.410931
A1: 0.654053 | A2: 1.422356 | ISG: 82.545677
A1: 0.590781 | A2: 1.385946 | ISG: 84.623667
A1: 0.583238 | A2: 1.376187 | ISG: 84.773618
A1: 0.405232 | A2: 1.180877 | ISG: 89.464645
A1: 0.393216 | A2: 1.233221 | ISG: 90.771506
A1: 0.552665 | A2: 1.455347 | ISG: 87.396657
A1: 0.497804 | A2: 1.449560 | ISG: 89.450603
A1: 0.385910 | A2: 1.310272 | ISG: 92.017813
A1: 0.451497 | A2: 1.230761 | ISG: 88.138798
A1: 0.525044 | A2: 1.294315 | ISG: 85.869706
A1: 0.558608 | A2: 1.310920 | ISG: 84.632602
A1: 0.729726 | A2: 1.410975 | ISG: 78.897113
A1: 0.851333 | A2: 1.261540 | ISG: 68.709435
A1: 0.930821 | A2: 1.350966 | ISG: 67.809202
A1: 0.840787 | A2: 1.465872 | ISG: 75.245244
A1: 0.704994 | A2: 1.322367 | ISG: 77.867802
A1: 0.687404 | A2: 1.418276 | ISG: 80.977524
A1: 0.693141 | A2: 1.469081 | ISG: 81.791981
A1: 0.765507 | A2: 1.314835 | ISG: 74.684547
A1: 0.718928 | A2: 1.318244 | ISG: 77.075655
A1: 0.430457 | A2: 1.678798 | ISG: 93.831085
A1: 0.432530 | A2: 1.686666 | ISG: 93.829591
A1: 0.642415 | A2: 1.448901 | ISG: 83.571040
A1: 0.699085 | A2: 1.531918 | ISG: 82.764185
A1: 0.635628 | A2: 1.588197 | ISG: 86.193809
A1: 0.540700 | A2: 1.424148 | ISG: 87.401439
A1: 0.570260 | A2: 1.431712 | ISG: 86.307510
A1: 0.697396 | A2: 1.603370 | ISG: 84.091064
A1: 0.732214 | A2: 1.549822 | ISG: 81.752155
A1: 0.607023 | A2: 1.408409 | ISG: 84.334101
A1: 0.606748 | A2: 1.416980 | ISG: 84.505610
A1: 0.700369 | A2: 1.498424 | ISG: 82.070406
A1: 0.743136 | A2: 1.413720 | ISG: 78.350355
A1: 0.799472 | A2: 1.430701 | ISG: 76.204743
A1: 0.901166 | A2: 1.336152 | ISG: 68.734136
A1: 0.831127 | A2: 1.298018 | ISG: 70.922460
A1: 0.740357 | A2: 1.400269 | ISG: 78.152459
A1: 0.647206 | A2: 1.319305 | ISG: 80.602586
A1: 0.612151 | A2: 1.381240 | ISG: 83.582921
A1: 0.650719 | A2: 1.406716 | ISG: 82.373676
A1: 0.688517 | A2: 1.343105 | ISG: 79.189699
A1: 0.787459 | A2: 1.488756 | ISG: 78.138742
A1: 0.792877 | A2: 1.542193 | ISG: 79.093770
A1: 0.811702 | A2: 1.506908 | ISG: 77.510491
A1: 0.811341 | A2: 1.456817 | ISG: 76.326078
A1: 0.855220 | A2: 1.457755 | ISG: 74.394746
A1: 0.933281 | A2: 1.342942 | ISG: 67.432761
A1: 0.876365 | A2: 1.300694 | ISG: 68.777579
A1: 0.831778 | A2: 1.360276 | ISG: 72.785254
A1: 0.854069 | A2: 1.379441 | ISG: 72.289027
A1: 0.835495 | A2: 1.441226 | ISG: 74.846652
A1: 0.829889 | A2: 1.427528 | ISG: 74.740420
A1: 0.830244 | A2: 1.388979 | ISG: 73.676252
A1: 0.869779 | A2: 1.504323 | ISG: 74.945687
A1: 0.871266 | A2: 1.515450 | ISG: 75.157696
A1: 0.779101 | A2: 1.334456 | ISG: 74.578896
A1: 0.856611 | A2: 1.190509 | ISG: 65.887935
A1: 0.989733 | A2: 1.312553 | ISG: 63.751343
A1: 0.939408 | A2: 1.435854 | ISG: 70.025868
A1: 0.904979 | A2: 1.409455 | ISG: 70.808345
A1: 0.898766 | A2: 1.492669 | ISG: 73.391858
A1: 0.992665 | A2: 1.608471 | ISG: 72.418006
A1: 0.959020 | A2: 1.572540 | ISG: 72.890448
A1: 0.894525 | A2: 1.506149 | ISG: 73.924294
A1: 0.936280 | A2: 1.419777 | ISG: 69.692160
A1: 0.857322 | A2: 1.258526 | ISG: 68.303719
A1: 0.887254 | A2: 1.192877 | ISG: 64.382042
A1: 0.890270 | A2: 1.251387 | ISG: 66.395422
A1: 0.799696 | A2: 1.422042 | ISG: 75.973637
A1: 0.696930 | A2: 1.425215 | ISG: 80.702367
A1: 0.646505 | A2: 1.402686 | ISG: 82.478756
A1: 0.676151 | A2: 1.348568 | ISG: 79.911382
A1: 0.814286 | A2: 1.283361 | ISG: 71.296977
A1: 0.861739 | A2: 1.327531 | ISG: 70.354705
A1: 0.860346 | A2: 1.313099 | ISG: 69.964774
A1: 0.933910 | A2: 1.333083 | ISG: 67.078537
A1: 1.006974 | A2: 1.215904 | ISG: 59.316754
A1: 1.011064 | A2: 1.271479 | ISG: 61.262381
A1: 0.830543 | A2: 1.603291 | ISG: 78.842650
A1: 0.766615 | A2: 1.557889 | ISG: 80.505688
A1: 0.898393 | A2: 1.393548 | ISG: 70.640805
A1: 1.019818 | A2: 1.546563 | ISG: 69.695111
A1: 1.064341 | A2: 1.508588 | ISG: 66.766350
A1: 1.086376 | A2: 1.468955 | ISG: 64.643542
A1: 1.131901 | A2: 1.379544 | ISG: 59.765651
A1: 1.059828 | A2: 1.288715 | ISG: 59.654233
A1: 1.004298 | A2: 1.290571 | ISG: 62.283332
A1: 0.890890 | A2: 1.261758 | ISG: 66.731794
A1: 0.759891 | A2: 1.338934 | ISG: 75.637525
A1: 0.654987 | A2: 1.229429 | ISG: 77.891947
A1: 0.621769 | A2: 1.293122 | ISG: 81.221888
A1: 0.645925 | A2: 1.346959 | ISG: 81.303327
A1: 0.708912 | A2: 1.393920 | ISG: 79.450332
A1: 0.737343 | A2: 1.472894 | ISG: 79.961055
A1: 0.568867 | A2: 1.674188 | ISG: 89.649518
A1: 0.661684 | A2: 1.759206 | ISG: 87.606258
A1: 0.870486 | A2: 1.364292 | ISG: 71.067781
A1: 0.751149 | A2: 1.179134 | ISG: 71.133240
A1: 0.669102 | A2: 1.319166 | ISG: 79.537521
A1: 0.757924 | A2: 1.432221 | ISG: 78.122104
A1: 0.854567 | A2: 1.309166 | ISG: 70.121745
A1: 0.830540 | A2: 1.266076 | ISG: 69.913934
A1: 0.771102 | A2: 1.367992 | ISG: 75.888132
A1: 0.663486 | A2: 1.245063 | ISG: 77.883121
A1: 0.706056 | A2: 1.162210 | ISG: 73.042295
A1: 0.715725 | A2: 1.199726 | ISG: 73.751761
A1: 0.625989 | A2: 1.292835 | ISG: 81.007839
A1: 0.666420 | A2: 1.264794 | ISG: 78.270339
A1: 0.805883 | A2: 1.200056 | ISG: 68.919718
A1: 1.039684 | A2: 1.499591 | ISG: 67.536508
A1: 0.954892 | A2: 1.546104 | ISG: 72.387984
A1: 0.817520 | A2: 1.371679 | ISG: 73.788995
A1: 0.840684 | A2: 1.371715 | ISG: 72.694973
A1: 0.851068 | A2: 1.413315 | ISG: 73.388119
A1: 0.870225 | A2: 1.400905 | ISG: 72.156613
A1: 0.916796 | A2: 1.423734 | ISG: 70.688600
A1: 0.985326 | A2: 1.371275 | ISG: 65.949547
A1: 1.056498 | A2: 1.452720 | ISG: 65.406524
A1: 1.082461 | A2: 1.443596 | ISG: 64.010049
A1: 0.949308 | A2: 1.320313 | ISG: 65.921124
A1: 0.743499 | A2: 1.518158 | ISG: 80.655372
A1: 0.736848 | A2: 1.523423 | ISG: 81.040858
A1: 0.870139 | A2: 1.362822 | ISG: 71.039870
A1: 1.045305 | A2: 1.472343 | ISG: 66.487456
A1: 1.109388 | A2: 1.388078 | ISG: 61.021662
A1: 0.930233 | A2: 1.264379 | ISG: 64.880761
A1: 0.810743 | A2: 1.378096 | ISG: 74.288409
A1: 0.841301 | A2: 1.404066 | ISG: 73.581996
A1: 0.849967 | A2: 1.317032 | ISG: 70.596734
A1: 0.852048 | A2: 1.282446 | ISG: 69.376124
A1: 0.890131 | A2: 1.358333 | ISG: 69.957820
A1: 0.910702 | A2: 1.466153 | ISG: 72.159022
A1: 0.865785 | A2: 1.422135 | ISG: 72.959248
A1: 0.680846 | A2: 1.221381 | ISG: 76.292885
A1: 0.628394 | A2: 1.246954 | ISG: 79.747449
A1: 0.564502 | A2: 1.235570 | ISG: 82.731102
A1: 0.506164 | A2: 1.349114 | ISG: 87.660704
A1: 0.613935 | A2: 1.464338 | ISG: 85.050147
A1: 0.738544 | A2: 1.407338 | ISG: 78.407100
A1: 0.888920 | A2: 1.466147 | ISG: 73.121036
A1: 1.060330 | A2: 1.171404 | ISG: 54.964724
A1: 1.091386 | A2: 1.176709 | ISG: 53.756549
A1: 0.956198 | A2: 1.428621 | ISG: 69.061576
A1: 0.797121 | A2: 1.361273 | ISG: 74.466151
A1: 0.723917 | A2: 1.461471 | ISG: 80.298302
A1: 0.744414 | A2: 1.496874 | ISG: 80.171911
A1: 0.714485 | A2: 1.508468 | ISG: 81.676407
A1: 0.639030 | A2: 1.437681 | ISG: 83.502537
A1: 0.714904 | A2: 1.311529 | ISG: 77.093526
A1: 0.744829 | A2: 1.353605 | ISG: 76.758847
A1: 0.701738 | A2: 1.382669 | ISG: 79.517740
A1: 0.684751 | A2: 1.335557 | ISG: 79.184726
A1: 0.688012 | A2: 1.338708 | ISG: 79.105718
A1: 0.678583 | A2: 1.335377 | ISG: 79.477052
A1: 0.673319 | A2: 1.346840 | ISG: 80.004812
A1: 0.818972 | A2: 1.441489 | ISG: 75.597981
A1: 0.868543 | A2: 1.408869 | ISG: 72.461111
A1: 1.023206 | A2: 1.485268 | ISG: 67.815543
A1: 1.095487 | A2: 1.469202 | ISG: 64.268564
A1: 1.136816 | A2: 1.577022 | ISG: 65.804928
A1: 1.216871 | A2: 1.351082 | ISG: 55.212107
A1: 1.123854 | A2: 1.208951 | ISG: 53.643009
A1: 1.043480 | A2: 1.401227 | ISG: 64.326733
A1: 1.008308 | A2: 1.468374 | ISG: 67.956287
A1: 0.942178 | A2: 1.487817 | ISG: 71.376513
A1: 0.907303 | A2: 1.449280 | ISG: 71.843078
A1: 0.885428 | A2: 1.427544 | ISG: 72.217535
A1: 0.760940 | A2: 1.279043 | ISG: 73.858484
A1: 0.811609 | A2: 1.233654 | ISG: 69.792442
A1: 0.879343 | A2: 1.309100 | ISG: 68.908428
A1: 0.884344 | A2: 1.268134 | ISG: 67.280731
A1: 0.728503 | A2: 1.095295 | ISG: 69.329588
A1: 0.678470 | A2: 1.293455 | ISG: 78.422585
A1: 0.908766 | A2: 1.606911 | ISG: 75.767295
A1: 0.909206 | A2: 1.513893 | ISG: 73.492116
A1: 0.689218 | A2: 1.237674 | ISG: 76.330093
A1: 0.678010 | A2: 1.283240 | ISG: 78.176170
A1: 0.836440 | A2: 1.449221 | ISG: 75.012031
A1: 0.897273 | A2: 1.374895 | ISG: 70.130993
A1: 0.850887 | A2: 1.324578 | ISG: 70.788625
A1: 0.758437 | A2: 1.463332 | ISG: 78.825217
A1: 0.692628 | A2: 1.472808 | ISG: 81.889307
A1: 0.646907 | A2: 1.469090 | ISG: 83.758836
A1: 0.417859 | A2: 1.204798 | ISG: 89.262568
A1: 0.271197 | A2: 1.315335 | ISG: 95.922292
A1: 0.531524 | A2: 1.468506 | ISG: 88.416792
A1: 0.592242 | A2: 1.445203 | ISG: 85.621224
A1: 0.841890 | A2: 1.724888 | ISG: 80.760706
A1: 0.784273 | A2: 1.808398 | ISG: 84.169320
A1: 0.650141 | A2: 1.716125 | ISG: 87.449168
A1: 0.686168 | A2: 1.667673 | ISG: 85.521747
A1: 0.681593 | A2: 1.503805 | ISG: 82.957857
A1: 0.840252 | A2: 1.217319 | ISG: 67.730410
A1: 0.870929 | A2: 1.276958 | ISG: 68.251467
A1: 0.792700 | A2: 1.424612 | ISG: 76.358226
A1: 0.758073 | A2: 1.437270 | ISG: 78.235478
A1: 0.730019 | A2: 1.435881 | ISG: 79.460754
A1: 0.554905 | A2: 1.265340 | ISG: 83.870123
A1: 0.523099 | A2: 1.263346 | ISG: 85.364709
A1: 0.720764 | A2: 1.554704 | ISG: 82.309475
A1: 0.701946 | A2: 1.621350 | ISG: 84.215048
A1: 0.606698 | A2: 1.412205 | ISG: 84.419151
A1: 0.780497 | A2: 1.195791 | ISG: 70.125144
A1: 0.932795 | A2: 1.262963 | ISG: 64.704156
A1: 0.940816 | A2: 1.260838 | ISG: 64.234760
A1: 0.945920 | A2: 1.292367 | ISG: 65.116089
A1: 0.901136 | A2: 1.378510 | ISG: 70.061023
A1: 0.913566 | A2: 1.430118 | ISG: 71.019130
A1: 0.852775 | A2: 1.540194 | ISG: 76.536733
A1: 0.758250 | A2: 1.475441 | ISG: 79.107171
A1: 0.760319 | A2: 1.501043 | ISG: 79.581727
A1: 0.679725 | A2: 1.430809 | ISG: 81.587028
A1: 0.717046 | A2: 1.333584 | ISG: 77.573274
A1: 0.684000 | A2: 1.271989 | ISG: 77.569604
A1: 0.612595 | A2: 1.332610 | ISG: 82.554540
A1: 0.715594 | A2: 1.532574 | ISG: 82.100648
A1: 0.656508 | A2: 1.614055 | ISG: 85.804421
A1: 0.520216 | A2: 1.409486 | ISG: 88.011014
A1: 0.664581 | A2: 1.275840 | ISG: 78.657581
A1: 0.845266 | A2: 1.454145 | ISG: 74.744736
A1: 0.833186 | A2: 1.413061 | ISG: 74.202364
A1: 0.820272 | A2: 1.380961 | ISG: 73.919685
A1: 0.785187 | A2: 1.533666 | ISG: 79.232355
A1: 0.763313 | A2: 1.482933 | ISG: 79.054581
A1: 0.839428 | A2: 1.398307 | ISG: 73.508830
A1: 0.862137 | A2: 1.363817 | ISG: 71.448304
A1: 0.937033 | A2: 1.357843 | ISG: 67.740417
A1: 0.977077 | A2: 1.485602 | ISG: 69.804804
A1: 0.941838 | A2: 1.448157 | ISG: 70.275010
A1: 0.941585 | A2: 1.414399 | ISG: 69.291680
A1: 0.984632 | A2: 1.348384 | ISG: 65.221452
A1: 0.807530 | A2: 1.223157 | ISG: 69.644369
A1: 0.683763 | A2: 1.309275 | ISG: 78.570641
A1: 0.627128 | A2: 1.256654 | ISG: 80.061036
A1: 0.616907 | A2: 1.230930 | ISG: 79.924992
A1: 0.722444 | A2: 1.369438 | ISG: 78.228466
A1: 0.734270 | A2: 1.413088 | ISG: 78.739815
A1: 0.789294 | A2: 1.443728 | ISG: 76.989000
A1: 0.898173 | A2: 1.302490 | ISG: 67.772607
A1: 0.837060 | A2: 1.197799 | ISG: 67.187790
A1: 0.748440 | A2: 1.388625 | ISG: 77.489424
A1: 0.844158 | A2: 1.461422 | ISG: 74.981986
A1: 0.837773 | A2: 1.459234 | ISG: 75.209901
A1: 0.816697 | A2: 1.442625 | ISG: 75.729462
A1: 0.903622 | A2: 1.245380 | ISG: 65.510826
A1: 1.003355 | A2: 1.375621 | ISG: 65.274145
A1: 0.907013 | A2: 1.476580 | ISG: 72.604594
A1: 0.844974 | A2: 1.406335 | ISG: 73.475303
A1: 0.829026 | A2: 1.442121 | ISG: 75.161388
A1: 0.746909 | A2: 1.347638 | ISG: 76.500712
A1: 0.778146 | A2: 1.293510 | ISG: 73.427071
A1: 0.802542 | A2: 1.348454 | ISG: 73.843700
A1: 0.756665 | A2: 1.412394 | ISG: 77.699518
A1: 0.873060 | A2: 1.525774 | ISG: 75.333988
A1: 0.935330 | A2: 1.552401 | ISG: 73.366887
A1: 0.965921 | A2: 1.584342 | ISG: 72.902576
A1: 0.937149 | A2: 1.596169 | ISG: 74.365240
A1: 0.869130 | A2: 1.553305 | ISG: 76.156793
A1: 0.844694 | A2: 1.588969 | ISG: 77.966800
A1: 0.725967 | A2: 1.437316 | ISG: 79.674226
A1: 0.752396 | A2: 1.303207 | ISG: 75.000555
A1: 0.784313 | A2: 1.408187 | ISG: 76.323554
A1: 0.664807 | A2: 1.564900 | ISG: 84.711654
A1: 0.676377 | A2: 1.505479 | ISG: 83.205068
A1: 0.805497 | A2: 1.457609 | ISG: 76.605827
A1: 0.960260 | A2: 1.629339 | ISG: 74.220316
A1: 1.057129 | A2: 1.387793 | ISG: 63.281573
A1: 0.993812 | A2: 1.342119 | ISG: 64.586561
A1: 0.883669 | A2: 1.436394 | ISG: 72.544195
A1: 0.706592 | A2: 1.295090 | ISG: 77.061108
A1: 0.627314 | A2: 1.343329 | ISG: 82.096776
A1: 0.555582 | A2: 1.265170 | ISG: 83.833496
A1: 0.531838 | A2: 1.318838 | ISG: 86.012582
A1: 0.612233 | A2: 1.411747 | ISG: 84.170122
A1: 0.674887 | A2: 1.436265 | ISG: 81.913717
A1: 0.768188 | A2: 1.475851 | ISG: 78.682802
A1: 0.850210 | A2: 1.292959 | ISG: 69.813028
A1: 0.807906 | A2: 1.278013 | ISG: 71.447780
A1: 0.777355 | A2: 1.335114 | ISG: 74.682458
A1: 0.836958 | A2: 1.319106 | ISG: 71.297397
A1: 0.995260 | A2: 1.091784 | ISG: 54.615000
A1: 1.078233 | A2: 1.183553 | ISG: 54.646403
A1: 0.922407 | A2: 1.559837 | ISG: 74.090934
A1: 0.774943 | A2: 1.514058 | ISG: 79.241075
A1: 0.694252 | A2: 1.399385 | ISG: 80.248619
A1: 0.522928 | A2: 1.292470 | ISG: 85.932976
A1: 0.772034 | A2: 1.194934 | ISG: 70.550155
A1: 1.599926 | A2: 1.672738 | ISG: 52.223746
A1: 2.367276 | A2: 1.004378 | ISG: 15.254954

Création d'un dataframe¶

In [529]:
values_list4 = []
for i in range(len(ISGs4)):
    append_values_to_list(A1[i], A2[i], ISGs4[i], values_list4)
df_ISG4 = pd.DataFrame(values_list4)
df_ISG4.head()
Out[529]:
A1 A2 ISG
0 0.969723 1.478746 69.928130
1 0.761792 1.431815 77.937868
2 0.703605 1.403140 79.907148
3 0.627063 1.339420 82.022778
4 0.619129 1.369755 83.035501

Valeur de l'ISG¶

In [530]:
df_ISG4.describe()
Out[530]:
A1 A2 ISG
count 627.000000 627.000000 627.000000
mean 0.754886 1.378062 76.645766
std 0.170517 0.115255 7.922234
min 0.098916 1.004378 15.254954
25% 0.658854 1.295075 71.485050
50% 0.752396 1.375621 76.920612
75% 0.855920 1.454746 81.968247
max 2.367276 1.808398 99.415949

ISG de 76.645766 pour ce jeu de données

In [531]:
plt.figure(figsize=(10, 4))
plt.plot(np.arange(len(ISGs4)), ISGs4, label='ISG', color='green')
plt.title('ISG pour chaque foulée')
plt.xlabel('Foulée')
plt.ylabel('ISG')
plt.legend()
plt.grid(True)
plt.show()
No description has been provided for this image

Boxplot des ISG pour visualiser les valeurs aberantes¶

In [532]:
plt.figure(figsize=(10, 4))
plt.boxplot(ISGs4)
plt.title('Boxplot de ISG')
plt.ylabel('ISG')
plt.grid(True)
plt.show()
No description has been provided for this image

Tri des valeurs aberantes¶

Les points qui apparaissent en dehors des moustaches représentent des valeurs aberrantes.

In [533]:
min_value4 = 59
max_value4 = 97
ISGs_filtered4 = ISG_min_max(ISGs4, min_value4, max_value4)
In [534]:
plt.figure(figsize=(10, 4))
plt.plot(np.arange(len(ISGs_filtered4)), ISGs_filtered4, label='ISG', color='green')
plt.title('ISG pour chaque foulée (Filtré)')
plt.xlabel('Foulée')
plt.ylabel('ISG')
plt.legend()
plt.grid(True)
No description has been provided for this image
In [535]:
plt.figure(figsize=(10, 4))
plt.boxplot(ISGs_filtered4)
plt.title('Boxplot de ISG (Filtré)')
Out[535]:
Text(0.5, 1.0, 'Boxplot de ISG (Filtré)')
No description has been provided for this image
In [536]:
df_ISG_filtered4 = df_ISG4[(df_ISG4['ISG'] >= min_value4) & (df_ISG4['ISG'] <= max_value4)]
df_ISG_filtered4.describe()
Out[536]:
A1 A2 ISG
count 614.000000 614.000000 614.000000
mean 0.752171 1.380029 76.827661
std 0.143060 0.112337 6.954869
min 0.265989 1.083250 59.009701
25% 0.661502 1.296780 71.812908
50% 0.751210 1.376449 76.961379
75% 0.853783 1.456450 81.873768
max 1.136816 1.808398 96.959027

Apres un filtre des données, l'ISG moyen est de 76.827661

Récapitulatif¶

In [537]:
df_ISG1.describe()
Out[537]:
A1 A2 ISG
count 118.000000 118.000000 118.000000
mean 0.890455 1.513142 73.940655
std 0.273549 0.131681 11.248176
min 0.094891 1.248455 47.473351
25% 0.710223 1.418374 65.574254
50% 0.916671 1.496832 74.105009
75% 1.092196 1.586573 81.793273
max 1.396826 1.960993 99.539785
In [538]:
df_ISG_filtered2.describe()
Out[538]:
A1 A2 ISG
count 166.000000 166.000000 166.000000
mean 0.584031 1.201768 80.375471
std 0.179989 0.086753 9.394320
min 0.213818 0.933122 55.955094
25% 0.448469 1.153114 74.271849
50% 0.574456 1.205038 81.934572
75% 0.705057 1.258645 88.168159
max 1.035396 1.438792 97.006087
In [539]:
df_ISG_filtered3.describe()
Out[539]:
A1 A2 ISG
count 608.000000 608.000000 608.000000
mean 0.435221 1.383436 90.395185
std 0.128034 0.106547 4.860927
min 0.056615 1.032076 76.421200
25% 0.344562 1.321251 86.929394
50% 0.439514 1.379948 90.848870
75% 0.529467 1.452552 94.122882
max 0.774316 1.840437 99.815591
In [540]:
df_ISG4.describe()
Out[540]:
A1 A2 ISG
count 627.000000 627.000000 627.000000
mean 0.754886 1.378062 76.645766
std 0.170517 0.115255 7.922234
min 0.098916 1.004378 15.254954
25% 0.658854 1.295075 71.485050
50% 0.752396 1.375621 76.920612
75% 0.855920 1.454746 81.968247
max 2.367276 1.808398 99.415949