這個單元我們要利用 for 迴圈將所有的歷史數據爬下來,並且繪製所有的歷史股價。我們也會介紹一些 for 迴圈的進階技巧,並且將這些技巧結合起來,完成這次的功能,想要學習python,就慢慢跟著我們一步一步來吧!
延續上個單元,我們應該已經爬取了world_index
這張表格:
然後還有一個我們寫好的function
import json
import requests
import datetime
import pandas as pd
import numpy as np
def crawl_price(stock_id):
d = datetime.datetime.now()
url = "https://query1.finance.yahoo.com/v8/finance/chart/"+stock_id+"?period1=0&period2="+str(int(d.timestamp()))+"&interval=1d&events=history&=hP2rOschxO0"
res = requests.get(url)
data = json.loads(res.text)
df = pd.DataFrame(data['chart']['result'][0]['indicators']['quote'][0], index=pd.to_datetime(np.array(data['chart']['result'][0]['timestamp'])*1000*1000*1000))
return df
接下來就可以將他們結合,來爬取歷史資料了!在爬取資料之前,有幾個程式的小技巧必須要學會
1. for 迴圈
假如我們要執行重複性的動作,通常第一件事情就是想到for 迴圈,例如我們想要印出1~9,不用for迴圈,我們可以寫成
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)
for i in [1,2,3,4,5,6,7,8,9]:
print(i)
這樣短短的就寫完了!其中
第一行:我們有一個變數i,他會從1~9不斷變換,並且執行下方的print(i)。第二行要記得加上前方四個空白,通常叫做縮排「indent」,當第一行有for
這個標示後,之後就必須用縮排indent直到寫完for迴圈裡的內容為止。
但有時候我們希望同時做兩個迴圈呢?
使用zip
我們可以使用zip,一次執行兩個list:
for number, letter in zip([1,2,3], ['a', 'b', 'c']):
print(number, letter)
最後,我們要使用 dictionary 將全球的指數給存起來。
dictionary
這邊先示範最簡單的用法:
d = {}
d['a'] = 1
d['b'] = 2
# 查找
print(d['b']) # 2
# 迴圈
# 其中,d.items 有點像是zip的感覺,
# 針對dictionary中的['a', 'b']和[1,2]進行迴圈)
for letter, number in d.items():
print(letter, number)
# a 1
# b 2
結合上述的小功能,就可以寫一個程式將世界指數都抓下來了!
我建議你自己試試看~
寫完之後再往下拉看範例:
import time
world_index_history = {}
for symbol, name in zip(world_index['Symbol'], world_index['Name']):
print(name)
world_index_history[name] = crawl_price(symbol)
time.sleep(5)
假如你有認真研究前三點功能,相信這些代碼應該難不倒你!其中沒有教到的是,我們利用time.sleep(5)
,來休息一下,不要抓的太頻繁,不然會被封鎖,除此之外,上述代碼非常簡單,寫一個for迴圈,將所有的指數都抓下來,存在world_index_history
中。
繪製指數
接下來,我們可以用一樣的for迴圈,來將指數給畫出來
for name, history in world_index_history.items():
history.close.plot()
這個單元的程式碼,都可以使用 colab 來執行喔!趕快來玩玩看吧!
有了指數,接下來要做什麼呢?
下個單元,我們要來分析一下這些指數,看看哪些適合投資,哪些不適合,敬請期待~
這一系列是我們影音課程的化簡版,