一覧へ Streamlit で Web アプリを作る 第3回 | 表の読み込み
高校の情報学探究 | Streamlit で Web アプリを作る | 第3回

表の読み込み

相手に CSV を選んでもらって中身を見せ、読み込める表と読み込めない表の境目を知る

10〜50分
教師用メモ

準備(授業前) 動かし方を 3 通りから先に一つ選ぶ(①各自の端末に入れる ②クラウドの実行環境 ③教師の 1 台で投影し、設計だけ各自が書く)。①②を選ぶ場合は pip install pandas も通るか 1 台で確かめる。読ませる CSV を 1 つ用意する(列が 3 つ、行が 20 行ほどの小さいもの)。教室コードは第1回と同じものを板書する。「教師」を押す。

投影 06 の仕分けは、答え合わせの前に「1 行目に何があるか」を全員で声に出す。08 の 2 つの表を並べて投影し、どこが違うかを指で示す。

時間配分

  • 50分版 01〜14 全部。02・03 前回と目標 5分 / 04〜07 読み込める表を見分ける 16分 / 08〜11 列を選ばせる 20分 / 12〜14 まとめ 9分
  • 20分版 01・03・05・06・07・09・10・12・13。表の見分け 8分 / 列を選ばせるコードを読む 5分 / 自分の表の列を決める 4分 / まとめ 3分
  • 10分版 01・05・06・10。読み込める表と読み込めない表を仕分けて 6 分、自分の表の列を 1 つ決めて 3 分で終える

この回の評価(評価規準と B・A の基準は 単元設計のページ。詳しいコードは 情報学探究マニュアル 第9節)

  • 知識・技能 CSV を受け取って中身を見せるコードを読み、どの行が何をしているか言える(体験01・体験02)
  • 思考・判断・表現 読み込める表の条件を挙げ、直さないと読めない表のどこが悪いかを指せる(体験01)
  • 態度 自分の題材で使う表と、選ばせたい列を決めようとしている(体験02・ふりかえり)

指導要領 高等学校 情報Ⅰ (3)「コンピュータとプログラミング」ア(イ)・イ(イ)、情報Ⅱ (4)「情報システムとプログラミング」ア(ウ)。設計指針(第2版)はこの単元で F2L4(抽象階層をもつプログラムを設計/構築できる)・F4L3(テストケースに基づき不備を確認し修正できる)・J3L1(システム開発が単なるプログラム作成と違う点)・B5L4(統一された UX をグループで設計/制作)に対応する。この回はF4L3の入口で、受け取るデータの形を先に決めさせる。

前にやった回 情報Ⅱ (4) 第11回「入口と出口は約束、中身は自由」。表の列の名前と形も、その約束の一つ。情報Ⅰ (4) 第9回「この問いに合うグラフはどれか」で扱った、集める前に決めておくことにもつながる。

環境が整わない場合の進め方 この回は実機がなくても進められる。06 の仕分けと 10 の設計は端末の中だけで完結する。Streamlit はブラウザだけでは動かないので、画面は 09 の図で見せる。自分の表を持っている生徒には、1 行目を紙に書き出させるだけでも足りる。

前回のまとめ

相手が入れた値で、返るものが変わった

入力 | 部品→処理 | ふつうの Python→出力 | st.write→今日 | 表ごと受け取る

前回入れてもらったのは、数が 1 つと文字が 1 つだった。自分で数えた記録は何十行もある表のことが多く、1 つずつ入れてもらうわけにはいかない

表をまるごと受け取るには、どうすればよいか

教師用メモ

3 分。前回決めた「入れてもらうもの」を開かせる。表を使う題材の生徒は、ここから先が本番になる。表を使わない題材の生徒にも、第4回の図を出すところで必要になると伝える。

今日の目標

授業の終わりにできるようになること

01
CSV を受け取って中身を見せる7 行を、行ごとに説明できる
02
読み込めない表を見分け、どこが悪いかを指せる
03
自分が使う表と、選ばせたい列を決められる

