рдлреБрдЯрдмреЙрд▓ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА

рд░реВрд╕реА рдкреНрд░реАрдорд┐рдпрд░ рд▓реАрдЧ (RPL) рдореЗрдВ рдлреБрдЯрдмреЙрд▓ рдореИрдЪреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХрд┐рдХрд┐рдЯ-рд▓рд░реНрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдорд╢реАрди рд╕реАрдЦрдиреЗ рдХрд╛ рдореЙрдбрд▓ред

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ: 2018 рдИрдкреАрдПрд▓ рдЧрдгрд┐рдд рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддреЗ рд╣реБрдП рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рд╣реБрдЖред рд╣рдорд╛рд░реЗ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдореЙрдбрд▓ рдЖрдЧрд╛рдореА рдЦреЗрд▓реЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 2015/2016 рд╕реАрдЬрд╝рди рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд░реВрд╕реА рдкреНрд░реАрдорд┐рдпрд░ рд▓реАрдЧ (рдЖрд░рдкреАрдПрд▓) рдХреЗ рдореИрдЪреЛрдВ рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рдкрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рджреЗрдЧрд╛ред рдбреЗрдЯрд╛ wyscout.com рдлреБрдЯрдмреЙрд▓ рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдХреЛрдб рдФрд░ рдбреЗрдЯрд╛ рдЧрд┐рддреБрдм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рдбреЗрдЯрд╛


рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

import pandas as pd import numpy as np import collections 

рдореИрдЪ рдХрд╛ рдбреЗрдЯрд╛ рдЧрд┐рддреБрдм рдкрд░ рд╣реИред

 data = pd.read_csv("RPL.csv", encoding = 'cp1251', delimiter=';') data.head() 

рдЫрд╡рд┐
XG рдФрд░ PPDA рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?
xG (рдЕрдкреЗрдХреНрд╖рд┐рдд рд▓рдХреНрд╖реНрдп) рдЕрдкреЗрдХреНрд╖рд┐рдд рд▓рдХреНрд╖реНрдпреЛрдВ рдХрд╛ рдПрдХ рдореЙрдбрд▓ рд╣реИред рдпрд╣ рд▓рдХреНрд╖реНрдп рдкрд░ рд╢реЙрдЯреНрд╕ рдХреЗ рд╕рдВрдХреЗрддрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣рдо рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЯреАрдо рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рддрдиреЗ рдЧреЛрд▓ рджрд╛рдЧреЗ рдереЗ рдЕрдЧрд░ рд╣рдо рдЙрди рд╕рднреА рд╢реЙрдЯреНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред XG рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВред
PPDA (Passes Allowed Per Defensive Action) рдПрдХ рдлреБрдЯрдмреЙрд▓ рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рд╕рдВрдХреЗрддрдХ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдореИрдЪ рдореЗрдВ рджрдмрд╛рд╡ рдХреА рддреАрд╡реНрд░рддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкреАрдкреАрдбреАрдП рдорд╛рди рдЬрд┐рддрдирд╛ рдХрдо рд╣реЛрдЧрд╛, рд░рдХреНрд╖рд╛ рдореЗрдВ рдЦреЗрд▓ рдХреА рддреАрд╡реНрд░рддрд╛ рдЙрддрдиреА рд╣реА рдЕрдзрд┐рдХ рд╣реЛрдЧреАред PPDA рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ
рдкреАрдкреАрдбреАрдП = рд╣рдорд▓рд╛рд╡рд░ рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд╛рд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ / рд░рдХреНрд╖рд╛ рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рд╕рдВрдЦреНрдпрд╛


