iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
Microsoft Azure

Python X 金融分析 X Azure系列 第 6

【Day6】取得資訊-Python #2:呈現(使用numpy、pandas)

  • 分享至 

  • xImage
  •  

已經取得資料了,但是這樣的顯示方式很不好閱讀,接著就是要介紹如何順利的結構化這些資料。

本篇將會使用numpypandas


程式碼

(完成程式碼在本段下方)
首先我們需要安裝numpypandas,分別執行:

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:擁有多維度陣列物件,可以用來儲存資料,也有一些function處理資料。
  • pandas:是以numpy為基礎,提供更豐富的類別,可以用來處理資料。

在資料儲存中,這邊使用的是第17行的pandas.DataFrame,他的格式為:DataFrame(資料,index=時間戳),所以依照我們轉成json的資料結構,資料會在 data["chart"]["result"][0]["indicators"]["quote"][0],時間戳(timestamp)會在numpy.array(data["chart"]["result"][0]["timestamp"]。詳細的資料結構可以參考下圖:

https://ithelp.ithome.com.tw/upload/images/20200914/20103826ZHQ3k50iyF.png


上一篇
【Day5】取得資訊-Python #2:抓股票資料
下一篇
【Day7】取得資訊-Python #3:呈現(jupyter notebook)
系列文
Python X 金融分析 X Azure31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
威利斯
iT邦研究生 3 級 ‧ 2020-09-28 08:09:27

您好,感謝您的分享,小弟在這次鐵人賽有介紹到 pandas-datareader ,是基於 Pandas 取得股市交易資訊的 API ,數據來源包含 "Yahoo! Finance" ,網址介紹及取得資訊擷圖如下,實作可以參考我的 Day 27 : 股市 K 線 LINE 聊天機器人實作 (功能實作) ,謝謝您的分享,供您參考互相交流。

謝謝分享

稍微拜讀一下文章,發現內容不少
需要花點時間咀嚼
有機會去拜訪您的系列
感謝分享/images/emoticon/emoticon07.gif

0
idea-stu
iT邦新手 5 級 ‧ 2022-03-06 00:35:44

百思不得其解,參考文章的資料戳後面也是乘上了 * 1000 * 1000 * 1000
還在思考為什麼是這樣~若不加似乎回到 1970 第一筆資料時間的樣子

看更多先前的回應...收起先前的回應...
idea-stu iT邦新手 5 級 ‧ 2022-03-11 23:04:23 檢舉

/images/emoticon/emoticon13.gif

idea-stu iT邦新手 5 級 ‧ 2022-03-13 15:13:46 檢舉

想請教作者

現在才看到/images/emoticon/emoticon04.gif
晚點會完整回覆,請再等一下

idea-stu iT邦新手 5 級 ‧ 2022-03-26 14:49:22 檢舉

ok

idea-stu iT邦新手 5 級 ‧ 2022-03-26 19:58:29 檢舉

@ 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


後記:
這準備時間不少,需要一點資料提供,因此就一直忘記要回覆/images/emoticon/emoticon06.gif

idea-stu iT邦新手 5 級 ‧ 2022-03-28 02:23:45 檢舉

/images/emoticon/emoticon41.gif

我要留言

立即登入留言