Erstellen Sie eine automatische Klassenverwaltungs-App für Tenho Private Room mit LINE Bot und Python Part ③

Einführung

Dieses Mal habe ich der im folgenden Beitrag erstellten automatischen Notenverwaltungs-App von Tenho die Bewertungsfunktion __ hinzugefügt.

Bewertungsformel

Die Bewertung nimmt das folgende Tenho-Format an. In Tenho ist Rating auch ein vollständiges Rangsystem, das auf dem vollständigen Rangsystem der Noten basiert. In unserem privaten Raum haben wir die Regel übernommen, dass das Gewicht des Ranglistenpunkts relativ hoch ist, und haben daher die Bewertung im Tenho-Stil übernommen.

(Teilauszug unten)

  • Ranglistenpunkte (10-30) korrigiert um den Durchschnitt desselben Tischspielers
  • Anfangswert = R1500
  • Je höher das durchschnittliche R der Tabelle ist, desto größer ist der Anstieg. (Ratenschwankung) = (Übereinstimmungszahlkorrektur) x (Übereinstimmungsergebnis + Korrekturwert) x (Skalierungskoeffizient) Korrektur der Übereinstimmungszahl (weniger als 400 Übereinstimmungen): 1 - Anzahl der Übereinstimmungen x 0,002 Spielnummernkorrektur (400 Spiele oder mehr): 0,2 Spielergebnis (Drei-Spieler-Kampf): 1. Platz +30 2. Platz 0 3. Platz-30 Korrekturwert: (Tabellenmittelwert R - Ihr eigenes R) / 40 Skalierungskoeffizient (Rangkampf): 1,0

Wenn in Ihrem privaten Raum eine Regel gilt, bei der die Rohwerte gegenüber den Ranglistenwerten hervorgehoben werden, kann dies zu einer stärkeren Korrelation mit den Noten führen, wenn Sie andere Bewertungsformeln hervorheben. Auf der folgenden Website wird die Bewertung von M Leaguer anhand von drei Formeltypen berechnet. Bitte beziehen Sie sich darauf.

Implementierung

Präambel

import re
import matplotlib.pyplot as plt

Rating / R-Initialisierung

Die Bewertungsdaten werden durch die Anfangsdaten (Spielername: Spieler, Anfangs-R: Init_Rating, Anfangsanzahl der Villen: Init_Games) in initial_file.txt initialisiert. Grundsätzlich ist R = 1500, Spiele = 0.

calc_rating.py



def initialize_rating(initial_file):
    
    with open(initial_file) as f:
        init_ratings = f.readlines() 

    rating = {}
    games  = {}
    rating_history = {}
    
    for l in init_ratings:
        player      = l.split()[0]
        init_rating = l.split()[1] 
        init_games  = l.split()[2]
        rating[player] = float(init_rating) 
        games[player]  = int(init_games)
        rating_history[player] = [float(init_rating)]
        print(games)
    
    return rating,games,rating_history

initial_file.txt


Herr A 1500 0
Herr B 1500 0
Herr C 1500 0
Herr D 1500 0

Berechnung von R.

def calc_rating(initial_rating,initial_games,initial_rating_history,logfile,tip=False):
    with open(logfile) as f:
        lines = f.readlines() #Lesen Sie alles bis zum Ende der Datei Zeile für Zeile(Enthält Zeilenvorschubzeichen)

    rating = initial_rating
    games  = initial_games
    rating_history = initial_rating_history

    for line in lines[1:]:
        # print(games)

        if len(line) > 10: #Überspringen Sie seltsame Zeilen
         
            roomid  = line.split("|")[0]
            time    = line.split("|")[1]
            rools   = line.split("|")[2]
            players = line.split("|")[3]
            
       #Ohne Glückwünsche
            if tip == False:
                l = re.split('[ ()]', players)
                player1 = l[1]
                player2 = l[4]
                player3 = l[7]
                
            #Wenn es eine Feier gibt
            if tip == True:
                l = re.split('[ (,)]', players)
                player1 = l[1]
                player2 = l[5]
                player3 = l[9]

            rate_average = (rating[player1]+rating[player2]+rating[player3])/3.0
            rate_average = round(rate_average,3)
            if rate_average < 1500.0:
                rate_average = 1500.0

            #Korrektur der Übereinstimmungsnummer
            if games[player1] < 400:
                games_correction1 = 1.0 - games[player1]*0.002
            if games[player1] >= 400:
                games_correction1 = 0.2
            if games[player2] < 400:
                games_correction2 = 1.0 - games[player2]*0.002
            if games[player2] >= 400:
                games_correction2 = 0.2
            if games[player3] < 400:
                games_correction3 = 1.0 - games[player3]*0.002
            if games[player3] >= 400:
                games_correction3 = 0.2

            #Durchschnittliche R-Korrektur
            averageR_correction1 = (rate_average - rating[player1])/40.0
            averageR_correction2 = (rate_average - rating[player2])/40.0
            averageR_correction3 = (rate_average - rating[player3])/40.0

            #Bewertungsschwankungen
            rate_delta1 = round(games_correction1 * ( 30.0  + averageR_correction1 ) * 1.0, 3) # 1st
            rate_delta2 = round(games_correction2 * ( 0.0   + averageR_correction2 ) * 1.0, 3) # 2nd
            rate_delta3 = round(games_correction3 * ( -30.0 + averageR_correction3 ) * 1.0, 3) # 3rd
            print(rate_delta1,rate_delta2,rate_delta3)

            # Rating
            rating[player1] += rate_delta1
            rating[player2] += rate_delta2
            rating[player3] += rate_delta3

            # Rating History
            rating_history[player1].append(rating[player1]) 
            rating_history[player2].append(rating[player2]) 
            rating_history[player3].append(rating[player3])             

            # Games
            games[player1] += 1
            games[player2] += 1
            games[player3] += 1

    return rating,games,rating_history

