25日目ではcsvを読み込んでデータを扱う授業。
Angela YuのUdemyではアメリカの州を当てるクイズを作成しましたが、
今回は日本地図で応用してみました。
csvは今までは
import csv
with openとかで読み込んでましたが、今回はpandasモジュールを使います。
pandasモジュールはpythonでデータ分析などをするならかなり重要なので
勉強してたら絶対見聞きするもの。
csvを表にしてcsvデータの取得や入力・変更などを簡単にできるモジュール。
pandasは後々の授業で詳しくしていたので後々復習。
イメージはこんな感じ
流れとしては
- 都道府県名を答える入力ポップアップが出てくる
- 答えがあっていたら、その県名の位置か近くに県名が表示される
- 答えられると答えた数と表示される県名がどんどん増える
- saveを入力すると、答えていない都道府県名だけをcsvにして保存する
こんな感じです。
今回は保存するだけでプロジェクトを再起動した時に残りの都道府県からはじまる、というような機能は持ち合わせていないです。
あくまでpandasでcsvを保存する機能を使う、というだけ。
はじめます。
今回もturtleモジュールを使います。turtle便利。
import pandas
import turtle
screen = turtle.Screen()
screen.title("日本地図都道府県当てゲーム")
screen.setup(883, 800)
image = "map.gif"
screen.addshape(image)
turtle.shape(image)
screenでサイズを設定して、
タートルの形を日本地図の形に設定。
data = pandas.read_csv("47ken.csv")
all_states = data.state.to_list()
states_num = []
pandas.read_csv("読み込みたいファイル")
で読み込むことができます。
pandasで読み込むと、
コンソール上でもこんな感じで綺麗に表示されます。
x、yは表記される位置を表しています。
all_states はこの表では質問と答えを照らし合わせるものにx,yは必要ないので
都道府県名のみをto_listでリスト化しています。
data.stateはdata["state"]と同じ。
states_numの空リストは、saveを押した時に答えた都道府県じゃないものを保存するためのリスト。
答えを求める入力ウィンドウを表示する
全部答えたら終わりというwhileを設定して、
inputで都道府県入力ウィンドウを出します。
while len(states_num) < 48:
answer = screen.textinput(f"{len(states_num)}/47県 正解!", "都道府県名を答えてください")
答えがall_statesのリストにあったら、
dataのxとyの位置に答えを入力するというコードを書きます。
if answer in all_states:
ken = turtle.Turtle()
ken.ht()
ken.penup()
state_data = data[data.state == answer]
ken.goto(int(state_data.x), int(state_data.y))
ken.write(answer)
states_num.append(answer)
state_data = data[data.state == answer]というのは
dataのテーブルの要素と答えたものの要素だけを抽出したものをstate_dataに抽出しています。pandasだからできること(なはず)
なのでpandasの表のスクショを見てもらって
答えた都道府県が北海道の場合は
0 北海道 88 305 というデータがstate_dataに保存されているということ。
その後のgotoで、state_data.x = 88 , sate_data.y = 305 の場所に
answer = 北海道 を入力するという動作になります。
ここはstate_data.stateになぜしないのかというとstate_data.stateというのは
あくまでdataというオブジェクトから抽出しているので本体はdata。
試しにwrite(state_data.state)にしてみると、こうなる。
余計なものがついてくる。
最後にstates_numに答えた都道府県を空リストに追加します。
これでほぼゲームは完成。
あとはsaveを入力した時に答えていない都道府県をcsvで保存します。
elif answer == "save":
remain_states = []
for state in all_states:
if state not in states_num:
remain_states.append(state)
remain_data = pandas.DataFrame(remain_states)
remain_data.to_csv("remain_states.csv", header=False, index=False)
break
screen.exitonclick()
ちょっとややこしい部分がfor以下の部分ですが
remain_states = []は、全ての都道府県が入っているall_statesリストから
最初に定義した答えをリストに入れていった states_num を引いたものをいれるためのリスト。
なのでfor以下を説明すると
all_statesから1つずつ回していって、答えのリストに入ってなかったら
remain_statesに入れていって全て終わったらremain_states.csvに保存する、ということ。
header=False, index=Falseというのはエクセルでいうところの一番上の行と左の行の数字はいらないよという指示をしています。
saveをしたらbreakで質問がでなくなるので、画面をクリックして終了。
全てのデータはこちら。