рд╣рдо 2018/2019 рд╕реАрдЬрд╝рди рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ (рдпрд╛рдиреА 2019 рдореЗрдВ рдЦреЗрд▓реЗ рдЧрдП рдореИрдЪреЛрдВ) рдХреЗ рд▓рд┐рдП рдореИрдЪ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рд╕реАрдЬрд╝рди рдореЗрдВ рдЦреЗрд▓рдиреЗ рд╡рд╛рд▓реА рдЯреАрдореЛрдВ рдХреА рд╕реВрдЪреА (рдЖрд░реНрд╕реЗрдирд▓, рдУрд░реЗрдирдмрд░реНрдЧ, рдбрд╛рдпрдирдореЛ, рдХреНрд░рд┐рд▓рд┐рдпрд╛ рд╕реЛрд╡реЗрддреЛрд╡ рдФрд░ рдпреЗрдирд┐рд╕реА рдХреЛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХреЗ рдкрд╛рд╕ рдпрд╛ рддреЛ рдкрд┐рдЫрд▓реЗ рд╕реАрдЬрд╝рди рдХреЗ рдЖрдБрдХрдбрд╝реЗ рдирд╣реАрдВ рд╣реИрдВ, рдпрд╛ рдЙрди рдкрд░ рдХреБрдЫ рдЖрдБрдХрдбрд╝реЗ рд╣реИрдВ):

 RPL_2018_2019 = pd.read_csv('Team Name 2018 2019.csv', encoding = 'cp1251') teamList = RPL_2018_2019['Team Name'].tolist() teamList 

рдЫрд╡рд┐

рд╣рдо рдЙрди рдЯреАрдореЛрдВ рдХреЗ рд╕рд╛рде рдореИрдЪ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдЬреЛ рд╕реАрдЬрди 2018/2019 рдореЗрдВ рднрд╛рдЧ рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ:

 deleteTeam = [x for x in pd.unique(data['']) if x not in teamList] for name in deleteTeam: data = data[data[''] != name] data = data[data[''] != name] data = data.reset_index(drop=True) 

рдПрдХ рд╕реАрдЬрди рдХреЗ рд▓рд┐рдП рдЯреАрдо рдХреЗ рдЖрдВрдХрдбрд╝реЗ рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп:

 def GetSeasonTeamStat(team, season): goalScored = 0 #  goalAllowed = 0 #  gameWin = 0 # gameDraw = 0 # gameLost = 0 # totalScore = 0 #   matches = 0 #   xG = 0 #  shot = 0 # shotOnTarget = 0 #   cross = 0 # accurateCross = 0 #  totalHandle = 0 #  averageHandle = 0 #     Pass = 0 # accuratePass = 0 #  PPDA = 0 #    for i in range(len(data)): if (((data[''][i] == season) and (data[''][i] == team) and (data[''][i] == 2)) or ((data[''][i] == season-1) and (data[''][i] == team) and (data[''][i] == 1))): matches += 1 goalScored += data[''][i] goalAllowed += data[''][i] if (data[''][i] > data[''][i]): totalScore += 3 gameWin += 1 elif (data[''][i] < data[''][i]): gameLost +=1 else: totalScore += 1 gameDraw += 1 xG += data['xG'][i] shot += data[''][i] shotOnTarget += data['  '][i] Pass += data[''][i] accuratePass += data[' '][i] totalHandle += data[''][i] cross += data[''][i] accurateCross += data[' '][i] PPDA += data['PPDA'][i] averageHandle = round(totalHandle/matches, 3) #      return [gameWin, gameDraw, gameLost, goalScored, goalAllowed, totalScore, round(xG, 3), round(PPDA, 3), shot, shotOnTarget, Pass, accuratePass, cross, accurateCross, round(averageHandle, 3)] 

рд╕рдорд╛рд░реЛрд╣ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:

 GetSeasonTeamStat("", 2018) #    2017/2018 

рдЫрд╡рд┐

рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЛрдб рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

 returnNames = ["", "", "", "\n ", " ", "\n ", "\nxG ( )", "PPDA ( )", "\n", "  ", "\n", " ", "\n", " ", "\n (   )"] for i, n in zip(returnNames, GetSeasonTeamStat("", 2018)): print(i, n) 

рдЫрд╡рд┐

рд╣рдорд╛рд░реЗ рдЖрдБрдХрдбрд╝реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдБрдХрдбрд╝реЛрдВ рд╕реЗ рднрд┐рдиреНрди рдХреНрдпреЛрдВ рд╣реИрдВ
рд╕рддреНрд░ 2017-2018 рдореЗрдВ рд╕реНрдкрд╛рд░реНрдЯрдХ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЖрдВрдХрдбрд╝реЗ:

рдЫрд╡рд┐

