{"id":291914,"date":"2019-07-10T15:01:37","date_gmt":"2019-07-10T15:01:37","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=291914"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=291914","title":{"rendered":"\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0444\u0443\u0442\u0431\u043e\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0442\u0447\u0435\u0439"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\u041c\u043e\u0434\u0435\u043b\u044c \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430 Python c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Scikit-learn, \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0444\u0443\u0442\u0431\u043e\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0442\u0447\u0435\u0439 \u0420\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u041f\u0440\u0435\u043c\u044c\u0435\u0440 \u041b\u0438\u0433\u0438 (\u0420\u041f\u041b).<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u041d\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u0435\u043d\u044f \u0432\u0434\u043e\u0445\u043d\u043e\u0432\u0438\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044f <a href=\"https:\/\/mariamsulakian.com\/2018\/02\/01\/machine-learning-predicting-the-2018-epl-matches\/\">Machine learning: predicting the 2018 EPL mathes<\/a>. \u041d\u0430\u0448\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0435 \u043c\u0430\u0442\u0447\u0435\u0439 \u0420\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u041f\u0440\u0435\u043c\u044c\u0435\u0440 \u041b\u0438\u0433\u0438 (\u0420\u041f\u041b) \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0441\u0435\u0437\u043e\u043d\u0430 2015\/2016, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u044f\u0449\u0438\u0445 \u0438\u0433\u0440. \u0414\u0430\u043d\u043d\u044b\u0435 \u0432\u0437\u044f\u0442\u044b \u0441 \u0441\u0430\u0439\u0442\u0430 \u0444\u0443\u0442\u0431\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 wyscout.com.<br \/>  \u041a\u043e\u0434 \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 <a href=\"https:\/\/github.com\/ilikeevb\/-football-prediction\">github<\/a>.<\/p>\n<h2>\u0414\u0430\u043d\u043d\u044b\u0435<\/h2>\n<p>  \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<pre><code class=\"python\">import pandas as pd import numpy as np import collections <\/code><\/pre>\n<p>  \u0414\u0430\u043d\u043d\u044b\u0435 \u0441 \u043c\u0430\u0442\u0447\u0430\u043c\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 <a href=\"https:\/\/github.com\/ilikeevb\/-football-prediction\/tree\/master\/data\">github<\/a>.<\/p>\n<pre><code class=\"python\">data = pd.read_csv(\"RPL.csv\", encoding = 'cp1251', delimiter=';') data.head() <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/65\/-o\/19\/65-o19yjlses_v65y6fo-gia5ey.png\" alt=\"image\">  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0427\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 xG \u0438 PPDA?<\/b><\/p>\n<div class=\"spoiler_text\"><b>xG (expected goals)<\/b> \u2013 \u044d\u0442\u043e \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0445 \u0433\u043e\u043b\u043e\u0432. \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u0435\u0451 \u043b\u0435\u0436\u0438\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0443\u0434\u0430\u0440\u043e\u0432 \u043f\u043e \u0432\u043e\u0440\u043e\u0442\u0430\u043c, \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0433\u043e\u043b\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0437\u0430\u0431\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0430, \u0435\u0441\u043b\u0438 \u0443\u0447\u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0443\u0434\u0430\u0440\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043d\u0430 \u043d\u0430\u043d\u0435\u0441\u043b\u0430. <a href=\"https:\/\/www.sports.ru\/tribuna\/blogs\/triumphator\/1565293.html\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e xG.<\/a><br \/>  <b>PPDA (Passes Allowed Per Defensive Action)<\/b> \u2014 \u0444\u0443\u0442\u0431\u043e\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0441\u0441\u0438\u043d\u0433\u0430 \u0432 \u043c\u0430\u0442\u0447\u0435. \u0427\u0435\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 PPDA, \u0442\u0435\u043c \u0432\u044b\u0448\u0435 \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438\u0433\u0440\u044b \u0432 \u043e\u0431\u043e\u0440\u043e\u043d\u0435. <a href=\"https:\/\/www.sports.ru\/tribuna\/blogs\/roblog\/1271820.html\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e PPDA<\/a>  <\/p>\n<blockquote><p>PPDA = \u0447\u0438\u0441\u043b\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \/ \u0447\u0438\u0441\u043b\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u043e\u0431\u043e\u0440\u043e\u043d\u0435 <\/p><\/blockquote>\n<p>  <\/div>\n<\/div>\n<p>  \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u0430\u0442\u0447\u0435\u0439 \u0434\u043b\u044f \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0435\u0437\u043e\u043d\u0430 2018\/2019 (\u0442.\u0435. \u043c\u0430\u0442\u0447\u0438, \u0441\u044b\u0433\u0440\u0430\u043d\u043d\u044b\u0435 \u0432 2019 \u0433\u043e\u0434\u0443). \u0421\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u0430\u043d\u0434 \u0438\u0433\u0440\u0430\u044e\u0449\u0438\u0445 \u0432 \u044d\u0442\u043e\u043c \u0441\u0435\u0437\u043e\u043d\u0435 (\u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0410\u0440\u0441\u0435\u043d\u0430\u043b, \u041e\u0440\u0435\u043d\u0431\u0443\u0440\u0433, \u0414\u0438\u043d\u0430\u043c\u043e, \u041a\u0440\u044b\u043b\u044c\u044f \u0421\u043e\u0432\u0435\u0442\u043e\u0432 \u0438 \u0415\u043d\u0438\u0441\u0435\u0439, \u0442.\u043a. \u0443 \u043d\u0438\u0445 \u043b\u0438\u0431\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0437\u0430 \u043f\u0440\u043e\u0448\u043b\u044b\u0435 \u0441\u0435\u0437\u043e\u043d\u044b, \u043b\u0438\u0431\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u043f\u043e \u043d\u0438\u043c \u043c\u0430\u043b\u043e):<\/p>\n<pre><code class=\"python\">RPL_2018_2019 = pd.read_csv('Team Name 2018 2019.csv', encoding = 'cp1251')  teamList = RPL_2018_2019['Team Name'].tolist() teamList <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ij\/i1\/41\/iji1419ybrwikff-i5za5d6tjb8.png\" alt=\"image\"><\/p>\n<p>  \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043c\u0430\u0442\u0447\u0438 \u0441 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u0441\u0435\u0437\u043e\u043d\u0435 2018\/2019:<\/p>\n<pre><code class=\"python\">deleteTeam = [x for x in pd.unique(data['\u041a\u043e\u043c\u0430\u043d\u0434\u0430']) if x not in teamList] for name in deleteTeam:     data = data[data['\u041a\u043e\u043c\u0430\u043d\u0434\u0430'] != name]     data = data[data['\u0421\u043e\u043f\u0435\u0440\u043d\u0438\u043a'] != name] data = data.reset_index(drop=True) <\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0437\u0430 \u0441\u0435\u0437\u043e\u043d:<\/p>\n<pre><code class=\"python\">def GetSeasonTeamStat(team, season):     goalScored = 0 #\u0413\u043e\u043b\u043e\u0432 \u0437\u0430\u0431\u0438\u0442\u043e     goalAllowed = 0 #\u0413\u043e\u043b\u043e\u0432 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043e      gameWin = 0 #\u0412\u044b\u0438\u0433\u0440\u0430\u043d\u043e     gameDraw = 0 #\u041d\u0438\u0447\u044c\u044f     gameLost = 0 #\u041f\u0440\u043e\u0438\u0433\u0440\u0430\u043d\u043e      totalScore = 0 #\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043e\u0447\u043a\u043e\u0432      matches = 0 #\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u044b\u0433\u0440\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u0442\u0447\u0435\u0439          xG = 0 #\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435 \u0433\u043e\u043b\u044b          shot = 0 #\u0423\u0434\u0430\u0440\u044b     shotOnTarget = 0 #\u0423\u0434\u0430\u0440\u044b \u0432 \u0441\u0442\u0432\u043e\u0440          cross = 0 #\u041d\u0430\u0432\u0435\u0441\u044b     accurateCross = 0 #\u0422\u043e\u0447\u043d\u044b\u0435 \u043d\u0430\u0432\u0435\u0441\u044b          totalHandle = 0 #\u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u043c\u044f\u0447\u043e\u043c     averageHandle = 0 #\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u043c\u044f\u0447\u043e\u043c \u0437\u0430 \u043c\u0430\u0442\u0447          Pass = 0 #\u041f\u0430\u0441\u044b     accuratePass = 0 #\u0422\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u0441\u044b          PPDA = 0 #\u0418\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0435\u0441\u0441\u0438\u043d\u0433\u0430 \u0432 \u043c\u0430\u0442\u0447\u0435      for i in range(len(data)):         if (((data['\u0413\u043e\u0434'][i] == season) and (data['\u041a\u043e\u043c\u0430\u043d\u0434\u0430'][i] == team) and (data['\u0427\u0430\u0441\u0442\u044c'][i] == 2)) or ((data['\u0413\u043e\u0434'][i] == season-1) and (data['\u041a\u043e\u043c\u0430\u043d\u0434\u0430'][i] == team) and (data['\u0427\u0430\u0441\u0442\u044c'][i] == 1))):             matches += 1                              goalScored += data['\u0417\u0430\u0431\u0438\u0442\u043e'][i]             goalAllowed += data['\u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043e'][i]              if (data['\u0417\u0430\u0431\u0438\u0442\u043e'][i] &gt; data['\u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043e'][i]):                 totalScore += 3                 gameWin += 1             elif (data['\u0417\u0430\u0431\u0438\u0442\u043e'][i] &lt; data['\u041f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043e'][i]):                 gameLost +=1             else:                 totalScore += 1                 gameDraw += 1                          xG += data['xG'][i]                          shot += data['\u0423\u0434\u0430\u0440\u044b'][i]             shotOnTarget += data['\u0423\u0434\u0430\u0440\u044b \u0432 \u0441\u0442\u0432\u043e\u0440'][i]                          Pass += data['\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0438'][i]             accuratePass += data['\u0422\u043e\u0447\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438'][i]                          totalHandle += data['\u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435'][i]                          cross += data['\u041d\u0430\u0432\u0435\u0441\u044b'][i]             accurateCross += data['\u0422\u043e\u0447\u043d\u044b\u0435 \u043d\u0430\u0432\u0435\u0441\u044b'][i]                          PPDA += data['PPDA'][i]      averageHandle = round(totalHandle\/matches, 3) #\u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435 \u043c\u044f\u0447\u043e\u043c \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0437\u0430 \u043c\u0430\u0442\u0447          return [gameWin, gameDraw, gameLost,              goalScored, goalAllowed, totalScore,              round(xG, 3), round(PPDA, 3),             shot, shotOnTarget,              Pass, accuratePass,             cross, accurateCross,             round(averageHandle, 3)] <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"python\">GetSeasonTeamStat(\"\u0421\u043f\u0430\u0440\u0442\u0430\u043a\", 2018) #\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0421\u043f\u0430\u0440\u0442\u0430\u043a\u0430 \u0437\u0430 \u0441\u0435\u0437\u043e\u043d 2017\/2018  <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nr\/bt\/mr\/nrbtmrfkcqjdxiq_uoaujjevmgs.png\" alt=\"image\"><\/p>\n<p>  \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434:<\/p>\n<pre><code class=\"python\">returnNames = [\"\u0412\u044b\u0438\u0433\u0440\u0430\u043d\u043e\", \"\u041d\u0438\u0447\u044c\u044f\", \"\u041f\u0440\u043e\u0438\u0433\u0440\u0430\u043d\u043e\",                \"\\n\u0413\u043e\u043b\u043e\u0432 \u0437\u0430\u0431\u0438\u0442\u043e\", \"\u0413\u043e\u043b\u043e\u0432 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043e\", \"\\n\u041d\u0430\u0431\u0440\u0430\u043d\u043e \u043e\u0447\u043a\u043e\u0432\",                \"\\nxG (\u0437\u0430 \u0441\u0435\u0437\u043e\u043d)\", \"PPDA (\u0437\u0430 \u0441\u0435\u0437\u043e\u043d)\",                \"\\n\u0423\u0434\u0430\u0440\u044b\", \"\u0423\u0434\u0430\u0440\u044b \u0432 \u0441\u0442\u0432\u043e\u0440\",                 \"\\n\u041f\u0430\u0441\u044b\", \"\u0422\u043e\u0447\u043d\u044b\u0435 \u043f\u0430\u0441\u044b\",                \"\\n\u041d\u0430\u0432\u0435\u0441\u044b\", \"\u0422\u043e\u0447\u043d\u044b\u0435 \u043d\u0430\u0432\u0435\u0441\u044b\",                 \"\\n\u0412\u043b\u0430\u0434\u0435\u043d\u0438\u0435 (\u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0437\u0430 \u043c\u0430\u0442\u0447)\"]  for i, n in zip(returnNames, GetSeasonTeamStat(\"\u0421\u043f\u0430\u0440\u0442\u0430\u043a\", 2018)):         print(i, n) <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rh\/z9\/nv\/rhz9nv6-g8_msejtgt2cyywxtko.png\" alt=\"image\"><\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u0448\u0430 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\u0420\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0421\u043f\u0430\u0440\u0442\u0430\u043a\u0430 \u0432 \u0441\u0435\u0437\u043e\u043d\u0435 2017\/2018:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jz\/ha\/zs\/jzhazsvnsqbzglgb_seuzsyevde.png\" alt=\"image\"><\/p>\n<p>  \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f, \u0442.\u043a. \u043c\u044b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0438 \u043c\u0430\u0442\u0447\u0438 \u043a\u043e\u043c\u0430\u043d\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0438\u0433\u0440\u0430\u044e\u0442 \u0432 \u0420\u041f\u041b \u0432 \u0441\u0435\u0437\u043e\u043d\u0435 2018\/2019. \u0422. \u0435., \u043c\u044b \u043d\u0435 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u043c\u0430\u0442\u0447\u0438 \u0421\u043f\u0430\u0440\u0442\u0430\u043a \u2014 \u0421\u041a\u0410, \u0421\u043f\u0430\u0440\u0442\u0430\u043a \u2014 \u0422\u043e\u0441\u043d\u043e \u0438 \u0442\u0434.  <\/div>\n<\/div>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0437\u0430 \u0441\u0435\u0437\u043e\u043d:<\/p>\n<pre><code class=\"python\">def GetSeasonAllTeamStat(season):     annual = collections.defaultdict(list)     for team in teamList:         team_vector = GetSeasonTeamStat(team, season)         annual[team] = team_vector     return annual <\/code><\/pre>\n<p>  <\/p>\n<h2>\u041e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0435\u043b\u0438<\/h2>\n<p>  \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435. \u041e\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434 \u0437\u0430 \u0432\u0441\u0435 \u0441\u0435\u0437\u043e\u043d\u044b. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0433\u0440\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u043a\u043e\u043c\u0430\u043d\u0434 \u0437\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0437\u043e\u043d \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 xTrain. \u0417\u0430\u0442\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u0442 yTrain \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1, \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0445\u043e\u0437\u044f\u0435\u0432 \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442, \u0438 0 \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.<\/p>\n<pre><code class=\"python\">def GetTrainingData(seasons):     totalNumGames = 0     for season in seasons:         annual = data[data['\u0413\u043e\u0434'] == season]         totalNumGames += len(annual.index)     numFeatures = len(GetSeasonTeamStat('\u0417\u0435\u043d\u0438\u0442', 2016)) #\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438     xTrain = np.zeros(( totalNumGames, numFeatures))     yTrain = np.zeros(( totalNumGames ))     indexCounter = 0     for season in seasons:         team_vectors = GetSeasonAllTeamStat(season)         annual = data[data['\u0413\u043e\u0434'] == season]         numGamesInYear = len(annual.index)         xTrainAnnual = np.zeros(( numGamesInYear, numFeatures))         yTrainAnnual = np.zeros(( numGamesInYear ))         counter = 0         for index, row in annual.iterrows():             team = row['\u041a\u043e\u043c\u0430\u043d\u0434\u0430']             t_vector = team_vectors[team]             rivals = row['\u0421\u043e\u043f\u0435\u0440\u043d\u0438\u043a']             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['\u041f\u043e\u0431\u0435\u0434\u0438\u0442\u0435\u043b\u044c']:                 yTrainAnnual[counter] = 1             else:                  yTrainAnnual[counter] = 0             counter += 1            xTrain[indexCounter:numGamesInYear+indexCounter] = xTrainAnnual         yTrain[indexCounter:numGamesInYear+indexCounter] = yTrainAnnual         indexCounter += numGamesInYear     return xTrain, yTrain <\/code><\/pre>\n<p>  \u041f\u043e\u0443\u0447\u0430\u0435\u043c \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 \u0432\u0441\u0435 \u0441\u0435\u0437\u043e\u043d\u044b \u0441 2015\/2016 \u043f\u043e 2018\/2019.<\/p>\n<pre><code class=\"python\">years = range(2016,2019) xTrain, yTrain = GetTrainingData(years) <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0430 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f LinearRegression \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Scikit-Learn.<\/p>\n<pre><code class=\"python\">from sklearn.linear_model import LinearRegression  model = LinearRegression() model.fit(xTrain, yTrain) <\/code><\/pre>\n<p>  \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u044b. \u041e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0435 \u043e\u0442 0 \u0434\u043e 1, \u0433\u0434\u0435 0 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448, \u0430 1 \u2014 \u044d\u0442\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0448. <\/p>\n<pre><code class=\"python\">def createGamePrediction(team1_vector, team2_vector):     diff = [[a - b for a, b in zip(team1_vector, team2_vector)]]     predictions = model.predict(diff)     return predictions <\/code><\/pre>\n<p>  <\/p>\n<h2>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/h2>\n<p>  \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0430 \u043c\u0430\u0442\u0447 \u0417\u0435\u043d\u0438\u0442 \u2014 \u0421\u043f\u0430\u0440\u0442\u0430\u043a <\/p>\n<pre><code class=\"python\">team1_name = \"\u0417\u0435\u043d\u0438\u0442\" team2_name = \"\u0421\u043f\u0430\u0440\u0442\u0430\u043a\"  team1_vector = GetSeasonTeamStat(team1_name, 2019) team2_vector = GetSeasonTeamStat(team2_name, 2019)  print ('\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u0432\u044b\u0438\u0433\u0440\u0430\u0435\u0442 ' + team1_name + ':', createGamePrediction(team1_vector, team2_vector)) print ('\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u0432\u044b\u0438\u0433\u0440\u0430\u0435\u0442 ' + team2_name + ':', createGamePrediction(team2_vector, team1_vector)) <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/rd\/s4\/5y\/rds45yhfxuqbufnedv1vdkhfo50.png\" alt=\"image\"><\/p>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432 \u043c\u0430\u0442\u0447\u0435 \u0417\u0435\u043d\u0438\u0442 \u2014 \u0421\u043f\u0430\u0440\u0442\u0430\u043a \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0431\u0435\u0434\u044b \u0417\u0435\u043d\u0438\u0442\u0430 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 47% (17.03.2019 \u0421\u043f\u0430\u0440\u0442\u0430\u043a 1-1 \u0417\u0435\u043d\u0438\u0442).<\/p>\n<p>  \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u043d\u043e\u0437 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<br \/>  \u0414\u043e 40% \u2014 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u0432\u044b\u0438\u0433\u0440\u0430\u0435\u0442 (\u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448 \u0438\u043b\u0438 \u043d\u0438\u0447\u044c\u044f)<br \/>  \u041e\u0442 40% \u0434\u043e 60% \u2014 \u0432\u044b\u0441\u043e\u043a\u0430\u044f \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0438\u0447\u044c\u0438<br \/>  \u041e\u0442 60% \u2014 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u0435\u0442 (\u043f\u043e\u0431\u0435\u0434\u0430 \u0438\u043b\u0438 \u043d\u0438\u0447\u044c\u044f) <\/p>\n<p>  \u0412\u044b\u0432\u0435\u0434\u0435\u043c \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u044b \u0434\u043b\u044f \u0426\u0421\u041a\u0410 \u043f\u0440\u043e\u0442\u0438\u0432 \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0443\u0431\u043e\u0432 <\/p>\n<pre><code class=\"python\">for team_name in teamList:     team1_name = \"\u0426\u0421\u041a\u0410\"     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,)) <\/code><\/pre>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ww\/dq\/n1\/wwdqn1iao6u7_7plw6u26o5wzgs.png\" alt=\"image\"><\/p>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0430\u043b \u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u043d\u043e\u0437 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 \u0432\u0441\u0435 \u043c\u0430\u0442\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438\u0441\u044c \u0432 \u043d\u0438\u0447\u044c\u044e. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u0435\u0442\u043e\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0433\u043d\u043e\u0437: \u0426\u0421\u041a\u0410 \u2014 \u0417\u0435\u043d\u0438\u0442. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0431\u0435\u0434\u044b \u0426\u0421\u041a\u0410 \u0432\u044b\u0448\u0435 \u043d\u0430 0.001, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0432\u043d\u044b \u043f\u043e \u0441\u0438\u043b\u0435 \u0438 \u0441\u044b\u0433\u0440\u0430\u044e\u0442 \u0432 \u043d\u0438\u0447\u044c\u044e, \u043d\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e\u0431\u0435\u0434\u0438\u043b \u0417\u0435\u043d\u0438\u0442 (3-1).<\/p>\n<h2>\u0412\u044b\u0432\u043e\u0434<\/h2>\n<p>  \u041d\u0430\u0448 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u044b\u043c. \u041e\u043d \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u0438\u0448\u044c \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0443 \u043c\u0430\u0442\u0447\u0435\u0439 (\u0438 \u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e 15 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432), \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0444\u0443\u0442\u0431\u043e\u043b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043c\u043d\u043e\u0433\u0438\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u043e\u0432. \u0414\u0430\u0436\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0438\u043b\u0438 \u043f\u043e\u0433\u043e\u0434\u0430 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0433\u0440\u044b. <\/p>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u0432\u044b\u0431\u043e\u0440\u043a\u0443, \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0442\u043e\u0447\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u044b.<\/p>\n<p>  \u0411\u0443\u0434\u0443 \u043f\u0440\u0438\u0437\u043d\u0430\u0442\u0435\u043b\u0435\u043d, \u0435\u0441\u043b\u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0441\u0432\u043e\u0438 \u0438\u0434\u0435\u0438 \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f.<\/p><\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/456226\/\"> https:\/\/habr.com\/ru\/post\/456226\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\u041c\u043e\u0434\u0435\u043b\u044c \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430 Python c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Scikit-learn, \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0444\u0443\u0442\u0431\u043e\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0442\u0447\u0435\u0439 \u0420\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u043e\u0439 \u041f\u0440\u0435\u043c\u044c\u0435\u0440 \u041b\u0438\u0433\u0438 (\u0420\u041f\u041b).  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-291914","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/291914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=291914"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/291914\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=291914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=291914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=291914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}