見出し画像

スプラ2リザルトのデータセット作成

ikaWidget 2(App Store / Google Play) に記録したリザルトを、データセット (CSVファイル) に変換してみた。この形にすることで、統計解析や機械学習に使える
Google Colaboratory (Google Colab) を利用してブラウザ上でPythonを実行してGoogle Drive上にCSVファイルを作成した。

ipynbファイル (この記事と同内容, Google Driveへコピーしたら実行可能)
https://colab.research.google.com/drive/1KbIpovBXKWU7aYkva8pksiMXyYMo3eFv?usp=sharing

1. ファイルの準備

  1. ikaWidget2のバックアップからikaxファイルを取得

  2. 拡張子変更 : .ikax → .zip

  3. zipファイル内からrealmファイルをコピー

  4. Realm Studioで開く

    • Playerクラスなど不要なデータを削除

    • jsonファイルとして保存 (File>Save Data>Json) ※ 数分かかる

  5. jsonファイルをアップロード (同じディレクトリに"stats.json"という名前で)

Realm Studioについて

  • フォーマットが古いというアラート (The Realm file stores data in an outdated format) が出るのでアップグレードして使用 (Upgrade in-place / Backup and upgrade どちらでもOK)

  • 文字数に関するエラー (Invalid string length) が出る場合はプレイヤーの名前リスト (Playerクラス) を削除してリトライ

参考

2. ファイルをアップロード, Googleドライブをマウント

  1. jsonファイルをアップロード (実行するipynbファイルと同じディレクトリに"stats.json"という名前で)

  2. GoogleColabでGoogleドライブをマウントする

参考

# GoogleColabでGoogleドライブをマウント
from google.colab import drive
drive.mount('/content/drive')

3. 欲しいデータを二次元配列に格納

  • 欲しいデータのキーはRealm Studioでrealmファイルを見ながら選定

  • (平日かどうか など検証したい変数を追加するのも良いかも)

# jsonファイルをロード
import json
with open("/content/drive/My Drive/Colab Notebooks/stats.json","r",encoding="utf-8") as json_file:
    result_json = json.load(json_file)

# 出力リスト output の初期化
output = []
output.append(["勝敗", "時刻", "ルール", "ステージ", "ウデマエ", "部屋パワー", "平日", "4時間以内ゲーム数", "直近5試合勝率"])

# 平日判定メソッド
# (引数 time はYYYY-MM-DDThh:mm:ssTZD)
import datetime
def is_weekday(time):
    date = datetime.date(int(time[0:4]), int(time[5:7]), int(time[8:10]))
    hour = int(time[11:13])
    if date.weekday() >= 5 or hour+9 <= 17:  # 土日か17時前なら休日 (日本時間のため+9)
        return 0
    else:
        return 1

# 4時間以内ゲーム数, 直近5試合の勝敗の初期化
last_time = ""
recent_games = 0
recent_wins = [0]

# 1ゲームずつ output に情報追加
for result in result_json["Result"]:
    # 部屋パワー
    if  result["gachiEstimateXPower"] > 0:  # ウデマエX
        room_pw = result["gachiEstimateXPower"]
    elif result["gachiEstimatePower"] > 0:  # ウデマエS+以下
        room_pw = result["gachiEstimatePower"]
    else:
        continue  # 部屋のガチパワーがXパワーが0の場合はそのリザルトの処理をスキップ

    # outputに出力する情報リスト item を追加していく
    item = []

    # 勝敗 (勝利 : 1, 敗北 : 0)
    win = 1 if result["win"] else 0
    item.append(win)

    # 時刻・ルール・ステージ・ウデマエ・部屋パワー
    item.append(result["startTime"])
    item.append(result["game"]["rule"])
    item.append(result["stage"]["name"])
    item.append(result["udemaeName"])
    item.append(room_pw)

    # 平日
    item.append(is_weekday(result["startTime"]))

    # 日別ゲーム数
    if result["startTime"][0:10] == last_time[0:10]:  # 前回が同日
        if int(result["startTime"][11:13]) - int(last_time[11:13]) < 4:  # 4時間以内
            recent_games += 1
    else:
        recent_games = 0
    last_time = result["startTime"]
    item.append(recent_games)

    # 直近5試合の勝率
    item.append(sum(recent_wins)/len(recent_wins))
    recent_wins.append(win)
    if len(recent_wins) > 5:
      del recent_wins[0]

    # 情報リスト item を出力リスト output に追加
    output.append(item)

4. 二次元配列をCSVファイルに出力

Excelで開く場合は データ>データの取得>テキストまたはCSVから (文字コードはUTF-8を指定)

import csv
with open("/content/drive/My Drive/Colab Notebooks/stats.csv", "w") as csv_file:
    writer = csv.writer(csv_file, lineterminator="\n")
    writer.writerows(output)

この記事が気に入ったらサポートをしてみませんか?