Portiert von der R-Sprache von "Sazae-sans Janken Data Analysis" nach Python

Einführung

Ursprünglich lernte ich die R-Sprache, als ich 2013 in der Shizuoka Developers Study Group maschinelles Lernen lernte. Danach lernte ich nur einmal im Jahr "[Sazae-sans Janken Data Analysis]" (http: //yaju3d.hatenablog). .jp / entry / 2017/01/03/134420) ", ich habe gerade R Studio gestartet und ich habe das Gefühl, dass ich mich an die Operation erinnere. Letztes Jahr konnte ich die Python-Entwicklungsumgebung mit Visual Studio Code vorbereiten, also habe ich versucht, sie von der R-Sprache nach Python zu portieren. Ich tat. Das heißt, es war das erste Mal, dass ich ernsthaft mit Python arbeitete, also hatte ich es schwer.

[31.12.2018 Nachtrag] Laut Weißbuch der Winterausgabe 2017 von Sazae-san Janken ist das erste Cool (Quartal) (Januar, April, Juli, Oktober) ) Ist leicht Choki zu bekommen, also habe ich diesmal versucht, es zu integrieren.

Entwicklungsumgebung

Installation

pip install beautifulsoup4
pip install pandasql

Web Scraping

Es war mein erstes Mal, dass ich Web-Scraping mit Python durchgeführt habe, also habe ich danach gesucht und es als Download Sazae's (und Precure) Janken Data gefunden. Das Skript wurde auf Git Hub veröffentlicht, daher habe ich es als Referenz verwendet. Dieses Mal wird Pandas zur Ausgabe in eine CSV-Datei verwendet.

[2018/01/01 postscript] "Sazae-sans Janken-Studien" endete am 25.06.2017, also nach 2017/07 Daten können nicht erhalten werden. Vielen Dank für eine lange Zeit m (_ _) m Die Daten danach werden manuell aus Ergebnisse des Spiels mit Sazae (jährlich) hinzugefügt.

GetSazaeData.py


# -*- coding: utf-8 -*-

#get data from http://www.asahi-net.or.jp/~tk7m-ari/sazae_ichiran.html

'''
Erfassung der Janken-Prognosedaten von Sazae
'''
import urllib.request
import datetime as dt
import bs4 as bs
import pandas as pd

def normalized_year(year):
    '''
Bearbeiten Sie das zweistellige Jahr in das vierstellige Jahr
    '''
    return int(year) + 2000 if year < 91 else int(year) + 1900

def read_data():
    '''
Datenerfassung durch Web Scraping
    '''
    result = []
    response = urllib.request.urlopen('http://www.asahi-net.or.jp/~tk7m-ari/sazae_ichiran.html')
    soup = bs.BeautifulSoup(response, "lxml")

    for i in soup.body.contents[9].contents:
        if i.string and len(i.string.strip()) != 0:
            split = i.strip().split()
            seq = int(split[0][1:-1])
            year, month, day = map(int, split[1].split('.'))
            year = normalized_year(year)
            #the data contain illegal date: 91.11.31 -> 91.12.01
            if year == 1991 and month == 11 and day == 31:
                date = dt.date(year, month + 1, 1)
            else:
                date = dt.date(year, month, day)

            kind, idx = ('-', 9)
            hand = split[2]
            if hand == 'Schmiere':
                kind, idx = ('G', 1)
            if hand == 'Choki':
                kind, idx = ('C', 2)
            if hand == 'Par':
                kind, idx = ('P', 3)

            result.append((seq, year, date, kind, idx))
    result.reverse()

    return result

def main():
    '''
Maine
    '''
    df_data = pd.DataFrame(read_data(), columns=['seq', 'year', 'date', 'kind', 'idx'])
    df_data.to_csv('SazaeData.csv', index=False)

if __name__ == '__main__':
    main()

Sazaes Janken-Vorhersage

Vorhersagealgorithmus aus nächster Nähe

Die von GetSazaeData.py ausgegebene Ausgabe "SazaeData.csv" wird gelesen und die Gewinn- / Verlustergebnisse für die 10 Jahre von 2009 bis 2018 werden ausgegeben. Ich bin anscheinend nicht an die Manipulation von Pandas-Daten gewöhnt, daher verwende ich "pandasql", um Daten mit SQL zu manipulieren. Auch "pysqldf", eine Abzweigung von pandasql, mit der Sie benutzerdefinierte Funktionen verwenden können, ist gut.

main.py


# -*- coding: utf-8 -*-
'''
Sazaes Janken-Vorhersage
'''
import datetime
import pandas as pd
from pandasql import sqldf

