已經取得資料了,但是這樣的顯示方式很不好閱讀,接著就是要介紹如何順利的結構化這些資料。
本篇將會使用numpy
和pandas
。
(完成程式碼在本段下方)
首先我們需要安裝numpy
和pandas
,分別執行:
pipenv install numpy
pipenv install pandas
安裝完後,就可以把套件import
近來囉:
import numpy
import pandas
因為要列印出表格,變成結構化,所以多點資料比較有感覺,這邊就把時間變成timestamp
參數:
# API位置
start_time = 1596211200
end_time = 1599926400
address = f"https://query1.finance.yahoo.com/v8/finance/chart/2317.TW?period1={start_time}&period2={end_time}&interval=1d&events=history&=hP2rOschxO0"
然後把取得的資料,變成序列化,也就是用json套件:
# 序列化資料回報
data = json.loads(response.text)
然後把資料放入強大的pandas
中,就大功告成囉~
# 把json格式資料放入pandas中
df = pandas.DataFrame(
data["chart"]["result"][0]["indicators"]["quote"][0],
index=pandas.to_datetime(
numpy.array(data["chart"]["result"][0]["timestamp"]) * 1000 * 1000 * 1000
),
)
最後,把結果印出來,就可以看到囉
# 印出前3行:
print(df[:3])
# 印出前5行
print(df.head())
顯示出的畫面是:
open close high volume low
2020-08-03 01:00:00 78.400002 77.099998 78.900002 61172243 77.099998
2020-08-04 01:00:00 77.699997 78.099998 78.199997 23051382 77.500000
2020-08-05 01:00:00 78.300003 77.900002 78.500000 27876127 77.900002
open close high volume low
2020-08-03 01:00:00 78.400002 77.099998 78.900002 61172243 77.099998
2020-08-04 01:00:00 77.699997 78.099998 78.199997 23051382 77.500000
2020-08-05 01:00:00 78.300003 77.900002 78.500000 27876127 77.900002
2020-08-06 01:00:00 79.300003 79.000000 79.699997 33250505 78.500000
2020-08-07 01:00:00 79.599998 78.300003 79.599998 21862438 78.300003
import requests
import json
import numpy
import pandas
# API位置
start_time = 1596211200
end_time = 1599926400
address = f"https://query1.finance.yahoo.com/v8/finance/chart/2317.TW?period1={start_time}&period2={end_time}&interval=1d&events=history&=hP2rOschxO0"
# 使用requests 來跟遠端 API server 索取資料
response = requests.get(address)
# 序列化資料回報
data = json.loads(response.text)
# 把json格式資料放入pandas中
df = pandas.DataFrame(
data["chart"]["result"][0]["indicators"]["quote"][0],
index=pandas.to_datetime(
numpy.array(data["chart"]["result"][0]["timestamp"]) * 1000 * 1000 * 1000
),
)
# 印出前3行:
print(df[:3])
# 印出前5行
print(df.head())
稍微解說一下,這兩個套件:
numpy
為基礎,提供更豐富的類別,可以用來處理資料。在資料儲存中,這邊使用的是第17
行的pandas.DataFrame
,他的格式為:DataFrame(資料,index=時間戳)
,所以依照我們轉成json的資料結構,資料會在 data["chart"]["result"][0]["indicators"]["quote"][0]
,時間戳(timestamp)會在numpy.array(data["chart"]["result"][0]["timestamp"]
。詳細的資料結構可以參考下圖:
您好,感謝您的分享,小弟在這次鐵人賽有介紹到 pandas-datareader
,是基於 Pandas 取得股市交易資訊的 API ,數據來源包含 "Yahoo! Finance" ,網址介紹及取得資訊擷圖如下,實作可以參考我的 Day 27 : 股市 K 線 LINE 聊天機器人實作 (功能實作) ,謝謝您的分享,供您參考互相交流。
謝謝分享
稍微拜讀一下文章,發現內容不少
需要花點時間咀嚼
有機會去拜訪您的系列
感謝分享
百思不得其解,參考文章的資料戳後面也是乘上了 * 1000 * 1000 * 1000
還在思考為什麼是這樣~若不加似乎回到 1970 第一筆資料時間的樣子
想請教作者
現在才看到
晚點會完整回覆,請再等一下
ok
@ eyelash*睫毛
先看範例:
pandas.to_datetime(1599786000)
pandas.to_datetime(1599786000000000000)
分別會是:
Timestamp('1970-01-01 00:00:01.599786')
Timestamp('2020-09-11 01:00:00')
也就是你所說的,前者在沒有乘10**9
時,為 1970-1-1的時間,這是因為 pandas.to_datetime()
是以 pandas.tslib.Timestamp
類別來執行的,而其格式為datetime64
(這是使用 Numpy 的資料格式),也就是其預設值精確度到nanoseconds
(Pandas 比 Python的 datetime
精準度更高)。
因此一般 timestamp 只有到「秒」,而 Pandas 的 timestamp 則是到「奈秒(毫微秒)」,所以要把秒轉換成nanoseconds
,所以要乘以10的9次方。
參考資料:
https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#epoch-timestamps
後記:
這準備時間不少,需要一點資料提供,因此就一直忘記要回覆