You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3129 lines
149 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import numpy as np
import pandas as pd
from google.protobuf.struct_pb2 import ListValue
from server import process_pb2
import warnings
warnings.filterwarnings('ignore')
# 忽略警告
pd.set_option('mode.chained_assignment', None)
# 显示所有列
pd.set_option('display.max_columns', None)
# 显示所有行
pd.set_option('display.max_rows', None)
# 设置value的显示长度为100默认为50
pd.set_option('max_colwidth', 100)
pd.set_option('display.width', 2000)
class Processor:
def __init__(self, event, home_team_id, visiting_team_id, names):
self.event = event
self.home_team_id = home_team_id
self.visiting_team_id = visiting_team_id
values = []
for value in event.values:
v = value.list_value.values
y = [
v[0].number_value,
v[1].number_value,
v[2].number_value,
v[3].number_value,
v[4].number_value,
v[5].string_value,
v[6].string_value,
v[7].number_value,
v[8].number_value,
v[9].number_value,
v[10].number_value,
v[11].number_value,
v[12].number_value,
v[13].number_value,
v[14].number_value,
v[15].number_value,
v[16].number_value,
v[17].number_value,
v[18].number_value,
v[19].number_value,
v[20].number_value,
v[21].number_value,
]
values.append(y)
self.df = pd.DataFrame(values, columns=list(names))
def run_team_statistics(self):
df = self.df
home_team_id = self.home_team_id
visiting_team_id = self.visiting_team_id
# 球权转移
lost = df['player1_teamID'] / df['player1_teamID'].shift(-1)
gained = df['player1_teamID'] / df['player1_teamID'].shift(1)
df['is_possessions_lost'] = (lost != np.nan) & (lost != np.inf) & (lost != 1)
df['is_possessions_gained'] = (gained != np.nan) & (gained != np.inf) & (gained != 1)
# 事件时间点的时间差
df['duration'] = df['time_point'].diff(-1)
df.loc[df['duration'] > 0, 'duration'] = 0
df.loc[df['event_index'].isin(
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 19, 20, 25, 27, 28, 29, 30, 37, 43, 45]), 'duration'] = 0
# df.loc[df['event_index'].shift(1).isin([23, 26]), 'duration'] = 0
df['duration'] = df['duration'].abs()
df.fillna(0, inplace=True)
possession_a = df[
(df['player1_teamID'] == home_team_id) |
(
(df['player1_teamID'].shift(1) == home_team_id) &
(df['player1_teamID'] == visiting_team_id)
)
]['duration'].sum()
possession_b = df[
(df['player1_teamID'] == visiting_team_id) |
(
(df['player1_teamID'].shift(1) == visiting_team_id) &
(df['player1_teamID'] == home_team_id)
)
]['duration'].sum()
# 1. 控球率
def possession(x):
r = possession_a / (possession_a + possession_b + 1e-20) \
if (x == visiting_team_id).sum() == 0 else possession_b / (
possession_a + possession_b + 1e-20)
return round(r, 2)
# 2. 控球时间
def possession_time(x):
return possession_a if (x == visiting_team_id).sum() == 0 else possession_b
average_regain_line_a = df[(
(df['player1_teamID'] == home_team_id) &
(df['is_possessions_lost'].shift(1)) &
(
(
(df['player1_teamID'] == df['left_team']) &
(df['pos_x'] < 0)
) |
(
(df['player1_teamID'] != df['left_team']) &
(df['pos_x'] > 0)
)
)
)]['pos_x'].apply(lambda a: abs(52.5 - abs(a))).mean()
average_regain_line_b = df[(
(df['player1_teamID'] == visiting_team_id) &
(df['is_possessions_lost'].shift(1)) &
(
(
(df['player1_teamID'] == df['left_team']) &
(df['pos_x'] < 0)
) |
(
(df['player1_teamID'] != df['left_team']) &
(df['pos_x'] > 0)
)
)
)]['pos_x'].apply(lambda a: abs(52.5 - abs(a))).mean()
# 3. 平均重新控球线
def average_regain_line(x):
return average_regain_line_a if (x == visiting_team_id).sum() == 0 else average_regain_line_b
possession_first_quarter_a = df[
(
(df['player1_teamID'] == home_team_id) |
(
(df['player1_teamID'].shift(1) == home_team_id) &
(df['player1_teamID'] == visiting_team_id)
)
) &
(df['match_progress'] == 1) &
(df['time_point'] <= 900000)
]['duration'].sum()
possession_first_quarter_b = df[
(
(df['player1_teamID'] == visiting_team_id) |
(
(df['player1_teamID'].shift(1) == visiting_team_id) &
(df['player1_teamID'] == home_team_id)
)
) &
(df['match_progress'] == 1) &
(df['time_point'] <= 900000)
]['duration'].sum()
# 4. 0-15分钟控球率
def possession_first_quarter(x):
return possession_first_quarter_a / (possession_first_quarter_a + possession_first_quarter_b + 1e-20) if (
x == visiting_team_id).sum() == 0 else possession_first_quarter_b / (
possession_first_quarter_a + possession_first_quarter_b + 1e-20)
possession_secend_quarter_a = df[
(
(df['player1_teamID'] == home_team_id) |
(
(df['player1_teamID'].shift(1) == home_team_id) &
(df['player1_teamID'] == visiting_team_id)
)
) &
(df['match_progress'] == 1) &
(df['time_point'] > 900000) &
(df['time_point'] <= 1800000)
]['duration'].sum()
possession_secend_quarter_b = df[
(
(df['player1_teamID'] == visiting_team_id) |
(
(df['player1_teamID'].shift(1) == visiting_team_id) &
(df['player1_teamID'] == home_team_id)
)
) &
(df['match_progress'] == 1) &
(df['time_point'] > 900000) &
(df['time_point'] <= 1800000)
]['duration'].sum()
# 5. 15-30分钟控球率
def possession_secend_quarter(x):
return possession_secend_quarter_a / (
possession_secend_quarter_a + possession_secend_quarter_b + 1e-20) if (
x == visiting_team_id).sum() == 0 else possession_secend_quarter_b / (
possession_secend_quarter_a + possession_secend_quarter_b + 1e-20)
possession_third_quarter_a = df[
(
(df['player1_teamID'] == home_team_id) |
(
(df['player1_teamID'].shift(1) == home_team_id) &
(df['player1_teamID'] == visiting_team_id)
)
) &
(df['match_progress'] == 1) &
(df['time_point'] > 1800000) &
(df['time_point'] <= 2700000)
]['duration'].sum()
possession_third_quarter_b = df[
(
(df['player1_teamID'] == visiting_team_id) |
(
(df['player1_teamID'].shift(1) == visiting_team_id) &
(df['player1_teamID'] == home_team_id)
)
) &
(df['match_progress'] == 1) &
(df['time_point'] > 1800000) &
(df['time_point'] <= 2700000)
]['duration'].sum()
# 6. 30-45分钟控球率
def possession_third_quarter(x):
return possession_third_quarter_a / (possession_third_quarter_a + possession_third_quarter_b + 1e-20) if (
x == visiting_team_id).sum() == 0 else possession_third_quarter_b / (
possession_third_quarter_a + possession_third_quarter_b + 1e-20)
possession_fourth_quarter_a = df[
(
(df['player1_teamID'] == home_team_id) |
(
(df['player1_teamID'].shift(1) == home_team_id) &
(df['player1_teamID'] == visiting_team_id)
)
) &
(df['match_progress'] == 2) &
(df['time_point'] <= 900000)
]['duration'].sum()
possession_fourth_quarter_b = df[
(
(df['player1_teamID'] == visiting_team_id) |
(
(df['player1_teamID'].shift(1) == visiting_team_id) &
(df['player1_teamID'] == home_team_id)
)
) &
(df['match_progress'] == 2) &
(df['time_point'] <= 900000)
]['duration'].sum()
# 7. 45-60分钟控球率
def possession_fourth_quarter(x):
return possession_fourth_quarter_a / (
possession_fourth_quarter_a + possession_fourth_quarter_b + 1e-20) if (
x == visiting_team_id).sum() == 0 else possession_fourth_quarter_b / (
possession_fourth_quarter_a + possession_fourth_quarter_b + 1e-20)
# return -1
possession_fifth_quarter_a = df[
(
(df['player1_teamID'] == home_team_id) |
(
(df['player1_teamID'].shift(1) == home_team_id) &
(df['player1_teamID'] == visiting_team_id)
)
) &
(df['match_progress'] == 2) &
(df['time_point'] > 900000) &
(df['time_point'] <= 1800000)
]['duration'].sum()
possession_fifth_quarter_b = df[
(
(df['player1_teamID'] == visiting_team_id) |
(
(df['player1_teamID'].shift(1) == visiting_team_id) &
(df['player1_teamID'] == home_team_id)
)
) &
(df['match_progress'] == 2) &
(df['time_point'] > 900000) &
(df['time_point'] <= 1800000)
]['duration'].sum()
# 8. 60-75分钟控球率
def possession_fifth_quarter(x):
return possession_fifth_quarter_a / (possession_fifth_quarter_a + possession_fifth_quarter_b + 1e-20) if (
x == visiting_team_id).sum() == 0 else possession_fifth_quarter_b / (
possession_fifth_quarter_a + possession_fifth_quarter_b + 1e-20)
# return -1
possession_sixth_quarter_a = df[
(
(df['player1_teamID'] == home_team_id) |
(
(df['player1_teamID'].shift(1) == home_team_id) &
(df['player1_teamID'] == visiting_team_id)
)
) &
(df['match_progress'] == 2) &
(df['time_point'] > 1800000) &
(df['time_point'] <= 2700000)
]['duration'].sum()
possession_sixth_quarter_b = df[
(
(df['player1_teamID'] == visiting_team_id) |
(
(df['player1_teamID'].shift(1) == visiting_team_id) &
(df['player1_teamID'] == home_team_id)
)
) &
(df['match_progress'] == 2) &
(df['time_point'] > 1800000) &
(df['time_point'] <= 2700000)
]['duration'].sum()
# 9. 75-90分钟控球率
def possession_sixth_quarter(x):
return possession_sixth_quarter_a / (possession_sixth_quarter_a + possession_sixth_quarter_b + 1e-20) if (
x == visiting_team_id).sum() == 0 else possession_sixth_quarter_b / (
possession_sixth_quarter_a + possession_sixth_quarter_b + 1e-20)
# return -1
# 10. 短传
def short_passes(x):
new_df = df.iloc[x.index.values]
return len(new_df[
(new_df['event_index'] == 1) &
(pow((pow(abs(new_df['pos_x'].shift(-1) - new_df['pos_x']), 2)) + (
pow(abs(new_df['pos_y'].shift(-1) - new_df['pos_y']), 2)), 0.5) <= 1000)
])
# 11. 中传
def medium_passes(x):
new_df = df.iloc[x.index.values]
return len(new_df[
(new_df['event_index'] == 1) &
(pow((pow(abs(new_df['pos_x'].shift(-1) - new_df['pos_x']), 2)) + (
pow(abs(new_df['pos_y'].shift(-1) - new_df['pos_y']), 2)), 0.5) > 1000) &
(pow((pow(abs(new_df['pos_x'].shift(-1) - new_df['pos_x']), 2)) + (
pow(abs(new_df['pos_y'].shift(-1) - new_df['pos_y']), 2)), 0.5) <= 2000)
])
# 12. 长传
def long_passes(x):
new_df = df.iloc[x.index.values]
return len(new_df[
(new_df['event_index'] == 1) &
(pow((pow(abs(new_df['pos_x'].shift(-1) - new_df['pos_x']), 2)) + (
pow(abs(new_df['pos_y'].shift(-1) - new_df['pos_y']), 2)), 0.5) > 2000)
])
forward_passes_a = len(df[
(df['player1_teamID'] == home_team_id) &
(df['event_index'] == 1) &
(abs(df['pos_y'].shift(-1) - df['pos_y']) / abs(
df['pos_x'].shift(-1) - df['pos_x']) < 1) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] < df['pos_x'].shift(-1))
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] > df['pos_x'].shift(-1))
)
)
])
forward_passes_b = len(df[
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'] == 1) &
(abs(df['pos_y'].shift(-1) - df['pos_y']) / abs(
df['pos_x'].shift(-1) - df['pos_x']) < 1) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] < df['pos_x'].shift(-1))
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] > df['pos_x'].shift(-1))
)
)
])
# 13. 向前传球
def forward_passes(x):
return forward_passes_a if (x == visiting_team_id).sum() == 0 else forward_passes_b
# 14. 横传(两侧)
def sideways_passes(x):
new_df = df.iloc[x.index.values]
return len(new_df[
(new_df['event_index'] == 1) &
(
(abs(new_df['pos_y'].shift(-1) - new_df['pos_y']) / abs(
new_df['pos_x'].shift(-1) - new_df['pos_x']) >= 1) |
(
(new_df['pos_x'] - new_df['pos_x'].shift(-1) == 0) &
(new_df['pos_y'] - new_df['pos_y'].shift(-1) != 0)
)
)
])
backward_passes_a = len(df[
(df['player1_teamID'] == home_team_id) &
(df['event_index'] == 1) &
(abs(df['pos_y'].shift(-1) - df['pos_y']) / abs(
df['pos_x'].shift(-1) - df['pos_x']) < 1) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] > df['pos_x'].shift(-1))
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] < df['pos_x'].shift(-1))
)
)
])
backward_passes_b = len(df[
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'] == 1) &
(abs(df['pos_y'].shift(-1) - df['pos_y']) / abs(
df['pos_x'].shift(-1) - df['pos_x']) < 1) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] > df['pos_x'].shift(-1))
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] < df['pos_x'].shift(-1))
)
)
])
# 15. 向后传球
def backward_passes(x):
return backward_passes_a if (x == visiting_team_id).sum() == 0 else backward_passes_b
# 16. 向前传球比例
def forward_passes_p(x):
return -1
# 17. 横传比例
def sideways_passes_p(x):
return -1
# 18. 向后传球比例
def backward_passes_p(x):
return -1
# 19. 射门
def shots(x):
return (x.isin([12, 24])).sum()
# 20. 射正
def shots_on_target(x):
return (x == 12).sum()
# 21. 射正率
def shots_on_target_p(x):
return -1
shots_area_one_a = len(df[
(df['player1_teamID'] == home_team_id) &
(df['event_index'].isin([12, 24])) &
(df['pos_y'] >= -916) &
(df['pos_y'] <= 916) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] >= 4700)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] <= -4700)
)
)
])
shots_area_one_b = len(df[
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'].isin([12, 24])) &
(df['pos_y'] >= -916) &
(df['pos_y'] <= 916) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] >= 4700)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] <= -4700)
)
)
])
# 22. 在区域一中射门
def shots_area_one(x):
return shots_area_one_a if (x == visiting_team_id).sum() == 0 else shots_area_one_b
shots_area_two_a = len(df[
(df['player1_teamID'] == home_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] < -916) &
(df['pos_y'] >= -2016) &
(df['pos_x'] > df['pos_y'] + 5616)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= 2016) &
(df['pos_y'] > 916) &
(df['pos_x'] < df['pos_y'] - 5616)
)
)
])
shots_area_two_b = len(df[
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < -916) &
(df['pos_x'] > df['pos_y'] + 5616)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > 916) &
(df['pos_y'] <= 2016) &
(df['pos_x'] < df['pos_y'] - 5616)
)
)
])
# 23. 在区域二中射门
def shots_area_two(x):
return shots_area_two_a if (x == visiting_team_id).sum() == 0 else shots_area_two_b
shots_area_three_a = len(df[
(df['player1_teamID'] == home_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] >= df['pos_x'] - 5616) &
(df['pos_y'] < 0) &
(df['pos_x'] > 3600) &
(df['pos_x'] <= 4700)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= df['pos_x'] + 5616) &
(df['pos_y'] > 0) &
(df['pos_x'] <= -3600) &
(df['pos_x'] > -4700)
)
)
])
shots_area_three_b = len(df[
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] >= df['pos_x'] - 5616) &
(df['pos_y'] < 0) &
(df['pos_x'] > 3600) &
(df['pos_x'] <= 4700)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= df['pos_x'] + 5616) &
(df['pos_y'] > 0) &
(df['pos_x'] <= -3600) &
(df['pos_x'] > -4700)
)
)
])
# 24. 在区域三中射门
def shots_area_three(x):
return shots_area_three_a if (x == visiting_team_id).sum() == 0 else shots_area_three_b
shots_area_four_a = len(df[
(df['player1_teamID'] == home_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] < -df['pos_x'] + 5616) &
(df['pos_y'] >= 0) &
(df['pos_x'] >= 3600) &
(df['pos_x'] < 4700)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > -df['pos_x'] - 5616) &
(df['pos_y'] <= 0) &
(df['pos_x'] <= -3600) &
(df['pos_x'] > -4700)
)
)
])
shots_area_four_b = len(df[
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] < -df['pos_x'] + 5616) &
(df['pos_y'] >= 0) &
(df['pos_x'] >= 3600) &
(df['pos_x'] < 4700)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > -df['pos_x'] - 5616) &
(df['pos_y'] <= 0) &
(df['pos_x'] <= -3600) &
(df['pos_x'] > -4700)
)
)
])
# 25. 在区域四中射门
def shots_area_four(x):
return shots_area_four_a if (x == visiting_team_id).sum() == 0 else shots_area_four_b
shots_area_five_a = len(df[
(df['player1_teamID'] == home_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] >= -df['pos_y'] + 5616) &
(df['pos_y'] <= 2016) &
(df['pos_y'] > 916)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] <= -df['pos_y'] - 5616) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < -916)
)
)
])
shots_area_five_b = len(df[
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] >= -df['pos_y'] + 5616) &
(df['pos_y'] <= 2016) &
(df['pos_y'] > 916)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] <= -df['pos_y'] - 5616) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < -916)
)
)
])
# 26. 在区域五中射门
def shots_area_five(x):
return shots_area_five_a if (x == visiting_team_id).sum() == 0 else shots_area_five_b
shots_area_six_a = len(df[
(df['player1_teamID'] == home_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(
(df['pos_x'] < 3600) |
(
(df['pos_x'] >= 3600) &
(abs(df['pos_y']) > 2016)
)
)
) |
(
(df['left_team'] != df['player1_teamID']) &
(
(df['pos_x'] > -3600) |
(
(df['pos_x'] <= -3600) &
(abs(df['pos_y']) > 2016)
)
)
)
)
])
shots_area_six_b = len(df[
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(
(df['pos_x'] < 3600) |
(
(df['pos_x'] >= 3600) &
(abs(df['pos_y']) > 2016)
)
)
) |
(
(df['left_team'] != df['player1_teamID']) &
(
(df['pos_x'] > -3600) |
(
(df['pos_x'] <= -3600) &
(abs(df['pos_y']) > 2016)
)
)
)
)
])
# 27. 在区域六中射门
def shots_area_six(x):
return shots_area_six_a if (x == visiting_team_id).sum() == 0 else shots_area_six_b
final_third_entries_left_a = len(df[
(df['player1_teamID'] == df['player1_teamID'].shift(1)) &
(df['player1_teamID'] == home_team_id) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'].shift(1) < 1750) &
(df['pos_x'] > 1750) &
(df['pos_y'] > 2016)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'].shift(1) > -1750) &
(df['pos_x'] < -1750) &
(df['pos_y'] < -2016)
)
)
])
final_third_entries_left_b = len(df[
(df['player1_teamID'] == df['player1_teamID'].shift(1)) &
(df['player1_teamID'] == visiting_team_id) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'].shift(1) < 1750) &
(df['pos_x'] > 1750) &
(df['pos_y'] > 2016)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'].shift(1) > -1750) &
(df['pos_x'] < -1750) &
(df['pos_y'] < -2016)
)
)
])
# 28. 攻入左路最后35米
def final_third_entries_left(x):
return final_third_entries_left_a if (x == visiting_team_id).sum() == 0 else final_third_entries_left_b
final_third_entries_medium_a = len(df[
(df['player1_teamID'] == df['player1_teamID'].shift(1)) &
(df['player1_teamID'] == home_team_id) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'].shift(1) < 1750) &
(df['pos_x'] > 1750) &
(df['pos_y'] >= -2016) &
(df['pos_y'] <= 2016)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'].shift(1) > -1750) &
(df['pos_x'] < -1750) &
(df['pos_y'] <= 2016) &
(df['pos_y'] >= -2016)
)
)
])
final_third_entries_medium_b = len(df[
(df['player1_teamID'] == df['player1_teamID'].shift(1)) &
(df['player1_teamID'] == visiting_team_id) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'].shift(1) < 1750) &
(df['pos_x'] > 1750) &
(df['pos_y'] <= 2016) &
(df['pos_y'] >= -2016)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'].shift(1) > -1750) &
(df['pos_x'] < -1750) &
(df['pos_y'] >= -2016) &
(df['pos_y'] <= 2016)
)
)
])
# 29. 攻入中路最后35米
def final_third_entries_medium(x):
return final_third_entries_medium_a if (x == visiting_team_id).sum() == 0 else final_third_entries_medium_b
final_third_entries_right_a = len(df[
(df['player1_teamID'] == df['player1_teamID'].shift(1)) &
(df['player1_teamID'] == home_team_id) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'].shift(1) < 1750) &
(df['pos_x'] > 1750) &
(df['pos_y'] < -2016)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'].shift(1) > -1750) &
(df['pos_x'] < -1750) &
(df['pos_y'] > 2016)
)
)
])
final_third_entries_right_b = len(df[
(df['player1_teamID'] == df['player1_teamID'].shift(1)) &
(df['player1_teamID'] == visiting_team_id) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'].shift(1) < 1750) &
(df['pos_x'] > 1750) &
(df['pos_y'] < -2016)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'].shift(1) > -1750) &
(df['pos_x'] < -1750) &
(df['pos_y'] > 2016)
)
)
])
# 30. 攻入右路最后35米
def final_third_entries_right(x):
return final_third_entries_right_a if (x == visiting_team_id).sum() == 0 else final_third_entries_right_b
# 31. 攻入左路最后35米比例
def final_third_entries_left_p(x):
return -1
# 32. 攻入中路最后35米比例
def final_third_entries_medium_p(x):
return -1
# 33. 攻入右路最后35米比例
def final_third_entries_right_p(x):
return -1
crosses_in_play_left_a = len(df[
(df['player1_teamID'] == home_team_id) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] > 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= 0)
)
)
])
crosses_in_play_left_b = len(df[
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] > 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= 0)
)
)
])
# 34. 左路活球传中
def crosses_in_play_left(x):
return crosses_in_play_left_a if (x == visiting_team_id).sum() == 0 else crosses_in_play_left_b
crosses_in_play_right_a = len(df[
(df['player1_teamID'] == home_team_id) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] <= 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > 0)
)
)
])
crosses_in_play_right_b = len(df[
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] <= 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > 0)
)
)
])
# 35. 右路活球传中
def crosses_in_play_right(x):
return crosses_in_play_right_a if (x == visiting_team_id).sum() == 0 else crosses_in_play_right_b
successful_crosses_in_play_left_a = len(df[
(df['player1_teamID'] == home_team_id) &
(df['is_possessions_lost'] == False) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] > 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= 0)
)
)
])
successful_crosses_in_play_left_b = len(df[
(df['player1_teamID'] == visiting_team_id) &
(df['is_possessions_lost'] == False) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] > 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= 0)
)
)
])
# 36. 左路成功活球传中
def successful_crosses_in_play_left(x):
return successful_crosses_in_play_left_a if (
x == visiting_team_id).sum() == 0 else successful_crosses_in_play_left_b
successful_crosses_in_play_right_a = len(df[
(df['player1_teamID'] == home_team_id) &
(df['is_possessions_lost'] == False) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] <= 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > 0)
)
)
])
successful_crosses_in_play_right_b = len(df[
(df['player1_teamID'] == visiting_team_id) &
(df['is_possessions_lost'] == False) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] <= 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > 0)
)
)
])
# 37. 右路成功活球传中
def successful_crosses_in_play_right(x):
return successful_crosses_in_play_right_a if (
x == visiting_team_id).sum() == 0 else successful_crosses_in_play_right_b
# 38. 左路活球传中成功率
def successful_crosses_in_play_left_p(x):
return -1
# 39. 右路活球传中成功率
def successful_crosses_in_play_right_p(x):
return -1
# 40. 传球
def passes(x):
return (x == 1).sum()
# 41. 角球
def corner(x):
new_df = df.iloc[x.index.values]
return len(df[(df['event_index'] == 5) &
(df['player1_teamID'].shift(-1) == home_team_id)]
) if (x == visiting_team_id
).sum() == 0 else len(df[(df['event_index'] == 5) &
(df['player1_teamID'].shift(-1) == visiting_team_id)])
# return len(new_df[
# (new_df['event_index'] == 23) &
# (new_df['event_index'].shift(1) == 5)
# ])
# return (x == 23).sum()
# 42. 越位
def offside(x):
return (x == 11).sum()
# 43. 成功传球
def successful_passes(x):
new_df = df.iloc[x.index.values]
return len(new_df[
(new_df['event_index'] == 1) &
(new_df['is_possessions_lost'] == 0)
])
# 44. 成功传球率
def successful_passes_p(x):
return -1
# 45. 射门(禁区内)
def shots_inside_the_box(x):
return -1
# 46. 普通进球
def goal_normal(x):
new_df = df.iloc[x.index.values]
a = len(new_df[
(new_df['event_index'] == 2) &
(new_df['event_index'].shift(2) != 7)
])
return a
# 47. 点球进球
def goal_sur_penalty(x):
return len(df[(df['event_index'] == 7) &
(df['player2_teamID'] == home_team_id) &
(df['event_index'].shift(-2) == 2)]) if x.values[0] == home_team_id else len( df[(df['event_index'] == 7) &
(df['player2_teamID'] == visiting_team_id) &
(df['event_index'].shift(-2) == 2)])
# 球队点球
def goal_penalty(x):
return len(df[(df['event_index'] == 7) &
(df['player2_teamID'] == home_team_id)]) if x.values[0] == home_team_id else len( df[(df['event_index'] == 7) &
(df['player2_teamID'] == visiting_team_id)])
# a = len(new_df[(new_df['event_index'] == 7) &
# (new_df['player1_teamID'] == visiting_team_id)]) if (x == home_team_id).sum() == 0 else len(
# new_df[(new_df['event_index'] == 7) &
# (new_df['player1_teamID'] == home_team_id)])
# 48. 乌龙球进球
def own_goal(x):
return (x == 6).sum()
# 49. 界外球
def throw_in(x):
new_df = df.iloc[x.index.values]
return len(new_df[(new_df['event_index'].shift(1) == 20)])
# return (x == 20).sum()
# 50. 触球次数
def balls_played(x):
new_df = df.iloc[x.index.values]
return len(new_df[(new_df['event_index'] != 0)])
# return x.count()
# 51. 机会球
def chances(x):
return (x == 13).sum()
# 52. 射偏
def shot_off_target(x):
return (x == 24).sum()
# 53. 短传比例
def short_passes_p(x):
return -1
# 54. 中传比例
def medium_passes_p(x):
return -1
# 55. 长传比例
def long_passes_p(x):
return -1
# 56. 获得球权
def possessions_gained(x):
return x.sum()
# 57. 失去球权
def possessions_lost(x):
return x.sum()
# 58. 犯规
def fouls_commited(x):
return (x.isin([3, 4, 7, 10])).sum()
# 59. 黄牌
def yellow_cards(x):
return (x == 27).sum()
# 61. 红牌
def red_cards(x):
return (x.isin([28, 29])).sum()
# 62. 控球区域 A1
possession_a1_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2650) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400) &
(df['event_index'] != 0)
]['duration'].sum()
possession_a1_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_a1(x):
return possession_a1_a if (x == visiting_team_id).sum() == 0 else possession_a1_b
# 63. 控球区域 A2
possession_a2_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2650) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016) &
(df['event_index'] != 0)
]['duration'].sum()
possession_a2_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_a2(x):
return possession_a2_a if (x == visiting_team_id).sum() == 0 else possession_a2_b
# 64. 控球区域 A3
possession_a3_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2650) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0) &
(df['event_index'] != 0)
]['duration'].sum()
possession_a3_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_a3(x):
return possession_a3_a if (x == visiting_team_id).sum() == 0 else possession_a3_b
# 65. 控球区域 A4
possession_a4_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2650) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016) &
(df['event_index'] != 0)
]['duration'].sum()
possession_a4_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_a4(x):
return possession_a4_a if (x == visiting_team_id).sum() == 0 else possession_a4_b
# 66. 控球区域 B1
possession_b1_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400) &
(df['event_index'] != 0)
]['duration'].sum()
possession_b1_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_b1(x):
return possession_b1_a if (x == visiting_team_id).sum() == 0 else possession_b1_b
# 67. 控球区域 B2
possession_b2_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016) &
(df['event_index'] != 0)
]['duration'].sum()
possession_b2_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_b2(x):
return possession_b2_a if (x == visiting_team_id).sum() == 0 else possession_b2_b
# 68. 控球区域 B3
possession_b3_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0) &
(df['event_index'] != 0)
]['duration'].sum()
possession_b3_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_b3(x):
return possession_b3_a if (x == visiting_team_id).sum() == 0 else possession_b3_b
# 69. 控球区域 B4
possession_b4_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016) &
(df['event_index'] != 0)
]['duration'].sum()
possession_b4_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_b4(x):
return possession_b4_a if (x == visiting_team_id).sum() == 0 else possession_b4_b
# 70. 控球区域 C1
possession_c1_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400) &
(df['event_index'] != 0)
]['duration'].sum()
possession_c1_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_c1(x):
return possession_c1_a if (x == visiting_team_id).sum() == 0 else possession_c1_b
# 71. 控球区域 C2
possession_c2_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016) &
(df['event_index'] != 0)
]['duration'].sum()
possession_c2_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_c2(x):
return possession_c2_a if (x == visiting_team_id).sum() == 0 else possession_c2_b
# 72. 控球区域 C3
possession_c3_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0) &
(df['event_index'] != 0)
]['duration'].sum()
possession_c3_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_c3(x):
return possession_c3_a if (x == visiting_team_id).sum() == 0 else possession_c3_b
# 73. 控球区域 C4
possession_c4_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016) &
(df['event_index'] != 0)
]['duration'].sum()
possession_c4_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_c4(x):
return possession_c4_a if (x == visiting_team_id).sum() == 0 else possession_c4_b
# 74. 控球区域 D1
possession_d1_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400) &
(df['event_index'] != 0)
]['duration'].sum()
possession_d1_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2625) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_d1(x):
return possession_d1_a if (x == visiting_team_id).sum() == 0 else possession_d1_b
# 75. 控球区域 D2
possession_d2_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016) &
(df['event_index'] != 0)
]['duration'].sum()
possession_d2_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2625) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_d2(x):
return possession_d2_a if (x == visiting_team_id).sum() == 0 else possession_d2_b
# 76. 控球区域 D3
possession_d3_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0) &
(df['event_index'] != 0)
]['duration'].sum()
possession_d3_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2625) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_d3(x):
return possession_d3_a if (x == visiting_team_id).sum() == 0 else possession_d3_b
# 77. 控球区域 D4
possession_d4_a = df[(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016) &
(df['event_index'] != 0)
]['duration'].sum()
possession_d4_b = df[(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2625) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016) &
(df['event_index'] != 0)
]['duration'].sum()
def possessions_area_d4(x):
return possession_d4_a if (x == visiting_team_id).sum() == 0 else possession_d4_b
# 78. 传中
def crosses(x):
return (x == 22).sum()
# 79. 净比赛时间
def net_game_time(x):
return df[(
~df['event_index'].shift(1).isin(
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 19, 20, 25, 27, 28, 29, 30, 37, 43, 45]) &
# ~df['event_index'].isin([23, 26]) &
df['player1_teamID'] != 0 &
df['match_progress'].isin([1, 2])
)]['duration'].sum()
team_df = df.groupby('player1_teamID').agg(
possession=('player1_teamID', possession),
possession_time=('player1_teamID', possession_time),
average_regain_line=('player1_teamID', average_regain_line),
possession_first_quarter=('player1_teamID', possession_first_quarter),
possession_secend_quarter=('player1_teamID', possession_secend_quarter),
possession_third_quarter=('player1_teamID', possession_third_quarter),
possession_fourth_quarter=('player1_teamID', possession_fourth_quarter),
possession_fifth_quarter=('player1_teamID', possession_fifth_quarter),
possession_sixth_quarter=('player1_teamID', possession_sixth_quarter),
short_passes=('player1_teamID', short_passes),
medium_passes=('player1_teamID', medium_passes),
long_passes=('player1_teamID', long_passes),
forward_passes=('player1_teamID', forward_passes),
sideways_passes=('player1_teamID', sideways_passes),
backward_passes=('player1_teamID', backward_passes),
forward_passes_p=('player1_teamID', forward_passes_p),
sideways_passes_p=('player1_teamID', sideways_passes_p),
backward_passes_p=('player1_teamID', backward_passes_p),
shots=('event_index', shots),
shots_on_target=('event_index', shots_on_target),
shots_on_target_p=('player1_teamID', shots_on_target_p),
shots_area_one=('player1_teamID', shots_area_one),
shots_area_two=('player1_teamID', shots_area_two),
shots_area_three=('player1_teamID', shots_area_three),
shots_area_four=('player1_teamID', shots_area_four),
shots_area_five=('player1_teamID', shots_area_five),
shots_area_six=('player1_teamID', shots_area_six),
final_third_entries_left=('player1_teamID', final_third_entries_left),
final_third_entries_medium=('player1_teamID', final_third_entries_medium),
final_third_entries_right=('player1_teamID', final_third_entries_right),
final_third_entries_left_p=('player1_teamID', final_third_entries_left_p),
final_third_entries_medium_p=('player1_teamID', final_third_entries_medium_p),
final_third_entries_right_p=('player1_teamID', final_third_entries_right_p),
crosses_in_play_left=('player1_teamID', crosses_in_play_left),
crosses_in_play_right=('player1_teamID', crosses_in_play_right),
successful_crosses_in_play_left=('player1_teamID', successful_crosses_in_play_left),
successful_crosses_in_play_right=('player1_teamID', successful_crosses_in_play_right),
successful_crosses_in_play_left_p=('player1_teamID', successful_crosses_in_play_left_p),
successful_crosses_in_play_right_p=('player1_teamID', successful_crosses_in_play_right_p),
passes=('event_index', passes),
corner=('player1_teamID', corner),
offside=('event_index', offside),
# new processor
successful_passes=('player1_teamID', successful_passes),
successful_passes_p=('event_index', successful_passes_p),
shots_inside_the_box=('event_index', shots_inside_the_box),
goal_normal=('event_index', goal_normal),
goal_penalty=('player1_teamID', goal_penalty),
own_goal=('event_index', own_goal),
throw_in=('event_index', throw_in),
balls_played=('player1_teamID', balls_played),
chances=('event_index', chances),
shot_off_target=('event_index', shot_off_target),
short_passes_p=('player1_teamID', short_passes_p),
medium_passes_p=('player1_teamID', medium_passes_p),
long_passes_p=('player1_teamID', long_passes_p),
possessions_gained=('is_possessions_gained', possessions_gained),
possessions_lost=('is_possessions_lost', possessions_lost),
fouls_commited=('event_index', fouls_commited),
yellow_cards=('event_index', yellow_cards),
red_cards=('event_index', red_cards),
crosses=('event_index', crosses),
possessions_area_a1=('player1_teamID', possessions_area_a1),
possessions_area_a2=('player1_teamID', possessions_area_a2),
possessions_area_a3=('player1_teamID', possessions_area_a3),
possessions_area_a4=('player1_teamID', possessions_area_a4),
possessions_area_b1=('player1_teamID', possessions_area_b1),
possessions_area_b2=('player1_teamID', possessions_area_b2),
possessions_area_b3=('player1_teamID', possessions_area_b3),
possessions_area_b4=('player1_teamID', possessions_area_b4),
possessions_area_c1=('player1_teamID', possessions_area_c1),
possessions_area_c2=('player1_teamID', possessions_area_c2),
possessions_area_c3=('player1_teamID', possessions_area_c3),
possessions_area_c4=('player1_teamID', possessions_area_c4),
possessions_area_d1=('player1_teamID', possessions_area_d1),
possessions_area_d2=('player1_teamID', possessions_area_d2),
possessions_area_d3=('player1_teamID', possessions_area_d3),
possessions_area_d4=('player1_teamID', possessions_area_d4),
net_game_time=('player1_teamID', net_game_time),
goal_sur_penalty=('player1_teamID', goal_sur_penalty),
)
columns = ['player1_teamID',
'possession',
'possession_time',
'average_regain_line',
'possession_first_quarter',
'possession_secend_quarter',
'possession_third_quarter',
'possession_fourth_quarter',
'possession_fifth_quarter',
'possession_sixth_quarter',
'short_passes',
'medium_passes',
'long_passes',
'forward_passes',
'sideways_passes',
'backward_passes',
'forward_passes_p',
'sideways_passes_p',
'backward_passes_p',
'shots',
'shots_on_target',
'shots_on_target_p',
'shots_area_one',
'shots_area_two',
'shots_area_three',
'shots_area_four',
'shots_area_five',
'shots_area_six',
'final_third_entries_left',
'final_third_entries_medium',
'final_third_entries_right',
'final_third_entries_left_p',
'final_third_entries_medium_p',
'final_third_entries_right_p',
'crosses_in_play_left',
'crosses_in_play_right',
'successful_crosses_in_play_left',
'successful_crosses_in_play_right',
'successful_crosses_in_play_left_p',
'successful_crosses_in_play_right_p',
'passes',
'corner',
'offside',
'successful_passes',
'successful_passes_p',
'shots_inside_the_box',
'goal_normal',
'goal_penalty',
'own_goal',
'throw_in',
'balls_played',
'chances',
'shot_off_target',
'short_passes_p',
'medium_passes_p',
'long_passes_p',
'possessions_gained',
'possessions_lost',
'fouls_commited',
'yellow_cards',
'red_cards',
'crosses',
'possessions_area_a1',
'possessions_area_a2',
'possessions_area_a3',
'possessions_area_a4',
'possessions_area_b1',
'possessions_area_b2',
'possessions_area_b3',
'possessions_area_b4',
'possessions_area_c1',
'possessions_area_c2',
'possessions_area_c3',
'possessions_area_c4',
'possessions_area_d1',
'possessions_area_d2',
'possessions_area_d3',
'possessions_area_d4',
'fouls_received',
'net_game_time',
'goal_sur_penalty',
]
team_df['shots_on_target_p'] = team_df['shots_on_target'].divide(team_df['shots'])
team_df['forward_passes_p'] = team_df['forward_passes'].divide(
team_df['forward_passes'] + team_df['sideways_passes'] + team_df['backward_passes'])
team_df['sideways_passes_p'] = team_df['sideways_passes'].divide(
team_df['forward_passes'] + team_df['sideways_passes'] + team_df['backward_passes'])
team_df['backward_passes_p'] = team_df['backward_passes'].divide(
team_df['forward_passes'] + team_df['sideways_passes'] + team_df['backward_passes'])
team_df['final_third_entries_left_p'] = team_df['final_third_entries_left'].divide(
team_df['final_third_entries_left'] + team_df['final_third_entries_medium'] + team_df[
'final_third_entries_right'])
team_df['final_third_entries_medium_p'] = team_df['final_third_entries_medium'].divide(
team_df['final_third_entries_left'] + team_df['final_third_entries_medium'] + team_df[
'final_third_entries_right'])
team_df['final_third_entries_right_p'] = team_df['final_third_entries_right'].divide(
team_df['final_third_entries_left'] + team_df['final_third_entries_medium'] + team_df[
'final_third_entries_right'])
team_df['successful_crosses_in_play_left_p'] = team_df['successful_crosses_in_play_left'].divide(
team_df['crosses_in_play_left'])
team_df['successful_crosses_in_play_right_p'] = team_df['successful_crosses_in_play_right'].divide(
team_df['crosses_in_play_right'])
team_df['successful_passes_p'] = team_df['successful_passes'].divide(team_df['passes'])
team_df['shots_inside_the_box'] = team_df['shots_area_one'] + team_df['shots_area_two'] + team_df[
'shots_area_three'] + team_df['shots_area_four'] + team_df['shots_area_five']
team_df['short_passes_p'] = team_df['short_passes'].divide(team_df['passes'])
team_df['medium_passes_p'] = team_df['medium_passes'].divide(team_df['passes'])
team_df['long_passes_p'] = team_df['long_passes'].divide(team_df['passes'])
team_df.replace([np.inf, -np.inf], np.nan)
team_df = team_df.reset_index()
team_df = team_df.drop(team_df[team_df['player1_teamID'] == ''].index)
# 60. 被犯规
dd = df.groupby('player2_teamID').agg(fouls_received=('event_index', fouls_commited)).reset_index()
dd = dd.drop(dd[dd['player2_teamID'] == ''].index)
dd.rename(columns={'player2_teamID': 'player1_teamID'}, inplace=True)
result = pd.merge(team_df, dd, on='player1_teamID', how='outer')[columns]
result.fillna(0, inplace=True)
list_value = ListValue()
list_value.extend(result.reset_index().values.tolist())
return process_pb2.TeamStatisticalResult(
result=list_value
)
def run_player_statistics(self):
df = self.df
home_team_id = self.home_team_id
visiting_team_id = self.visiting_team_id
# 球权转移
lost = df['player1_teamID'] / df['player1_teamID'].shift(-1)
gained = df['player1_teamID'] / df['player1_teamID'].shift(1)
df['is_possessions_lost'] = (lost != np.nan) & (lost != np.inf) & (lost != 1)
df['is_possessions_gained'] = (gained != np.nan) & (gained != np.inf) & (gained != 1)
# 事件时间点的时间差
df['duration'] = df['time_point'].diff(-1)
df.loc[df['duration'] > 0, 'duration'] = 0
df.loc[df['event_index'].isin(
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 19, 20, 25, 27, 28, 29, 30, 37, 43, 45]), 'duration'] = 0
# df.loc[df['event_index'].shift(1).isin([23, 26]), 'duration'] = 0
df['duration'] = df['duration'].abs()
df.fillna(0, inplace=True)
# 1. 触球次数
def balls_played(x):
new_df = df.iloc[x.index.values]
return len(new_df[(new_df['event_index'] != 0)])
# return x.count()
# 2. 获得球权
def possessions_gained(x):
return x.sum()
# 3. 丢失球权
def possessions_lost(x):
return x.sum()
# 4. 传球
def passes(x):
return (x == 1).sum()
# 5. 成功传球
def successful_passes(x):
data = df.iloc[x.index.values]
return len(data[
(data['event_index'] == 1) &
(data['is_possessions_lost'] == 0)
]
)
# 6. 传中
def crosses(x):
return (x == 22).sum()
# 7. 射门
def shots(x):
return (x.isin([12, 24])).sum()
# 8. 射正
def shots_on_target(x):
return (x == 12).sum()
# 9. 射正( %
def shots_on_target_p(x):
return -1
# 10. 创造机会
def chances(x):
return (x == 13).sum()
# 11. 犯规
def fouls_commited(x):
return (x.isin([3, 4, 7, 10])).sum()
# 13. 黄牌
def yellow_cards(x):
return (x == 27).sum()
# 14. 红牌
def red_cards(x):
return (x.isin([28, 29])).sum()
def get_teamID(x):
return home_team_id if (x == visiting_team_id).sum() == 0 else visiting_team_id
# 15. 第一张黄牌
def yellow_card_1st(x):
new_df = df.iloc[x.index.values]
return new_df[x == 27]['time_point'].values[0] if (len(new_df[x == 27]['time_point'].values) >= 1) else 0
# 16. 第二张黄牌
def yellow_card_2nd(x):
new_df = df.iloc[x.index.values]
return new_df[x == 27]['time_point'].values[1] if (len(new_df[x == 27]['time_point'].values) >= 2) else 0
# 17. 红牌时间
def red_card_time(x):
new_df = df.iloc[x.index.values]
return new_df[x.isin([28, 29])]['time_point'].values[0] if (
len(new_df[x.isin([28, 29])]['time_point'].values) >= 1) else 0
# 18. 向前传球
def forward_passes(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['event_index'] == 1) &
(df['player1'] != df['player1'].shift(-1)) &
(abs(df['pos_y'] - df['pos_y'].shift(-1)) / abs(
df['pos_x'] - df['pos_x'].shift(-1)) < 1) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] < df['pos_x'].shift(-1))
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] > df['pos_x'].shift(-1))
)
)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'] == 1) &
(df['player1'] != df['player1'].shift(-1)) &
(abs(df['pos_y'] - df['pos_y'].shift(-1)) / abs(
df['pos_x'] - df['pos_x'].shift(-1)) < 1) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] < df['pos_x'].shift(-1))
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] > df['pos_x'].shift(-1))
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 19. 向前传球比例
def forward_passes_p(x):
return -1
# 20. 角球
def corner(x):
return len(df[(df['event_index'] == 5) &
(df['player1_teamID'].shift(-1) == home_team_id)]
) if (x == visiting_team_id
).sum() == 0 else len(df[(df['event_index'] == 5) &
(df['player1_teamID'].shift(-1) == visiting_team_id)])
# new_df = df.iloc[x.index.values]
# return len(new_df[
# (new_df['event_index'] == 23) &
# (new_df['event_index'].shift(1) == 5)
# ])
# return (x == 23).sum()
# 21. 越位
def offside(x):
return (x == 11).sum()
# 22. 控球时间
def possession_time(x):
new_df = df.iloc[x.index.values]
return new_df[
(
(
(df['player1_teamID'].shift(1) != visiting_team_id) &
(df['player1_teamID'] == home_team_id)
) |
(
(df['player1_teamID'].shift(1) == home_team_id) &
(df['player1_teamID'] == visiting_team_id)
)
) |
(
(
(df['player1_teamID'].shift(1) != home_team_id) &
(df['player1_teamID'] == visiting_team_id)
) |
(
(df['player1_teamID'].shift(1) == visiting_team_id) &
(df['player1_teamID'] == home_team_id)
)
)
]['duration'].sum()
# 23. 短传
def short_passes(x):
new_df = df.iloc[x.index.values]
return len(new_df[
(new_df['event_index'] == 1) &
(pow((pow(abs(new_df['pos_x'].shift(-1) - new_df['pos_x']), 2)) + (
pow(abs(new_df['pos_y'].shift(-1) - new_df['pos_y']), 2)), 0.5) <= 1000)
])
# 24. 中传
def medium_passes(x):
new_df = df.iloc[x.index.values]
return len(new_df[
(new_df['event_index'] == 1) &
(pow((pow(abs(new_df['pos_x'].shift(-1) - new_df['pos_x']), 2)) + (
pow(abs(new_df['pos_y'].shift(-1) - new_df['pos_y']), 2)), 0.5) > 1000) &
(pow((pow(abs(new_df['pos_x'].shift(-1) - new_df['pos_x']), 2)) + (
pow(abs(new_df['pos_y'].shift(-1) - new_df['pos_y']), 2)), 0.5) <= 2000)
])
# 25. 长传
def long_passes(x):
new_df = df.iloc[x.index.values]
return len(new_df[
(new_df['event_index'] == 1) &
(pow((pow(abs(new_df['pos_x'].shift(-1) - new_df['pos_x']), 2)) + (
pow(abs(new_df['pos_y'].shift(-1) - new_df['pos_y']), 2)), 0.5) > 2000)
])
# 26. 短传比例
def short_passes_p(x):
return -1
# 27. 中传比例
def medium_passes_p(x):
return -1
# 28. 长传比例
def long_passes_p(x):
return -1
# 29. 横传(两侧)
def sideways_passes(x):
new_df = df.iloc[x.index.values]
return len(new_df[
(new_df['event_index'] == 1) &
(
(abs(new_df['pos_y'].shift(-1) - new_df['pos_y']) / abs(
new_df['pos_x'].shift(-1) - new_df['pos_x']) >= 1) |
(
(new_df['pos_x'] - new_df['pos_x'].shift(-1) == 0) &
(new_df['pos_y'] - new_df['pos_y'].shift(-1) != 0)
)
)
])
# 30. 向后传球
def backward_passes(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['event_index'] == 1) &
(abs(df['pos_y'].shift(-1) - df['pos_y']) / abs(
df['pos_x'].shift(-1) - df['pos_x']) < 1) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] > df['pos_x'].shift(-1))
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] < df['pos_x'].shift(-1))
)
)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'] == 1) &
(abs(df['pos_y'].shift(-1) - df['pos_y']) / abs(
df['pos_x'].shift(-1) - df['pos_x']) < 1) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] > df['pos_x'].shift(-1))
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] < df['pos_x'].shift(-1))
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 31. 横传比例
def sideways_passes_p(x):
return -1
# 32. 向后传球比例
def backward_passes_p(x):
return -1
# 33. 传球成功率
def successful_passes_p(x):
return -1
# 34. 在区域一射门
def shots_area_one(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['event_index'].isin([12, 24])) &
(df['pos_y'] >= -916) &
(df['pos_y'] <= 916) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] >= 4700)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] <= -4700)
)
)
) |
(
(df['player1_teamID'] == home_team_id) &
(df['event_index'].isin([12, 24])) &
(df['pos_y'] >= -916) &
(df['pos_y'] <= 916) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] >= 4700)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] <= -4700)
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 35. 在区域二射门
def shots_area_two(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] < -916) &
(df['pos_y'] >= -2016) &
(df['pos_x'] > df['pos_y'] + 5616)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= 2016) &
(df['pos_y'] > 916) &
(df['pos_x'] < df['pos_y'] - 5616)
)
)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < -916) &
(df['pos_x'] > df['pos_y'] + 5616)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > 916) &
(df['pos_y'] <= 2016) &
(df['pos_x'] < df['pos_y'] - 5616)
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 36. 在区域三射门
def shots_area_three(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] >= df['pos_x'] - 5616) &
(df['pos_y'] < 0) &
(df['pos_x'] > 3600) &
(df['pos_x'] <= 4700)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= df['pos_x'] + 5616) &
(df['pos_y'] > 0) &
(df['pos_x'] <= -3600) &
(df['pos_x'] > -4700)
)
)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] >= df['pos_x'] - 5616) &
(df['pos_y'] < 0) &
(df['pos_x'] > 3600) &
(df['pos_x'] <= 4700)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= df['pos_x'] + 5616) &
(df['pos_y'] > 0) &
(df['pos_x'] <= -3600) &
(df['pos_x'] > -4700)
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 37. 在区域四射门
def shots_area_four(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] < -df['pos_x'] + 5616) &
(df['pos_y'] >= 0) &
(df['pos_x'] >= 3600) &
(df['pos_x'] < 4700)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > -df['pos_x'] - 5616) &
(df['pos_y'] <= 0) &
(df['pos_x'] <= -3600) &
(df['pos_x'] > -4700)
)
)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] < -df['pos_x'] + 5616) &
(df['pos_y'] >= 0) &
(df['pos_x'] >= 3600) &
(df['pos_x'] < 4700)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > -df['pos_x'] - 5616) &
(df['pos_y'] <= 0) &
(df['pos_x'] <= -3600) &
(df['pos_x'] > -4700)
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 38. 在区域五射门
def shots_area_five(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] >= -df['pos_y'] + 5616) &
(df['pos_y'] <= 2016) &
(df['pos_y'] > 916)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] <= -df['pos_y'] - 5616) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < -916)
)
)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'] >= -df['pos_y'] + 5616) &
(df['pos_y'] <= 2016) &
(df['pos_y'] > 916)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'] <= -df['pos_y'] - 5616) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < -916)
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 39. 在区域六射门
def shots_area_six(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(
(df['pos_x'] < 3600) |
(
(df['pos_x'] >= 3600) &
(abs(df['pos_y']) > 2016)
)
)
) |
(
(df['left_team'] != df['player1_teamID']) &
(
(df['pos_x'] > -3600) |
(
(df['pos_x'] <= -3600) &
(abs(df['pos_y']) > 2016)
)
)
)
)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'].isin([12, 24])) &
(
(
(df['left_team'] == df['player1_teamID']) &
(
(df['pos_x'] < 3600) |
(
(df['pos_x'] >= 3600) &
(abs(df['pos_y']) > 2016)
)
)
) |
(
(df['left_team'] != df['player1_teamID']) &
(
(df['pos_x'] > -3600) |
(
(df['pos_x'] <= -3600) &
(abs(df['pos_y']) > 2016)
)
)
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 40. 射门(禁区内)
def shots_inside_the_box(x):
return -1
# 41. 射偏
def shot_off_target(x):
return (x == 24).sum()
# 42. 普通进球
def goal_normal(x):
new_df = df.iloc[x.index.values]
return len(new_df[
(new_df['event_index'] == 2) &
(new_df['event_index'].shift(2) != 7)
])
# 43. 点球进球
def goal_penalty(x):
r = 0
for idx, v in df.iterrows():
if v['event_index'] == 7:
if df.iloc[idx + 2]['player1'] == x.values[0]:
r += 1
return r
# 44. 乌龙球进球
def own_goal(x):
r = (x == 6).sum()
# print("乌龙=======")
# print(r)
return r
# 45. 界外球
def throw_in(x):
new_df = df.iloc[x.index.values]
return len(new_df[(new_df['event_index'].shift(1) == 20)])
# return (x == 20).sum()
# 46. 左路活球传中
def crosses_in_play_left(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] > 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= 0)
)
)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] > 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= 0)
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 47. 右路活球传中
def crosses_in_play_right(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] <= 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > 0)
)
)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] <= 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > 0)
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 48. 左路成功活球传中
def successful_crosses_in_play_left(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['is_possessions_lost'] == False) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] > 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= 0)
)
)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['is_possessions_lost'] == False) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] > 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] <= 0)
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 49. 右路成功活球传中
def successful_crosses_in_play_right(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['is_possessions_lost'] == False) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] <= 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > 0)
)
)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['is_possessions_lost'] == False) &
(df['event_index'] == 22) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_y'] <= 0)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_y'] > 0)
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 50. 左路活球传中成功率
def successful_crosses_in_play_left_p(x):
return -1
# 51. 右路活球传中成功率
def successful_crosses_in_play_right_p(x):
return -1
# 52. 攻入左路最后35米
def final_third_entries_left(x):
data = df[(
(df['player1_teamID'] == df['player1_teamID'].shift(1)) &
(df['player1_teamID'] == home_team_id) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'].shift(1) < 1750) &
(df['pos_x'] > 1750) &
(df['pos_y'] > 2016)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'].shift(1) > -1750) &
(df['pos_x'] < -1750) &
(df['pos_y'] < -2016)
)
)
) |
(
(df['player1_teamID'] == df['player1_teamID'].shift(1)) &
(df['player1_teamID'] == visiting_team_id) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'].shift(1) < 1750) &
(df['pos_x'] > 1750) &
(df['pos_y'] > 2016)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'].shift(1) > -1750) &
(df['pos_x'] < -1750) &
(df['pos_y'] < -2016)
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 53. 攻入中路最后35米
def final_third_entries_medium(x):
data = df[(
(df['player1_teamID'] == df['player1_teamID'].shift(1)) &
(df['player1_teamID'] == home_team_id) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'].shift(1) < 1750) &
(df['pos_x'] > 1750) &
(df['pos_y'] >= -2016) &
(df['pos_y'] <= 2016)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'].shift(1) > -1750) &
(df['pos_x'] < -1750) &
(df['pos_y'] <= 2016) &
(df['pos_y'] >= -2016)
)
)
) |
(
(df['player1_teamID'] == df['player1_teamID'].shift(1)) &
(df['player1_teamID'] == visiting_team_id) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'].shift(1) < 1750) &
(df['pos_x'] > 1750) &
(df['pos_y'] <= 2016) &
(df['pos_y'] >= -2016)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'].shift(1) > -1750) &
(df['pos_x'] < -1750) &
(df['pos_y'] >= -2016) &
(df['pos_y'] <= 2016)
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 54. 攻入右路最后35米
def final_third_entries_right(x):
data = df[(
(df['player1_teamID'] == df['player1_teamID'].shift(1)) &
(df['player1_teamID'] == home_team_id) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'].shift(1) < 1750) &
(df['pos_x'] > 1750) &
(df['pos_y'] < -2016)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'].shift(1) > -1750) &
(df['pos_x'] < -1750) &
(df['pos_y'] > 2016)
)
)
) |
(
(df['player1_teamID'] == df['player1_teamID'].shift(1)) &
(df['player1_teamID'] == visiting_team_id) &
(
(
(df['left_team'] == df['player1_teamID']) &
(df['pos_x'].shift(1) < 1750) &
(df['pos_x'] > 1750) &
(df['pos_y'] < -2016)
) |
(
(df['left_team'] != df['player1_teamID']) &
(df['pos_x'].shift(1) > -1750) &
(df['pos_x'] < -1750) &
(df['pos_y'] > 2016)
)
)
)]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 55. 控球区域 A1
def possessions_area_a1(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2650) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 56. 控球区域 A2
def possessions_area_a2(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2650) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 57. 控球区域 A3
def possessions_area_a3(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2650) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 58. 控球区域 A4
def possessions_area_a4(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2650) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 59. 控球区域 B1
def possessions_area_b1(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 60. 控球区域 B2
def possessions_area_b2(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016)
) |
(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 61. 控球区域 B3
def possessions_area_b3(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 62. 控球区域 B4
def possessions_area_b4(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 63. 控球区域 C1
def possessions_area_c1(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 64. 控球区域 C2
def possessions_area_c2(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 65. 控球区域 C3
def possessions_area_c3(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 66. 控球区域 C4
def possessions_area_c4(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 0) &
(df['pos_x'] < 2625) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -2625) &
(df['pos_x'] < 0) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 67. 控球区域 D1
def possessions_area_d1(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2625) &
(df['pos_y'] >= 2016) &
(df['pos_y'] <= 3400)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 68. 控球区域 D2
def possessions_area_d2(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2625) &
(df['pos_y'] >= 0) &
(df['pos_y'] < 2016)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 69. 控球区域 D3
def possessions_area_d3(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2625) &
(df['pos_y'] >= -2016) &
(df['pos_y'] < 0)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
# 70. 控球区域 D4
def possessions_area_d4(x):
data = df[(
(df['player1_teamID'] == home_team_id) &
(df['pos_x'] >= 2625) &
(df['pos_x'] <= 5250) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016)
) |
(
(df['player1_teamID'] == visiting_team_id) &
(df['pos_x'] >= -5250) &
(df['pos_x'] < -2625) &
(df['pos_y'] >= -3400) &
(df['pos_y'] < -2016)
) &
(df['event_index'] != 0)
]
d = set(x.index.values) & set(data.index.values)
return len(d)
player_df = df.groupby('player1').agg(
balls_played=('qualif', balls_played),
possessions_gained=('is_possessions_gained', possessions_gained),
possessions_lost=('is_possessions_lost', possessions_lost),
passes=('event_index', passes),
successful_passes=('event_index', successful_passes),
crosses=('event_index', crosses),
shots=('event_index', shots),
shots_on_target=('event_index', shots_on_target),
shots_on_target_p=('event_index', shots_on_target_p),
chances=('event_index', chances),
fouls_commited=('event_index', fouls_commited),
yellow_cards=('event_index', yellow_cards),
red_cards=('event_index', red_cards),
forward_passes=('player1_teamID', forward_passes),
team_id=('player1_teamID', get_teamID),
yellow_card_1st=('event_index', yellow_card_1st),
yellow_card_2nd=('event_index', yellow_card_2nd),
red_card_time=('event_index', red_card_time),
corner=('player1_teamID', corner),
offside=('event_index', offside),
# new processor
possession_time=('player1', possession_time),
short_passes=('player1', short_passes),
medium_passes=('player1', medium_passes),
long_passes=('player1', long_passes),
short_passes_p=('player1', short_passes_p),
medium_passes_p=('player1', medium_passes_p),
long_passes_p=('player1', long_passes_p),
sideways_passes=('player1', sideways_passes),
backward_passes=('player1', backward_passes),
sideways_passes_p=('player1', sideways_passes_p),
backward_passes_p=('player1', backward_passes_p),
successful_passes_p=('event_index', successful_passes_p),
shots_area_one=('player1', shots_area_one),
shots_area_two=('player1', shots_area_two),
shots_area_three=('player1', shots_area_three),
shots_area_four=('player1', shots_area_four),
shots_area_five=('player1', shots_area_five),
shots_area_six=('player1', shots_area_six),
shots_inside_the_box=('event_index', shots_inside_the_box),
shot_off_target=('event_index', shot_off_target),
goal_normal=('event_index', goal_normal),
goal_penalty=('player1', goal_penalty),
own_goal=('event_index', own_goal),
throw_in=('event_index', throw_in),
crosses_in_play_left=('player1', crosses_in_play_left),
crosses_in_play_right=('player1', crosses_in_play_right),
successful_crosses_in_play_left=('player1', successful_crosses_in_play_left),
successful_crosses_in_play_right=('player1', successful_crosses_in_play_right),
successful_crosses_in_play_left_p=('player1', successful_crosses_in_play_left_p),
successful_crosses_in_play_right_p=('player1', successful_crosses_in_play_right_p),
final_third_entries_left=('player1', final_third_entries_left),
final_third_entries_medium=('player1', final_third_entries_medium),
final_third_entries_right=('player1', final_third_entries_right),
possessions_area_a1=('player1', possessions_area_a1),
possessions_area_a2=('player1', possessions_area_a2),
possessions_area_a3=('player1', possessions_area_a3),
possessions_area_a4=('player1', possessions_area_a4),
possessions_area_b1=('player1', possessions_area_b1),
possessions_area_b2=('player1', possessions_area_b2),
possessions_area_b3=('player1', possessions_area_b3),
possessions_area_b4=('player1', possessions_area_b4),
possessions_area_c1=('player1', possessions_area_c1),
possessions_area_c2=('player1', possessions_area_c2),
possessions_area_c3=('player1', possessions_area_c3),
possessions_area_c4=('player1', possessions_area_c4),
possessions_area_d1=('player1', possessions_area_d1),
possessions_area_d2=('player1', possessions_area_d2),
possessions_area_d3=('player1', possessions_area_d3),
possessions_area_d4=('player1', possessions_area_d4)
)
columns = ['player1',
'balls_played',
'possessions_gained',
'possessions_lost',
'passes',
'successful_passes',
'crosses',
'shots',
'shots_on_target',
'shots_on_target_p',
'chances',
'fouls_commited',
'yellow_cards',
'red_cards',
'forward_passes',
'team_id',
'yellow_card_1st',
'yellow_card_2nd',
'red_card_time',
'corner',
'offside',
'forward_passes_p',
'fouls_received',
'possession_time',
'short_passes',
'medium_passes',
'long_passes',
'short_passes_p',
'medium_passes_p',
'long_passes_p',
'sideways_passes',
'backward_passes',
'sideways_passes_p',
'backward_passes_p',
'successful_passes_p',
'shots_area_one',
'shots_area_two',
'shots_area_three',
'shots_area_four',
'shots_area_five',
'shots_area_six',
'shots_inside_the_box',
'shot_off_target',
'goal_normal',
'goal_penalty',
'own_goal',
'throw_in',
'crosses_in_play_left',
'crosses_in_play_right',
'successful_crosses_in_play_left',
'successful_crosses_in_play_right',
'successful_crosses_in_play_left_p',
'successful_crosses_in_play_right_p',
'final_third_entries_left',
'final_third_entries_medium',
'final_third_entries_right',
'possessions_area_a1',
'possessions_area_a2',
'possessions_area_a3',
'possessions_area_a4',
'possessions_area_b1',
'possessions_area_b2',
'possessions_area_b3',
'possessions_area_b4',
'possessions_area_c1',
'possessions_area_c2',
'possessions_area_c3',
'possessions_area_c4',
'possessions_area_d1',
'possessions_area_d2',
'possessions_area_d3',
'possessions_area_d4'
]
player_df['short_passes_p'] = player_df['short_passes'].divide(player_df['passes'])
player_df['medium_passes_p'] = player_df['medium_passes'].divide(player_df['passes'])
player_df['long_passes_p'] = player_df['long_passes'].divide(player_df['passes'])
player_df['shots_on_target_p'] = player_df['shots_on_target'].divide(player_df['shots'])
player_df['forward_passes_p'] = player_df['forward_passes'].divide(player_df['passes'])
player_df['forward_passes_p'] = player_df['forward_passes'].divide(
player_df['forward_passes'] + player_df['sideways_passes'] + player_df['backward_passes'])
player_df['sideways_passes_p'] = player_df['sideways_passes'].divide(
player_df['forward_passes'] + player_df['sideways_passes'] + player_df['backward_passes'])
player_df['backward_passes_p'] = player_df['backward_passes'].divide(
player_df['forward_passes'] + player_df['sideways_passes'] + player_df['backward_passes'])
player_df['successful_crosses_in_play_left_p'] = player_df['successful_crosses_in_play_left'].divide(
player_df['crosses_in_play_left'])
player_df['successful_crosses_in_play_right_p'] = player_df['successful_crosses_in_play_right'].divide(
player_df['crosses_in_play_right'])
player_df['successful_passes_p'] = player_df['successful_passes'].divide(player_df['passes'])
player_df['shots_inside_the_box'] = player_df['shots_area_one'] + player_df['shots_area_two'] + player_df[
'shots_area_three'] + player_df['shots_area_four'] + player_df['shots_area_five']
player_df.replace([np.inf, -np.inf], np.nan)
player_df = player_df.reset_index()
player_df = player_df.drop(player_df[player_df['player1'] == ''].index)
# 被犯规
dd = df.groupby('player2').agg(fouls_received=('event_index', fouls_commited)).reset_index()
dd = dd.drop(dd[dd['player2'] == ''].index)
dd.rename(columns={'player2': 'player1'}, inplace=True)
result = pd.merge(player_df, dd, on='player1', how='outer')[columns]
result.fillna(0, inplace=True)
list_value = ListValue()
list_value.extend(result.values.tolist())
return process_pb2.PlayerStatisticalResult(
result=list_value
)
def run_passing_matrix(self):
return process_pb2.PassingMatrixResult(
result=ListValue()
)
def run_pass_graph(self):
return process_pb2.PassGraphResult(
result=ListValue()
)