def get_guess(fstkind, sndkind, thrkind):
    '''
Nächste Vorhersage
    '''

    guess = 'G'

    if fstkind == 'G':
        guess = 'C'
    elif fstkind == 'C':
        guess = 'G'
    elif fstkind == 'P':
        guess = 'G'

    #Wenn es 2 vorne gibt
    if sndkind != '':
        if sndkind != fstkind:
            #Andere Kombination: Ich erwarte, dass die verbleibenden Hände herauskommen, also werde ich die verbleibenden Hände verwenden
            ptn = fstkind + sndkind
            if ptn in('GC', 'CG'):
                guess = 'C' #Machen Sie es C, indem Sie P erwarten
            elif ptn in('CP', 'PC'):
                guess = 'P' #Machen Sie P mit Gs Erwartung
            elif ptn in('PG', 'GP'):
                guess = 'G' #Machen Sie G mit der Erwartung von C.
        else:
            #Wenn sie gleich sind, erwarte ich, dass sie egoistisch sind, also werde ich verlieren
            if fstkind == 'G':
                guess = 'C' #Machen Sie es C, indem Sie P erwarten
            elif fstkind == 'C':
                guess = 'P' #Machen Sie P mit Gs Erwartung
            elif fstkind == 'P':
                guess = 'G' #Machen Sie G mit der Erwartung von C.

        #Wenn es 3 vorne gibt
        if thrkind != '':
            #Andere Kombination: Ich erwarte, dass die verbleibenden Hände herauskommen, also werde ich die verbleibenden Hände verwenden
            ptn = fstkind + sndkind
            if ptn in('GC', 'CG'):
                guess = 'C' #Da P herauskommt, setzen Sie es auf C.
            ptn = fstkind + sndkind + thrkind
            if ptn in('GCG', 'CGC'):
                guess = 'C' #Machen Sie es C, indem Sie P erwarten
            elif ptn in('CPC', 'PCP'):
                guess = 'P' #Machen Sie P mit Gs Erwartung
            elif ptn in('PGP', 'GPG'):
                guess = 'G' #Machen Sie G mit der Erwartung von C.
            elif ptn in('GGC', 'CCG', 'GCC', 'CGG'):
                guess = 'C' #Machen Sie es C, indem Sie P erwarten
            elif ptn in('CCP', 'PPC', 'PCC', 'CPP'):
                guess = 'P' #Machen Sie P mit Gs Erwartung
            elif ptn in('PPG', 'GGP', 'GPP', 'PGG'):
                guess = 'G' #Machen Sie G mit der Erwartung von C.

    return guess   #Rückgabewert

def get_fight(kind, guess):
    '''
Erstellung von Gewinn- / Verlustfunktionen
    '''

    ptn = kind + guess
    if ptn in('GP', 'CG', 'PC'):
        result = 'win'
    elif kind == guess:
        result = 'draw'
    else:
        result = 'lose'

    return result   #Rückgabewert

def isFirstWeek(value):
    '''
    1,4,7,Beurteilung, ob es die erste Woche von 10 ist
    '''
    date = datetime.datetime.strptime(value, '%Y-%m-%d')
    if((date.month - 1) % 3 != 0):
       return False
      
    day = date.day

    weeks = 0
    while day > 0:
        weeks += 1
        day -= 7

    return (weeks == 1) 

def get_fight_result(df_data):
    '''
Gewinn / Verlust mit historischen Daten pro Jahr
    '''
    result = []
    i = 0
    oldyear = 0
    row = len(df_data)
    while i < row:
        if oldyear != df_data.ix[i, 'year']:
            oldyear = df_data.ix[i, 'year']
            thrkind, sndkind, fstkind = ['', '', '']

        seq = df_data.ix[i, 'seq']
        year = df_data.ix[i, 'year']
        date = df_data.ix[i, 'date']
        kind = df_data.ix[i, 'kind']

        #Holen Sie sich den nächsten Schritt
        guess = get_guess(fstkind, sndkind, thrkind)
        #1,4,7,Es gibt viele Choki in der ersten Woche von 10
        if(isFirstWeek(date)):
            guess = 'G'
        fight = get_fight(kind, guess)
        thrkind, sndkind, fstkind = [sndkind, fstkind, kind]

        result.append((seq, year, date, kind, guess, fight))
        i = i + 1

    return pd.DataFrame(result, columns=['seq', 'year', 'date', 'kind', 'guess', 'fight'])

def get_winning_percentage(df_data):
    '''
Berechnung der jährlichen Gewinnrate
    '''
    result = []
    i = 0
    oldyear = 0
    row = len(df_data)
    while i < row:
        if oldyear != df_data.ix[i, 'year']:
            oldyear = df_data.ix[i, 'year']
            year = oldyear
            draw = df_data.ix[i, 'cnt']
            lose = df_data.ix[i+1, 'cnt']
            win = df_data.ix[i+2, 'cnt']
            rate = round(win / (win + lose), 3)
            result.append((year, win, lose, draw, rate))

        i = i + 1

    return pd.DataFrame(result, columns=['year', 'win', 'lose', 'draw', 'rate'])

