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.
pip install beautifulsoup4
pip install pandasql
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()
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()
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 |
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.
Recommended Posts