本記事では、以下の項目について説明をする。
- ? コマンドの基本的な使い方
- ? コマンドのオプション
正直コマンドのオプションを増やしすぎた
Discordから受け取ったメッセージを実行する、SQLクラスのインスタンスを生成
from SQL import SQL Query=SQL()
? コマンドの基本的な使い方
? コマンドの引数,出力,説明を見る
? コマンドの引数,出力,説明を見るには、!psql コマンド名
を使う。
2行目は、引数1,引数2,引数3 ==> 出力1,出力2,出力3
の形式で出力される。
コマンド名を省略して、!psql
と入力すると、すべての ? コマンドの説明が表示される。
実行例 (23/8/7現在)
!psql sev
sev 技, -, - ==> ポケモン, -, - その技を覚えるポケモンを表示する ---------------------------------------------------------- sevty 技, タイプ, - ==> ポケモン, -, - その技を覚える指定したタイプをもつポケモンを表示する ---------------------------------------------------------- sevdt 技, -, - ==> ポケモン, -, - その技の技タイプとタイプ不一致で、その攻撃技を覚えるポケモンを表示する ----------------------------------------------------------
? コマンドの実行
Query.exe()の括弧の文をDiscordで送信すると、結果が返ってくる。
基本的な構文は、?コマンド名 引数1 引数2 ...
例えば、?sev ちょうはつ
を入力すると、ちょうはつを覚えるポケモンが表示される。
Query.exe("?sev ちょうはつ")
name | |
---|---|
0 | イダイナキバ |
1 | ヤトウモリ |
2 | ケロマツ |
3 | ミジュマル |
4 | サナギラス |
... | ... |
213 | コノヨザル |
214 | マニューラ |
215 | ゲンガー |
216 | スリーパー |
217 | ベトベトン |
218 rows × 1 columns
?speed 90 130
のように、引数を複数とるコマンドも存在する。
!psql speed
speed
種族値, 種族値, - ==> 種族値, ポケモン, -
そのS種族値以上かつ指定したS種族値以下のポケモンを表示する
----------------------------------------------------------
Query.exe("?speed 90 130")
s | name | |
---|---|---|
0 | 130 | ミュウツー |
1 | 130 | サンダース |
2 | 130 | コオリッポ(ナイス) |
3 | 130 | ムゲンダイナ |
4 | 130 | レイスポス |
... | ... | ... |
148 | 90 | コノヨザル |
149 | 90 | ニャース(アローラ) |
150 | 90 | ニャース |
151 | 90 | ディグダ(アローラ) |
152 | 90 | ディアルガ |
153 rows × 2 columns
?コマンドを合成する
and オプション (ポケモン名で内部結合)
S種族値が90以上130以下 かつ ちょうはつを覚えるポケモンを表示したいとする。
つまり、?speed 90 130
と?sev ちょうはつ
を合成したい。
これは、?speed 90 130 and ?sev ちょうはつ
と入力することで合成できる。
なお、and
は省略できるので、?speed 90 130 ?sev ちょうはつ
と入力しても同じ。
Query.exe("?speed 90 130 ?sev ちょうはつ")
s | name | |
---|---|---|
0 | 130 | ミュウツー |
1 | 130 | レイスポス |
2 | 126 | ファイアロー |
3 | 125 | マニューラ |
4 | 123 | オンバーン |
... | ... | ... |
76 | 90 | ブロロローム |
77 | 90 | カラミンゴ |
78 | 90 | コノヨザル |
79 | 90 | ニャース(アローラ) |
80 | 90 | ニャース |
81 rows × 2 columns
複数のコマンドを合成することもできる。
Query.exe("?speed 90 130 and ?sev ちょうはつ ?sev ステルスロック")
s | name | |
---|---|---|
0 | 120 | アルセウス |
1 | 115 | アグノム |
2 | 112 | ルガルガン(まひる) |
3 | 110 | ルガルガン(たそがれ) |
4 | 101 | ランドロス(化身) |
5 | 100 | ミュウ |
6 | 98 | サザンドラ |
7 | 95 | オコリザル |
8 | 92 | ワルビアル |
9 | 91 | ランドロス(霊獣) |
10 | 90 | コノヨザル |
※1 コマンド合成の順番について
展開
コマンドは左から順番に実行され、コマンド合成は、左側のポケモン名を基準に合成される。
そのため、?spped
と?sev
の順番を入れ替えて、?sev ちょうはつ and ?speed 90 130
と入力すると、
という処理がなされるので、結果はS種族値の順番に並ばない。
Query.exe("?sev ちょうはつ and ?speed 90 130")
name | s | |
---|---|---|
0 | テツノイサハ | 104 |
1 | トルネロス(霊獣) | 121 |
2 | トルネロス(化身) | 111 |
3 | タギングル | 110 |
4 | イッカネズミ | 111 |
... | ... | ... |
76 | バスラオ(赤) | 98 |
77 | ファイヤー(ガラル) | 90 |
78 | サンダー(ガラル) | 100 |
79 | ビリリダマ(ヒスイ) | 100 |
80 | ビリリダマ | 100 |
81 rows × 2 columns
この問題は後述のsort
オプションで解決できる。
Query.exe("?sev ちょうはつ and ?speed 90 130 sort s d")
name | s | |
---|---|---|
0 | ミュウツー | 130 |
1 | レイスポス | 130 |
2 | ファイアロー | 126 |
3 | マニューラ | 125 |
4 | オンバーン | 123 |
... | ... | ... |
76 | ヤルキモノ | 90 |
77 | ニャース | 90 |
78 | ファイヤー(ガラル) | 90 |
79 | コノヨザル | 90 |
80 | ブロロローム | 90 |
81 rows × 2 columns
※2 コマンドの合成の詳細について
展開
コマンド合成は、内部的にはand
オプションによって実行されている。
また、and
オプションはポケモン(列名がnameのもの)以外で結合することができない。
任意の結合を行いたい場合は、後述のinnner,outer,left,right
オプションを使う。
or オプション (ポケモン名で外部結合)
ちょうはつ もしくは アンコールを覚えるポケモンを表示したいとする。
このときは、and
ではなくor
を使う。
Query.exe("?sev ちょうはつ or ?sev アンコール")
name | |
---|---|
0 | イダイナキバ |
1 | ヤトウモリ |
2 | ケロマツ |
3 | ミジュマル |
4 | サナギラス |
... | ... |
264 | ルリリ |
265 | キマワリ |
266 | ヒマナッツ |
267 | ププリン |
268 | ピチュー |
269 rows × 1 columns
引数を省略する
引数は *
を入力することで、省略することができる。
例えば、?heal *
と入力すると、回復技と、その回復技を覚えるポケモンの組がすべて表示される。
Query.exe("?heal *")
name | move | |
---|---|---|
0 | ピカチュウ | プレゼント |
1 | ピカチュウ | ねがいごと |
2 | ピカチュウ | ドレインキッス |
3 | ライチュウ | ねがいごと |
4 | ライチュウ | ドレインキッス |
... | ... | ... |
687 | トドロクツキ | はねやすめ |
688 | テツノブジン | ドレインパンチ |
689 | コライドン | ドレインパンチ |
690 | ミライドン | パラボラチャージ |
691 | テツノイサハ | ギガドレイン |
692 rows × 2 columns
引数が複数ある場合は、省略したい箇所に*
をつける。
Query.exe("?speed 140 *")
※3 *
の内部的な処理について
展開
? コマンドを登録する際に、SQL文に?
を埋め込むことで、コマンドに引数を設定することができる。
*
(任意入力)はクエリ内部で以下の変換表に従って変換されている。
変換前(sqlcmd.cmd) | 変換後(PostgreSQL) | |
---|---|---|
不等号 | >=? | >=0 |
不等号 | ?<= | 0<= |
不等号 | <=? | <=65535 |
不等号 | ?>= | 65535>= |
不等号 | >? | >0 |
不等号 | ?< | 0< |
不等号 | <? | <65535 |
不等号 | ?> | 65535> |
中間一致 | '%'||?||'%' | '%' |
前方一致 | '%'||? | '%' |
後方一致 | ?||'%' | '%' |
等号 | =? | LIKE '%' |
等号否定 | !=? | LIKE '%' |
IN句 | ? IN ( | '%' IN ('%', |
NOT IN句 | ? NOT IN ( | '%' IN ('%', |
上の表の変換前(sqlcmd.cmd)は!psqlcmd コマンド名
で確認できるクエリ。
!psqlcmd heal
heal SELECT pokedex.name,move.move FROM move,poke2move,pokedex WHERE + pokedex.name LIKE '%' --変換後 - pokedex.name = ? --変換前 AND poke2move.id = pokedex.id AND move.id = poke2move.moveid AND move.text like '%HP%回復する%' ORDER BY pokedex.id
? コマンドのオプション
前提として、? コマンドは引数に応じて表を1つ返す。
そして、コマンドのオプションは3種類ある。
- 1つの表を1つの表に変換するもの(sort,where,drop,loc,rename,dup,desc,groupby)
- 2つの表を1つの表に結合するもの(and,or,inner,outer,left,right,diff)
- 出力形式を変更するもの(show,out,plot)
1つの表を1つの表に変換するもの
sort オプション (順番を並び替える)
ネクロズマのフォルム違いを、S種族値順に並び替えたいとする。
これは、sort s d
を付けることで実現できる。
d
は降順に並び替える場合。また、d
は省略できるので、sort s
と入力しても同じ。
Query.exe("?st ネクロズマ sort s")
name | h | a | b | c | d | s | sum | |
---|---|---|---|---|---|---|---|---|
0 | ウルトラネクロズマ | 97 | 167 | 97 | 167 | 97 | 129 | 754 |
1 | ネクロズマ | 97 | 107 | 101 | 127 | 89 | 79 | 600 |
2 | ネクロズマ(日食) | 97 | 157 | 127 | 113 | 109 | 77 | 680 |
3 | ネクロズマ(月食) | 97 | 113 | 109 | 157 | 127 | 77 | 680 |
昇順に並び替える場合は、sort h a
と入力する。
Query.exe("?st ネクロズマ sort s a")
name | h | a | b | c | d | s | sum | |
---|---|---|---|---|---|---|---|---|
0 | ネクロズマ(日食) | 97 | 157 | 127 | 113 | 109 | 77 | 680 |
1 | ネクロズマ(月食) | 97 | 113 | 109 | 157 | 127 | 77 | 680 |
2 | ネクロズマ | 97 | 107 | 101 | 127 | 89 | 79 | 600 |
3 | ウルトラネクロズマ | 97 | 167 | 97 | 167 | 97 | 129 | 754 |
上の実行結果では、日食ネクロと月食ネクロの s=77 で同じだが、b,c,dに関しては値が異なっている。
そのため、複数列を基準にソートしたい場合は、sort s,b a,a
のように入力する。
すると、S種族値で昇順にソートしたあと、さらにB種族値で昇順にソートした結果が得られる。
Query.exe("?st ネクロズマ sort s,b a,a")
name | h | a | b | c | d | s | sum | |
---|---|---|---|---|---|---|---|---|
0 | ネクロズマ(月食) | 97 | 113 | 109 | 157 | 127 | 77 | 680 |
1 | ネクロズマ(日食) | 97 | 157 | 127 | 113 | 109 | 77 | 680 |
2 | ネクロズマ | 97 | 107 | 101 | 127 | 89 | 79 | 600 |
3 | ウルトラネクロズマ | 97 | 167 | 97 | 167 | 97 | 129 | 754 |
where オプション (条件を満たす行を抽出する・列を追加する)
複雑な条件を指定する場合は、条件を`(バッククォート)
で囲って記述する。
内部的には、pandasのpd.evalメソッドが呼び出されている。脆弱性があるとかないとか
※バッククォートは、JISキーボードならShift+@
で入力できます
※SQLのWHERE
句と同じなのでwhereオプションと呼ぶことにします
以下は、物理耐久指数 = H実数値*性格補正込みB実数値 >=50000 のポケモンを表示している。
Query.exe("?st * `(h+107)*(b+52)*1.1>=50000`")
name | h | a | b | c | d | s | sum | |
---|---|---|---|---|---|---|---|---|
0 | メガヤドラン | 95 | 75 | 180 | 130 | 80 | 30 | 590 |
1 | ハガネール | 75 | 85 | 200 | 55 | 65 | 30 | 510 |
2 | メガハガネール | 75 | 125 | 230 | 55 | 95 | 30 | 610 |
3 | メガボスゴドラ | 70 | 140 | 230 | 60 | 80 | 50 | 630 |
4 | レジロック | 80 | 100 | 200 | 50 | 100 | 50 | 580 |
5 | クレベース | 95 | 117 | 184 | 44 | 46 | 28 | 514 |
6 | クレベース(ヒスイ) | 95 | 127 | 184 | 34 | 36 | 38 | 514 |
7 | ジガルデ(パーフェクト) | 216 | 100 | 121 | 91 | 95 | 85 | 708 |
8 | メルメタル | 135 | 143 | 143 | 80 | 65 | 34 | 600 |
9 | ディンルー | 155 | 110 | 125 | 55 | 80 | 45 | 570 |
また、物理耐久指数を、新しい列 hb として表に加えたい場合は、以下のように記述する。
Query.exe("?std ?st * `hb=(h+107)*(b+52)*1.1`")
name | h | a | b | c | d | s | sum | hb | |
---|---|---|---|---|---|---|---|---|---|
0 | リザードン | 78 | 84 | 78 | 109 | 85 | 100 | 534 | 26455.0 |
1 | ライチュウ | 60 | 90 | 55 | 90 | 80 | 110 | 485 | 19655.9 |
2 | ライチュウ(アローラ) | 60 | 85 | 50 | 95 | 85 | 110 | 485 | 18737.4 |
3 | プクリン | 140 | 70 | 45 | 85 | 50 | 45 | 435 | 26354.9 |
4 | モルフォン | 70 | 65 | 60 | 90 | 75 | 90 | 450 | 21806.4 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
290 | イーユイ | 55 | 80 | 80 | 135 | 120 | 100 | 570 | 23522.4 |
291 | トドロクツキ | 105 | 139 | 71 | 55 | 101 | 119 | 590 | 28683.6 |
292 | テツノブジン | 74 | 130 | 90 | 120 | 60 | 116 | 590 | 28272.2 |
293 | ウネルミナモ | 99 | 83 | 91 | 125 | 83 | 109 | 590 | 32403.8 |
294 | テツノイサハ | 90 | 130 | 88 | 70 | 108 | 104 | 590 | 30338.0 |
295 rows × 9 columns
文字列に関する条件や、複数条件を指定することも可能。
Query.exe("?st * `name=='ケッキング' or name in ['カミツルギ','ラムパルド']`")
name | h | a | b | c | d | s | sum | |
---|---|---|---|---|---|---|---|---|
0 | ケッキング | 150 | 160 | 100 | 95 | 65 | 100 | 670 |
1 | ラムパルド | 97 | 165 | 60 | 65 | 50 | 58 | 495 |
2 | カミツルギ | 59 | 181 | 131 | 59 | 31 | 109 | 570 |
正規表現なども利用できる。
※@df.a
でローカル変数df
にアクセスできる
※@df.a>=160
はa>=160
と同じ。
Query.exe("?st * `(name.str.match('メガ.*') or name.str.contains('イルカマン')) and @df.a>=160`")
name | h | a | b | c | d | s | sum | |
---|---|---|---|---|---|---|---|---|
0 | メガミュウツーX | 106 | 190 | 100 | 154 | 100 | 130 | 780 |
1 | メガヘラクロス | 80 | 185 | 115 | 40 | 105 | 75 | 600 |
2 | メガバンギラス | 100 | 164 | 150 | 95 | 120 | 71 | 700 |
3 | メガバシャーモ | 80 | 160 | 80 | 130 | 80 | 100 | 630 |
4 | メガジュペッタ | 64 | 165 | 75 | 93 | 83 | 75 | 555 |
5 | メガレックウザ | 105 | 180 | 100 | 180 | 100 | 115 | 780 |
6 | メガガブリアス | 108 | 170 | 115 | 120 | 95 | 92 | 700 |
7 | メガエルレイド | 68 | 165 | 95 | 65 | 115 | 110 | 618 |
8 | メガディアンシー | 50 | 160 | 110 | 160 | 110 | 110 | 700 |
9 | イルカマン(マイティ) | 100 | 160 | 97 | 106 | 87 | 100 | 650 |
※4 whereオプション内における*
の内部的な処理について
展開
whereオプション付きのコマンドを登録する際に、where句内、`(バッククォート)
の内側に引数 ? を設定することができる。
whereオプション内で、*
(任意入力)はクエリ内部で以下の変換表に従って変換されている。
変換前(sqlcmd.cmd) | 変換後(PostgreSQL) | |
---|---|---|
不等号 | >=? | >=0 |
不等号 | ?<= | 0<= |
不等号 | <=? | <=65535 |
不等号 | ?>= | 65535>= |
不等号 | >? | >0 |
不等号 | ?< | 0< |
不等号 | <? | <65535 |
不等号 | ?> | 65535> |
等号 | =="?" | .str.match('.*') |
等号否定 | !="?" | .str.match('.*') |
中間一致 | .str.contains("?") | .str.match('.*') |
前方一致 | .str.startswith("?") | .str.match('.*') |
後方一致 | .str.endswith("?") | .str.match('.*') |
!psqlcmd spe
spe ?showS * ?single * drop rank + `0<=a_s<=65535` --変換後 - `?<=a_s<=?` --変換前 sort a_s,s d,d
loc オプション (列を抽出)
Query.exe("?st *")
name | h | a | b | c | d | s | sum | |
---|---|---|---|---|---|---|---|---|
0 | フシギダネ | 45 | 49 | 49 | 65 | 65 | 45 | 318 |
1 | フシギソウ | 60 | 62 | 63 | 80 | 80 | 60 | 405 |
2 | フシギバナ | 80 | 82 | 83 | 100 | 100 | 80 | 525 |
3 | メガフシギバナ | 80 | 100 | 123 | 122 | 120 | 80 | 625 |
4 | ヒトカゲ | 39 | 52 | 43 | 60 | 50 | 65 | 309 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
1172 | テツノブジン | 74 | 130 | 90 | 120 | 60 | 116 | 590 |
1173 | コライドン | 100 | 135 | 115 | 85 | 100 | 135 | 670 |
1174 | ミライドン | 100 | 85 | 100 | 135 | 115 | 135 | 670 |
1175 | ウネルミナモ | 99 | 83 | 91 | 125 | 83 | 109 | 590 |
1176 | テツノイサハ | 90 | 130 | 88 | 70 | 108 | 104 | 590 |
1177 rows × 8 columns
上の表から、name,sum の列だけを抽出したい場合は、loc name,sum
と入力する。
Query.exe("?st * loc name,sum")
name | sum | |
---|---|---|
0 | フシギダネ | 318 |
1 | フシギソウ | 405 |
2 | フシギバナ | 525 |
3 | メガフシギバナ | 625 |
4 | ヒトカゲ | 309 |
... | ... | ... |
1172 | テツノブジン | 590 |
1173 | コライドン | 670 |
1174 | ミライドン | 670 |
1175 | ウネルミナモ | 590 |
1176 | テツノイサハ | 590 |
1177 rows × 2 columns
上の表から、name, h, a, b のように連続している列を抽出したい場合は、loc name:b
と入力する。
Query.exe("?st * loc name:b")
name | h | a | b | |
---|---|---|---|---|
0 | フシギダネ | 45 | 49 | 49 |
1 | フシギソウ | 60 | 62 | 63 |
2 | フシギバナ | 80 | 82 | 83 |
3 | メガフシギバナ | 80 | 100 | 123 |
4 | ヒトカゲ | 39 | 52 | 43 |
... | ... | ... | ... | ... |
1172 | テツノブジン | 74 | 130 | 90 |
1173 | コライドン | 100 | 135 | 115 |
1174 | ミライドン | 100 | 85 | 100 |
1175 | ウネルミナモ | 99 | 83 | 91 |
1176 | テツノイサハ | 90 | 130 | 88 |
1177 rows × 4 columns
drop オプション (列を削除する)
種族値データから、c, sum の列を削除するには、drop c,sum
と入力する。
Query.exe("?st * drop c,sum")
name | h | a | b | d | s | |
---|---|---|---|---|---|---|
0 | フシギダネ | 45 | 49 | 49 | 65 | 45 |
1 | フシギソウ | 60 | 62 | 63 | 80 | 60 |
2 | フシギバナ | 80 | 82 | 83 | 100 | 80 |
3 | メガフシギバナ | 80 | 100 | 123 | 120 | 80 |
4 | ヒトカゲ | 39 | 52 | 43 | 50 | 65 |
... | ... | ... | ... | ... | ... | ... |
1172 | テツノブジン | 74 | 130 | 90 | 60 | 116 |
1173 | コライドン | 100 | 135 | 115 | 100 | 135 |
1174 | ミライドン | 100 | 85 | 100 | 115 | 135 |
1175 | ウネルミナモ | 99 | 83 | 91 | 83 | 109 |
1176 | テツノイサハ | 90 | 130 | 88 | 108 | 104 |
1177 rows × 6 columns
rename オプション (列名を変更する)
?st *
で、列名を nameからpokemonに、sumから合計種族値 に変更したいとする。
このときは、rename name:pokemon,sum:合計種族値
と入力する。
Query.exe("?st * rename name:pokemon,sum:合計種族値")
pokemon | h | a | b | c | d | s | 合計種族値 | |
---|---|---|---|---|---|---|---|---|
0 | フシギダネ | 45 | 49 | 49 | 65 | 65 | 45 | 318 |
1 | フシギソウ | 60 | 62 | 63 | 80 | 80 | 60 | 405 |
2 | フシギバナ | 80 | 82 | 83 | 100 | 100 | 80 | 525 |
3 | メガフシギバナ | 80 | 100 | 123 | 122 | 120 | 80 | 625 |
4 | ヒトカゲ | 39 | 52 | 43 | 60 | 50 | 65 | 309 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
1172 | テツノブジン | 74 | 130 | 90 | 120 | 60 | 116 | 590 |
1173 | コライドン | 100 | 135 | 115 | 85 | 100 | 135 | 670 |
1174 | ミライドン | 100 | 85 | 100 | 135 | 115 | 135 | 670 |
1175 | ウネルミナモ | 99 | 83 | 91 | 125 | 83 | 109 | 590 |
1176 | テツノイサハ | 90 | 130 | 88 | 70 | 108 | 104 | 590 |
1177 rows × 8 columns
dup オプション (重複行を抽出する)
フォルムチェンジがあるポケモンを表示したいとする。
?tb テーブル名
でテーブルの全データを表示できる(ただし、表示できるデータには文字制限がある)
このコマンドを使って、?tb pokedex loc no,name
と入力することでpokedexテーブルから図鑑番号と名前を抽出できる。
Query.exe("?tb pokedex loc no,name")
no | name | |
---|---|---|
0 | 1 | フシギダネ |
1 | 2 | フシギソウ |
2 | 3 | フシギバナ |
3 | 3 | メガフシギバナ |
4 | 4 | ヒトカゲ |
... | ... | ... |
1172 | 1006 | テツノブジン |
1173 | 1007 | コライドン |
1174 | 1008 | ミライドン |
1175 | 1009 | ウネルミナモ |
1176 | 1010 | テツノイサハ |
1177 rows × 2 columns
さらに、dup no
と入力することで、図鑑番号が重複している(≒フォルムチェンジがある)ポケモンを抽出できる。
Query.exe("?tb pokedex loc no,name dup no")
no | name | |
---|---|---|
0 | 3 | フシギバナ |
1 | 3 | メガフシギバナ |
2 | 6 | リザードン |
3 | 6 | メガリザードンX |
4 | 6 | メガリザードンY |
... | ... | ... |
301 | 916 | パフュートン♀ |
302 | 931 | イキリンコ(青・緑) |
303 | 931 | イキリンコ(白・黄) |
304 | 964 | イルカマン(ナイーブ) |
305 | 964 | イルカマン(マイティ) |
306 rows × 2 columns
dup
の引数は複数とることができ、図鑑番号と合計種族値が重複しているポケモンを抽出することもできる。
Query.exe("?tb pokedex loc no,name,sum dup no,sum")
no | name | sum | |
---|---|---|---|
0 | 6 | メガリザードンX | 634 |
1 | 6 | メガリザードンY | 634 |
2 | 19 | コラッタ | 253 |
3 | 19 | コラッタ(アローラ) | 253 |
4 | 20 | ラッタ | 413 |
... | ... | ... | ... |
188 | 905 | ラブトロス(霊獣) | 580 |
189 | 916 | パフュートン♂ | 489 |
190 | 916 | パフュートン♀ | 489 |
191 | 931 | イキリンコ(青・緑) | 417 |
192 | 931 | イキリンコ(白・黄) | 417 |
193 rows × 3 columns
unique オプション (重複行の削除)
dup
の逆操作。
例えば、unique no
と入力すると、図鑑番号が重複する2番目以降の行が削除される。
また、unique
もdup
同様、複数列を対象にできる。
Query.exe("?tb pokedex loc no,name unique no")
no | name | |
---|---|---|
0 | 1 | フシギダネ |
1 | 2 | フシギソウ |
2 | 3 | フシギバナ |
3 | 4 | ヒトカゲ |
4 | 5 | リザード |
... | ... | ... |
1005 | 1006 | テツノブジン |
1006 | 1007 | コライドン |
1007 | 1008 | ミライドン |
1008 | 1009 | ウネルミナモ |
1009 | 1010 | テツノイサハ |
1010 rows × 2 columns
desc オプション (データを要約する)
?showS ポケモン名
でそのポケモンのS実数値を表示できる。
Query.exe("?showS コオリッポ")
a_s | name | set1 | set2 | s | |
---|---|---|---|---|---|
0 | 400.0 | コオリッポ(ナイス) | 最速 | こうそくいどう | 130 |
1 | 364.0 | コオリッポ(ナイス) | 準速 | こうそくいどう | 130 |
2 | 300.0 | コオリッポ(ナイス) | 最速 | +1 | 130 |
3 | 300.0 | コオリッポ(ナイス) | 無振 | こうそくいどう | 130 |
4 | 273.0 | コオリッポ(ナイス) | 準速 | +1 | 130 |
5 | 224.0 | コオリッポ(アイス) | 最速 | こうそくいどう | 50 |
6 | 204.0 | コオリッポ(アイス) | 準速 | こうそくいどう | 50 |
7 | 200.0 | コオリッポ(ナイス) | 最速 | 130 | |
8 | 182.0 | コオリッポ(ナイス) | 準速 | 130 | |
9 | 168.0 | コオリッポ(アイス) | 最速 | +1 | 50 |
10 | 153.0 | コオリッポ(アイス) | 準速 | +1 | 50 |
11 | 150.0 | コオリッポ(ナイス) | 無振 | 130 | |
12 | 140.0 | コオリッポ(アイス) | 無振 | こうそくいどう | 50 |
13 | 121.0 | コオリッポ(ナイス) | 最遅 | 130 | |
14 | 112.0 | コオリッポ(アイス) | 最速 | 50 | |
15 | 102.0 | コオリッポ(アイス) | 準速 | 50 | |
16 | 70.0 | コオリッポ(アイス) | 無振 | 50 | |
17 | 49.0 | コオリッポ(アイス) | 最遅 | 50 |
このとき、desc
オプションをつけると、各列のデータの統計量(stat)を確認できる。(->詳細な仕様)
- count …行数
- unique…重複していない(一意な)要素の個数
- top …最頻値
- freq …最頻値の出現回数
- mean …平均値
- min …最小値
- max …最大値
Query.exe("?showS コオリッポ desc")
stat | a_s | name | set1 | set2 | s | |
---|---|---|---|---|---|---|
0 | count | 18.000000 | 18 | 18 | 18 | 18.00000 |
1 | unique | NaN | 2 | 4 | 3 | NaN |
2 | top | NaN | コオリッポ(ナイス) | 最速 | NaN | |
3 | freq | NaN | 9 | 6 | 8 | NaN |
4 | mean | 195.111111 | NaN | NaN | NaN | 90.00000 |
5 | std | 98.618033 | NaN | NaN | NaN | 41.15966 |
6 | min | 49.000000 | NaN | NaN | NaN | 50.00000 |
7 | 25% | 125.750000 | NaN | NaN | NaN | 50.00000 |
8 | 50% | 175.000000 | NaN | NaN | NaN | 90.00000 |
9 | 75% | 260.750000 | NaN | NaN | NaN | 130.00000 |
10 | max | 400.000000 | NaN | NaN | NaN | 130.00000 |
groupby オプション (データを集約する)
コオリッポのS実数値データを、(name,set2) に関して集約を行いたいとする。
こうすることで、set1=[ 最遅, 無振, 準速, 最速 ] のデータを1行にまとめることができる。
内部的にはpandasのgroupbyメソッドが呼び出されている。
Query.exe("?showS コオリッポ groupby name,set2 a_s:max;min,set1:count")
name | set2 | a_s.max | a_s.min | set1.count | |
---|---|---|---|---|---|
0 | コオリッポ(アイス) | 112.0 | 49.0 | 4 | |
1 | コオリッポ(アイス) | +1 | 168.0 | 153.0 | 2 |
2 | コオリッポ(アイス) | こうそくいどう | 224.0 | 140.0 | 3 |
3 | コオリッポ(ナイス) | 200.0 | 121.0 | 4 | |
4 | コオリッポ(ナイス) | +1 | 300.0 | 273.0 | 2 |
5 | コオリッポ(ナイス) | こうそくいどう | 400.0 | 300.0 | 3 |
2つの表を1つの表に結合するもの
and, or オプション (ポケモン名で結合)
こちらはすでに解説したので省略。
内部的にはpandasのmergeメソッド が呼び出されている。
inner, outer, left, right オプション (任意の列で結合)
こちらもpandasのmergeメソッド が呼び出されている。
inner
の構文は?cmd1 inner 結合列名 ?cmd2
outer, left, right
も構文は同じ。
例えば、S種族値が140以上のポケモンの種族値を表示したいとする。
and
オプションの場合は、ポケモン名(name)の列が結合キーとなる。
そのため、sは結合キーとみなされず、接尾辞(suffix)がつく。
Query.exe("?minS 140 ?st *")
s_x | name | h | a | b | c | d | s_y | sum | |
---|---|---|---|---|---|---|---|---|---|
0 | 200 | レジエレキ | 80 | 100 | 50 | 100 | 50 | 200 | 580 |
1 | 150 | マルマイン | 60 | 50 | 70 | 80 | 80 | 150 | 490 |
2 | 150 | マルマイン(ヒスイ) | 60 | 50 | 70 | 80 | 80 | 150 | 490 |
3 | 150 | バドレックス(こくば) | 100 | 85 | 80 | 165 | 100 | 150 | 680 |
4 | 148 | ザシアン(王) | 92 | 150 | 115 | 80 | 115 | 148 | 700 |
5 | 142 | ドラパルト | 88 | 120 | 75 | 100 | 75 | 142 | 600 |
inner
を使って、(s,name)を結合キーとすると、以下のように出力される。
Query.exe("?minS 140 inner s,name ?st *")
s | name | h | a | b | c | d | sum | |
---|---|---|---|---|---|---|---|---|
0 | 200 | レジエレキ | 80 | 100 | 50 | 100 | 50 | 580 |
1 | 150 | マルマイン | 60 | 50 | 70 | 80 | 80 | 490 |
2 | 150 | マルマイン(ヒスイ) | 60 | 50 | 70 | 80 | 80 | 490 |
3 | 150 | バドレックス(こくば) | 100 | 85 | 80 | 165 | 100 | 680 |
4 | 148 | ザシアン(王) | 92 | 150 | 115 | 80 | 115 | 700 |
5 | 142 | ドラパルト | 88 | 120 | 75 | 100 | 75 | 600 |
diff オプション(表の差分を表示する)
アンコールとちょうはつという2つの技に関して
の3種類がある。
単純にor
を使うよりも、diff
を使えば、わかりやすく表示できる。
diff name
と入力すると、_mergeの列に、left_only, right_only, both が表示されていることがわかる。
Query.exe("?sev アンコール diff name ?sev ちょうはつ")
name | _merge | |
---|---|---|
0 | パモット | left_only |
1 | ミジュマル | both |
2 | ゴマゾウ | left_only |
3 | フタチマル | both |
4 | バドレックス | left_only |
... | ... | ... |
264 | サンダー(ガラル) | right_only |
265 | マルマイン(ヒスイ) | right_only |
266 | マルマイン | right_only |
267 | ビリリダマ(ヒスイ) | right_only |
268 | ビリリダマ | right_only |
269 rows × 2 columns
さらに、whereオプションを使えば、3種類のデータを柔軟に取り出せる。
例えば、_merge=='right_only'
とすれば、ちょうはつは覚えるが、アンコールは覚えないポケモンが表示される。
Query.exe("?sev アンコール diff name ?sev ちょうはつ `_merge=='right_only'`")
name | _merge | |
---|---|---|
0 | イダイナキバ | right_only |
1 | ヤトウモリ | right_only |
2 | ケロマツ | right_only |
3 | サナギラス | right_only |
4 | テツノイサハ | right_only |
... | ... | ... |
162 | サンダー(ガラル) | right_only |
163 | マルマイン(ヒスイ) | right_only |
164 | マルマイン | right_only |
165 | ビリリダマ(ヒスイ) | right_only |
166 | ビリリダマ | right_only |
167 rows × 2 columns
出力を変更するもの
show オプション (発行したSQL文やオプションを表示する)
show
を入力すると、コマンドがどういう風に実行されているかがわかる。デバッグ用の機能。
? コマンド名[ コマンドに対応するSQL文] オプション (オプションの説明や引数など) ... show
Query.exe("?minS 90 ?sev ちょうはつ show")
?minS[
SELECT pokedex.s,pokedex.name FROM pokedex WHERE pokedex.s>='90' AND pokedex.insv ORDER BY pokedex.s DESC]
and (inner join on name)
?sev[
SELECT pokedex.name,move.move FROM pokedex,poke2move,move WHERE move.move='ちょうはつ' AND poke2move.moveid = move.id AND pokedex.id = poke2move.id]
show
s | name | |
---|---|---|
0 | 150 | マルマイン |
1 | 150 | バドレックス(こくば) |
2 | 150 | マルマイン(ヒスイ) |
3 | 136 | テツノツツミ |
4 | 135 | ハバタクカミ |
... | ... | ... |
84 | 90 | ニャース |
85 | 90 | カラミンゴ |
86 | 90 | ファイヤー(ガラル) |
87 | 90 | ヤルキモノ |
88 | 90 | ザングース |
89 rows × 2 columns
out オプション (Google Spread Sheetに出力する)
outオプションを使うことで、今までDiscordに出力されていた表をGoogle Spread Sheetで編集・閲覧できるようになる。
Query.exe("?minS 90 ?sev ちょうはつ out")
(Spread SheetのURLが送信される)
plot オプション (グラフをプロットする)
plot
オプションでグラフを描画できる。あまり実用性がない
内部的にはpandasのplotメソッドが呼び出されている。
まずteras1 ポケモン名
でそのポケモンのシングルでのテラスタル使用率を表示。
Query.exe("?teras1 ハバタクカミ")
name | rank | terastype | raito | |
---|---|---|---|---|
0 | ハバタクカミ | 1 | フェアリー | 43.6 |
1 | ハバタクカミ | 2 | みず | 29.8 |
2 | ハバタクカミ | 3 | じめん | 9.0 |
3 | ハバタクカミ | 4 | ノーマル | 5.1 |
4 | ハバタクカミ | 5 | ゴースト | 4.9 |
5 | ハバタクカミ | 6 | ほのお | 4.9 |
6 | ハバタクカミ | 7 | くさ | 0.8 |
7 | ハバタクカミ | 8 | はがね | 0.8 |
8 | ハバタクカミ | 9 | かくとう | 0.4 |
9 | ハバタクカミ | 10 | でんき | 0.4 |
採用率が4%以上のテラスタイプ毎の円グラフはこんな感じ。
Query.exe( """ ?teras1 ハバタクカミ `raito>=4` plot kind:pie,x:terastype,y:raito,title:ハバタクカミのテラスタイプ使用率 """)
params | args | |
---|---|---|
0 | kind | pie |
1 | figsize | [4, 3] |
2 | x | terastype |
3 | y | raito |
4 | title | ハバタクカミのテラスタイプ使用率 |
5 | startangle | 90 |
6 | counterclock | False |
7 | labels | [フェアリー, みず, じめん, ノーマル, ゴースト, ほのお] |
8 | autopct | %1.1f%% |
棒グラフはこんな感じ。
Query.exe( """ ?single * `rank<=5` ?st * plot kind:bar,stacked:True,x:name,y:h;a;b;c;d;s """)
params | args | |
---|---|---|
0 | kind | bar |
1 | figsize | [4, 3] |
2 | x | name |
3 | y | [h, a, b, c, d, s] |
4 | stacked | True |
シングルにおけるS実数値の最大値のグラフ。
Query.exe( """ ?single * ?showS * groupby rank,name a_s:min;mean;max `rank<=50` plot kind:bar,x:name,y:a_s.max,figsize:16;9 """)
params | args | |
---|---|---|
0 | kind | bar |
1 | figsize | [16, 9] |
2 | x | name |
3 | y | a_s.max |
以上!説明終わり!