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#

  1. 建立一個site_dict,可用以查詢某個youbike站台的資料。原本的Youbike data除了第一層有retCoderetVal外,在retVal所對應到的資料中,是以sno也就是駐車站編號作為dict的key。我希望把整筆資料轉個型態,仍保持dict of dict,但最外層的dictionary裡面的每個key是站台「中文名稱」,並以site_dict來作為新的dictionary的變數名稱。

  2. 除此之外,請參考下列資料,移除幾個儲存英文站名、英文區域和英文地址的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-loopif-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個駐車站的snaperctotsbi((請善用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

  • image.png

e = 1
for i in range(1, 1000):
    denominator = 1
    # Your code should go here
    
    
    
    
    
print(e)
        
2.7182818284590455