はじめに
3年前にポケモンBDSPが発売されたタイミングでとあるツールを作成しました。
旅パで使うタイプを設定すると、足りていないポケモンのタイプを教えてくれるものです。
GitHubにあるので好きにご覧ください。
データの取得
まず、ポケモンのタイプ相性表を取得します。
データ数としては少ないので自分で作ってもよいのですが、当時の自分はスクレイピングして取得したようです。
長年お世話になってきた徹底攻略様よりお借りしています。
実際のスクレイピングに使用したコードは以下です。
アプリとして実装
相性判定部分に関しては既にある相性表から読み取り、●がついているかどうかで判断しています。
関数で、効果抜群にできないタイプと不足タイプを検出し、それを返す形です。
途中でset
を使っているのは被っている要素を排除するためですね(多分)。
import streamlit as st
import pandas as pd
df_type_comp = pd.read_csv('type_comp.csv')
df_type_single = pd.read_csv('type_comp_single.csv')
type_dict = dict(zip(df_type_comp.columns, df_type_single.columns))
def check_comp(attack_type, defence_type):
comp = df_type_comp[defence_type][attack_type]
print('相性', comp)
def party_type_check(party_type_list):
types = list(df_type_comp.columns)
for pt in party_type_list:
targets = list(df_type_comp.loc[df_type_comp.loc[pt]=='●'].index)
for target in targets:
if target in types:
types.remove(target)
lacks = []
for t in types:
lacks.extend(df_type_comp[df_type_comp.loc[:, t] == '●'].index)
lacks = list(set(lacks))
for pt in party_type_list:
if pt in lacks:
lacks = lacks.remove(pt)
print('効果抜群にできないタイプ→', types)
print('不足タイプ→', lacks)
return types, lacks
st.write('# パーティーに含まれるタイプを選択してください。')
select_types = st.multiselect('選択↓', df_type_comp.index)
types, lacks = party_type_check(select_types)
st.markdown("# 効果抜群にできないタイプ")
st.write(' / '.join(types))
st.markdown("# 不足しているタイプ")
st.write(' / '.join(lacks))
types = [type_dict[key] for key in types]
lacks = [type_dict[key] for key in lacks]
st.markdown("# 参考用タイプ相性表")
st.dataframe(df_type_single[types].loc[lacks])
UI
マルチセレクトで簡単にタイプ登録をします。
そして、した二つのタイプ一覧が変化する形ですね。
また、下に参考用タイプ相性表が出てきます。
これを基に追加するタイプなどを選んでいく流れになります。