※ CSV(シーエスブイ)= 表を、1 行 1 件・項目をコンマで区切って並べただけの、いちばん単純な表のファイル。表計算ソフトでも分析の道具でも、そのまま開ける

01 | 16分
表を受け取る

読める形を見分ける

02 | 20分
列を選ばせる

相手に選んでもらう

次回 | 第4回
図を出す

選んだ列を図にする

SECTION 01

表を受け取る

読める形と、直さないと読めない形がある

手書きの記録用紙と、表計算の画面を並べて見比べながら打ち込んでいる高校生
受け取って、見せる

7 行で、相手の表が画面に出る

import streamlit as st
import pandas as pd

up = st.file_uploader("CSV を選ぶ", type="csv")
if up:
    df = pd.read_csv(up)
    st.write("行の数:", len(df))
    st.dataframe(df.head())
st.file_uploaderファイルを選んでもらう部品。type="csv" で CSV だけに絞る
if up:まだ選ばれていないときは中を実行しない。これを書かないと、開いた瞬間にエラーで止まる
pd.read_csvCSV を表(df)に変える。1 行目を列の名前として読む
st.dataframe表をそのまま画面に出す。df.head() は先頭 5 行だけ
教師用メモ

5 分 if up: の 1 行に時間を使う。相手はまだ何も選んでいない状態でページを開く。その最初の一瞬を手当てするのが、この 1 行。第6回の「まちがった入力でも止まらないか」の、いちばん小さい形。

pandas 情報Ⅰ (4) の分析で使った考え方と同じ。列の名前で呼び出せる表になる、とだけ言えばよい。

体験 01

この表は、そのまま読み込めるか

pd.read_csv は、1 行目を列の名前として読み、2 行目から下を記録として読む。8 つの表を仕分ける。まず上で付ける印を選び、次にその印を付けるものを押す。全部に印を付けたら「答え合わせ」

そのまま読める = 直さずに使える直さないと読めない = 先に手を入れる
教師用メモ

進め方(9分) 一人で 4 分、迷ったものを挙げさせて 5 分。

いちばん多い形 「上に題や説明が入っている」。人が読むために付けた行が、機械には邪魔になる。人が読む表と、機械が読む表は違うという言い方でまとめる。

単位つきの列 「23.4℃」は文字として読まれるので、平均も図も出せない。単位は列の名前のほうに入れる(「気温(℃)」)。次の枚で見せる。

2 行に 1 記録 見た目を整えるために折り返した表。1 行 1 記録に戻す。情報Ⅰ (4) で扱ったデータの形と同じ話。目標 02。

まとめ 01

1 行目は列の名前、2 行目から下は記録

そのまま読める日付,気温,人数 4/8,23.4,31 4/9,25.1,28 4/10,21.0,35
直さないと読めない4 月の記録(2 年 A 組) ※ 雨の日は測っていません 日付,気温,人数 4/8,23.4℃,31人
題や説明表の外に出す。どうしても残すなら、別のファイルに書く
単位数の隣ではなく、列の名前に入れる。「気温(℃)」「人数(人)」
1 行 1 記録折り返さない。列が増えても、横に伸ばす
空欄読み込めはする。ただし平均や図で外れるので、あることを先に数える
教師用メモ

3 分。自分の表を今から作る生徒は、ここで形を決めておくと後がまったく違うと強く言う。集め終わってから直すのは手間がかかる。情報Ⅰ (4) 第9回の「集める前に決める」と同じ。

SECTION 02

列を選ばせる

どの列を見るかは、開いた人に決めてもらう

画面に出た表の列の見出しを指でたどりながら、どれを見せるか考えている高校生
列を選ばせる

選択肢を書かずに、表の列をそのまま渡す

import streamlit as st
import pandas as pd

up = st.file_uploader("CSV を選ぶ", type="csv")
if up:
    df = pd.read_csv(up)
    st.dataframe(df.head())
    col = st.selectbox("見たい列", df.columns)
    st.write(df[col].value_counts())

df.columns は、その表の列の名前が並んだもの。前回の st.selectbox に選択肢を手で書いた所に、これを渡す

