[PYTHON] Ich analysierte die Rangkampfdaten des Pokemon-Schwertschilds und visualisierte sie auf Tableau

Too Long, Didn’t Read

Hallo, ich frage mich, Shokei, die sich auf diesen Artikel beziehen, Pokemon, verkürzt durch Pokemon (Pokemon · Pokémon ist. Eingetragenes Warenzeichen von Nintendo, Creatures, Game Freak), hat es dort gespielt.

Der zweite Erweiterungs-Patch des neuesten Pocket Monster Sword Shield (allgemein als Schwertschild bekannt), das Kronenschneefeld, wurde letzte Woche am 23. Oktober vertrieben, und viele Pokemon-Trainer sind in dieser Zeit in die Garal-Region zurückgekehrt. nicht wahr.

Wie immer bin ich einer von ihnen und mein geliebtes Pokemon Electric (schwarz und gelb, cooler Typ) Ich habe gehört, dass es möglich sein wird, es zu benutzen, und es fühlt sich so an, als wäre es kurz bevor ich das Spiel auf dem Kopf stehend gestartet habe.

Abgesehen davon hat dieser Arbeitsschwertschild eine Funktion namens Rangübereinstimmung, die Online-Kämpfe zwischen Menschen ermöglicht (die Rangfolge wird durch den Kampfrekord bestimmt, da es sich nur um einen Rang handelt), und es ist der Endinhalt, der das Element dieser Arbeit ist. Ein Monat ist eine Saison, und der Rang wird zurückgesetzt, und das Pokemon, das verwendet werden kann, wird zum Saisonwechsel geändert, und die Umgebung ändert sich in jeder Saison stark, was einen großen Unterschied zum Bewertungsspiel der vergangenen Arbeit darstellt.

Wie ich bereits erwähnt habe, habe ich Pokemon schon lange nicht mehr berührt, seit ich mich auf einer isolierten Rüstungsinsel niedergelassen habe (dem ersten Erweiterungsfeld), also dem Trend und dem sogenannten "[Meta] im Rangmatch des Pokemon-Schwertschilds, wo sich die Umgebung schnell ändert. ](Https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF) ”ist nicht bekannt, daher ist es schwierig, eine Strategie zu formulieren.

Wie Sie wissen, werden nach der Verbreitung von Pokemon HOME im Februar dieses Jahres kampfbezogene Daten in der Smartphone-Versionsanwendung veröffentlicht. Es ist jetzt möglich, Informationen wie die Top-10-Rekrutierungsraten und die Art der Techniken, an die Sie sich erinnern, zu sammeln.

Ich hatte jedoch das Gefühl, dass es nicht genug war. Ist es möglich, etwas zu machen, das umfassender ist und "Tier" mehr widerspiegelt? Ein solches Problembewusstsein ist die Hauptmotivation für den Beginn dieses Artikels.

Goal

Fertige Sache (Spoiler)

Tableau Public

gif2.gif

Ziele setzen

Der Ausgangspunkt ist diesmal

war.

Der Landepunkt ist also

Es scheint so als.

Problemlösung

Um jedoch "die Trends und Meta jeder Saison zu erfassen", was das Ziel dieses Buches ist, müssen wir uns anscheinend auf die Daten von Pokemon HOME verlassen. Die von Pokemon nach außen veröffentlichten kampfbezogenen Daten sind meine eigenen. Soweit ich weiß, ist das alles.