def main():
    '''
Maine
    '''
    #Lesen von Sazaes Janken-Daten
    ytbl = pd.read_csv('SazaeData.csv')

    #Gewinn / Verlust mit früheren Daten für 10 Jahre
    pd.set_option("display.max_rows", 100)
    query = "SELECT seq, year, date, kind, idx FROM ytbl WHERE idx<>9 AND year BETWEEN 2009 AND 2018;"
    ytblptn = sqldf(query, locals())
    fighttbl = get_fight_result(ytblptn)
    print(fighttbl)

    #Jährliche Gewinnratenberechnung für 10 Jahre
    query = "SELECT year,fight,COUNT(fight) AS cnt FROM fighttbl GROUP BY year,fight ORDER BY year;"
    fightcnt = sqldf(query, locals())
    ratetbl = get_winning_percentage(fightcnt)
    print(ratetbl)

if __name__ == '__main__':
    main()

Ausgabeergebnis

Weil es lang ist, resultieren 2018 Sazaes Handvorhersage und Sieg / Niederlage

seq year date kind guess fight
443 1364 2018 2018-01-07 C G win
444 1365 2018 2018-01-14 G G draw
445 1366 2018 2018-01-21 C C draw
446 1367 2018 2018-01-28 G C lose
447 1368 2018 2018-02-04 P C win
448 1369 2018 2018-02-11 G G draw
449 1370 2018 2018-02-18 C G win
450 1371 2018 2018-02-25 C C draw
451 1372 2018 2018-03-04 P C win
452 1373 2018 2018-03-11 G P win
453 1374 2018 2018-03-18 G G draw
454 1375 2018 2018-03-25 C G win
455 1376 2018 2018-04-01 C G win
456 1377 2018 2018-04-08 G C lose
457 1378 2018 2018-04-15 P C win
458 1379 2018 2018-04-22 P G lose
459 1380 2018 2018-04-29 C G win
460 1381 2018 2018-05-06 G P win
461 1382 2018 2018-05-13 C C draw
462 1383 2018 2018-05-20 P C win
463 1384 2018 2018-05-27 G P win
464 1385 2018 2018-06-03 C G win
465 1386 2018 2018-06-10 G C lose
466 1387 2018 2018-06-17 P C win
467 1388 2018 2018-06-24 P G lose
468 1389 2018 2018-07-01 C G win
469 1390 2018 2018-07-08 G P win
470 1391 2018 2018-07-15 P C win
471 1392 2018 2018-07-22 G G draw
472 1393 2018 2018-07-29 C G win
473 1394 2018 2018-08-05 C C draw
474 1395 2018 2018-08-12 P C win
475 1396 2018 2018-08-19 G P win
476 1397 2018 2018-08-26 G G draw
477 1398 2018 2018-09-02 P G lose
478 1399 2018 2018-09-09 C G win
479 1400 2018 2018-09-16 G P win
480 1401 2018 2018-09-23 C C draw
481 1402 2018 2018-09-30 P C win
482 1403 2018 2018-10-07 C G win
483 1404 2018 2018-10-14 G P win
484 1405 2018 2018-10-21 P C win
485 1406 2018 2018-11-04 P G lose
486 1407 2018 2018-11-11 C G win
487 1408 2018 2018-11-18 C P lose
488 1409 2018 2018-11-25 G P win
489 1410 2018 2018-12-02 G C lose
490 1411 2018 2018-12-09 P C win
491 1412 2018 2018-12-16 C G win

Gewinn- / Verlustergebnisse für 2009-2018

year win lose draw rate
0 2009 32 5 12 0.865
1 2010 27 6 14 0.818
2 2011 30 8 12 0.789
3 2012 27 12 10 0.692
4 2013 26 11 12 0.703
5 2014 32 8 11 0.800
6 2015 34 8 8 0.810
7 2016 26 12 12 0.684
8 2017 34 8 6 0.810
9 2018 30 9 10 0.769

Schließlich

Datenrahmen in R-Sprache können auch einfach mit Pythons Pandas portiert werden. sqldf könnte auch durch pandasql ersetzt werden. Wenn überhaupt, war es schwieriger, die Warnfehler in Pylint durch Visual Studio Code zu reduzieren. Selbst wenn ich nach dem Fehlerinhalt gesucht habe, konnte ich die auf Japanisch geschriebene Site nicht erreichen, daher habe ich sie behoben, während ich den englischen Text verstanden habe. Sie müssen die Namenskonventionen von Python verstehen.

Referenz

Recommended Posts