df.columns→日付 / 気温 / 人数→選ぶ欄になる

選択肢を書かないので、どんな表が来ても動く。相手の表の列が 3 つでも 10 個でも、そのまま並ぶ

※ df[col] は「選ばれた名前の列」。.value_counts() は、その列に同じ値がいくつあるかを数える

教師用メモ

6 分 前回の st.selectbox("何を買うか", ["うどん", "パン", "おにぎり"]) と並べて見せる。選択肢の中身を、こちらで決めないで済むことが値打ち。

ここが抽象化 「どんな表が来ても動く」形にすると、自分以外の人の表でも使える。情報Ⅱ (4) 第11回の「中身を知らなくても使える」と同じ考え方。設計指針 F2L4 の場面。

体験 02

自分の表と、選ばせたい列を決める

6 つの欄に、自分が使う表のことを一つずつ書く。書けたら右の「決めた」に印を付ける。まだ表が無い人も、06 に集める日を書けば進められる。この画面は自分の端末にだけ残る

01
何の表か
02
1 行目に並ぶ列の名前
03
1 つの行は何を表すか
04
単位はどこに入れたか
05
相手に選ばせたい列
06
まだ持っていない表なら、いつ集めるか
※ この 6 行はこの端末に残る。第4回と第6回で開く。「消す」を押すと 6 行が空になる
教師用メモ

進め方(14分) 01〜03 を書く 5 分 → 隣と交換して「その列で、返したいものが出せるか」を確かめる 4 分 → 04〜06 を書く 5 分。

よくある直し 列の名前に単位が入っていない → 04 で直させる / 1 行が何を表すか書けない → 表の形が決まっていない証拠。01 に戻す / 「まだ表がない」→ 06 に集める日を書かせる。表がなくても設計は進む。

表を使わない題材の生徒 第4回で図を出すときに要るので、身のまわりの小さな記録(自分の睡眠時間、部活のタイム)を 1 つ決めさせる。10 行でよい。

環境が無い場合 この枚はそのまま全員できる。紙で書かせてもよい。目標 03。

まとめ 02

表の形を決めるのは、集める前

受け取るst.file_uploader で選んでもらう。if up: で、まだ選ばれていないときを手当てする
表にするpd.read_csv。1 行目が列の名前になる。題や説明は表の外に出しておく
見せるst.dataframe。df.head() なら先頭 5 行だけ。全部出すと画面が埋まる
選ばせるst.selectbox("見たい列", df.columns)。選択肢を書かないので、どんな表でも動く

次回は、選んだ列を図にする。どの図が合うかは、問いによって決まる

教師用メモ

2 分。「人が読む表と、機械が読む表は違う」をもう一度言う。ここで形を決めておくと、第4回の図がそのまま出る。

今日のまとめ

相手の表を受け取って、中身を見せた

01
受け取る 7 行で CSV を表にして画面に出せる。if up: が最初の手当て
02
見分ける 1 行目が列の名前か、単位が数の隣に混ざっていないか、1 行 1 記録か
03
選ばせる df.columns を渡すと、どんな表が来ても選ぶ欄になる
自己評価

今日の目標、自分はどこまで

3 つの目標それぞれに、できた/だいたい/まだ、を 1 つ選ぶ。右の帯にクラス全体の分布が出る

今日の目標、自分はどこまで | 1 つずつ選ぶ
01CSV を受け取って見せる 7 行を、行ごとに説明できた
02読み込めない表を見分け、どこが悪いか指せた
03自分が使う表と、選ばせたい列を決められた
できただいたいまだ
教師用メモ

1 分。03 が「まだ」の生徒には、次回までに 10 行の表を 1 つ作るよう伝える。自分の睡眠時間でも、部活のタイムでもよい。

ふりかえり

自分の表で、直さないといけない所

一文でよい。まだ表がない人は「いつ、何を、何行ぶん集めるか」を書く

みんなの直すところ
教師用メモ

3 分。同じ直しが多ければ、次回の冒頭で 3 分使って全体に見せる。教室コードを忘れずに板書。