рдЖрдБрдХрдбрд╝реЗ рдЕрд▓рдЧ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рд╕реАрдЬрди 2018/2019 рдореЗрдВ рдЖрд░рдкреАрдПрд▓ рдореЗрдВ рдирд╣реАрдВ рдЦреЗрд▓рдиреЗ рд╡рд╛рд▓реА рдЯреАрдореЛрдВ рдХреЗ рдореИрдЪреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ред рдпрд╣реА рд╣реИ, рд╣рдо рд╕реНрдкрд╛рд░реНрдЯрдХ - рдПрд╕рдХреЗрдП, рд╕реНрдкрд╛рд░реНрдЯрдХ - рдЯреЛрд╕реНрдиреЛ, рдЖрджрд┐ рдХреЗ рдореИрдЪреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВред

рд╕реАрдЬрди рдХреЗ рд▓рд┐рдП рд╕рднреА рдЯреАрдореЛрдВ рдХреЗ рдЖрдВрдХрдбрд╝реЗ рд▓реМрдЯрд╛рдПрдВрдЧреЗ:

 def GetSeasonAllTeamStat(season): annual = collections.defaultdict(list) for team in teamList: team_vector = GetSeasonTeamStat(team, season) annual[team] = team_vector return annual 

рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг


рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛ рд▓реМрдЯрд╛рдПрдЧрд╛ред рд╡рд╣ рд╕рднреА рдореМрд╕рдореЛрдВ рдХреЗ рд▓рд┐рдП рдЯреАрдо рд╡реИрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рддреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЧреЗрдо рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдЬрд╝рди рдХреЗ рд▓рд┐рдП рдЯреАрдореЛрдВ рдХреЗ рд╡реИрдХреНрдЯрд░ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ xTrain рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИред рдпрджрд┐ рдШрд░ рдХреА рдЯреАрдо рдЬреАрддрддреА рд╣реИ, рдФрд░ 0 рдЕрдиреНрдпрдерд╛, рддреЛ рдлрд╝рдВрдХреНрд╢рди рддрдм 1 рддрдХ yTrain рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

 def GetTrainingData(seasons): totalNumGames = 0 for season in seasons: annual = data[data[''] == season] totalNumGames += len(annual.index) numFeatures = len(GetSeasonTeamStat('', 2016)) #     xTrain = np.zeros(( totalNumGames, numFeatures)) yTrain = np.zeros(( totalNumGames )) indexCounter = 0 for season in seasons: team_vectors = GetSeasonAllTeamStat(season) annual = data[data[''] == season] numGamesInYear = len(annual.index) xTrainAnnual = np.zeros(( numGamesInYear, numFeatures)) yTrainAnnual = np.zeros(( numGamesInYear )) counter = 0 for index, row in annual.iterrows(): team = row[''] t_vector = team_vectors[team] rivals = row[''] r_vector = team_vectors[rivals] diff = [a - b for a, b in zip(t_vector, r_vector)] if len(diff) != 0: xTrainAnnual[counter] = diff if team == row['']: yTrainAnnual[counter] = 1 else: yTrainAnnual[counter] = 0 counter += 1 xTrain[indexCounter:numGamesInYear+indexCounter] = xTrainAnnual yTrain[indexCounter:numGamesInYear+indexCounter] = yTrainAnnual indexCounter += numGamesInYear return xTrain, yTrain 

рд╣рдо 2015/2016 рд╕реЗ 2018/2019 рддрдХ рд╕рднреА рдореМрд╕рдореЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдбреЗрдЯрд╛ рд╕реАрдЦрддреЗ рд╣реИрдВред

 years = range(2016,2019) xTrain, yTrain = GetTrainingData(years) 

рдЬреАрддрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо Scikit-Learn рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ LinearRegression рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

 from sklearn.linear_model import LinearRegression model = LinearRegression() model.fit(xTrain, yTrain) 

рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рд▓реМрдЯрд╛рдПрдЧрд╛ред рдпрд╣ 0 рдФрд░ 1 рдХреЗ рдмреАрдЪ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рдПрдЧрд╛, рдЬрд╣рд╛рдВ 0 рдиреБрдХрд╕рд╛рди рд╣реИ рдФрд░ 1 рд▓рд╛рдн рд╣реИред

 def createGamePrediction(team1_vector, team2_vector): diff = [[a - b for a, b in zip(team1_vector, team2_vector)]] predictions = model.predict(diff) return predictions 

