Py / Python網頁資料擷取與分析班-筆記 8/16

主要內容

_使用matplotlib繪製折線圖

_JSON格式處理


使用matplotlib繪製折線圖

同樣是使用requests模組取得網路公開資料-每日外幣參考匯率

接著是處理資料

繪製著線圖需要有X軸跟Y軸

listx1=[ ] 為X軸資料串列-日期

listy1=[ ] 為Y軸資料串列-外幣匯率

每日外幣參考匯率的資料欄位為「日期、美元/新台幣、人民幣/新台幣、歐元/美元、美元/日幣、英鎊/美元、澳幣/美元、美元/港幣、美元/人民幣、美元/南非幣、紐幣/美元」

所以分割後的串列list1[0]是日期,list1[1]是美元/新台幣

Y軸就可以選定要抓取哪一種匯率

由於list1[1]的匯率是字串型態,因此透過eval()去除字串符號變成數字型態

listy1.append(eval(list2[1])) #eval()函數將去掉字符串的兩個引號

也可以用float()將字串轉換為浮點數字

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import requests
html = requests.get("https://www.taifex.com.tw/data_gov/taifex_open_data.asp?data_name=DailyForeignExchangeRates")
html.encoding="CP950"
print(html.text)

#切割換行
list1=html.text.split("\r\n")
print(list1)
listx1=[]
listy1=[]
for i in range(1,len(list1)-1):
    list2=list1[i].split(",")
    print(list2[0]+","+list2[1])
    listx1.append("{}/{}".format(list2[0][4:6],list2[0][6:8]))
    listy1.append(eval(list2[1])) #eval()函數將去掉字符串的兩個引號

print(listx1) 
print(listy1)     

##引用matplotlib繪製折線圖  
import matplotlib.pyplot as plt 
import matplotlib as mpl 

mpl.rcParams['font.sans-serif'] = ['FangSong'] 
mpl.rcParams['axes.unicode_minus'] = False 

plt.plot(listx1, listy1, color="red", linewidth=1, linestyle="--", label="美元/新台幣")
plt.legend()
plt.show()

 

最後就是引用matplotlib模組繪製折線圖

matplotlib預設的字型無法顯示中文,所以要改成中文字型

以及避免因為字型的關係無法正常顯示負號

mpl.rcParams['font.sans-serif'] = ['FangSong'] 
mpl.rcParams['axes.unicode_minus'] = False
 

引用 matplotlib.pyplot 並且取別名為 plt

legend() 如果沒有設定參數,就會使用預設值,並且從plot()中抓取label的設定值

plt.plot(listx1, listy1, color="red", linewidth=1, linestyle="--", label="美元/新台幣") 
plt.legend() 
plt.show()

輸出的圖檔

 


JSON格式處理

細懸浮微粒資料(PM2.5)

1
2
3
4
5
6
7
8
import requests,json
html = requests.get("https://data.epa.gov.tw/api/v2/aqx_p_02?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=datacreationdate%20desc&format=json")
print(html.text)

#2.解析JSON
dict1=json.loads(html.text)
# print(dict1)
list1=dict1.get("records") #取出 key值為 records的資料

 

備註:Python Json模組中dumps()、loads()、dump()、load()

讀取資料:loads() 、 load()

寫出資料:dumps()、dump()

差別在於有s的都是讀取或寫出字串型態,所以都是在程式中使用

沒有s的都是讀取或寫出Json檔案,所以要留意編碼格式

所以上方的範例,資料來源是requests模組取得的字串資料

因此使用loads()來解析

由於Json在Python轉換之後的對應關係是字典型態

所以轉換之後可以用字典方法來取得資料

上方範例中records存放的是陣列型態資料

轉換之後的對應關係是串列型態

所以要取出裡面的資料就要用串列的方法

 

要分析Json的結構,除了下載之後土炮分析之外

也可以透過 http://jsoneditoronline.org 來解析
 

參考資料

Python中eval()和input()的用法淺析

如何在 Python 中將字串轉換為浮點或整數

如何在Win 10解決matplotlib中文顯示的問題?

Matplotlib 中文標籤問題

Python Json模組中dumps、loads、dump、load函式介紹

Python 讀取、產生 JSON 格式資料教學與範例

Python 初學第九講 — 字典

解决json中ensure_ascii=False的问题