R-Fluktuation grafisch darstellen

def rating_plot(rating_history):

    plt.clf()
    names = {"Herr A.":"a","Herr B.":"b","Herr C.":"c","Herr D.":"d"}
    for player in rating_history.keys():
        x = [i for i in range(len(rating_history[player]))]
        y = rating_history[player]
        plt.plot(x,y,linewidth=0.5,alpha=0.5)
        plt.scatter(x[-1],y[-1],label=names[player])
        plt.text(x[-1],y[-1]+5,int(y[-1]))

    plt.legend()
    plt.savefig("rating.png ")

Ausführen (Test in lokaler Umgebung)

if __name__ == "__main__":
    r,g,h = initialize_rating("rating.txt")
    r,g,h = calc_rating(r,g,h,"logvol1.txt",tip=False)
    r,g,h = calc_rating(r,g,h,"logvol2.txt",tip=True)
    r,g,h = calc_rating(r,g,h,"logvol3.txt",tip=True)

    rating_plot(h)

Ausgabeergebnis

Implementierung auf LINE Bot

tenhoulinebot.py



(Unterlassung)
    import download4
    import rating.calc_rating as cr
(Unterlassung)
    elif postbackdata == "request_rating":
        download4.download("/logvol1.txt","rating/logvol1.txt")
        download4.download("/logvol2.txt","rating/logvol2.txt")
        download4.download("/logvol3.txt","rating/logvol3.txt")
        
        initial_rating,initial_games,initial_rating_history = cr.initialize_rating("rating/rating.txt")
        r,g,h = cr.calc_rating(initial_rating,initial_games,initial_rating_history,"rating/logvol1.txt",tip=False)
        r,g,h = cr.calc_rating(r,g,h,"rating/logvol2.txt",tip=True)
        r,g,h = cr.calc_rating(r,g,h,"rating/logvol3.txt",tip=True)
        cr.rating_plot(h)

        bucket.upload_file("rating.png ", "rating.png ")
        s3_image_url = s3_client.generate_presigned_url(
            ClientMethod = 'get_object',
            Params       = {'Bucket': aws_s3_bucket, 'Key': "rating.png "},
            ExpiresIn    = 600,
            HttpMethod   = 'GET'
        )

        line_bot_api.reply_message(
            event.reply_token,
            ImageSendMessage(
                original_content_url = s3_image_url,
                preview_image_url    = s3_image_url,
            )
        )
        download4.upload("rating.png ","/rating.png ")  


P.S.

Der Mahjong dieser Saison ist in sehr gutem Zustand. Eine Person gewinnt. Ich möchte die Meisterschaft so wie sie ist gewinnen. Ich würde gerne Tenhos Score-Analyse ausprobieren, aber das mjlog-Format (xml) ist schwierig. .. .. Lass es mich wissen, bitte. .. ..

Recommended Posts

Erstellen Sie eine automatische Klassenverwaltungs-App für Tenho Private Room mit LINE Bot und Python Part 1
Erstellen Sie mit LINE Bot und Python Part 2 eine automatische Klassenverwaltungs-App für Tenho Private Room
Erstellen Sie eine automatische Klassenverwaltungs-App für Tenho Private Room mit LINE Bot und Python Part ③
Erstellen Sie mit Minette für Python einen LINE BOT
Erstellen Sie eine englische Wort-App mit Python
Erstellen Sie eine App, die Schüler mit Python errät
Lassen Sie uns eine App erstellen, die ähnliche Bilder mit Python und Flask Part2 durchsuchen kann
[LINE Messaging API] Erstellen Sie einen Papageienrückgabe-BOT mit Python
Erstellen Sie eine App für maschinelles Lernen mit ABEJA Platform + LINE Bot
Erstellen Sie LCD-Spiele (16x2) mit Raspberry Pi und Python
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Erstellen Sie eine gestreifte Illusion mit Gammakorrektur für Python3 und openCV3
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Automatisches FX-Handelssystem mit Python und genetischem Algorithmus Teil 1
Erläuterung zum Erstellen einer Anwendung zum Anzeigen von Bildern und Zeichnen mit Python
FM-Modulation und Demodulation mit Python Part 3
Erstellen Sie schnell eine Excel-Datei mit Python #python
Erstellen und entschlüsseln Sie Caesar-Code mit Python
[Python] [LINE Bot] Erstellen Sie einen LINE Bot mit Papageienrückgabe
FM-Modulation und Demodulation mit Python Part 2
[Python] Erstellen Sie schnell eine API mit Flask
[LINE WORKS-Version Trello Bot] So erstellen Sie einen privaten Gesprächsraum mit einem Gesprächsbot