Portiert von der R-Sprache von "Sazae-sans Janken Data Analysis" nach Python
[Python] Fluss vom Web-Scraping zur Datenanalyse
[Python] Von der morphologischen Analyse von CSV-Daten bis zur CSV-Ausgabe und Diagrammanzeige [GiNZA]
Meteorologie x Python ~ Von der Wetterdatenerfassung bis zur Spektrumanalyse ~
Python, um von einer anderen Sprache zu wechseln
Empfohlene Bücher und Quellen für die Datenanalyseprogrammierung (Python oder R)
So vermeiden Sie doppelte Daten bei der Eingabe von Python in SQLite.
Einführung in die Datenanalyse mit Python P17-P26 [ch02 1.usa.gov Daten von bit.ly]
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
[Einführung in Data Scientist] Grundlagen von Python ♬
Vergleich von R, Python, SAS, SPSS aus Sicht europäischer Datenwissenschaftler
Übertragen Sie Gleitkommadaten von Python ohne Ziffernverlust nach JavaScript
Datenanalyse Python
Portierte einen naiven Homebrew-Sprachcompiler nach Python
[Python] Lesen von Daten aus CIFAR-10 und CIFAR-100
Aufgezeichnete Umgebung für die Datenanalyse mit Python
Datenanalyse in Python Zusammenfassung der Quellen, die Anfänger zuerst betrachten sollten
Organisieren Sie Python-Tools, um die anfängliche Bewegung von Datenanalyse-Wettbewerben zu beschleunigen
Datenanalyse mit Python 2
Die Wand beim Ändern des Django-Dienstes von Python 2.7 auf Python 3-Serie
Zusammenfassung der Tools, die zum Analysieren von Daten in Python benötigt werden
Beispiel für die Anwendung von Python auf das Engineering: Ermitteln von Parametern der ungefähren Berechnungsformel aus tatsächlichen Daten
[Python] [Word] [python-docx] Einfache Analyse von Diff-Daten mit Python
[Für Anfänger] So studieren Sie den Python3-Datenanalysetest
So kratzen Sie Bilddaten von Flickr mit Python
Änderungen von Python 3.0 zu Python 3.5
Änderungen von Python 2 zu Python 3.0
Datenanalyse Übersicht Python
[Von Zeit zu Zeit aktualisiert] Python-Memos, die häufig für die Datenanalyse verwendet werden [N-Division usw.]
[Kapitel 5] Einführung in Python mit 100 Klopfen Sprachverarbeitung
Lesehinweis: Einführung in die Datenanalyse mit Python
Einführung in die Python-Sprache
Verwendung von Python Kivy ~ ~ Grundlagen der Kv-Sprache ~
Fordern Sie die Hauptkomponentenanalyse von Textdaten mit Python heraus
Senden Sie Daten von Python über die Socket-Kommunikation an Processing
[Impression] [Datenanalyse ab Null] Einführung in die Python-Datenwissenschaft in Geschäftsfällen
Liste des Python-Codes, der bei der Big-Data-Analyse verwendet wird
[Kapitel 3] Einführung in Python mit 100 Klopfen Sprachverarbeitung
DataNitro, Implementierung einer Funktion zum Lesen von Daten aus dem Blatt
Python-Datenanalysevorlage
[Kapitel 2] Einführung in Python mit 100 Klopfen Sprachverarbeitung
Verstehen Sie den Status des Datenverlusts - Python vs. R.
[Grundlagen der Datenwissenschaft] Sammeln von Daten aus RSS mit Python
Datenanalyse mit Python
[Technisches Buch] Einführung in die Datenanalyse mit Python -1 Kapitel Einführung-
[Kapitel 4] Einführung in Python mit 100 Klopfen Sprachverarbeitung
Darstellung der Verteilung der Bakterienzusammensetzung aus Qiime2-Analysedaten in einem Box-Whisker-Diagramm
Rufen Sie C-Sprachfunktionen von Python auf, um mehrdimensionale Arrays auszutauschen
SIGNATE Quest ② Von der gezielten Modellerstellung bis zur Erstellung von Übermittlungsdaten
Sprachverarbeitung 100 Schläge-48: Extraktion des Weges von der Nase zur Wurzel
Ich möchte viele Prozesse von Python aus starten
20200329_Einführung in die Datenanalyse mit Python 2nd Edition Personal Summary
Welches sollte ich für die Datenanalyse studieren, R oder Python?
[Python] Extrahieren Sie Textdaten aus XML-Daten von 10 GB oder mehr.
Die Geschichte des Kopierens von Daten von S3 auf Googles TeamDrive
[Einführung in Data Scientists] Grundlagen von Python ♬ Funktionen und Klassen
Drücken Sie in Python auf REST, um Daten von New Relic abzurufen
Vergleich der Datenrahmenbehandlung in Python (Pandas), R, Pig
Gehen Sie zur Sprache, um Teil 8 zu sehen und sich daran zu erinnern. Rufen Sie die GO-Sprache von Python aus auf