【?】コマンドの使い方・オプション編[Discord Bot]

本記事では、以下の項目について説明をする。

  • ? コマンドの基本的な使い方
  • ? コマンドのオプション

正直コマンドのオプションを増やしすぎた

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と入力すると、

  1. ちょうはつを覚えるポケモンがピックアップされる

  2. ちょうはつを覚えるポケモンのうち、S種族値が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 *")
s name
0 200 レジエレキ
1 150 マルマイン
2 150 マルマイン(ヒスイ)
3 150 バドレックス(こくば)
4 148 ザシアン(王)
5 142 ドラパルト

※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+@で入力できます

SQLWHERE句と同じなので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>=160a>=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 オプション (列を抽出)

?st *で、全ポケモン種族値データを表示できる。

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番目以降の行が削除される。

また、uniquedup同様、複数列を対象にできる。

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

以上!説明終わり!