@@ -928,6 +928,85 @@ class DatasetFlag(Flag):
928928 BALL_STATE = 2
929929
930930
931+ @dataclass
932+ class Statistic (ABC ):
933+ name : str = field (init = False )
934+
935+
936+ @dataclass
937+ class ScalarStatistic (Statistic ):
938+ value : float
939+
940+
941+ @dataclass
942+ class ExpectedGoals (ScalarStatistic ):
943+ """Expected goals"""
944+
945+ def __post_init__ (self ):
946+ self .name = "xG"
947+
948+
949+ @dataclass
950+ class PostShotExpectedGoals (ScalarStatistic ):
951+ """Post-shot expected goals"""
952+
953+ def __post_init__ (self ):
954+ self .name = "PSxG"
955+
956+
957+ @dataclass
958+ class ActionValue (Statistic ):
959+ """Action value"""
960+
961+ name : str
962+ action_value_scoring_before : Optional [float ] = field (default = None )
963+ action_value_scoring_after : Optional [float ] = field (default = None )
964+ action_value_conceding_before : Optional [float ] = field (default = None )
965+ action_value_conceding_after : Optional [float ] = field (default = None )
966+
967+ @property
968+ def offensive_value (self ) -> Optional [float ]:
969+ return (
970+ None
971+ if None
972+ in (
973+ self .action_value_scoring_before ,
974+ self .action_value_scoring_after ,
975+ )
976+ else self .action_value_scoring_after
977+ - self .action_value_scoring_before
978+ )
979+
980+ @property
981+ def defensive_value (self ) -> Optional [float ]:
982+ return (
983+ None
984+ if None
985+ in (
986+ self .action_value_conceding_before ,
987+ self .action_value_conceding_after ,
988+ )
989+ else self .action_value_conceding_after
990+ - self .action_value_conceding_before
991+ )
992+
993+ @property
994+ def value (self ) -> Optional [float ]:
995+ if None in (
996+ self .action_value_scoring_before ,
997+ self .action_value_scoring_after ,
998+ self .action_value_conceding_before ,
999+ self .action_value_conceding_after ,
1000+ ):
1001+ return None
1002+ return (
1003+ self .action_value_scoring_after - self .action_value_scoring_before
1004+ ) - (
1005+ self .action_value_conceding_after
1006+ - self .action_value_conceding_before
1007+ )
1008+
1009+
9311010@dataclass
9321011class DataRecord (ABC ):
9331012 """
@@ -945,6 +1024,7 @@ class DataRecord(ABC):
9451024 next_record : Optional ["DataRecord" ] = field (init = False )
9461025 period : Period
9471026 timestamp : timedelta
1027+ statistics : List [Statistic ]
9481028 ball_owning_team : Optional [Team ]
9491029 ball_state : Optional [BallState ]
9501030
0 commit comments