Travailler sur la forme évolutive d'une équipe pour ses six jeux précédents

2

J'ai un tableur avec beaucoup de scores de football. Je l'ai joint pour que vous sachiez de quoi je parle.

Voici l'une des entrées:

+-----+--------+-----------+-----------+--------+--------+------------+--------+--------+----+----+----+----+------+----+------+----+------+----+----+
| Ref | Output | Home      | Away      | HTHome | HTAway |    Date    | FTHome | FTAway | HT | FT | HT | FT | Away | HT | Away | FT | Away | HT | FT |
+-----+--------+-----------+-----------+--------+--------+------------+--------+--------+----+----+----+----+------+----+------+----+------+----+----+
|  1  |    1   | Arsenal   | Leicester |    2   |    2   | 11/08/2017 |    4   |    3   |  D |  W | DW |  D |   L  | DL |      |    |      |    |    |
+-----+--------+-----------+-----------+--------+--------+------------+--------+--------+----+----+----+----+------+----+------+----+------+----+----+

De cela, je sais que Arsenal a remporté le match 4-3.

La feuille de calcul contient beaucoup de lignes comme celle-ci. Ce que je voudrais faire, c'est travailler sur la forme précédente d'une équipe avant son prochain match.

Par exemple, le lendemain de Noël, Liverpool a joué à Swansea:

+-----+--------+-----------+-----------+--------+--------+------------+--------+--------+----+----+----+----+------+----+------+----+------+----+----+
| Ref | Output | Home      | Away      | HTHome | HTAway |    Date    | FTHome | FTAway | HT | FT | HT | FT | Away | HT | Away | FT | Away | HT | FT |
+-----+--------+-----------+-----------+--------+--------+------------+--------+--------+----+----+----+----+------+----+------+----+------+----+----+
| 194 |   20   | Liverpool | Swansea   |    1   |    0   | 26/12/2017 |    5   |    0   |  W |  W | WW |  L |   L  | LL |      |    |      |    |    |
+-----+--------+-----------+-----------+--------+--------+------------+--------+--------+----+----+----+----+------+----+------+----+------+----+----+

La forme de Liverpool pour ses six jeux précédents serait W W D D W D. Je convertirai éventuellement cette information en un seul numéro, par exemple avec 3pour une victoire, 1pour un match nul et 0pour une défaite, Liverpool aurait un "score" de 12.

Les matchs peuvent être soit à domicile, soit à l'extérieur, et j'aimerais connaître la forme des six jeux précédents, quel que soit le lieu où ils ont été disputés. Je souhaite également pouvoir faire glisser la formule vers le bas, afin de pouvoir entrer dans les matchs de la semaine prochaine et de générer correctement le formulaire précédent.

J'ai vu beaucoup d'autres solutions pour une table de formulaire. Mes exigences sont différentes car j'aimerais connaître le formulaire précédent pour chaque match de la saison.

Il serait également utile que les formules puissent être facilement adaptées pour vérifier la forme, par exemple, des 3 derniers jeux.

Prem.xlsx

Toutes les questions, s'il vous plaît faites le moi savoir.


Voici le lien vers les données:

http://www.football-data.co.uk/mmz4281/1718/E0.csv

utilisateur22485
la source

Réponses:

3

Vos deux exemples d'entrées ne correspondent pas aux données du fichier CSV lié et sont un peu flous. Il semble que vous importez le fichier CSV dans un classeur et le modifiez. (Vous avez cependant oublié de coller le lien dans le classeur.)

Ainsi, pour ma solution, je vais utiliser les données de fichier CSV non modifiées. Vous devrez ajuster les formules en fonction de votre tableau actuel. De plus, étant donné que le "score" des six jeux précédents est en réalité plus simple à calculer que les résultats individuels victoire / défaite / match nul, ma formule renverra ce qui suit:

Capture d'écran de la feuille de travail

Entrez la formule suivante BN2et ctrl-entrez / copiez-collez / remplissez en bas et à droite / remplissez automatiquement le reste du tableau BNet des BOcolonnes:

=IFERROR(MOD(SUMPRODUCT(LARGE(+($C$1:$C1=C2)*(100*ROW($G$1:$G1)+3*($G$1:$G1="H")+1*($G$1:$G1="D"))+($D$1:$D1=C2)*(100*ROW($G$1:$G1)+3*($G$1:$G1="A")+1*($G$1:$G1="D")),{6,5,4,3,2,1})),100),0)

