League of Legends APIを使って機械学習をやってみる2

#今回の目的
前回は1つのゲームについてどんな情報が記録されているかを確認しました。
機械学習をやるためには大量のゲームデータが必要になので今回はこのゲームデータを入手します。


#方針
前回は以下のコマンドでゲームデータを取得しました。
`watcher.match.by_id(my_region,210876606)`
「210876606」はゲームごとに与えられているIDでこれが大量に欲しいのですが、APIで直接このIDを手に入れる手段がありませんでした。
そのため、ユーザーの過去マッチからIDを入手→各IDのゲームに参加していたユーザーをリストに追加→ユーザーリストの過去マッチからゲームIDを入手。という形でゲームIDを入手します。

#手順

モジュールのインストール

```python
from riotwatcher import RiotWatcher, ApiError
watcher = RiotWatcher('APIキー')
#リクエストの待機用
import time
#ローカルへの保存用
import pickle
#保存したファイルリストの呼び出し用
import glob
```

###まずは一人分のゲームIDを取り出す

```python
my_region = 'jp1'
summoner = 'riyokuhi'
me = watcher.summoner.by_name(my_region, summoner)
matches = watcher.match.matchlist_by_account(my_region,me['accountId'])['matches']
gamelist=[]

for i in range(len(matches)):
    #ソロキューランク戦のみ取り出す
    queue = recentmatchlists['matches'][i]['queue']
    if queue == 420:
        game = recentmatchlists['matches'][i]['gameId']
        gamelist.append(game)
    
print(gamelist)
```
`[209518596, 209092616, 209256458, 209354763, 209223696, 209944592, 209649683, 210108443, 210108444, 209453085, 209256479, 209682463, 209682466, 210010148, 209944613, 209944617, 209649707, 209420334, 209518639, 209059888, 210042933, 209289270, 209682486, 209649719, 209485878, 209256511,`
以下略

###取り出したゲームIDリストからユーザーIDを取り出す

```python
userIDlist =[]

for i in gamelist:
    match_detail = watcher.match.by_id(my_region, i)
    for i in range(10):
        userIDlist.append(match_detail['participantIdentities'][0]['player']['currentAccountId'])
    #1リクエストごとに5秒待機
    time.sleep(5)
userIDlist = set(userIDlist)
print(userIDlist)
```

`{'Pkhvr9RSoguiWhKJMOUVsjbj9o82k1AK3ctgDp62DKpON-oxS5ktbM5r', '1z7DgoRp2NeFO46JZ6ZOwm10Mo6RsigrHSj8JK-O5buM2Do', 'O4R3dcq7wbo6eYStOFWtvGkmGf65dYZauw8LlCgXg_d0oNI'`
以下略

###ユーザーリストから再びゲームIDを取り出す

```python
#１ユーザーの過去ランク戦のゲームIDを取得する関数
def get_game_id_by_player(currentAccountId,slp):
    local_gamelist = []
    try:
        recentmatchlists = watcher.match.matchlist_by_account(my_region,currentAccountId)
        time.sleep(slp)
        COUNT = len(recentmatchlists['matches'])
        for i in range(COUNT):
            queue = recentmatchlists['matches'][i]['queue']
            if queue == 420:
                game = recentmatchlists['matches'][i]['gameId']
                local_gamelist.append(game)
        return(local_gamelist)
    except:
        time.sleep(slp)
        

#ユーザーリスト内の全プレイヤーのランク戦ゲームIDを取得
gameset = set([])

for i in userIDlist :
    local_gamelist = get_game_id_by_player(i,5)
    for j in local_gamelist:
        #古いゲームデータは除外する
        if j >= 210000000:
            gameset.add(j)

gamelist = list(gameset)
print(gamelist)
```
`[210808834, 210812935, 210413581, 210092046, 210348046, 210040853, 211003414, 210343960, 210794522, 210958371, 210475044, 211372072, 211038248,`
以下略

このユーザーIDとゲームIDの取り出しを繰り返すことでゲームデータを集めます。

##データのローカルへの保存
```python
#filenameにゲームIDを含めた任意の名前を指定してゲームデータを保存する
for i in gamelist:
    try:    
        filename = './gamedata_test/gamedata_' + str(i) + '.txt'
        f = open(filename, 'wb')
        list_row = watcher.match.by_id(my_region,i)
        time.sleep(5)
        pickle.dump(list_row, f)
    except:
        time.sleep(5)
```

##保存したデータの確認

```python
gamelist = glob.glob('gamedata_test\*')
f = open(gamelist[0],"rb")
game = pickle.load(f)
print(game)
```
`{'gameId': 210040853, 'platformId': 'JP1', 'gameCreation': 1570839777783, 'gameDuration': 1527, 'queueId': 420, 'mapId': 11, 'seasonId': 13, 'gameVersion': '9.20.292.2452', 'gameMode': 'CLASSIC', 'gameType': 'MATCHED_GAME', 'teams': [{'teamId': 100, 'win': `
以下略

これでゲームデータをローカルに保存することができました。

##注意点
RiotAPIには以下の制限があるのでリクエストごとに待機時間を十分とる必要があります。
1秒ごとに20リクエスト
2分ごとに100リクエスト
またこの方法でゲームデータを取得すると最初に指定したプレイヤーのランク帯にデータが偏るため、
複数のランク帯のデータが欲しい場合最初のプレイヤーを変えて何度も実行する必要があります。

#おわりに
今回で大量のゲームデータが手に入ったため次回機械学習で予測をしてみたいと思います。