def create_data_js(self, train_data, n, directory):
        """

        :param n:
        :return:
        """

        train_data.sort("Date")
        self.train(train_data)
        top_n = self.top_n_players(n)

        lt = ""
        tc = 0
        tours = []
        data = {}

        r = self.player_rankings
        g = self.player_games
        elo = rs.Elo(self.params["mu"], self.params["K"])
        edge = self.params["edge"]
        probabilities = []
        bet_amount = []

        for name in top_n:
            data[name] = {"rating": [{"return": 1500, "serve": 1500}], "name": name}

        for i, row in train_data.iterrows():
            name1 = row["Winner"]
            name2 = row["Loser"]
            wsp1 = row["WSP1"]
            wsp2 = row["WSP2"]

            # If there is no data on serve win percentage, skip.
            if math.isnan(wsp1) or math.isnan(wsp2):
                probabilities.append(0.5)
                bet_amount.append(0)
                continue

            if not r.get(name1, False):
                r[name1] = [elo.create_rating(), elo.create_rating()]
            if not r.get(name2, False):
                r[name2] = [elo.create_rating(), elo.create_rating()]

            r[name1][0], r[name2][1] = elo.match(r[name1][0], r[name2][1], wsp1 - edge)
            r[name2][0], r[name1][1] = elo.match(r[name2][0], r[name1][1], wsp2 - edge)

            if (name1 in top_n or name2 in top_n) and row["Tournament"] != lt:
                lt = row["Tournament"]
                tc += 1
                tours.append({"text": lt + " " + str(row["Date"]), "value": tc, "games": []})
                for name in top_n:
                    ser, ret = int(r[name][0].rating), int(r[name][1].rating)
                    data[name]["rating"].append({"return": ret, "serve": ser})

            if len(tours) and row["Tournament"] == lt:
                game = "%s | %s vs %s: %s." % (row["Round"], name1, name2, row["Score"])
                tours[-1]["games"].append(game)

        self.player_rankings = r
        self.player_games = g

        alpha = 0.05
        for key, value in data.iteritems():
            points = len(value["rating"])
            ret = np.array([float(x["return"]) for x in data[key]["rating"]])
            ser = np.array([float(x["serve"]) for x in data[key]["rating"]])
            ret = calc.smooth_time_series_exp(ret, alpha)
            ser = calc.smooth_time_series_exp(ser, alpha)
            new_rating = [{"return": r, "serve": s} for r, s in zip(ret, ser)]
            data[key]["rating"] = new_rating

        sez = sorted([value for key, value in data.iteritems()])

        with open(directory, "w") as f:
            f.write("data = ")
            f.write(str(sez))
            f.write("\n")
            f.write("n_points = ")
            f.write(str(points))
            f.write("\n")
            f.write("tours = ")
            f.write(str(tours))
    def create_data_js(self, train_data, n, directory):
        '''

        :param n:
        :return:
        '''

        train_data.sort("Date")
        self.train(train_data)
        top_n = self.top_n_players(n)

        lt = ""
        tc = 0
        tours = []
        data = {}

        r = self.player_rankings
        g = self.player_games
        elo = rs.Elo(self.params["mu"], self.params["K"])
        edge = self.params["edge"]
        probabilities = []
        bet_amount = []

        for name in top_n:
            data[name] = {
                "rating": [{
                    "return": 1500,
                    "serve": 1500
                }],
                "name": name
            }

        for i, row in train_data.iterrows():
            name1 = row["Winner"]
            name2 = row["Loser"]
            wsp1 = row["WSP1"]
            wsp2 = row["WSP2"]

            # If there is no data on serve win percentage, skip.
            if math.isnan(wsp1) or math.isnan(wsp2):
                probabilities.append(0.5)
                bet_amount.append(0)
                continue

            if not r.get(name1, False):
                r[name1] = [elo.create_rating(), elo.create_rating()]
            if not r.get(name2, False):
                r[name2] = [elo.create_rating(), elo.create_rating()]

            r[name1][0], r[name2][1] = elo.match(r[name1][0], r[name2][1],
                                                 wsp1 - edge)
            r[name2][0], r[name1][1] = elo.match(r[name2][0], r[name1][1],
                                                 wsp2 - edge)

            if (name1 in top_n or name2 in top_n) and row["Tournament"] != lt:
                lt = row["Tournament"]
                tc += 1
                tours.append({
                    "text": lt + " " + str(row["Date"]),
                    "value": tc,
                    "games": []
                })
                for name in top_n:
                    ser, ret = int(r[name][0].rating), int(r[name][1].rating)
                    data[name]["rating"].append({"return": ret, "serve": ser})

            if len(tours) and row["Tournament"] == lt:
                game = "%s | %s vs %s: %s." % (row["Round"], name1, name2,
                                               row["Score"])
                tours[-1]["games"].append(game)

        self.player_rankings = r
        self.player_games = g

        alpha = 0.05
        for key, value in data.iteritems():
            points = len(value["rating"])
            ret = np.array([float(x["return"]) for x in data[key]["rating"]])
            ser = np.array([float(x["serve"]) for x in data[key]["rating"]])
            ret = calc.smooth_time_series_exp(ret, alpha)
            ser = calc.smooth_time_series_exp(ser, alpha)
            new_rating = [{"return": r, "serve": s} for r, s in zip(ret, ser)]
            data[key]["rating"] = new_rating

        sez = sorted([value for key, value in data.iteritems()])

        with open(directory, 'w') as f:
            f.write("data = ")
            f.write(str(sez))
            f.write("\n")
            f.write("n_points = ")
            f.write(str(points))
            f.write("\n")
            f.write("tours = ")
            f.write(str(tours))
    def create_data_js(self, train_data, n, directory):
        '''

        :param n:
        :return:
        '''

        train_data.sort("Date")
        self.train(train_data)
        top_n = self.top_n_players(n)

        lt = ""
        tc = 0
        tours = []

        ranking = {}
        data = {}
        p = self.params
        glicko = Match(p["mu"], p["start_sigma"], p["end_sigma"], p["c"], p["Q"])

        for name in top_n:
            ranking[name] = glicko.create_player(name)
            data[name] = {"rating": [{"return": 1500, "serve": 1500}], "name": name}

        for i, row in train_data.iterrows():
            name1 = row["Winner"]
            name2 = row["Loser"]
            wsp1 = row["WSP1"]
            wsp2 = row["WSP2"]

            # If there is no data on serve win percentage, skip.
            if math.isnan(wsp1) or math.isnan(wsp2):
                continue

            if not ranking.get(name1, False):
                ranking[name1] = glicko.create_player(name1)
            if not ranking.get(name2, False):
                ranking[name2] = glicko.create_player(name2)

            r1, r2 = glicko.match(ranking[name1], ranking[name2], wsp1, wsp2)
            ranking[name1], ranking[name2] = r1, r2

            if (name1 in top_n or name2 in top_n) and row["Tournament"] != lt:
                lt = row["Tournament"]
                tc += 1
                tours.append({"text": lt + " " + str(row["Date"]), "value": tc, "games": []})
                for name in top_n:
                    r = ranking[name]
                    ret, ser = int(r.mg_def.rating), int(r.mg_att.rating)
                    data[name]["rating"].append({"return": ret, "serve": ser})

            if len(tours) and row["Tournament"] == lt:
                game = "%s | %s vs %s: %s." % (row["Round"], name1, name2, row["Score"])
                tours[-1]["games"].append(game)

        alpha = 0.05
        for key, value in data.iteritems():
            points = len(value["rating"])
            ret = np.array([float(x["return"]) for x in data[key]["rating"]])
            ser = np.array([float(x["serve"]) for x in data[key]["rating"]])
            ret = calc.smooth_time_series_exp(ret, alpha)
            ser = calc.smooth_time_series_exp(ser, alpha)
            new_rating = [{"return": r, "serve": s} for r, s in zip(ret, ser)]
            data[key]["rating"] = new_rating

        sez = sorted([value for key, value in data.iteritems()])
        
        with open(directory, 'w') as f:
            f.write("data = ")
            f.write(str(sez))
            f.write("\n")
            f.write("n_points = ")
            f.write(str(points))
            f.write("\n")
            f.write("tours = ")
            f.write(str(tours))