|
|
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()
|
|
|
)
|