Python資料庫(下):分段說明 [附程式碼]

接續上一篇,本篇把程式碼分段,每段分開說明。

希望透過實作,對資料庫存取不熟的讀者可以快速上手,利用SQLite資料庫,將資料集中存放,便於管理。

Python資料庫(上):完整程式碼

# 載入需要用到的函式庫
import pandas as pd # 數據分析函式庫
import sqlalchemy # SQL資料庫ORM函式庫
import ffn # 金融函式庫
這應該不用多說,pandas是數據分析的神級套件,sqlalchemy是常用的ORM套件,ffn這裡是拿來下載歷史資料用的。

# 連結SQLite資料庫
engine = sqlalchemy.create_engine('sqlite:///data.db') # 資料庫檔案(.db)會生成在程式碼(.py)所在資料夾
使用sqlalchemy連結SQLite資料庫,如果要連結的檔案不存在,會自動建立檔案,如果檔案已經存在,則會和檔案建立連結。

stock_1 = ffn.get('^TWII', column_names=['price'], start='2018-1-1', end='2018-12-31') # 下載加權指數歷史資料(2018)
stock_1.to_sql('stock', engine, if_exists='replace', index_label='table_index') # 將資料存入SQLite資料庫(建立Table: stock)
output_1 = pd.read_sql('stock', engine, index_col='table_index', parse_dates=['table_index']) # 讀取SQLite資料庫(Table: stock)
第一行:下載加權指數2018歷史資料。
第二行:將加權指數2018歷史資料存入data.db檔案裡名為stock的table。
(if_exists='replace'表示如果data.db已經存在名稱為stock的table,用新建立的table取代舊的table)
第三行:讀取data.db檔案裡名為stock的table。

stock_2 = ffn.get('^TWII', column_names=['price'], start='2019-1-1') # 下載加權指數歷史資料(2019~Now)
stock_2.to_sql('stock', engine, if_exists='append', index_label='table_index') # 將資料存入SQLite資料庫(更新Table: stock)
output_2 = pd.read_sql('stock', engine, index_col='table_index', parse_dates=['table_index']) # 讀取SQLite資料庫(Table: stock)
第一行:下載加權指數2019迄今的歷史資料。
第二行:將加權指數2019迄今的歷史資料存入data.db檔案裡名為stock的table。(if_exists='append'表示如果data.db已經存在名稱為stock的table,在舊的table上新增這筆資料,即數據更新。)
第三行:讀取data.db檔案裡名為stock的table,此時包含2018及2019迄今的資料。

nasdaq = ffn.get('^IXIC', column_names=['price'], start='2018-1-1') # 下載NASDAQ歷史資料(2018~Now)
nasdaq.to_sql('nasdaq', engine, if_exists='replace', index_label='table_index') # 將資料存入SQLite資料庫(建立Table: nasdaq)
第一行:下載NASDAQ從2018迄今的歷史資料。
第二行:將NASDAQ從2018迄今的歷史資料存入data.db檔案裡名為nasdaq的table。
(if_exists='replace'表示如果data.db已經存在名稱為nasdaq的table,用新建立的table取代舊的table)

# 取得資料庫Tables名稱
table_names_1 = engine.table_names() # 取得資料庫內全部Tables的名稱
print(table_names_1) # 顯示所有Tables的名稱
此時,data.db檔案存有stock及nasdaq兩個table。

# SQLite資料庫Table操作(刪除)
meta = sqlalchemy.MetaData() # 建立MetaData物件
meta.reflect(bind=engine) # 將資料reflect到meta

table_stock = meta.tables['stock'] # 建立Table物件(Table: stock)
table_stock.drop(engine) # 刪除Table(Table: stock)
第一行與第二行:建立代表data.db的MetaData物件。
第三行:建立代表stock的Table物件。
第四行:刪除stock這個table。

# 取得資料庫Tables名稱
table_names_2 = engine.table_names() # 取得資料庫內全部Tables的名稱
print(table_names_2) # 顯示所有Tables的名稱
此時,data.db檔案中僅剩下nasdaq一個table。