import pymongo
from collections import Counter
import re
import pprint
connection = pymongo.Connection('localhost',27017)
db = connection.warskifu
col = db.kifu
MongoDBには事前に「第1回将棋ウォーズ聖帝戦」で100位以内に入ったプレーヤーの棋譜を(だいたい3週間分)取り込んである.情報の取得はイベントが終わってから数時間後である.
col.find().count()
1891
pattern = re.compile(r'%TORYO')
print col.find({'csa':pattern}).count()
1589
pattern = re.compile(r'%TIME_UP')
print col.find({'csa':pattern}).count()
289
pattern = re.compile(r'DRAW_SENNICHI')
print col.find({'csa':pattern}).count()
8
pattern = re.compile(r'ENTERINGKING')
print col.find({'csa':pattern}).count()
4
pp = pprint.PrettyPrinter(indent=4)
pattern = re.compile(r'(TIME_UP)|(TORYO)|(DRAW_SENNICHI)|(ENTERINGKING)')
json = col.find({'csa':{"$not":pattern}})
pp.pprint( list(json) )
[ { u'_id': u'nyupo-jun419-20141025_120928', u'avatar0': u'mc21', u'avatar1': u'_e1409s1b', u'csa': u'+5756FU\nT2\n-3334FU\nT3\n+2858HI\nT1\n-2233KA\nT1\n+7776FU\nT2\n-4344FU\nT2\n+5655FU\nT3\n-8222HI\nT3\n+5948OU\nT4\n-3142GI\nT2\n+5554FU\nT2\n-4152KI\nT7\n+4838OU\nT2\n-5162OU\nT4\n+3828OU\nT9\n-5243KI\nT9\n+5453TO\nT6\n-4253GI\nT1\n+7968GI\nT5\n-6272OU\nT2\n+6877GI\nT7\n-7162GI\nT2\n+7766GI\nT5\n-6364FU\nT1\n+3938GI\nT5\n-6263GI\nT2\n+8786FU\nT3\n-2324FU\nT3\n+8685FU\nT3\n-2425FU\nT1\n+8877KA\nT2\n-1314FU\nT3\n+5888HI\nT7\n-0056FU\nT8\n+0058FU\nT9\n-6171KI\nT2\n+8584FU\nT4\n-8384FU\nT2\n+6675GI\nT5\n-7182KI\nT2\n+1716FU\nT10\n-7374FU\nT3\n+7584GI\nT8\n-0083FU\nT6\n+8495GI\nT6\n-3435FU\nT4\n+4746FU\nT5\n-9394FU\nT2\n+9586GI\nT9\n-2526FU\nT2\n+2726FU\nT2\n-2226HI\nT2\n+0027FU\nT1\n-2624HI\nT2\n+7675FU\nT10\n-7475FU\nT8\n+0084FU\nT7\n-8384FU\nT4\n+8675GI\nT2\n-0074FU\nT3\n+7584GI\nT2\n-0083FU\nT8\n+0073FU\nT6\n-8173KE\nT8\n+8473NG\nT5\n-8273KI\nT1\n+0055KE\nT3\n-0054GI\nT3\n+5543NK\nT8\n-5443GI\nT1\n+4645FU\nT8\n-4445FU\nT2\n+7733UM\nT7\n-2133KE\nT3\n+0051KA\nT8\n-0044KA\nT4\n+0071KI\nT10\n-7282OU\nT2\n+7181KI\nT7\n-8272OU\nT1\n+8171KI\nT9\n-7282OU\nT1\n+7181KI\nT8\n-8272OU\nT2\n+8171KI\nT6\n-7282OU\nT1\n+7181KI\nT2\n-8272OU\nT2\n+8171KI\nT1\nGOTE_WIN_OUTE_SENNICHI', u'dan0': u'\u4e09\u6bb5', u'dan1': u'\u516d\u6bb5', u'date': u'20141025_120928', u'datetime': datetime.datetime(2014, 10, 25, 12, 9, 28), u'gtype': u's1', u'user0': u'nyupo', u'user1': u'jun419'}]
該当する棋譜は1件だけであった.
GOTE_WIN_OUTE_SENNICHI
から察するに,おそらく連続王手で千日手(cf. http://www.shogidojo.com/dojo/faq/draw.htm)になったことによる反則負けだと思われる.
results = []
for data in col.find():
results.append(data['user0'])
results.append(data['user1'])
counter = Counter(results)
id_list = []
for _id, count in counter.most_common():
if count > 80:
print _id, count
1_tsutsukana 261 miya_with_r 113 kumanbou 108 kuropete 107 zomzom082 103 Aokijikuzan 103 pagagm 102 aoba81 100 persona42 97
1_tsutsukana
が1位だった.
1_tsutsukana
は運営が放流している将棋ソフトなので大会のランキングには入っていない.しかし対局数ランキング2位と比べても2倍以上の対局数をこなしている.
%matplotlib inline
import matplotlib.pyplot as plt
dates = [d['datetime'] for d in col.find()]
hist = plt.hist([t.hour for t in dates], bins=range(25))
plt.xlim(0,24)
plt.show()
まず19時から23時までが特に盛り上がっている点からして,プレーヤーには普通の社会人/学生が多いのかなという印象を受ける.
11時の人数が12時より多いのは不思議だ.大抵の場合昼休みは12~13時なので対局は12時に集中しそうな気がするのだが…