def hit_location_data(
            self,
            df,
            pos_of=FIELD_POSITIONS_OF,
            pos_if=FIELD_POSITIONS_IF,
            pos_bt=FIELD_POSITIONS_BATTERY
    ):
        """
        Hit Location Data from RETROSHEET
        :param df: event file dataframe by RETROSHEET
        :param pos_of: Out Fielder Position{'number': 'name'}
        :param pos_if: In Fielder Position{'number': 'name'}
        :param pos_bt: BATTERY Position{'number': 'name'}
        :return: Hit Location Data(dict)
        """
        hit_charts = {
            'of': self._initialize_hit_location_data(pos_of),
            'if': self._initialize_hit_location_data(pos_if),
            'battery': self._initialize_hit_location_data(pos_bt)
        }
        for i, row in df.iterrows():
            row_dict = row.to_dict()
            at_bat = RetroSheetUtil.get_atbat(
                row_dict['event_tx'],
                row_dict['event_cd'],
                row_dict['battedball_cd'],
            )
            batted_ball_event = AnalyzeBatter._batted_ball_event(at_bat['event'])
            batted_ball_pos = AnalyzeBatter._batted_ball_position(at_bat['position'])
            for k, pos in {'of': pos_of, 'if': pos_if, 'battery': pos_bt}.items():
                if batted_ball_pos in pos.keys():
                    hit_charts[k][pos[batted_ball_pos]][AnalyzeBatter.HITS_DICT[batted_ball_event]] += 1

        return hit_charts
    def test_get_atbat(self):

        # single
        self.assertEqual(
            RetroSheetUtil.get_atbat('S9/G.1-3', '20', 'G'),
            {'event': 'S', 'position': '9', 'battedball': 'G'}
        )

        # duble
        self.assertEqual(
            RetroSheetUtil.get_atbat('D57/G', 21, 'G'),
            {'event': 'D', 'position': '57', 'battedball': 'G'}
        )

        # ground rule duble
        self.assertEqual(
            RetroSheetUtil.get_atbat('DGR/9/F', '21', 'F'),
            {'event': 'DGR', 'position': '9', 'battedball': 'F'}
        )

        # ground rule duble(fan )
        self.assertEqual(
            RetroSheetUtil.get_atbat('DGR/FINT/7/L-.1-3', '21', 'L'),
            {'event': 'DGR', 'position': '7', 'battedball': 'L'}
        )

        # triple
        self.assertEqual(
            RetroSheetUtil.get_atbat('T9/L', '22', 'L'),
            {'event': 'T', 'position': '9', 'battedball': 'L'}
        )

        # home run
        self.assertEqual(
            RetroSheetUtil.get_atbat('HR/89/F.1-H', '23', 'F'),
            {'event': 'HR', 'position': '89', 'battedball': 'F'}
        )

        # home run(illegal position)
        self.assertEqual(
            RetroSheetUtil.get_atbat('HR/F8XD', '23', 'F'),
            {'event': 'HR', 'position': '8', 'battedball': 'F'}
        )
Esempio n. 3
0
    def hit_location_data(self,
                          df,
                          pos_of=FIELD_POSITIONS_OF,
                          pos_if=FIELD_POSITIONS_IF,
                          pos_bt=FIELD_POSITIONS_BATTERY):
        """
        Hit Location Data from RETROSHEET
        :param df: event file dataframe by RETROSHEET
        :param pos_of: Out Fielder Position{'number': 'name'}
        :param pos_if: In Fielder Position{'number': 'name'}
        :param pos_bt: BATTERY Position{'number': 'name'}
        :return: Hit Location Data(dict)
        """
        hit_charts = {
            'of': self._initialize_hit_location_data(pos_of),
            'if': self._initialize_hit_location_data(pos_if),
            'battery': self._initialize_hit_location_data(pos_bt)
        }
        for i, row in df.iterrows():
            row_dict = row.to_dict()
            at_bat = RetroSheetUtil.get_atbat(
                row_dict['event_tx'],
                row_dict['event_cd'],
                row_dict['battedball_cd'],
            )
            batted_ball_event = AnalyzeBatter._batted_ball_event(
                at_bat['event'])
            batted_ball_pos = AnalyzeBatter._batted_ball_position(
                at_bat['position'])
            for k, pos in {
                    'of': pos_of,
                    'if': pos_if,
                    'battery': pos_bt
            }.items():
                if batted_ball_pos in pos.keys():
                    hit_charts[k][pos[batted_ball_pos]][
                        AnalyzeBatter.HITS_DICT[batted_ball_event]] += 1

        return hit_charts
    def test_get_atbat(self):

        # single
        self.assertEqual(
            RetroSheetUtil.get_atbat("S9/G.1-3", "20", "G"), {"event": "S", "position": "9", "battedball": "G"}
        )

        # duble
        self.assertEqual(
            RetroSheetUtil.get_atbat("D57/G", 21, "G"), {"event": "D", "position": "57", "battedball": "G"}
        )

        # ground rule duble
        self.assertEqual(
            RetroSheetUtil.get_atbat("DGR/9/F", "21", "F"), {"event": "DGR", "position": "9", "battedball": "F"}
        )

        # ground rule duble(fan )
        self.assertEqual(
            RetroSheetUtil.get_atbat("DGR/FINT/7/L-.1-3", "21", "L"),
            {"event": "DGR", "position": "7", "battedball": "L"},
        )

        # triple
        self.assertEqual(
            RetroSheetUtil.get_atbat("T9/L", "22", "L"), {"event": "T", "position": "9", "battedball": "L"}
        )

        # home run
        self.assertEqual(
            RetroSheetUtil.get_atbat("HR/89/F.1-H", "23", "F"), {"event": "HR", "position": "89", "battedball": "F"}
        )

        # home run(illegal position)
        self.assertEqual(
            RetroSheetUtil.get_atbat("HR/F8XD", "23", "F"), {"event": "HR", "position": "8", "battedball": "F"}
        )