AS02 List-dict-for-if#
Q1 Using site name as dict id#
# Getting youtube data
import requests
import json
response = requests.get('https://tcgbusfs.blob.core.windows.net/dotapp/youbike/v2/youbike_immediate.json')
data = response.json()
Q1_Code#
建立一個
site_dict
,可用以查詢某個youbike站台的資料。原本的Youbike data除了第一層有retCode
和retVal
外,在retVal
所對應到的資料中,是以sno
也就是駐車站編號作為dict的key。我希望把整筆資料轉個型態,仍保持dict of dict,但最外層的dictionary裡面的每個key是站台「中文名稱」,並以site_dict
來作為新的dictionary的變數名稱。除此之外,請參考下列資料,移除幾個儲存英文站名、英文區域和英文地址的keys與values,有
['sareaen', 'snaen', 'aren']
。參考資料:Removing multiple keys from a dictionary safely (stackoverflow)
data.keys()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
Cell In[2], line 1
----> 1 data.keys()
AttributeError: 'list' object has no attribute 'keys'
site_dict = {} # Using this as new dict name
en_keys = ['sareaen', 'snaen', 'aren']
# Your code should go here
Q1_Verification#
執行以下程式碼以驗證你的程式撰寫是否成功。你不能更動以下Cell的Code,僅能在上面的Cell撰寫程式,使得以下的Code列印出來的資料與預期相同。助教會看這個Cell的結果來判斷你是否達到題目要求。以下的程式碼會從你所建立的site_dict
中隨機抽五個站,然後列印出這些站的資料。
輸出參考(因隨機挑選,站台可能不同)
['老松國小', '重慶民族路口', '朱崙商場', '臺北醫學大學', '臺北田徑場']
dict_values(['0090', '老松國小', '28', '10', '萬華區', '20220924191842', '25.037783', '121.501708', '康定路/桂林路(東南側)(鄰近艋舺龍山寺/艋舺清水巖祖師廟/台北市鄉土教育中心(剝皮寮歷史街區))', '18', '1'])
dict_values(['0372', '重慶民族路口', '12', '2', '大同區', '20220924191821', '25.068250', '121.513590', '重慶北路三段154號(前方/東側)', '10', '1'])
dict_values(['0294', '朱崙商場', '12', '2', '中山區', '20220924191821', '25.047617', '121.540431', '龍江路15號前方人行道(鄰近遼寧夜市)', '10', '1'])
dict_values(['0012', '臺北醫學大學', '22', '13', '信義區', '20220924191823', '25.026679', '121.561747', '台北醫學大學(吳興街220巷59弄)(鄰近台北醫學大學)', '9', '1'])
dict_values(['0055', '臺北田徑場', '22', '5', '松山區', '20220924191834', '25.049505', '121.549408', '敦化北路3號(鄰近臺北小巨蛋/台北田徑場)', '16', '1'])
import random
random_sites = random.sample(list(site_dict.keys()), 5)
print(random_sites)
for site in random_sites:
print(site_dict[site].values())
['老松國小', '重慶民族路口', '朱崙商場', '臺北醫學大學', '臺北田徑場']
dict_values(['0090', '老松國小', '28', '10', '萬華區', '20220924191842', '25.037783', '121.501708', '康定路/桂林路(東南側)(鄰近艋舺龍山寺/艋舺清水巖祖師廟/台北市鄉土教育中心(剝皮寮歷史街區))', '18', '1'])
dict_values(['0372', '重慶民族路口', '12', '2', '大同區', '20220924191821', '25.068250', '121.513590', '重慶北路三段154號(前方/東側)', '10', '1'])
dict_values(['0294', '朱崙商場', '12', '2', '中山區', '20220924191821', '25.047617', '121.540431', '龍江路15號前方人行道(鄰近遼寧夜市)', '10', '1'])
dict_values(['0012', '臺北醫學大學', '22', '13', '信義區', '20220924191823', '25.026679', '121.561747', '台北醫學大學(吳興街220巷59弄)(鄰近台北醫學大學)', '9', '1'])
dict_values(['0055', '臺北田徑場', '22', '5', '松山區', '20220924191834', '25.049505', '121.549408', '敦化北路3號(鄰近臺北小巨蛋/台北田徑場)', '16', '1'])
Q2 Calculating the fullness of each youbike site#
Q2_Code#
建立一個新的指標perc = sbi/tot
,為現有單車數(sbi
)除以總單車格數(tot
)作為滿站的比例,並希望在每個駐車站的資料中多一個key為perc
來存放滿站比例。你可以接續上題作,或者回到原本撈回來的資料做。
例如
{ '捷運市政府站(3號出口)':{
'sna': '捷運市政府站(3號出口)',
'sno': ...,
'tot': ...,
'sbi': ...,
'perc': ...,
...},
...
}
# Your code should be here
Q2_Code & Verification#
以下所附的Code將會隨機選出五個站台於list random_sites
中,請用for-loop印出這五個站台的sbi, tot, perc, 和sna。
預期結果如下,請嘗試用format()格式化你的輸出,讓你的輸出符合以下浮點數以下二位的樣子。
3 20 0.15 捷運芝山站(2號出口)
3 20 0.15 螢橋國小
4 18 0.22 樹德公園
0 18 0.00 民生光復路口
5 14 0.36 湖光國宅
import random
random_sites = random.sample(list(site_dict.keys()), 5)
print(random_sites)
['中山天母路口', '市民林森路口', '南京新生路口', '萬華車站', '市民廣場']
8 16 0.50 中山天母路口
0 14 0.00 市民林森路口
7 16 0.44 南京新生路口
6 28 0.21 萬華車站
17 32 0.53 市民廣場
Q3 Finding Maximum#
Q3_Code & Verification: Finding sites with maximum perc
#
用for-loop
和if-else
找出perc
(fullness)最高的駐車站,並印出其站名和perc
數值,以及時間。
預期輸出格式如下(至於最高perc
與其站台則因個人查詢當時狀態而不同):
At 20211014204443, the highest perc is 0.937500 (Station: 士林運動中心)
fullest_sna = ""
fullest_perc = 0.0
fullest_time = ""
# Your code should be here
print("At %s, the highest perc is %f (Station: %s)"%(fullest_time, fullest_perc, fullest_sna))
At 20220924191821, the highest perc is 1.250000 (Station: 基隆路一段101巷口)
Q3_Code & Verification: Top 10#
用內建或第三方的sorting函式,將perc
(fullness)按照full to empty排序,用for-loop列印出,perc
最高的10個駐車站的sna
、perc
、tot
、sbi
((請善用printing formation和\t
將之對齊排列好,不用到完全一樣、不用照高低順序、對齊即可)。
16 15 0.94 成功國宅
24 21 0.88 新東公園
12 11 0.92 圓環站
30 28 0.93 基河一期國宅
8 7 0.88 第二果菜批發市場
4 5 1.25 基隆路一段101巷口
8 7 0.88 捷運中山站(2號出口)
10 9 0.90 南京光復路口
8 10 1.25 南京東興路口
# Your code should be here
16 15 0.94 成功國宅
24 21 0.88 新東公園
12 11 0.92 圓環站
30 28 0.93 基河一期國宅
8 7 0.88 第二果菜批發市場
4 5 1.25 基隆路一段101巷口
8 7 0.88 捷運中山站(2號出口)
10 9 0.90 南京光復路口
8 10 1.25 南京東興路口
Q4: Categorizing fullness#
當要建立回歸模型來預測腳踏車的滿站程度時,我們需要的可能是上述的perc
來作為依變項Y;但我如果只是要仿照Youbike地圖,用顏色來標示出滿站程度時(如https://taipei.youbike.com.tw/station/map) ,就需要將perc
按數值分區。
Q4_Code & Verification#
設計if-else搭配for-loop來計算每個資料區間各有多少個腳踏車站台。一共分成以下幾個label。
full: perc = 1.0,
empty: perc = 0.0,
few: 0.0 < perc <0.3
general: 0.3 <= perc < 0.7
many: 0.7 <= perc < 1.0 請在每個站台的dictionary中新增一個key為label,然後用Counting來累計並列印出當時刻full, empty, few, general, many各有多少個站台。
範例輸出(可能因為不同時間而數量不同)
few 173
general 152
empty 44
many 30
Q5_e 自然常數的泰勒展式#
e的值可用以下的泰勒展式去逼近,請嘗試完成下列迴圈,計算e的近似值。
e ≈ 2.71828 18284 59045 23536
e = 1
for i in range(1, 1000):
denominator = 1
# Your code should go here
print(e)
2.7182818284590455