Wenn Sie sich auf [Pionier, der Rang-Match-Kampfdaten von der API erhalten hat] beziehen (https://qiita.com/retrorocket/items/3cae6f156bdd3d288515), können anscheinend Pokemon HOME + α-Daten abgerufen werden.

Dieses Mal werde ich die daraus gewonnenen Daten verarbeiten, um sie sichtbar zu machen, damit so etwas wie "Tier" verstanden werden kann (Verschiedenes).

Ich denke, es gibt verschiedene Visualisierungsmethoden, aber ich habe mich für Tableau Desktop entschieden, nachdem ich den Komfort des interaktiven Betriebs, der guten Grafik und der zahlreichen Funktionen (oder besser gesagt, die meinen Geschmack widerspiegeln) umfassend bewertet habe. ..

Ich werde dieses Ziel noch einmal vorstellen.

Let's Try it

1. Über API

Informationen zum Herunterladen der folgenden Daten finden Sie im Artikel @retrorocket (07. Juni 2020). Bitte lesen Sie hier für Details.

curl 'https://api.battle.pokemon-home.com/cbd/competition/rankmatch/list' \
  -H 'accept: application/json, text/javascript, */*; q=0.01' \
  -H 'countrycode: 304' \
  -H 'authorization: Bearer' \
  -H 'langcode: 1' \
  -H 'user-agent: Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Mobile Safari/537.36' \
  -H 'content-type: application/json' \
  -d '{"soft":"Sw"}'

Die Antwort, die von der obigen API-Anfrage erhalten wurde, enthält Informationen zur Rangübereinstimmungssaison.


{
  "code": 200,
  "detail": 0,
  "list": {
    "7": {
      "10072": {
        "name": "Staffel 7",
        "start": "2020/06/01 13:00",
        "end": "2020/07/01 08:59",
        "cnt": 147244,
        "rule": 1,
        "season": 7,
        "rst": 0,
        "ts1": 1591187503,
        "ts2": 1591187515,
        "reg": "000000248"
      },
      "10071": { //Einzelne Kampf-ID
        "name": "Staffel 7",
        "start": "2020/06/01 13:00",
        "end": "2020/07/01 08:59",
        "cnt": 147202,
        "rule": 0,
        "season": 7,
        "rst": 0,
        "ts1": 1591187503,
        "ts2": 1591187515,
        "reg": "000000247"
      }
    }, //Folgendes wird weggelassen
}

Der Wert der Saison-ID und der ersten usw. ist hier enthalten

'https://resource.pokemon-home.com/battledata/ranking/{season_iduschwifff//strr.

Sie können Daten von Pokemon HOME abrufen, indem Sie in die API eintauchen und darauf klicken.

2. Daten herunterladen

Es ist ein richtig geschriebener Code, also keine Angst

(Der Ordner "resources" und der Ordner "resources \ split" werden vorab im aktuellen Verzeichnis erstellt.)

import urllib.request
import json
import datetime
import os

def load_ids():
    ids = "";
    #Laden Sie den aus der vorherigen API-Anforderung erhaltenen JSON
    with open(ID_FILEPATH, 'r', encoding='utf-8') as json_open:
        return json.load(json_open)

def check_dir(path):
    if not os.path.isdir(path):
        os.makedirs(path)

def get_response(url, file_name):
    try:
        with urllib.request.urlopen(url) as response:
            body = json.loads(response.read())
            with open(f'resources//split//{file_name}', 'w') as f:
                json.dump(body, f, indent=4)
        return True
    except urllib.error.URLError as e:
        print(e.reason)
        return False

def make_json(ids):
    for season_number in ids['list'].keys():
        for  season_id in ids['list'][season_number].keys():
            rst = ids['list'][season_number][season_id]['rst']
            ts2 = ids['list'][season_number][season_id]['ts2']
            for i in range(1,6,1):
                url = f'https://resource.pokemon-home.com/battledata/ranking/{season_id}/{rst}/{ts2}/pdetail-{i}'
                file_name = f'Season{season_number}_{"Single" if season_id[4]=="1" else "Double"}_{i}.json'
                if get_response(url, file_name):
                    with open('log', 'a') as f:
                        print(f'{datetime.datetime.now()} | Generated: {file_name}', file=f)

def merge_json(ids):
    for i in ids['list'].keys():
        for j in ids['list'][i].keys():
            rule = "Single" if j[4] == '1' else "Double"
            files = []
            for n in range(1,6,1):
                with open(f'.//resources//split//Season{i}_{rule}_{n}.json', 'r', encoding='utf-8') as json_open:
                    files.append(json.load(json_open))
            jsonMerged = {**files[0], **files[1], **files[2], **files[3], **files[4]}
            file_name = f'Season{i}_{rule}_master.json'
            with open(f'resources//{file_name}', 'w') as f:
                json.dump(jsonMerged, f, indent=4)
            with open('log', 'a') as f:
                print(f'{datetime.datetime.now()} | Merged   : {file_name}', file=f)

if __name__ == "__main__":
    ids = load_ids()
    #Bitte geben Sie hier Ihr Lieblingsverzeichnis an
    for path in ['.//resources', './/resources//split']:
        check_dir(path)
    make_json(ids)
    merge_json(ids)
    print('Suceeded')

Durch Ausführen des obigen Skripts wird die JSON-Datei mit den Kampfdaten von Staffel 1 bis zur letzten Staffel gespeichert.

Das Problem ist jedoch, dass die JSON-Datei jede Saison in 5 Teile unterteilt wird, was sehr problematisch ist.

Lassen Sie uns sie in einer Datei pro Saison zusammenführen.

def merge_json(ids):
    for i in ids['list'].keys():
        for j in ids['list'][i].keys():
            rule = "Single" if j[4] == '1' else "Double"
            files = []
            for n in range(1,6,1):
                with open(f'.//resources//split//Season{i}_{rule}_{n}.json', 'r', encoding='utf-8') as json_open:
                    files.append(json.load(json_open))
            jsonMerged = {**files[0], **files[1], **files[2], **files[3], **files[4]}
            with open(f'resources//Season{i}_{rule}_merged.json', 'w') as f:
                json.dump(jsonMerged, f, indent=4)


ids = "";
with open(ID_FILEPATH, 'r', encoding='utf-8') as json_open:
    ids = json.load(json_open)

make_jsonchunk(ids)

Damit hätte die große Anzahl der zuvor erwähnten JSON-Dateien einzeln aggregiert werden müssen.

Der Inhalt dieses JSON ist wie folgt.

//Diesmal pokemon one kombiniert json der passenden Jahreszeit.Benannt json
// .\Datachunk\pokemon.json
{
    "Bilderbuchnummer" : {
        "p_detail_id":{
            "temoti":{
                //Top 10 Techniken verwendet
                "waza":[
                    {
                        "id":"xxxx",
                        "val":"value"  //Rekrutierungsrate, Prozentsatz
                    },
                    ...
                ],
                //Angenommene Eigenschaften
                "tokusei":[
                    {
                        "id": "xxxx",
                        "val": "value" //Rekrutierungsrate, Prozentsatz
                    },
                    ...
                ],
                //Top 10 Pokemon in deinen Sachen
                "motimono": [
                    {
                        "id": "xxxx",
                        "val": "value" //Rekrutierungsrate, Prozentsatz
                    },
                    ...
                ],
                //Top 10 Pokemon im Kampfteam zusammen
                "pokemon": [
                    {
                        "id": "xxxx",
                        "form": "value" //Bilden
                    },
                    ....
                ]
            },
            "lose": {
                //Top 10 Techniken, um dieses Pokémon zu besiegen
                "waza": [
                    {
                        "id": "xxxx",
                        "val": "value" //Prozentsatz
                    },
                    ...
                ],
                //Top 10 Pokemon, die dieses Pokemon besiegt haben
                "pokemon": [
                    {
                        "id": "xxxx",
                        "form": "value" //Bilden
                    },
                    ...
                ],
            },
            "win": {
                //Top 10 Techniken von diesem Pokemon besiegt
                "waza": [
                    {
                        "id": "xxxx",
                        "val": "value" //Prozentsatz
                    },
                    ...
                ],
                //Top 10 Pokemon von diesem Pokemon besiegt
                "pokemon": [
                    {
                        "id": "xxxx",
                        "form": "value" //Bilden
                    },
                    ...
                ]
            }
        }
    }
}

Es scheint, dass Sie verschiedene Informationen erhalten können, wie z. B. Techniken, die für Pokemon außerhalb des TOP10 verwendet werden, und Pokemon, die zusammen verwendet werden und bei Pokemon HOME nicht erhältlich sind.

Zusammenfassend können folgende Daten erfasst werden

  1. Top 10 Techniken verwendet
  2. Angenommene Merkmale
  3. Top 10 Pokemon in deinen Sachen
  4. Top 10 Pokémon, die zusammen im Kampfteam enthalten sind
  5. Top 10 Techniken, um dieses Pokémon zu besiegen
  6. Top 10 Pokemon, die dieses Pokemon besiegt haben
  7. Top 10 Techniken, die von diesem Pokémon besiegt wurden
  8. Top 10 Pokemon von diesem Pokemon besiegt

Nutzen Sie diese Daten vollständig und versuchen Sie, die plausibelste Stufe zu berechnen.

Diesmal ist die Tier-Berechnungsmethode jedoch nicht das Hauptthema, daher werde ich einen Index betrachten, der ein solches Ergebnis zu liefern scheint.

3. Stufenauswahl

--Problem: Ich möchte, dass Pokemon mit einer hohen Rekrutierungsrate für Parteien und einer hohen Auswahlrate an die Spitze kommt.

Wie man Meta berechnet

Denken Sie aus dem Meta

Tier 1, dh Umgebung Top-Meta Bezieht sich auf das stärkste und beliebteste Pokemon, daher erstellen wir einen Index, der sich auf "stark" und "modisch" konzentriert.

"stark"

Die Daten, die ich dieses Mal habe, beinhalten "Top 10 Pokemon, die dieses Pokemon besiegt haben". Die Anzahl der Niederlagen und die Anzahl der Gegner, die besiegt werden können, ersetzen die Stärke des Pokémon in der Umgebung.

"Ist in Mode"

Der intuitivste Indikator für "beliebte" Kriterien ist die Rekrutierung von Parteien. Diesmal sind die Daten jedoch nicht verfügbar und sollten durch andere Kriterien ersetzt werden. Da diese Daten "Top 10 Pokemon, die mit diesem Pokemon verwendet werden" enthalten, haben wir uns entschlossen, das Pokemon, das von einer Vielzahl von Parteien verwendet wird, aus den auf diesen Daten basierenden Rangdaten zu berechnen. .. Darüber hinaus wird davon ausgegangen, dass die Anzahl der Auswahlen proportional zur Anzahl der oben genannten Niederlagen zunimmt, sodass die Rekrutierungsrate der Partei allein als Index dafür verwendet wird, ob sie "beliebt" ist oder nicht.

Versuch

Bibliotheksimport

import json
import csv
import pandas as pd
from sklearn import preprocessing

Daten gelesen

pokedex = "";
with open('.//Datachunk//bundle.json', 'r', encoding='utf-8') as json_open:
    pokedex = json.load(json_open)

pokedex = "";
with open('.//Datachunk//bundle.json', 'r', encoding='utf-8') as json_open:
    pokedex = json.load(json_open)

pdetail = "";
with open('.//Datachunk//pokemon.json', 'r', encoding='utf-8') as json_open:
    pdetail = json.load(json_open)

Dateiausgabefunktion

def make_csv(pdetail, filename, method = 'temoti'):
    # method = 'temoti', 'win', 'lose'
    write_csv(["Book Number","Pokemon", "component", "value_or_rank"], filename, "w")
    for pokenum in  list(pdetail.keys()):
        for p_detail_id in list(pdetail[pokenum].keys()):
            t_name = get_pokemonname(pokenum, p_detail_id)
            for rank, poke_associations in enumerate(list(pdetail[pokenum][p_detail_id][method]['pokemon'])):
                a_name = get_pokemonname(poke_associations['id'], poke_associations['form'])
                write_csv([pokenum, t_name, a_name, rank+1] , filename, "a")

Trendindexberechnung & Ausgabefunktion

def make_index(filename):
    df = pd.read_csv(filename, encoding='utf-8')
    concated_df1 = df.groupby('component', as_index=False)['value_or_rank'].mean()
    concated_df1.columns = ['Pokemon', 'RankAverage']

    concated_df2 = df.groupby('component', as_index=False)['value_or_rank'].sum()
    concated_df2.columns = ['Pokemon', 'Top10Count']

    concat_df = pd.concat([concated_df1,concated_df2], axis = 1, join = 'inner')
    concat_df =pd.concat([concated_df1[concated_df1.columns[0]], \
                concat_df.drop(concat_df.columns[2], axis =1)], axis = 1)

    concat_df['RankAverage_std'] = preprocessing.minmax_scale(concat_df['RankAverage'])
    concat_df['Top10Count_std'] = preprocessing.minmax_scale(concat_df['Top10Count'])

    concat_df['Crt'] = concat_df["RankAverage"] * concat_df["Top10Count"]
    concat_df['Crt_by_std'] = concat_df['RankAverage_std'] * concat_df['Top10Count_std']
    return concat_df.sort_values('Crt', ascending = False)

Lauf

make_csv(pdetail, "test1.csv", 'lose')
make_index('test1.csv').to_csv('test2.csv', index=False)
Pokémon Durchschnittliches Rekrutierungsranking Rekrutierungsranking TOP10 zählen RankAverage_std Top10Count_std Crt Crt_by_std
Drews 4.863158 462 0.429240 0.956432 2246.778947
Loebsin 5.742424 379 0.526936 0.784232 2176.378788
Samayor 4.747368 451 0.416374 0.933610 2141.063158
... ... ... ... ... ...

スクリーンショット_2020_10-27_185731.png

* Hinweis: Das Obige wird aus Doppelkampfdaten erstellt

Es scheint, dass die Kämpfe Rob Singhs Wahl in dieser Saison waren.

Ich habe das Gefühl, dass es grob reflektiert werden kann.

Berechnung des Meta-Index

Der Meta-Index wird aus der normalisierten [Anzahl besiegbarer Feinde] * [Rang] berechnet.

Das Ergebnis wurde von derselben Funktion wie zuvor ausgegeben.

スクリーンショット_2020_10_28_043415.png

Die Anzahl der im Ranking aufgeführten Pokémon war geringer als das Rekrutierungsranking. Es ist ein wenig überraschend, dass Laplace der größte war, aber ich denke, es ist doppelt.

Es ist eine zu grobe Berechnungsmethode, aber ich probiere Dinge aus, deshalb habe ich beschlossen, diese beiden Indikatoren vorerst zu verwenden.

Visualisierung

Streudiagramm

Ich werde darüber schreiben, wie man die Form im Streudiagramm eines Tages in eine beliebige Form bringt, weil sie vom Hauptthema abweicht.

Weitere Informationen zu dringenden Informationen finden Sie unter hier.

Ich habe mir auch das Pokemon-Symbol [hier] ausgeliehen (https://github.com/msikma/pokesprite).

スクリーンショット_2020-10-29_205435.png

Clustering

Ich habe die Anzahl der Cluster auf 10 gesetzt und versucht, Cluster zu erstellen. Es scheint, dass ich eine Stufe hinzufügen kann (ich fühle).

スクリーンショット_2020-10-29_205057.png

Jahreszeit Regel Pokémon Durchschnittliches Rekrutierungsranking Rekrutierungsranking TOP10 zählen RankAverage_std Top10Count_std Crt Crt_by_std
Staffel 1 Single Drews 4.863158 462 0.429240 0.956432 2246.778947
Staffel 1 Single Loebsin 5.742424 379 0.526936 0.784232 2176.378788
Staffel 1 doppelt Samayor 4.747368 451 0.416374 0.933610 2141.063158
Staffel 2 Single ... ... ... ... ... ...

Datengenerierung

Der vorherige Index wird für alle Jahreszeiten sowohl für Einzel als auch für Doppel ausgegeben. Sie können es einzeln von Hand tun, aber es ist mühsam, also bereiten Sie ein Programm vor.

def Rename(x):
    for key in rename_dict.keys():
        if x[2] == key:
            x[2] = rename_dict[key]
    return x[2]

rename_dict = {'Nyaonics':'Nyaonics♂',
'Gilgard':'Gilgard盾',
'Hihi Dharma':'Hihi DharmaN',
'Basrao':'Basrao赤',
'Lugargan':'Lugargan昼',
'Metheno':'Metheno(Meteor)',
'Yessan':'Yessan♂'}

Abgesehen davon verwende ich diese Funktion, um sie umzubenennen, da die Visualisierung auf Tableau etwas schwierig ist. Ich werde es diesmal nicht anfassen, also hoffe ich, dass Sie denken können "Ich ändere den Namen nicht".

def cal_crt(df, method='temoti'):
    if method == 'temoti':
        row_name = "Epidemie-Index"
    elif method == 'win':
        row_name = 'Meta-Index'

    concated_df1 = df.groupby('B', as_index=False)['value'].mean()
    concated_df1.columns = ['Pokemon', 'RankAverage']

    concated_df2 = df.groupby('B', as_index=False)['value'].sum()
    concated_df2.columns = ['Pokemon', 'Top10Count']

    concat_df = pd.concat([concated_df1,concated_df2], axis = 1, join = 'inner')
    concat_df =pd.concat([concated_df1[concated_df1.columns[0]], \
                concat_df.drop(concat_df.columns[2], axis =1)], axis = 1)

    concat_df['RankAverage_std'] = preprocessing.minmax_scale(concat_df['RankAverage'])
    concat_df['Top10Count_std'] = preprocessing.minmax_scale(concat_df['Top10Count'])

    concat_df['Crt'] = concat_df["RankAverage"] * concat_df["Top10Count"]
    concat_df[row_name] = concat_df['RankAverage_std'] * concat_df['Top10Count_std']
    df = concat_df.sort_values('Crt', ascending = False)
    return df.drop(['RankAverage', 'Top10Count', 'RankAverage_std', 'Top10Count_std', 'Crt'], axis=1)
def get_name(num, p_detail_id, method='pokemon'):
    if method == 'pokemon':
        name = ''
        if num == "876":
            if p_detail_id == "0":
                name = "Yessan ♂"
            else:
                name = "Yessan ♀"
        elif num == "479":
            if p_detail_id == "0":
                name = "Rotom (Standard)"
            elif p_detail_id == "1":
                name = "Rotom (Di)"
            elif p_detail_id == "2":
                name = "Rotom (Mittwoch)"
            elif p_detail_id == "3":
                name = "Rotom (Eis)"
            elif p_detail_id == "4":
                name = "Rotom (fliegend)"
            elif p_detail_id == "5":
                name = "Rotom (Gras)"
        else:
            name = pokedex['poke'][int(num) -1]
    elif method == 'motimono':
        name = pokedex['item'][num]
    else:
        name = pokedex[method][num]

    return name
def data_trans(pdetail, method1 = 'temoti', method2='pokemon', column =  ["A", "B", "value"]):
    t_names = []
    a_names = []
    ranks = []
    for pokenum in  list(pdetail.keys()):
        for p_detail_id in list(pdetail[pokenum].keys()):
            t_name = get_name(pokenum, p_detail_id, method='pokemon')
            for rank, component in enumerate(list(pdetail[pokenum][p_detail_id][method1][method2])):
                a_name = get_name(component['id'], component[list(component.keys())[1]], method=method2)
                t_names += [t_name]
                a_names += [a_name]
                ranks += [rank+1]
    return pd.DataFrame(
        data = {column[0]: t_names,column[1]: a_names,  column[2]: ranks},
        columns = column
    )
from pathlib import Path
import os
import re
#Wählen Sie Ihr eigenes Verzeichnis
file_dir = ".//resources"
p = Path(file_dir)
files = sorted(p.glob("*"))

Seasons = []
Rules = []
df_master = pd.DataFrame(columns = ['Season', 'Rule', 'Pokemon','Epidemie-Index', 'Meta-Index'])
for rule in ['Single', 'Double']:
    for season_num in range(1,12,1):
        for method in ['temoti', 'win']:
            with open(f'{file_dir}//Season{season_num}_{rule}_master.json', 'r', encoding='utf-8') as json_open:
                data = json.load(json_open)
            if method == 'temoti':
                df_fashion = cal_crt(trans_data(data, method=method), method=method)
            elif method == 'win':
                df_meta =  cal_crt(trans_data(data, method=method), method=method)

        df = pd.merge(df_fashion, df_meta, on='Pokemon', how='outer').fillna(0)

        df['Season'] = season_num
        df['Rule'] = rule

        df_master = pd.concat([df_master, df], axis = 0)

df_master['Pokemon']  = df_master.apply(Rename,axis=1)
df_master.to_csv(f'ALL_SEASON_METAVALUES.csv', index=False)

4. Dashboard

Wir haben uns entschlossen, ein Dashboard zu erstellen, in dem Informationen wie Pokemon angezeigt werden, die leicht übernommen werden können, wenn Sie mit der Maus über das Pokemon im obigen Streudiagramm fahren.

Spezifikationsstudie

Vorerst möchte ich die folgenden Daten anzeigen, die aus Rohdaten gelesen werden können.

  1. Top 10 Techniken verwendet
  2. Angenommene Merkmale
  3. Top 10 Pokemon in deinem Inventar
  4. Top 10 Pokémon, die zusammen im Kampfteam enthalten sind
  5. Top 10 Techniken, um dieses Pokémon zu besiegen
  6. Top 10 Pokemon, die dieses Pokemon besiegt haben
  7. Top 10 Techniken, die von diesem Pokémon besiegt wurden
  8. TOP10 Pokemon von diesem Pokemon besiegt

Datengenerierung

Erstellen Sie CSV, um die Handhabung beim Generieren von Daten zu vereinfachen.

new_dict = {}
for n in pokedex['item'].keys():
    n = int(n)
    if n < 148:
        pass
    elif n < 260:
        id_ = n-143
        new_dict[id_] = pokedex['item'][str(n)]
    elif 264 < n:
        id_ = n-148
        new_dict[id_] = pokedex['item'][str(n)]

pd.DataFrame(new_dict.values(), index=new_dict.keys(), columns = ['item']).to_csv('item_index.csv')

pd.DataFrame(pokedex['waza'].values(), index=pokedex['waza'].keys(), columns = ['waza']).to_csv('skill_index.csv')

pd.DataFrame(pokedex['tokusei'].values(), index=pokedex['tokusei'].keys(), columns = ['tokusei']).to_csv('tokusei_index.csv')

Zur Hand

%%timeit

Seasons = []
Rules = []
column_a = {'waza': 'Techniken mit hoher Akzeptanzrate','pokemon':'Pokemon mit einer hohen Kombinationsrate' , 'tokusei':'Merkmale mit hoher Akzeptanzrate' , 'motimono':'Was mit einer hohen Adoptionsrate zu bringen'}
file_names = {'waza':'ALL_SEASON_SKILL.csv','pokemon':'ALL_SEASON_COMBIND_PARTNER.csv', 'tokusei':'ALL_SEASON_IDIOSYNCRASY.csv', 'motimono':'ALL_SEASON_ITEM.csv'}
for method in column_a.keys():
    df_master = pd.DataFrame(columns = ['Season', 'Rule', 'Pokemon', column_a[method], f'Rank_{column_a[method]}'])
    for rule in ['Single', 'Double']:
        for season_num in range(1,12,1):
            with open(f'{file_dir}//Season{season_num}_{rule}_master.json', 'r', encoding='utf-8') as json_open:
                data = json.load(json_open)
            df = data_trans(data, method2 = method, column = ['Pokemon', column_a[method], f'Rank_{column_a[method]}'])
            df['Season'] = season_num
            df['Rule'] = rule
            
            df_master = pd.concat([df_master, df], axis = 0)
            
    df_master['Pokemon']  = df_master.apply(Change_Name,axis=1)
    df_master.to_csv(file_names[method], index=False)

53.9 s ± 3.33 s per loop (mean ± std. dev. of 7 runs, 1 loop each)

Besiegte Technik und besiegte Pokemon

Zuallererst von der Technik und dem Pokémon, die dieses Pokémon besiegt haben.

%%timeit

Seasons = []
Rules = []
column_a = {'waza': 'Besiegte Technik','pokemon':'Besiegte Pokemon'}
file_names = {'waza':'ALL_SEASON_KNOCKED_SKILL.csv','pokemon':'ALL_SEASON_KNOCKED_BY.csv'}
for method in column_a.keys():
    df_master = pd.DataFrame(columns = ['Season', 'Rule', 'Pokemon', column_a[method], f'Rank_{column_a[method]}'])
    for rule in ['Single', 'Double']:
        for season_num in range(1,12,1):
            with open(f'{file_dir}//Season{season_num}_{rule}_master.json', 'r', encoding='utf-8') as json_open:
                data = json.load(json_open)
            df = data_trans(data,method1='lose', method2 = method, column = ['Pokemon', column_a[method], f'Rank_{column_a[method]}'])
            df['Season'] = season_num
            df['Rule'] = rule
            
            df_master = pd.concat([df_master, df], axis = 0)
            
    df_master['Pokemon']  = df_master.apply(Change_Name,axis=1)
    df_master.to_csv(file_names[method], index=False)

17.6 s ± 1.14 s per loop (mean ± std. dev. of 7 runs, 1 loop each)

Besiegte Technik und besiegter Feind

%%timeit

Seasons = []
Rules = []
column_a = {'waza': 'Besiegte Technik','pokemon':'Besiegte Pokemon'}
file_names = {'waza':'ALL_SEASON_KNOCKING_SKILL.csv','pokemon':'ALL_SEASON_KNOCKING.csv'}
for method in column_a.keys():
    df_master = pd.DataFrame(columns = ['Season', 'Rule', 'Pokemon', column_a[method], f'Rank_{column_a[method]}'])
    for rule in ['Single', 'Double']:
        for season_num in range(1,12,1):
            with open(f'{file_dir}//Season{season_num}_{rule}_master.json', 'r', encoding='utf-8') as json_open:
                data = json.load(json_open)
            df = data_trans(data,method1='win', method2 = method, column = ['Pokemon', column_a[method], f'Rank_{column_a[method]}'])
            df['Season'] = season_num
            df['Rule'] = rule
            
            df_master = pd.concat([df_master, df], axis = 0)
            
    df_master['Pokemon']  = df_master.apply(Change_Name,axis=1)
    df_master.to_csv(file_names[method], index=False)

15.7 s ± 1.14 s per loop (mean ± std. dev. of 7 runs, 1 loop each)

Visualisierung

Nachdem wir die acht Dateien ausgegeben haben, die der obigen Liste entsprechen, schauen wir uns die Tableau-Arbeitsmappe an und zeigen sie an.

Union die 9 zuvor erstellten CSV-Dateien und kombinieren Sie sie mit der Datei, in der der Rennwert usw. aufgezeichnet sind. Die letztere Datei wurde abrupt veröffentlicht. Dies ist erforderlich, um das Pokemon-Minisymbol mithilfe der benutzerdefinierten Formfunktion auf der Streukarte anzuzeigen. Ich werde es diesmal nicht tief berühren, weil es unnötig ist, wenn Sie nur ein Streudiagramm erstellen.

image4

Sobald die Daten gelesen wurden, müssen Sie sie nur noch installieren. Tableau ist hervorragend bedienbar und sehr gut (Direktmarketing).

[Tableau Public](https://public.tableau.com/shared/GD57KTRKF ?: Display_count = y &: origin = viz_share_link) Ich habe es oben hochgeladen. Wenn Sie also das fertige Produkt sehen möchten, tun Sie dies bitte.

Bitte verzeihen Sie mir, dass das Design fast die Standardeinstellung ist.

Wenn Sie das fertige Produkt berühren, sieht es so aus.

gif2.gif

Verschiedene Aktionsfunktionen wurden verwendet, um ein Dashboard zu erstellen. Informationen zu Tableau-Mausbewegungen finden Sie unter hier.

5. Bestätigung des Ziels

  • Verarbeiten Sie die von der API erhaltenen Daten, um mehr Vorschläge zu erhalten, als die Formel angibt --Visualisieren Sie mit Tableau und machen Sie die Anzeige von Daten einfacher

Diesmal ist es uns gelungen, den Übergang der Zeitreihen und der Einzel- / Doppelkampfumgebung zu zeigen, indem wir die Indikatoren des Epidemieindex und des Metaindex als Zakuri definiert und ein Streudiagramm erstellt haben.

Man kann sagen, dass die beiden oben genannten Ziele fast erreicht wurden.

Andererseits weisen die oben genannten Indikatoren die folgenden Probleme auf.

  1. Es gibt einen Unterschied zum offiziellen Rekrutierungsratenranking (Beispiel: Patch Ragon-Rang ist niedrig)

  2. Es gibt einen Unterschied zur vom Benutzer ausgegebenen Stufentabelle (Beispiel: Patch-Ragon-Rang ist niedrig)

  3. Pokémon, die unsichtbare Beiträge leisten, werden unterschätzt (Wenn Sie den Feind nicht besiegen, ist der Metaindex niedrig, sodass der Rang des Unterstützungs-Pokémon-Typs tendenziell niedrig ist. Pokémon, das die Auswahl des Gegners binden kann, indem Sie es einfach halten Wird nicht reflektiert usw.)

  4. Eine eindeutige Ebenenberechnung ist nicht möglich (diesmal wird nicht hierarchisches Clustering verwendet, es ist jedoch nicht möglich, bis zu Ebene 〇 anzugeben).

Ich denke, es gibt verschiedene andere Probleme wie. Da sich dieser Index in Zukunft verbessern wird, war es möglicherweise sinnvoll, die Kampfdaten von Ranglistenschlachten visualisieren zu können.

~~ Ich möchte es auf Github hochladen, wenn ich Lust dazu habe. ~~

→ Hochgeladen (2020/11/03)

Wir sehen uns wieder.

Nachtrag

2020/11/03 Github hat den gesamten Code veröffentlicht.

Umgebung

  1. Windows10 Home 1903

  2. Python 3.7.6

  3. Pandas 1.0.1

  4. Sklearn 0.23.2

  5. Tableau Desktop 2020.1.20.0427.1803

Quelle

© 2020 Pokémon © 1995-2020 Nintendo / Creatures Inc./GAME FREAK Inc. Pocket Monsters, Pokemon und Pokémon sind eingetragene Marken von Nintendo, Creatures und Game Freak.

Recommended Posts

Ich analysierte die Rangkampfdaten des Pokemon-Schwertschilds und visualisierte sie auf Tableau
Ich habe den Akkord des Songs mit word2vec vektorisiert und mit t-SNE visualisiert
Ich habe versucht, die Daten des Laptops durch Booten unter Ubuntu zu retten
Ich habe versucht, die Daten des Laptops durch Booten unter Ubuntu zu retten
[Python3] Machen Sie einen Screenshot einer Webseite auf dem Server und schneiden Sie sie weiter zu
Vielleicht habe ich die Auswirkungen von Shell Shock auf CGI überschätzt
Ich habe versucht, die API von Sakenowa Data Project zu verwenden
Ich analysierte die Rangkampfdaten des Pokemon-Schwertschilds und visualisierte sie auf Tableau
Festkomma-Beobachtung bestimmter Daten im Web durch automatische Ausführung des Webbrowsers auf dem Server (Ubuntu16.04) (1) -Webbrowser-Installation-
Visualisieren Sie das Zentrum der Rangkampfumgebung über die Pokemon Home-API
Ich habe Apple Watch-Daten in Google Colaboratory aufgenommen und analysiert
[Python] Ich habe das Tagebuch eines Mannes im ersten Jahr des Arbeitslebens analysiert und das Arbeitsleben positiv / negativ beurteilt.
Laden Sie Daten mit einem Befehl und einer Aktualisierung auf s3 von aws hoch und löschen Sie die verwendeten Daten (unterwegs).
[Persönliches Memo] Holen Sie sich Daten im Web und machen Sie daraus einen DataFrame
Ich habe 200 Mal versucht, magisch auszutauschen [Pokemon-Schwertschild]
Pokemon x Data Science (3) - Denken Sie an die Partykonstruktion des Pokemon-Schwertschilds aus der Netzwerkanalyse. Wo befindet sich das Zentrum des Netzwerks?
Ich habe die Varianten von UKR gelesen und implementiert
[Python3] Machen Sie einen Screenshot einer Webseite auf dem Server und schneiden Sie sie weiter zu
[SLAYER] Ich habe versucht, die Stahlseele zu bestätigen, indem ich die Texte von Slash Metal [Word Cloud] visualisiert habe.
Daten Langling PDF über den Ausbruch der Influenza durch das Ministerium für Gesundheit, Arbeit und Soziales
[Herausforderer suchen] Das schnellste Laden und Erweitern von Daten (Kaggle-Notizbuch), denke ich
Ich wollte nur die Daten des gewünschten Datums und der gewünschten Uhrzeit mit Django extrahieren
Lesen Sie die CSV-Datei mit dem Jupiter-Notizbuch und schreiben Sie die Grafik übereinander
Ich habe versucht, es einfach zu machen, die Einstellung des authentifizierten Proxys auf Jupyter zu ändern
[Pokemon-Schwertschild] Ich habe versucht, die Urteilsgrundlage des tiefen Lernens anhand der Drei-Familien-Klassifikation als Beispiel zu visualisieren
Ich mag es nicht, mit der Veröffentlichung von Pokemon Go frustriert zu sein, deshalb habe ich ein Skript erstellt, um die Veröffentlichung zu erkennen und zu twittern