рдкрд░рд┐рдгрд╛рдо


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЬрд╝реЗрдирд┐рдЯ - рд╕реНрдкрд╛рд░реНрдЯрдХ рдореИрдЪ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ

 team1_name = "" team2_name = "" team1_vector = GetSeasonTeamStat(team1_name, 2019) team2_vector = GetSeasonTeamStat(team2_name, 2019) print (',   ' + team1_name + ':', createGamePrediction(team1_vector, team2_vector)) print (',   ' + team2_name + ':', createGamePrediction(team2_vector, team1_vector)) 

рдЫрд╡рд┐

рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдореИрдЪ рдореЗрдВ рдЬрд╝реАрдирдд - рд╕реНрдкрд╛рд░реНрдЯрдХ, рдЬрд╝реАрдирдд рдХреЗ рд▓рд┐рдП рдЬреАрдд рдХреА рд╕рдВрднрд╛рд╡рдирд╛ 47% рд╣реИ (03/17/2019 рд╕реНрдкрд╛рд░реНрдЯрдХ 1-1 рдЬрд╝реАрдирд┐рдЯ)ред

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд┐рдП рдЧрдП рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ:
40% рддрдХ - рдЯреАрдо рдиреЗ рд╕рд┐рд░реНрдл рдЬреАрдд (рд╣рд╛рд░ рдпрд╛ рдбреНрд░реЙ) рдирд╣реАрдВ рдЬреАрддрд╛
40% рд╕реЗ 60% рддрдХ - рдПрдХ рдбреНрд░реЙ рдХреА рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛
60% рд╕реЗ - рдЯреАрдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рд╣рд╛рд░реЗрдЧреА (рдЬреАрдд рдпрд╛ рдбреНрд░рд╛)

рдЕрдиреНрдп рд╕рднреА рдХреНрд▓рдмреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл CSKA рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди

 for team_name in teamList: team1_name = "" team2_name = team_name if(team1_name != team2_name): team1_vector = GetSeasonTeamStat(team1_name, 2019) team2_vector = GetSeasonTeamStat(team2_name, 2019) print(team1_name, createGamePrediction(team1_vector, team2_vector), " - ", team2_name, createGamePrediction(team2_vector, team1_vector,)) 

рдЫрд╡рд┐

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдиреЗ рд▓рдЧрднрдЧ рд╕рднреА рдореИрдЪреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣реА рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рджрд┐рдпрд╛ рдЬреЛ рдПрдХ рдбреНрд░реЙ рдореЗрдВ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖред рдПрдХрдорд╛рддреНрд░ рдЧрд▓рдд рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди: CSKA рдорд╛рд╕реНрдХреЛ - рдЬрд╝реАрдирд┐рдЯред CSKA рдХреА рдЬреАрдд рдХреА рд╕рдВрднрд╛рд╡рдирд╛ 0.001 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЯреАрдореЗрдВ рддрд╛рдХрдд рдореЗрдВ рдмрд░рд╛рдмрд░ рд╣реИрдВ рдФрд░ рдбреНрд░реЙ рдореЗрдВ рдЦреЗрд▓реЗрдВрдЧреА, рд▓реЗрдХрд┐рди рдЕрдВрдд рдореЗрдВ рдЬрд╝реАрдирдд рдиреЗ рдЬреАрдд рд╣рд╛рд╕рд┐рд▓ рдХреА (3-1)ред

рдирд┐рд╖реНрдХрд░реНрд╖


рд╣рдорд╛рд░рд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрд╣реБрдд рдЖрджрд┐рдо рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдореИрдЪреЛрдВ рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ (рдФрд░ рдлрд┐рд░ рдХреЗрд╡рд▓ 15 рдореВрд▓ рдорд╛рдкрджрдВрдбреЛрдВ) рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдлреБрдЯрдмреЙрд▓ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХрдИ рдХрд╛рд░рдХреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореИрджрд╛рди рдпрд╛ рдореМрд╕рдо рдХреА рд╕реНрдерд┐рддрд┐ рдЦреЗрд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИред

рдЕрдЧрд▓рд╛, рдореИрдВ рд╕рдВрдХреЗрддреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдПрдХ рдкрд░реАрдХреНрд╖рдг рдирдореВрдирд╛ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рд╡рд┐рднрд┐рдиреНрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдореЙрдбрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рд╕рдмрд╕реЗ рд╕рдЯреАрдХ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдФрд░ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред

Source: https://habr.com/ru/post/hi456226/


All Articles