Explication:

La version simplifiée de la formule est la suivante:

=
IFERROR(
  MOD(
    SUMPRODUCT(
      LARGE(
        +($C$1:$C1=C2)*(100*ROW($G$1:$G1)+3*($G$1:$G1="H")+1*($G$1:$G1="D"))
        +($D$1:$D1=C2)*(100*ROW($G$1:$G1)+3*($G$1:$G1="A")+1*($G$1:$G1="D")),
        {6,5,4,3,2,1}
      )
    ),
    100
  ),
  0
)

Pour chaque ligne précédente contenant l'équipe cible, la formule crée une valeur spéciale. (Pour les autres lignes, la valeur est zéro.) Les deux chiffres les plus à droite de la valeur spéciale contiennent la valeur du résultat ( 3pour un gain, 1un tirage au sort et 0une perte), tandis que les chiffres les plus à gauche contiennent le numéro de la ligne.

La LARGE()fonction sélectionne ensuite les valeurs spéciales des six dernières lignes correspondantes (c'est-à-dire celles dont les six plus grands numéros figurent dans les chiffres les plus à gauche). L'utilisation SUMPRODUCT()de ces six valeurs donne une seule valeur où les deux chiffres les plus à droite sont la somme des valeurs de résultat, c'est-à-dire le "score". La MOD()fonction extrait ce score.

La IFERROR()fonction est là pour supprimer l’ #NUM!erreur qui se produit de ligne 2en ligne 6(en raison de la LARGE()tentative d’obtenir les six valeurs les plus grandes d’un tableau contenant moins de six éléments).

Notez que s'il y a moins de six matchs précédents pour l'équipe cible, la valeur des éléments du tableau correspondant aux matchs manquants sera zéro.


Passer en revue la formule BO22devrait clarifier ce qui précède. Notez que depuis TRUEet FALSEsont convertis en 1et 0respectivement lorsqu'ils sont utilisés dans une multiplication, pour des raisons de compacité, j'utiliserai ces chiffres dans les évaluations suivantes.

  • 100*ROW($G$1:$G21)+3*($G$1:$G21="H")+1*($G$1:$G21="D")
    100*{1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21}+3*({0;1;0;0;0;1;0;0;1;1;0;0;0;1;1;1;1;0;1;0;0})+1*({0;0;0;0;0;0;1;1;0;0;0;0;0;0;0;0;0;0;0;0;1})
    {100;203;300;400;500;603;701;801;903;1003;1100;1200;1300;1403;1503;1603;1703;1800;1903;2000;2101}, les valeurs spéciales pour les équipes à domicile pour toutes les lignes précédentes
  • ($C$1:$C21=D22)*({100;203;300;400;500;603;701;801;903;1003;1100;1200;1300;1403;1503;1603;1703;1800;1903;2000;2101})
    ({0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1})*({100;203;300;400;500;603;701;801;903;1003;1100;1200;1300;1403;1503;1603;1703;1800;1903;2000;2101})
    {0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2101}, les valeurs spéciales si l'équipe à domicile correspond à l'équipe cible ( D22) pour toutes les lignes précédentes
  • De même, ($D$1:$D21=D22)*(100*ROW($G$1:$G21)+3*($G$1:$G21="A")+1*($G$1:$G21="D"))
    {0;0;303;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}, les valeurs spéciales si l’ équipe à l’ extérieur correspond à l’équipe cible pour toutes les lignes précédentes.
  • +{0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2101}+{0;0;303;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}
    {0;0;303;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2101}, les valeurs spéciales si un match impliquait l'équipe cible pour toutes les lignes précédentes. (Notez que, comme les deux tableaux sont "mutuellement exclusifs", leur sommation ne causera aucune interférence.)
  • LARGE({0;0;303;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2101},{6,5,4,3,2,1})
    {0,0,0,0,303,2101}, les valeurs spéciales des six matches précédents impliquant l'équipe cible
  • SUMPRODUCT({0,0,0,0,303,2101})
    2404, où les deux chiffres les plus à droite sont le "score", c'est-à-dire la somme des valeurs de résultat, et les chiffres à gauche non pertinents sont la somme des numéros de ligne. (Notez que cette expression SUMPRODUCT()est utilisée à la place des SUM()expressions internes, elles sont évaluées en tant que tableaux, évitant ainsi la nécessité de saisir la formule par un tableau.)
  • MOD(2404,100)
    4, le "score" (ou forme) des six matches précédents impliquant l'équipe cible

Remarques:

  • La formule raffinée fonctionne réellement si elle est entrée.
  • Vous devrez conserver la FTRcolonne ( G:G) du fichier CSV brut pour que les formules fonctionnent. (La colonne n'est pas strictement requise, mais les formules doivent être ajustées pour fonctionner sans elle. J'ai choisi d'utiliser la colonne car elle facilite la lecture de la formule.)
  • Modification de la formule à utiliser uniquement les trois précédents jeux pertinents est une simple question de changer {6,5,4,3,2,1}à {3,2,1}.
  • Le facteur de mise à l'échelle des lignes ne fonctionne que si [# relevant previous games]*[max outcome value] < [row scaling factor]. En utilisant les valeurs de l'exemple 6*3=18 < 100, nous pouvons donc voir que 100c'est le facteur de mise à l'échelle minimum qui fonctionnera. (Eh bien, en fait, la puissance minimale de dix facteurs d’échelle, tout comme 19le minimum absolu .)
  • Si vous souhaitez réellement obtenir les résultats individuels des six matches précédents correspondants, je peux ajouter cela à la réponse. Ajoutée.

Addendum n ° 1:

Pour les résultats individuels des six matchs précédents de l'équipe à domicile de la ligne en cours, le tableau multicellulaire saisit ( Ctrl+ Shift+ Enter) la formule suivante dans six cellules consécutives de la ligne 2et copié-collé / rempli dans le reste des colonnes du tableau (ne pas t oublier d’enlever le {et }):

{=
CHOOSE(1+
  IFERROR(
    MOD(
      LARGE(
        +($C$1:$C1=C2)*(100*ROW($G$1:$G1)+3*($G$1:$G1="H")+2*($G$1:$G1="A")+1*($G$1:$G1="D"))
        +($D$1:$D1=C2)*(100*ROW($G$1:$G1)+3*($G$1:$G1="A")+2*($G$1:$G1="H")+1*($G$1:$G1="D")),
        {6,5,4,3,2,1}
      ),
      100
    ),
    0
  ),
  "-","D","L","W"
)}

Pour les résultats individuels des six derniers matches de l'équipe à l' extérieur de la ligne en cours, il suffit de changer les deux =C2pour =D2.

Pour renvoyer les résultats sous forme de chaîne dans une seule cellule, enveloppez simplement la formule entière avec TEXTJOIN("",TRUE,…). (Fonctionne uniquement de manière native dans Excel 2016. Les versions antérieures d'Excel requièrent un fichier UDF poly-fill - voir cet article pour en savoir plus.)

Explication:

La formule est fondamentalement la même que la précédente avec seulement trois modifications:

  1. Une valeur de résultat de 2est ajoutée pour une perte
  2. Les valeurs de résultat ne sont plus additionnées
  3. Au lieu de cela, ils sont utilisés comme premier argument (c’est-à-dire comme index) de la CHOOSE()fonction pour sélectionner les caractères de résultat appropriés.

Enfin, pour vous montrer que je ne plaisantais pas sur le fait que le score est plus facile à calculer que les résultats individuels, voici la formule de résultats la plus simple, qui ne calcule pas d'abord les valeurs de score individuelles:

{=
IF(
  ISERROR(0/LARGE(ROW($G$1:$G1)*(($C$1:$C1=C2)+($D$1:$D1=C2)),{6,5,4,3,2,1})),
  "-",
IF(
  "D"=INDEX($G:$G,N(IF(1,1+LARGE((ROW($G$1:$G1)-1)*(($C$1:$C1=C2)+($D$1:$D1=C2)),{6,5,4,3,2,1})))),
  "D",
IF(
  +("H"=INDEX($G:$G,N(IF(1,1+LARGE((ROW($G$1:$G1)-1)*(($C$1:$C1=C2)+($D$1:$D1=C2)),{6,5,4,3,2,1})))))
  *(C2=INDEX($C:$C,N(IF(1,1+LARGE((ROW($G$1:$G1)-1)*(($C$1:$C1=C2)+($D$1:$D1=C2)),{6,5,4,3,2,1})))))
  +("A"=INDEX($G:$G,N(IF(1,1+LARGE((ROW($G$1:$G1)-1)*(($C$1:$C1=C2)+($D$1:$D1=C2)),{6,5,4,3,2,1})))))
  *(C2=INDEX($D:$D,N(IF(1,1+LARGE((ROW($G$1:$G1)-1)*(($C$1:$C1=C2)+($D$1:$D1=C2)),{6,5,4,3,2,1}))))),
  "W",
"L"
)))}

Addenda n ° 2:

Toutes les formules précédentes profitent du fait que les en- têtes de colonnes C, Det Gne correspondent à aucune des valeurs de données dans ces colonnes, et que les valeurs dans les colonnes ne sont utilisées que dans les comparaisons. Cela signifie que la valeur du premier élément (c'est-à-dire correspondant à la ligne d'en-tête) des tableaux pour les équipes locale et celle de l'extérieur sera un zéro.

Cependant, si les valeurs dans les colonnes sont réellement utilisées numériquement dans la formule, comme dans le cas du total des buts marqués par chaque équipe lors de leurs six derniers matches,

=
IFERROR(
  MOD(
    SUMPRODUCT(
      LARGE(
        +($C$1:$C1=C2)*(100*ROW($E$1:$E1)+$E$1:$E1)
        +($D$1:$D1=C2)*(100*ROW($F$1:$F1)+$F$1:$F1),
        {6,5,4,3,2,1}
      )
    ),
    100
  ),
  0
)

alors la valeur du premier élément des tableaux sera la valeur d'erreur #VALUE!, la LARGE()fonction retournera toujours le tableau {#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!,#VALUE!}et la formule retournera toujours un zéro.

Il y a plusieurs façons de résoudre ce problème.

Une solution consiste à entrer la formule en commençant par ligne 3au lieu de ligne 2et en la modifiant afin que les plages commencent par ligne 2au lieu de ligne 1(par exemple $C$2:$C2=C3au lieu de $C$1:$C2=C3). Les valeurs de ligne 2seront toujours des zéros, bien sûr, et peuvent être entrées manuellement en tant que telles.


Une autre méthode consiste à envelopper la somme des tableaux dans une IFERROR()fonction pour convertir l'erreur du premier élément en zéro avant de la transmettre à la LARGE()fonction:

{=
IFERROR(
  MOD(
    SUMPRODUCT(
      LARGE(
        IFERROR(
          +($C$1:$C1=C2)*(100*ROW($E$1:$E1)+$E$1:$E1)
          +($D$1:$D1=C2)*(100*ROW($F$1:$F1)+$F$1:$F1),
          0
        ),
        {6,5,4,3,2,1}
      )
    ),
    100
  ),
  0
)}

Remarques:

  • Cette formule doit être entrée dans un tableau. Normalement, les expressions dans une SUMPRODUCT()fonction sont évaluées en tant que tableaux, mais les expressions dans une imbriquée IFERROR()sont une des exceptions.
  • Puisque la formule est entrée dans un tableau, SUM()peut être utilisée à la place de SUMPRODUCT(). (Rappelez-vous qu’il n’était utilisé à l’origine que pour forcer l’évaluation de tableaux sans exiger que la formule soit entrée dans un tableau.)
robinCTS
la source
1
Merci beaucoup, c’est parfait, si vous pouviez inclure ceci: "Si vous souhaitez réellement obtenir les résultats individuels des six matches précédents, je peux ajouter cela à la réponse." cela serait parfait. Je ne peux pas croire à quel point vous avez donné une bonne réponse, je vous en suis extrêmement reconnaissant !!!!!!
user22485
1
@ZarinaAkhtar Okie, dokie. Ajout des formules de résultats individuels.
robinCTS
2
Vous êtes le meilleur
user22485
1
Bonjour @RobinCTS, pouvez-vous penser à un moyen simple de marquer les buts marqués par chaque équipe lors des 6,3 derniers matches? J'ai essayé de convertir votre formule mais je me bats un peu.
user22485
1
@ZarinaAkhtar Il suffit de remplacer les valeurs de résultats +3*($G$1:$G1="H")+1*($G$1:$G1="D")de l'équipe locale, par les objectifs de l'équipe locale +$E$1:$E1. De la même manière, remplacez les valeurs de résultats +3*($G$1:$G1="A")+1*($G$1:$G1="D")de l'équipe en déplacement par les objectifs de l'équipe en déplacement +$F$1:$F1. (En utilisant la première formule, bien sûr.)
robinCTS