Spaces:
Running
Running
Commit ·
271e6aa
1
Parent(s): 3b4b59c
Publish standalone Lesson 21 starter for students continuing from Lesson 19
Browse files- classroom_data/course.json +2 -2
- classroom_data/templates/week21/DATA_SOURCE.md +18 -0
- classroom_data/templates/week21/README.md +45 -0
- classroom_data/templates/week21/REPORT.md +38 -0
- classroom_data/templates/week21/data/students_by_county.csv +243 -0
- classroom_data/templates/week21/main.py +114 -0
- tests/test_lesson21_template.py +73 -0
classroom_data/course.json
CHANGED
|
@@ -328,7 +328,7 @@
|
|
| 328 |
"project": "公開資料分析",
|
| 329 |
"output": "用排名、差值或圖表回答自己的問題,說明計算方式。",
|
| 330 |
"workspace_id": "week19",
|
| 331 |
-
"template":
|
| 332 |
"guide": {
|
| 333 |
"goal": "用排名、差值或圖表回答自己的問題,說明計算方式。",
|
| 334 |
"source_title": "教育部統計處|各級學校縣市別學生人數",
|
|
@@ -338,7 +338,7 @@
|
|
| 338 |
{
|
| 339 |
"time": "0–20 分",
|
| 340 |
"title": "人數增減",
|
| 341 |
-
"body": "
|
| 342 |
},
|
| 343 |
{
|
| 344 |
"time": "20–35 分",
|
|
|
|
| 328 |
"project": "公開資料分析",
|
| 329 |
"output": "用排名、差值或圖表回答自己的問題,說明計算方式。",
|
| 330 |
"workspace_id": "week19",
|
| 331 |
+
"template": true,
|
| 332 |
"guide": {
|
| 333 |
"goal": "用排名、差值或圖表回答自己的問題,說明計算方式。",
|
| 334 |
"source_title": "教育部統計處|各級學校縣市別學生人數",
|
|
|
|
| 338 |
{
|
| 339 |
"time": "0–20 分",
|
| 340 |
"title": "人數增減",
|
| 341 |
+
"body": "先執行 L21 套版;讀檔、數字轉換與查詢函式已備好,不需先完成 L20。核對兩個原始人數,再做新北市示範與臺中市練習。已有專案者先暫存,再決定是否匯入套版。"
|
| 342 |
},
|
| 343 |
{
|
| 344 |
"time": "20–35 分",
|
classroom_data/templates/week21/DATA_SOURCE.md
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 範例資料來源
|
| 2 |
+
|
| 3 |
+
- 資料集:教育部統計處「各級學校縣市別學生人數」
|
| 4 |
+
- 資料集頁面:https://data.gov.tw/dataset/40121
|
| 5 |
+
- 原始 CSV:`data/students_by_county.csv`
|
| 6 |
+
- 內容:104–114 學年度各縣市各教育階段的彙總學生人數。
|
| 7 |
+
- 檔案共有 242 筆資料、15 個欄位,涵蓋 22 個縣市。
|
| 8 |
+
- 授權:政府資料開放授權條款第 1 版;使用或改作時保留資料來源註記。
|
| 9 |
+
|
| 10 |
+
## 下載同一份資料
|
| 11 |
+
|
| 12 |
+
1. 開啟上方資料集頁面。
|
| 13 |
+
2. 找到「資料資源下載網址」,按左側的 **CSV** 按鈕。旁邊的「檢視資料」是檔案說明。
|
| 14 |
+
3. 下載的檔名是 `edu_B_1_4.csv`。本課把它改名為 `students_by_county.csv`,放在專案的 `data` 資料夾。
|
| 15 |
+
|
| 16 |
+
課堂專案已附檔,不需要重新下載。網站之後可能更新年份;上課範例以本課提供的 104–114 學年度版本為準。
|
| 17 |
+
|
| 18 |
+
這是彙總統計資料。它可以回答「多少人」或「不同地區、學年度的數值如何變化」,不能單獨說明變化的原因。若換成其他公開資料,請把來源網址、下載日期、欄位和單位補進本檔。
|
classroom_data/templates/week21/README.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Lesson 21|比較與圖表
|
| 2 |
+
|
| 3 |
+
執行 `main.py` 就能看到人數排名、文字長條圖,以及兩個學年度的原始人數。CSV 和工具函式都已備好,只使用 Python 內建模組,不需要另外安裝套件或下載資料。
|
| 4 |
+
|
| 5 |
+
## 怎麼使用
|
| 6 |
+
|
| 7 |
+
1. 先執行一次,確認讀入 242 列資料,並看到 114 學年度的國小人數排名。
|
| 8 |
+
2. 在 CSV 裡找到其中一筆數字,核對學年度、縣市與欄位。
|
| 9 |
+
3. 到 `main()` 下半部,找到 `change = None`,改成「後來的人數減去原來的人數」的算式,再執行。
|
| 10 |
+
4. 修改檔案上方的 `COUNTY`、`BEFORE_YEAR`、`AFTER_YEAR`、`FIELD` 或 `TOP_N`,回答自己的問題。
|
| 11 |
+
5. 把一張文字圖或一組比較結果記在 `REPORT.md`,先暫存進度;要交作品時再正式提交。
|
| 12 |
+
|
| 13 |
+
可以先完成排名圖或跨年比較其中一種,再由老師依程度安排延伸。
|
| 14 |
+
|
| 15 |
+
## 可以查詢的工具
|
| 16 |
+
|
| 17 |
+
```python
|
| 18 |
+
rows = load_rows()
|
| 19 |
+
before = get_count(rows, "104", "新北市", "國小[人]")
|
| 20 |
+
after = get_count(rows, "114", "新北市", "國小[人]")
|
| 21 |
+
results = count_by_county(rows, "114", "國中[人]")
|
| 22 |
+
print_text_chart(results, 5)
|
| 23 |
+
```
|
| 24 |
+
|
| 25 |
+
- `load_rows()`:讀取專案裡的 CSV。
|
| 26 |
+
- `get_count()`:取得一個學年度、一個縣市、一個欄位的人數。
|
| 27 |
+
- `count_by_county()`:取得同一學年度的縣市人數排名。
|
| 28 |
+
- `print_text_chart()`:印出同尺度的文字長條圖。
|
| 29 |
+
- `parse_count()`:把 `"1,234"` 轉成 `1234`;空白、破折號和無效值會得到 `None`,不會誤當成 0。
|
| 30 |
+
|
| 31 |
+
欄位名稱要與 CSV 完全一致,例如 `國小[人]`、`國中[人]`。縣市使用原表寫法,例如 `臺中市`。
|
| 32 |
+
|
| 33 |
+
## 核對用例子
|
| 34 |
+
|
| 35 |
+
- 新北市國小:104 學年度 201,970 人;114 學年度 194,670 人。
|
| 36 |
+
- 臺中市國小:104 學年度 157,272 人;114 學年度 161,332 人。
|
| 37 |
+
- 114 學年度國小前 3 名:新北市、臺中市、桃園市。
|
| 38 |
+
|
| 39 |
+
圖表要標明學年度、教育階段、單位與來源。只比較兩個學年度,不能直接寫成「每年都增加/減少」,也不能單靠人數判斷原因。
|
| 40 |
+
|
| 41 |
+
選做:計算百分比時,以原來的人數作分母;原來的人數是 0 時不能直接相除。
|
| 42 |
+
|
| 43 |
+
## 已經有自己的進度
|
| 44 |
+
|
| 45 |
+
Lesson 19–22 沿用同一個專案。切換 Lesson 不會自動匯入套版;已有程式與報告時,請先暫存或下載備份,再決定是否匯入起始套版。沿用原專案的同學,也可以只參考上述查詢函式與相減寫法。
|
classroom_data/templates/week21/REPORT.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# 我的資料比較
|
| 2 |
+
|
| 3 |
+
## 我想回答的問題
|
| 4 |
+
|
| 5 |
+
<!-- 寫清楚比較的學年度、縣市與教育階段。 -->
|
| 6 |
+
|
| 7 |
+
## 資料來源
|
| 8 |
+
|
| 9 |
+
- 資料名稱:各級學校縣市別學生人數
|
| 10 |
+
- 提供機關:教育部統計處
|
| 11 |
+
- 來源網址:https://data.gov.tw/dataset/40121
|
| 12 |
+
- 課堂資料:data/students_by_county.csv
|
| 13 |
+
- 資料範圍:104–114 學年度,各縣市彙總學生人數
|
| 14 |
+
- 單位:人
|
| 15 |
+
|
| 16 |
+
## 我使用的條件與方法
|
| 17 |
+
|
| 18 |
+
<!-- 寫下程式使用的年份、縣市、欄位;選排名或跨年比較其中一種即可。 -->
|
| 19 |
+
|
| 20 |
+
## 原始數字與計算
|
| 21 |
+
|
| 22 |
+
<!-- 貼上程式輸出或文字圖。若計算差值,保留相減前的兩個原始人數與算式。 -->
|
| 23 |
+
|
| 24 |
+
## 我核對了什麼
|
| 25 |
+
|
| 26 |
+
<!-- 到 CSV 核對一筆排名數字;若相減,則核對兩筆原始數字。 -->
|
| 27 |
+
|
| 28 |
+
## 我的發現
|
| 29 |
+
|
| 30 |
+
<!-- 讓結論與程式裡的年份、對象、欄位及數字一致。 -->
|
| 31 |
+
|
| 32 |
+
## 這份資料不能回答什麼
|
| 33 |
+
|
| 34 |
+
<!-- 例如:比較人數可以看出差異,但還不足以證明變化的原因。 -->
|
| 35 |
+
|
| 36 |
+
## AI 使用紀錄
|
| 37 |
+
|
| 38 |
+
<!-- 如實寫一件使用 AI 與自己核對的事;沒有使用就寫「本次未使用」。 -->
|
classroom_data/templates/week21/data/students_by_county.csv
ADDED
|
@@ -0,0 +1,243 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
學年度,縣市別,幼兒園[人],國小[人],國中[人],高級中等學校-普通科[人],高級中等學校-專業群科[人],高級中等學校-綜合高中[人],高級中等學校-實用技能學程[人],高級中等學校-進修部[人],大專校院(全部計入校本部)[人],大專校院(跨縣市教學計入所在地縣市)[人],宗教研修學院[人],國中小進修部(補校)及大專進修學校及空大[人],特殊教育學校[人]
|
| 2 |
+
104,新北市,73526,201970,116039,40566,41358,5773,1434,6816,161853,154484,138,17150,400
|
| 3 |
+
104,臺北市,47269,118471,75015,60532,39235,4892,530,7152,267363,244091,42,9174,828
|
| 4 |
+
104,桃園市,44367,128444,76299,29529,36060,4300,4963,7623,109869,120426,0,2532,438
|
| 5 |
+
104,臺中市,65946,157272,97447,37771,54951,3027,3423,7885,192593,191962,0,10182,953
|
| 6 |
+
104,臺南市,40731,92570,58160,25795,24022,6146,4557,2813,132736,135744,0,1601,533
|
| 7 |
+
104,高雄市,49321,134949,83539,35600,39574,5499,6502,4915,149988,156110,12,9450,678
|
| 8 |
+
104,宜蘭縣,9791,23227,16014,6409,4899,1471,805,732,14725,17952,0,811,129
|
| 9 |
+
104,新竹縣,13997,36265,19150,4230,5487,2763,858,1436,17525,23665,0,653,230
|
| 10 |
+
104,苗栗縣,10492,29940,18268,5922,8086,2136,1285,1247,21352,21352,0,903,136
|
| 11 |
+
104,彰化縣,24073,68920,42767,11939,19919,4790,2755,3975,38990,38990,0,1309,670
|
| 12 |
+
104,南投縣,9328,25439,17256,4504,8411,870,1236,960,12458,12458,0,555,126
|
| 13 |
+
104,雲林縣,12818,35903,24178,8009,9430,1971,1563,698,26340,27035,0,1145,211
|
| 14 |
+
104,嘉義縣,8175,22434,14440,2708,5244,515,1697,460,25071,30424,0,914,0
|
| 15 |
+
104,屏東縣,13986,39629,26193,8977,10010,1381,855,1299,42083,42203,0,1406,185
|
| 16 |
+
104,臺東縣,4319,11156,7227,513,2349,3224,188,329,5963,6008,0,54,101
|
| 17 |
+
104,花蓮縣,6561,16538,10861,4168,4184,2682,93,673,19610,19562,0,284,170
|
| 18 |
+
104,澎湖縣,1635,3972,2670,1018,1651,0,60,0,2984,2984,0,33,0
|
| 19 |
+
104,基隆市,6091,17341,11496,5081,6555,416,365,656,16077,16077,0,2018,157
|
| 20 |
+
104,新竹市,11697,29694,16662,8793,5764,3630,621,1785,51748,51050,0,249,0
|
| 21 |
+
104,嘉義市,5918,16104,11640,6358,9204,1660,1846,842,18728,15324,0,268,316
|
| 22 |
+
104,金門縣,1851,3679,2144,988,961,0,60,53,4389,4523,0,0,0
|
| 23 |
+
104,連江縣,223,443,259,0,0,335,0,0,0,21,0,0,0
|
| 24 |
+
105,新北市,77229,195706,106199,41342,39875,5791,1205,6119,157674,151012,136,16599,397
|
| 25 |
+
105,臺北市,50079,116496,69178,59008,37749,4659,472,6294,267043,244062,53,8685,815
|
| 26 |
+
105,桃園市,47794,124604,70471,29658,36600,3393,4944,7041,106343,116787,0,2675,448
|
| 27 |
+
105,臺中市,72269,153062,89408,37764,54626,2042,3634,7160,191224,190633,0,10001,940
|
| 28 |
+
105,臺南市,43250,89475,53089,26098,23331,5324,4362,2700,128882,131468,0,1429,508
|
| 29 |
+
105,高雄市,54095,129914,76167,35688,39310,4683,5988,4136,148244,154088,27,8797,667
|
| 30 |
+
105,宜蘭縣,10247,22349,14783,6383,4743,1399,769,607,14458,17717,0,872,115
|
| 31 |
+
105,新竹縣,14995,35692,18044,5089,5565,1803,829,1392,16395,22667,0,607,230
|
| 32 |
+
105,苗栗縣,11018,28579,16836,6157,8037,1852,1216,1124,20832,20794,0,707,129
|
| 33 |
+
105,彰化縣,25336,65423,39679,12079,19434,4550,2799,3684,37422,37450,0,1160,623
|
| 34 |
+
105,南投縣,9873,24180,15716,4461,8426,739,1226,791,12191,12191,13,536,149
|
| 35 |
+
105,雲林縣,13080,34012,22308,8080,9369,1810,1527,658,25729,26405,0,1070,208
|
| 36 |
+
105,嘉義縣,8490,20810,13153,2729,4953,519,1778,483,24448,29757,0,915,0
|
| 37 |
+
105,屏東縣,14616,37482,24014,9246,9664,1091,811,1206,41174,41150,0,1487,189
|
| 38 |
+
105,臺東縣,4510,10702,6682,537,2519,2847,182,303,5910,6091,0,37,111
|
| 39 |
+
105,花蓮縣,6772,15914,10165,4144,4074,2404,64,598,19426,19510,0,257,171
|
| 40 |
+
105,澎湖縣,1685,3756,2452,1000,1668,0,65,0,3018,3018,0,29,0
|
| 41 |
+
105,基隆市,6451,16654,10279,5082,6395,383,373,535,15741,15741,0,2118,159
|
| 42 |
+
105,新竹市,12544,29534,15683,9016,5783,3649,607,1677,50315,49211,0,282,0
|
| 43 |
+
105,嘉義市,6220,15468,10634,6507,9047,1475,1892,777,18457,15053,0,251,329
|
| 44 |
+
105,金門縣,1936,3618,2023,1009,1016,0,51,36,4515,4618,0,0,0
|
| 45 |
+
105,連江縣,292,455,249,0,0,324,0,0,0,18,0,0,0
|
| 46 |
+
106,新北市,81348,192321,100608,40999,37328,5581,917,5336,151475,145054,116,16615,385
|
| 47 |
+
106,臺北市,52253,115679,66746,58742,35058,4072,377,5448,263668,241829,81,8120,779
|
| 48 |
+
106,桃園市,51322,122590,67375,29822,35420,3032,4770,5965,102983,114101,0,2633,450
|
| 49 |
+
106,臺中市,77619,150412,85244,37962,50784,2020,3836,6211,188641,188114,0,9450,897
|
| 50 |
+
106,臺南市,46663,87329,50556,25817,22075,4418,4007,2540,124447,126610,0,1397,482
|
| 51 |
+
106,高雄市,56968,125900,72395,35657,38273,3347,5579,3557,144540,149969,72,8142,673
|
| 52 |
+
106,宜蘭縣,10639,21563,14108,6290,4513,1306,673,529,13546,16707,0,806,116
|
| 53 |
+
106,新竹縣,16035,35578,17398,5351,5436,1431,869,1241,15259,20942,0,561,235
|
| 54 |
+
106,苗栗縣,11727,27602,15835,6216,7835,1552,1221,934,19806,19674,0,425,135
|
| 55 |
+
106,彰化縣,26724,62830,37275,12119,18398,4270,2726,3397,35163,35166,0,1099,565
|
| 56 |
+
106,南投縣,10345,23221,14436,4525,8302,623,1114,679,11578,11578,28,530,145
|
| 57 |
+
106,雲林縣,13617,32410,21017,7949,8666,1577,1451,667,25198,25932,0,1066,197
|
| 58 |
+
106,嘉義縣,8649,19569,12207,2732,4964,495,1583,502,24088,29101,0,886,0
|
| 59 |
+
106,屏東縣,15592,35645,22574,9068,9114,964,698,1105,39787,39639,0,1494,189
|
| 60 |
+
106,臺東縣,4643,10385,6303,563,2543,2635,188,257,5860,5997,0,28,114
|
| 61 |
+
106,花蓮縣,7017,15363,9614,4047,3875,2185,28,538,18762,18819,0,256,158
|
| 62 |
+
106,澎湖縣,1766,3524,2362,970,1588,0,64,0,3008,3008,0,18,0
|
| 63 |
+
106,基隆市,6909,15944,9635,4696,5852,349,412,437,15211,15211,0,2208,131
|
| 64 |
+
106,新竹市,13284,29635,15414,9300,5680,3397,559,1518,48359,47203,0,280,0
|
| 65 |
+
106,嘉義市,6466,15068,9996,6407,8940,1371,1922,693,18014,14659,0,230,302
|
| 66 |
+
106,金門縣,2026,3619,1948,1007,1005,0,47,52,4501,4562,0,0,0
|
| 67 |
+
106,連江縣,292,474,227,0,0,304,0,0,0,19,0,0,0
|
| 68 |
+
107,新北市,83960,195862,95923,39153,34275,5128,700,4693,147293,141046,89,17056,318
|
| 69 |
+
107,臺北市,54229,118097,64651,57381,31239,3316,302,4712,259340,239263,124,7409,739
|
| 70 |
+
107,桃園市,54358,124639,64734,29262,33257,2544,4422,5138,101858,113066,0,2628,419
|
| 71 |
+
107,臺中市,79891,153260,81865,37422,45640,1970,4119,5479,186363,185886,0,9543,807
|
| 72 |
+
107,臺南市,47210,88745,48570,24629,19920,3480,3594,2101,120215,121598,47,1342,446
|
| 73 |
+
107,高雄市,57683,126527,69362,34231,36231,2134,5094,3021,141008,146140,128,7742,625
|
| 74 |
+
107,宜蘭縣,10876,21515,13233,5981,4325,1233,610,555,12864,15850,0,816,103
|
| 75 |
+
107,新竹縣,16412,36512,16990,5204,5121,1174,850,949,14411,19541,0,545,241
|
| 76 |
+
107,苗栗縣,12027,27778,14967,6182,7363,1152,1206,867,18887,18704,0,219,118
|
| 77 |
+
107,彰化縣,29513,62367,35150,11949,17139,3951,2689,2712,33376,33328,0,870,511
|
| 78 |
+
107,南投縣,10617,22763,13531,4269,7575,637,970,588,10926,10926,50,470,137
|
| 79 |
+
107,雲林縣,14170,31645,19840,7607,7833,1273,1403,642,24836,25598,0,1038,202
|
| 80 |
+
107,嘉義縣,8865,18736,11450,2700,4597,426,1336,399,27312,31702,0,979,0
|
| 81 |
+
107,屏東縣,16004,35146,21110,8665,8086,828,640,1095,38794,38541,0,1532,173
|
| 82 |
+
107,臺東縣,4733,10189,6052,562,2622,2349,185,275,5757,5814,0,37,108
|
| 83 |
+
107,花蓮縣,7160,15235,9102,3975,3725,1780,72,491,18269,18301,0,269,143
|
| 84 |
+
107,澎湖縣,1803,3472,2200,897,1542,0,44,0,3025,3025,0,18,0
|
| 85 |
+
107,基隆市,7169,15896,9031,4093,5088,338,411,413,14802,14802,0,2162,114
|
| 86 |
+
107,新竹市,13773,30866,15214,9256,5875,2906,533,1358,47161,46003,0,246,0
|
| 87 |
+
107,嘉義市,6628,15090,9351,6298,8298,1214,1865,589,14022,11234,0,208,288
|
| 88 |
+
107,金門縣,2037,3729,1863,976,1018,0,34,47,4303,4374,0,0,0
|
| 89 |
+
107,連江縣,286,482,220,0,0,285,0,0,0,80,0,0,0
|
| 90 |
+
108,新北市,87311,198588,93426,37425,30732,4471,600,4028,141670,135795,81,17747,271
|
| 91 |
+
108,臺北市,56635,120623,64558,56217,26944,2641,323,4024,256209,237838,148,7326,653
|
| 92 |
+
108,桃園市,58589,126902,63378,29030,30448,1781,3993,4183,99870,110856,0,2639,409
|
| 93 |
+
108,臺中市,81908,155376,80549,36466,39657,1806,4435,4760,184268,183875,0,9967,702
|
| 94 |
+
108,臺南市,47967,90188,47473,23228,17808,2843,3121,1912,115057,115794,67,1578,408
|
| 95 |
+
108,高雄市,60483,127513,67579,32753,33865,1212,4279,2681,138258,143051,171,7619,566
|
| 96 |
+
108,宜蘭縣,11389,21698,12534,5663,4093,1103,601,581,12197,14880,0,689,86
|
| 97 |
+
108,新竹縣,17325,37203,16909,5029,4977,918,824,760,13314,17919,0,584,213
|
| 98 |
+
108,苗栗縣,13390,27856,14515,5933,6656,971,1083,769,18246,18018,0,228,114
|
| 99 |
+
108,彰化縣,31301,62052,33185,11609,15924,3582,2643,2113,31147,31147,0,817,493
|
| 100 |
+
108,南投縣,11295,22689,12793,3907,6876,778,796,561,10214,10214,58,494,123
|
| 101 |
+
108,雲林縣,14988,31117,18968,7225,6736,1182,1285,530,24603,25358,0,817,193
|
| 102 |
+
108,嘉義縣,9097,18355,10668,2636,4058,352,1080,333,26309,30480,0,1095,0
|
| 103 |
+
108,屏東縣,17157,34688,20054,8123,7020,700,562,866,36734,36549,0,1310,168
|
| 104 |
+
108,臺東縣,4853,9975,5805,541,2533,2105,187,237,5842,5863,0,33,114
|
| 105 |
+
108,花蓮縣,7531,15217,8567,3810,3504,1485,20,434,18027,18040,0,289,127
|
| 106 |
+
108,澎湖縣,1866,3472,2062,833,1368,0,52,0,3051,3051,0,36,0
|
| 107 |
+
108,基隆市,7506,15862,8704,3502,4334,270,323,370,14561,14561,0,2061,114
|
| 108 |
+
108,新竹市,14559,31907,15323,9025,6102,2073,494,1158,45986,44777,0,179,0
|
| 109 |
+
108,嘉義市,6996,15107,8843,6076,7488,991,1746,423,13222,10593,0,184,264
|
| 110 |
+
108,金門縣,2099,3756,1846,948,931,0,4,63,4387,4451,0,0,0
|
| 111 |
+
108,連江縣,300,470,241,0,0,257,0,0,0,62,0,0,0
|
| 112 |
+
109,新北市,89211,199521,92271,36692,28494,4259,516,3514,139130,133358,74,17165,260
|
| 113 |
+
109,臺北市,58312,122605,65349,55247,24765,2264,328,3646,256492,239317,154,4010,633
|
| 114 |
+
109,桃園市,61674,128236,62781,28861,28965,1269,3538,3496,100402,111374,0,1409,384
|
| 115 |
+
109,臺中市,84021,156584,79598,36000,35898,1680,5002,4219,186976,186543,0,6087,655
|
| 116 |
+
109,臺南市,49113,90522,46886,22560,16556,2453,2897,1689,111807,112370,75,819,391
|
| 117 |
+
109,高雄市,63771,127298,66052,31908,32132,1033,3562,2256,137812,142353,178,5159,535
|
| 118 |
+
109,宜蘭縣,11549,21737,11869,5520,4016,988,566,481,11674,14166,0,427,91
|
| 119 |
+
109,新竹縣,18473,37672,17130,4971,4884,851,780,729,12657,16589,0,187,192
|
| 120 |
+
109,苗栗縣,14077,27698,14088,5921,6148,720,946,655,18036,17809,0,221,105
|
| 121 |
+
109,彰化縣,32060,61453,31796,10988,15106,3324,2598,1737,28036,28036,0,455,498
|
| 122 |
+
109,南投縣,11741,22273,12183,3646,6155,913,636,512,9771,9771,69,220,114
|
| 123 |
+
109,雲林縣,15183,30472,18282,7091,6310,1116,1228,469,24519,25319,0,435,187
|
| 124 |
+
109,嘉義縣,9397,17770,9990,2682,3212,197,850,218,25456,29682,0,118,0
|
| 125 |
+
109,屏東縣,17983,34316,18930,7907,6302,649,483,722,35511,35454,0,683,163
|
| 126 |
+
109,臺東縣,4923,9859,5592,592,2457,1867,167,199,5980,5953,0,28,104
|
| 127 |
+
109,花蓮縣,7601,15194,8248,3696,3356,1212,14,419,17821,17714,0,192,110
|
| 128 |
+
109,澎湖縣,1848,3446,1902,818,1283,0,47,0,3047,3047,0,33,0
|
| 129 |
+
109,基隆市,8009,15691,8368,3338,3956,240,271,332,15735,15735,0,261,119
|
| 130 |
+
109,新竹市,14728,32372,15651,8807,6680,1373,492,1106,45641,44392,0,154,0
|
| 131 |
+
109,嘉義市,7237,14846,8710,6177,6906,796,1706,373,12826,10221,0,95,218
|
| 132 |
+
109,金門縣,2202,3808,1854,941,911,0,0,50,4131,4213,0,0,0
|
| 133 |
+
109,連江縣,293,493,257,0,0,237,0,0,0,44,0,0,0
|
| 134 |
+
110,新北市,88778,202529,91044,36286,27493,4080,403,3135,135995,130782,65,16922,262
|
| 135 |
+
110,臺北市,57492,125093,65268,54449,22915,1942,360,3373,250939,239082,165,3422,587
|
| 136 |
+
110,桃園市,62155,131258,62184,28842,27813,922,3225,3082,99535,110565,18,1203,353
|
| 137 |
+
110,臺中市,82579,160242,78320,35832,33498,1509,5328,3795,187115,186634,0,4737,635
|
| 138 |
+
110,臺南市,49071,91967,46589,22150,15877,2340,2637,1595,108005,108508,73,728,387
|
| 139 |
+
110,高雄市,65003,128846,64368,31497,30510,1052,3279,2098,136309,140652,150,5263,499
|
| 140 |
+
110,宜蘭縣,11578,21720,11620,5346,3938,933,521,459,11076,13022,0,312,91
|
| 141 |
+
110,新竹縣,18949,38429,17235,4993,4709,832,829,690,11956,15458,0,148,195
|
| 142 |
+
110,苗栗縣,14072,28275,13787,5967,5755,498,802,602,17825,17633,0,175,105
|
| 143 |
+
110,彰化縣,31533,61364,30638,10593,14115,3062,2428,1482,25049,25049,0,381,496
|
| 144 |
+
110,南投縣,11684,22481,11549,3413,5517,1043,574,486,9477,9477,89,205,111
|
| 145 |
+
110,雲林縣,15011,30256,17466,6900,5978,978,1153,399,24124,24936,0,269,180
|
| 146 |
+
110,嘉義縣,9198,17571,9219,2652,2692,74,657,138,24808,28824,0,92,0
|
| 147 |
+
110,屏東縣,18038,34546,17910,7705,5825,642,398,621,34038,33925,0,378,156
|
| 148 |
+
110,臺東縣,4937,9768,5322,577,2341,1786,151,160,6095,6105,0,19,99
|
| 149 |
+
110,花蓮縣,7687,15242,8045,3608,3276,987,16,374,17714,17588,0,171,103
|
| 150 |
+
110,澎湖縣,1853,3485,1810,776,1189,0,41,0,3063,3063,0,30,0
|
| 151 |
+
110,基隆市,7961,15795,8125,3255,3598,195,156,274,15000,15000,0,231,107
|
| 152 |
+
110,新竹市,14554,33197,15841,8654,6983,972,452,937,50745,44811,0,122,0
|
| 153 |
+
110,嘉義市,7302,14883,8456,6038,6502,600,1594,375,12747,10384,0,78,207
|
| 154 |
+
110,金門縣,2194,3878,1871,940,828,0,0,46,4215,4284,0,0,0
|
| 155 |
+
110,連江縣,292,492,247,0,0,232,0,0,0,48,0,0,0
|
| 156 |
+
111,新北市,88525,207675,87567,36341,27082,3983,282,2660,129608,125103,69,16834,252
|
| 157 |
+
111,臺北市,55777,127285,63593,53909,22367,1690,376,3139,244638,234009,175,3305,583
|
| 158 |
+
111,桃園市,62603,135930,59783,28878,26777,752,2852,2508,96681,107419,43,1092,321
|
| 159 |
+
111,臺中市,80497,165662,75249,36005,32114,1480,5374,3438,181341,180820,0,4170,640
|
| 160 |
+
111,臺南市,48170,95050,44319,21835,15310,2307,2461,1416,101751,102225,68,639,393
|
| 161 |
+
111,高雄市,63808,132841,61145,31388,28889,987,3032,1767,130544,134435,118,5064,483
|
| 162 |
+
111,宜蘭縣,11243,22238,11253,5297,3685,916,473,385,10345,11767,0,249,81
|
| 163 |
+
111,新竹縣,19065,39663,16837,4983,4707,873,862,605,11119,14069,0,119,204
|
| 164 |
+
111,苗栗縣,13742,29098,12944,6063,5488,262,775,384,17239,17071,0,155,113
|
| 165 |
+
111,彰化縣,30784,62313,29093,10370,13124,2801,2293,1249,21299,21299,0,260,480
|
| 166 |
+
111,南投縣,11322,22789,10915,3344,4990,991,436,420,9165,9165,86,162,105
|
| 167 |
+
111,雲林縣,14710,30506,16394,6807,5802,878,1068,340,23820,24677,0,218,163
|
| 168 |
+
111,嘉義縣,8811,17658,8625,2613,2277,0,462,105,23901,27830,0,75,0
|
| 169 |
+
111,屏東縣,17798,35286,16731,7658,5470,644,328,518,32324,32114,0,298,141
|
| 170 |
+
111,臺東縣,4907,9976,4962,546,2243,1742,140,149,5854,5958,0,12,99
|
| 171 |
+
111,花蓮縣,7407,15530,7741,3538,3112,913,7,359,17143,17038,0,139,101
|
| 172 |
+
111,澎湖縣,1788,3548,1697,733,1082,0,31,0,2927,2927,0,29,0
|
| 173 |
+
111,基隆市,7733,16146,7644,3289,3321,170,121,224,14190,14190,0,162,92
|
| 174 |
+
111,新竹市,14456,33869,15530,8716,7225,704,426,835,50067,44047,0,104,0
|
| 175 |
+
111,嘉義市,7143,15123,8126,5925,6159,523,1363,310,11958,9656,0,50,203
|
| 176 |
+
111,金門縣,2151,3909,1823,939,807,0,0,44,4175,4243,0,0,0
|
| 177 |
+
111,連江縣,290,480,245,0,0,265,0,0,0,27,0,0,0
|
| 178 |
+
112,新北市,88341,208980,85762,36496,26180,3948,254,2371,121961,117829,46,16626,243
|
| 179 |
+
112,臺北市,53918,127398,62422,53653,21986,1648,456,2982,237221,228032,159,3289,572
|
| 180 |
+
112,桃園市,63995,138435,58718,29096,26703,740,2731,2016,94438,104594,56,1092,310
|
| 181 |
+
112,臺中市,79789,168752,73448,36378,31315,1380,5568,3166,177725,177187,0,4035,640
|
| 182 |
+
112,臺南市,47927,96383,42710,21844,14793,2258,2295,1231,94711,95217,59,605,387
|
| 183 |
+
112,高雄市,63390,134605,58888,31351,27449,1027,3129,1629,124633,127985,77,4930,471
|
| 184 |
+
112,宜蘭縣,11251,22523,11013,5164,3434,880,422,308,9876,11221,0,247,65
|
| 185 |
+
112,新竹縣,18821,40410,16537,5062,4741,1006,907,533,10596,13208,0,137,210
|
| 186 |
+
112,苗栗縣,13893,29208,12557,6025,5249,195,714,325,16591,16425,0,164,106
|
| 187 |
+
112,彰化縣,30602,62675,27965,10231,12599,2596,2035,1123,17722,17722,0,249,446
|
| 188 |
+
112,南投縣,11253,22883,10602,3288,4731,922,320,359,9122,9122,114,156,105
|
| 189 |
+
112,雲林縣,14799,30604,15454,6719,5383,769,1006,305,23049,23832,0,206,161
|
| 190 |
+
112,嘉義縣,8757,17664,8216,2535,2276,0,326,98,23233,27497,0,67,0
|
| 191 |
+
112,屏東縣,17854,35817,15960,7301,5100,612,279,450,30157,29958,0,331,134
|
| 192 |
+
112,臺東縣,4916,9949,4752,506,2058,1650,121,129,5807,5907,0,8,90
|
| 193 |
+
112,花蓮縣,7313,15595,7484,3460,2800,972,5,322,16622,16532,0,137,96
|
| 194 |
+
112,澎湖縣,1822,3632,1625,693,971,0,26,0,2702,2702,0,29,0
|
| 195 |
+
112,���隆市,7703,16303,7270,3292,3083,136,59,222,13813,13813,0,182,80
|
| 196 |
+
112,新竹市,14584,34035,15109,8810,7432,552,378,731,49073,42827,0,111,0
|
| 197 |
+
112,嘉義市,7288,15035,7760,5899,5861,470,1126,298,11727,9060,0,42,218
|
| 198 |
+
112,金門縣,2087,3988,1795,939,778,0,0,41,4050,4105,0,0,0
|
| 199 |
+
112,連江縣,278,496,252,0,0,269,0,0,0,54,0,0,0
|
| 200 |
+
113,新北市,85532,202483,90131,36744,25707,3992,242,2340,119190,116885,28,16888,222
|
| 201 |
+
113,臺北市,50990,122987,64808,53247,21907,1665,413,2968,234053,223992,172,3113,590
|
| 202 |
+
113,桃園市,63421,135942,61743,29186,26245,770,2661,1844,94684,104871,54,1106,293
|
| 203 |
+
113,臺中市,77511,165484,77345,36635,30749,1371,5705,3055,175722,175075,0,3970,624
|
| 204 |
+
113,臺南市,46610,93966,44331,21940,14353,2291,2245,1106,91347,91947,53,564,377
|
| 205 |
+
113,高雄市,61751,131156,61242,31247,26786,914,3412,1444,121965,124137,43,4698,468
|
| 206 |
+
113,宜蘭縣,10954,22157,11263,5227,3292,860,405,304,9388,10659,0,237,69
|
| 207 |
+
113,新竹縣,18790,39379,17585,5054,4947,1130,999,523,10980,12951,0,161,201
|
| 208 |
+
113,苗栗縣,13459,28315,13092,6104,5088,106,700,310,16438,16365,0,175,108
|
| 209 |
+
113,彰化縣,29864,60625,28516,10028,12375,2407,1922,928,15787,15854,0,270,435
|
| 210 |
+
113,南投縣,10944,22256,10999,3191,4494,856,206,335,9073,9073,147,170,109
|
| 211 |
+
113,雲林縣,14534,29618,15584,6655,5026,694,949,252,22445,23301,0,236,157
|
| 212 |
+
113,嘉義縣,8639,17154,8240,2490,2221,0,224,98,23133,27250,0,59,0
|
| 213 |
+
113,屏東縣,17527,34969,16427,7017,4806,565,182,390,28810,28750,0,329,142
|
| 214 |
+
113,臺東縣,4739,9790,4834,519,1913,1634,111,140,5645,5833,0,11,85
|
| 215 |
+
113,花蓮縣,6943,15179,7507,3455,2530,1102,16,299,15861,15839,0,120,106
|
| 216 |
+
113,澎湖縣,1814,3534,1666,682,854,0,22,0,2388,2651,0,12,0
|
| 217 |
+
113,基隆市,7355,15951,7408,3263,2905,127,45,185,13383,13429,0,189,90
|
| 218 |
+
113,新竹市,14063,32858,15928,9046,7575,421,369,606,48901,42763,0,108,0
|
| 219 |
+
113,嘉義市,6997,14593,8017,5819,5922,447,939,300,11349,8734,0,57,227
|
| 220 |
+
113,金門縣,2011,3928,1877,954,803,0,0,39,3823,3866,0,0,0
|
| 221 |
+
113,連江縣,268,487,257,0,0,257,0,0,0,140,0,0,0
|
| 222 |
+
114,新北市,81149,194670,96668,36359,23972,4106,221,2306,117768,117768,42,16892,243
|
| 223 |
+
114,臺北市,47886,117650,68231,53020,21069,1626,415,2829,230483,230483,162,3140,564
|
| 224 |
+
114,桃園市,61764,132964,66607,28850,25498,760,2636,1742,93462,93462,57,1154,285
|
| 225 |
+
114,臺中市,74369,161332,82767,36484,29330,1354,5575,2772,174618,174618,0,3975,562
|
| 226 |
+
114,臺南市,44318,91142,47883,21507,13301,2070,2128,1012,88863,88863,56,404,375
|
| 227 |
+
114,高雄市,59174,127327,65631,30498,25072,820,3435,1329,118531,118531,0,5465,466
|
| 228 |
+
114,宜蘭縣,10651,21605,11843,5046,3099,865,372,291,9143,9143,0,219,74
|
| 229 |
+
114,新竹縣,18409,38373,18746,5267,4847,1160,1077,489,11340,11340,0,129,194
|
| 230 |
+
114,苗栗縣,12852,27368,14041,6011,4587,44,641,285,15950,15950,0,159,100
|
| 231 |
+
114,彰化縣,28486,58539,29788,9769,11956,2287,1656,758,15361,15361,0,279,429
|
| 232 |
+
114,南投縣,10499,21608,11428,3121,4139,803,184,318,8947,8947,160,192,111
|
| 233 |
+
114,雲林縣,13953,28798,16118,6500,4573,638,776,254,22453,22453,30,250,152
|
| 234 |
+
114,嘉義縣,8270,16524,8509,2467,2208,0,117,93,22510,22510,0,81,0
|
| 235 |
+
114,屏東縣,16988,34245,17225,6668,4547,504,162,371,27749,27749,0,298,151
|
| 236 |
+
114,臺東縣,4553,9507,5035,502,1671,1580,95,139,5391,5391,0,10,85
|
| 237 |
+
114,花蓮縣,6670,14809,7708,3328,2390,1115,7,301,15029,15029,0,156,115
|
| 238 |
+
114,澎湖縣,1809,3434,1757,658,799,0,26,0,2202,2202,0,22,0
|
| 239 |
+
114,基隆市,7020,15403,7827,3066,2530,127,26,168,13242,13242,0,154,83
|
| 240 |
+
114,新竹市,13500,31460,16964,9222,7124,416,313,573,49039,49039,0,96,0
|
| 241 |
+
114,嘉義市,6655,14126,8377,5680,5782,384,879,323,11103,11103,0,64,210
|
| 242 |
+
114,金門縣,1867,3886,1948,950,752,0,0,32,3660,3660,0,0,0
|
| 243 |
+
114,連江縣,235,488,247,0,0,252,0,0,0,0,0,0,0
|
classroom_data/templates/week21/main.py
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""Lesson 21:用同一份公開資料練習排名、文字圖與跨年比較。"""
|
| 2 |
+
|
| 3 |
+
import csv
|
| 4 |
+
from pathlib import Path
|
| 5 |
+
|
| 6 |
+
|
| 7 |
+
DATA_FILE = Path("data/students_by_county.csv")
|
| 8 |
+
|
| 9 |
+
# 先執行一次,再依自己的問題修改這幾個條件。
|
| 10 |
+
COUNTY = "新北市"
|
| 11 |
+
BEFORE_YEAR = "104"
|
| 12 |
+
AFTER_YEAR = "114"
|
| 13 |
+
FIELD = "國小[人]"
|
| 14 |
+
TOP_N = 5
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
# 以下工具已備好,可以先使用,再查詢函式裡的寫法。
|
| 18 |
+
def load_rows(path=DATA_FILE):
|
| 19 |
+
"""將 CSV 每列讀成 dict;兼容有 BOM 的 UTF-8 檔案。"""
|
| 20 |
+
with open(path, encoding="utf-8-sig", newline="") as file:
|
| 21 |
+
return list(csv.DictReader(file))
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
def parse_count(value):
|
| 25 |
+
"""數字文字轉成整數;空白、破折號與無效值回傳 None。"""
|
| 26 |
+
cleaned = (value or "").strip().replace(",", "")
|
| 27 |
+
if not cleaned or cleaned == "-":
|
| 28 |
+
return None
|
| 29 |
+
try:
|
| 30 |
+
return int(cleaned)
|
| 31 |
+
except ValueError:
|
| 32 |
+
return None
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
def get_count(rows, school_year, county, field):
|
| 36 |
+
"""查詢指定學年度、縣市與教育階段的人數;找不到回傳 None。"""
|
| 37 |
+
for row in rows:
|
| 38 |
+
if row.get("學年度", "").strip() != str(school_year):
|
| 39 |
+
continue
|
| 40 |
+
if row.get("縣市別", "").strip() == county:
|
| 41 |
+
return parse_count(row.get(field))
|
| 42 |
+
return None
|
| 43 |
+
|
| 44 |
+
|
| 45 |
+
def count_by_county(rows, school_year, field):
|
| 46 |
+
"""同一學年度的人數排名;未知值不當成 0。"""
|
| 47 |
+
totals = {}
|
| 48 |
+
for row in rows:
|
| 49 |
+
if row.get("學年度", "").strip() != str(school_year):
|
| 50 |
+
continue
|
| 51 |
+
county = row.get("縣市別", "").strip()
|
| 52 |
+
count = parse_count(row.get(field))
|
| 53 |
+
if county and count is not None:
|
| 54 |
+
totals[county] = count
|
| 55 |
+
return sorted(totals.items(), key=lambda item: item[1], reverse=True)
|
| 56 |
+
|
| 57 |
+
|
| 58 |
+
def print_text_chart(results, limit=5):
|
| 59 |
+
"""使用相同尺度畫文字長條,並保留可核對的人數。"""
|
| 60 |
+
visible = results[:max(0, limit)]
|
| 61 |
+
if not visible:
|
| 62 |
+
print("沒有符合條件的資料,請檢查學年度、欄位名稱與顯示筆數。")
|
| 63 |
+
return
|
| 64 |
+
largest = max(value for _, value in visible)
|
| 65 |
+
print("縣市 人數(人) | 比例長條")
|
| 66 |
+
for county, value in visible:
|
| 67 |
+
bar_length = round(value / largest * 24) if largest else 0
|
| 68 |
+
print(f"{county:<6} {value:>8,} | {'█' * bar_length}")
|
| 69 |
+
print("長條從 0 開始,最長為 24 格;仍以旁邊的實際數字核對。")
|
| 70 |
+
|
| 71 |
+
|
| 72 |
+
def main():
|
| 73 |
+
rows = load_rows()
|
| 74 |
+
print("=== Lesson 21:比較與圖表 ===")
|
| 75 |
+
print(f"讀入 {len(rows)} 列資料")
|
| 76 |
+
if not rows:
|
| 77 |
+
print("CSV 沒有資料,請檢查檔案。")
|
| 78 |
+
return
|
| 79 |
+
print(f"欄位:{', '.join(rows[0])}")
|
| 80 |
+
|
| 81 |
+
# 第一部分:先觀察現成的排名圖,再換成自己的條件。
|
| 82 |
+
results = count_by_county(rows, AFTER_YEAR, FIELD)
|
| 83 |
+
print(f"\n{AFTER_YEAR} 學年度各縣市 {FIELD}(前 {TOP_N} 名)")
|
| 84 |
+
print_text_chart(results, TOP_N)
|
| 85 |
+
print("來源:教育部統計處|各級學校縣市別學生人數(課堂 CSV)")
|
| 86 |
+
|
| 87 |
+
# 第二部分:兩個原始數字都查到以後,才做相減。
|
| 88 |
+
before = get_count(rows, BEFORE_YEAR, COUNTY, FIELD)
|
| 89 |
+
after = get_count(rows, AFTER_YEAR, COUNTY, FIELD)
|
| 90 |
+
print(f"\n{COUNTY} {FIELD}:{BEFORE_YEAR} → {AFTER_YEAR} 學年度")
|
| 91 |
+
if before is None or after is None:
|
| 92 |
+
print("找不到完整的兩筆人數,請核對年份、縣市與欄位;未知值不能當成 0。")
|
| 93 |
+
return
|
| 94 |
+
print(f"{BEFORE_YEAR} 學年度:{before:,} 人")
|
| 95 |
+
print(f"{AFTER_YEAR} 學年度:{after:,} 人")
|
| 96 |
+
|
| 97 |
+
# TODO:以「後來的人數」減去「原來的人數」,取代下面的 None。
|
| 98 |
+
change = None
|
| 99 |
+
|
| 100 |
+
if change is None:
|
| 101 |
+
print("請完成 change 的相減算式,再執行一次。")
|
| 102 |
+
return
|
| 103 |
+
print(f"增減人數:{change:+,} 人")
|
| 104 |
+
if change > 0:
|
| 105 |
+
print(f"在這兩個學年度之間增加 {change:,} 人。")
|
| 106 |
+
elif change < 0:
|
| 107 |
+
print(f"在這兩個學年度之間減少 {abs(change):,} 人。")
|
| 108 |
+
else:
|
| 109 |
+
print("這兩個學年度的人數相同。")
|
| 110 |
+
print("只比較兩個端點,還不能說中間每一年都增加或減少,也不能單靠此表判斷原因。")
|
| 111 |
+
|
| 112 |
+
|
| 113 |
+
if __name__ == "__main__":
|
| 114 |
+
main()
|
tests/test_lesson21_template.py
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import contextlib
|
| 2 |
+
import io
|
| 3 |
+
import json
|
| 4 |
+
import runpy
|
| 5 |
+
import shutil
|
| 6 |
+
import subprocess
|
| 7 |
+
import sys
|
| 8 |
+
import tempfile
|
| 9 |
+
import unittest
|
| 10 |
+
from pathlib import Path
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
ROOT = Path(__file__).resolve().parents[1]
|
| 14 |
+
TEMPLATE = ROOT / "classroom_data/templates/week21"
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
class Lesson21TemplateTests(unittest.TestCase):
|
| 18 |
+
def setUp(self):
|
| 19 |
+
self.lesson = runpy.run_path(str(TEMPLATE / "main.py"))
|
| 20 |
+
self.rows = self.lesson["load_rows"](TEMPLATE / "data/students_by_county.csv")
|
| 21 |
+
|
| 22 |
+
def run_starter(self, county="新北市", completed=False):
|
| 23 |
+
with tempfile.TemporaryDirectory() as directory:
|
| 24 |
+
project = Path(directory) / "project"
|
| 25 |
+
shutil.copytree(TEMPLATE, project, ignore=shutil.ignore_patterns("__pycache__"))
|
| 26 |
+
source = (project / "main.py").read_text(encoding="utf-8")
|
| 27 |
+
source = source.replace('COUNTY = "新北市"', f'COUNTY = "{county}"')
|
| 28 |
+
if completed:
|
| 29 |
+
source = source.replace("change = None", "change = after - before")
|
| 30 |
+
(project / "main.py").write_text(source, encoding="utf-8")
|
| 31 |
+
result = subprocess.run([sys.executable, "-B", "main.py"], cwd=project,
|
| 32 |
+
capture_output=True, text=True, timeout=10)
|
| 33 |
+
self.assertEqual(result.returncode, 0, result.stderr)
|
| 34 |
+
return result.stdout
|
| 35 |
+
|
| 36 |
+
def test_lesson_is_enabled_without_changing_existing_workspace(self):
|
| 37 |
+
course = json.loads((ROOT / "classroom_data/course.json").read_text(encoding="utf-8"))
|
| 38 |
+
lessons = {item["id"]: item for item in course["weeks"]}
|
| 39 |
+
self.assertTrue(lessons["week21"]["template"])
|
| 40 |
+
self.assertEqual(lessons["week21"]["workspace_id"], "week19")
|
| 41 |
+
self.assertEqual(lessons["week20"]["workspace_id"], "week19")
|
| 42 |
+
self.assertTrue((TEMPLATE / "REPORT.md").is_file())
|
| 43 |
+
self.assertTrue((TEMPLATE / "DATA_SOURCE.md").is_file())
|
| 44 |
+
|
| 45 |
+
def test_starter_runs_before_student_fills_in_the_calculation(self):
|
| 46 |
+
output = self.run_starter()
|
| 47 |
+
self.assertIn("讀入 242 列資料", output)
|
| 48 |
+
self.assertIn("201,970 人", output)
|
| 49 |
+
self.assertIn("194,670 人", output)
|
| 50 |
+
self.assertIn("請完成 change", output)
|
| 51 |
+
self.assertNotIn("增減人數:", output)
|
| 52 |
+
|
| 53 |
+
def test_completed_examples_match_the_lesson_slides(self):
|
| 54 |
+
self.assertIn("增減人數:-7,300 人", self.run_starter(completed=True))
|
| 55 |
+
self.assertIn("增減人數:+4,060 人", self.run_starter("臺中市", completed=True))
|
| 56 |
+
|
| 57 |
+
def test_rankings_use_the_supplied_dataset(self):
|
| 58 |
+
results = self.lesson["count_by_county"](self.rows, "114", "國小[人]")
|
| 59 |
+
self.assertEqual(results[:3], [("新北市", 194670), ("臺中市", 161332), ("桃園市", 132964)])
|
| 60 |
+
|
| 61 |
+
def test_unknown_counts_are_not_zero_and_zero_chart_does_not_divide(self):
|
| 62 |
+
for value in ("", "-", "未知", None):
|
| 63 |
+
self.assertIsNone(self.lesson["parse_count"](value))
|
| 64 |
+
self.assertEqual(self.lesson["parse_count"]("0"), 0)
|
| 65 |
+
self.assertEqual(self.lesson["parse_count"](" 1,234 "), 1234)
|
| 66 |
+
self.assertIsNone(self.lesson["get_count"](self.rows, "999", "新北市", "國小[人]"))
|
| 67 |
+
with contextlib.redirect_stdout(io.StringIO()):
|
| 68 |
+
self.lesson["print_text_chart"]([("甲", 0), ("乙", 0)])
|
| 69 |
+
self.assertIn("找不到完整的兩筆人數", self.run_starter("不存在的縣市", completed=True))
|
| 70 |
+
|
| 71 |
+
|
| 72 |
+
if __name__ == "__main__":
|
| 73 |
+
unittest.main()
|