Python股票處理之七_(dá)數(shù)據(jù)庫(kù)存儲(chǔ)

1. 說(shuō)明

股票數(shù)據(jù)無(wú)需每次都從網(wǎng)上下載,像日線級(jí)別的歷史數(shù)據(jù)會(huì)常常用到,使用多線程下載一般也需要幾個(gè)小時(shí),最好存儲(chǔ)到本地,除了已有的特征值,還有清洗后的數(shù)據(jù),和計(jì)算出的新特征值,以及需要與其它程序共享數(shù)據(jù)。相對(duì)于數(shù)據(jù)文件,使用數(shù)據(jù)庫(kù)更合適。
本文介紹pandas(數(shù)據(jù)結(jié)構(gòu)支持)通過(guò)sqlalchemy與數(shù)據(jù)庫(kù)連接,存儲(chǔ)tushare下載的日線數(shù)據(jù),用一套代碼操作不同數(shù)據(jù)庫(kù)(Mysql/sqlite)。

2. 安裝數(shù)據(jù)庫(kù)

1) Sqlalchemy工具

$ pip install sqlalchemy

2) Mysql數(shù)據(jù)庫(kù)

$ sudo apt-get install mysql-server
$ sudo apt-get install mysql-client
$ mysql -u root –p
mysql> create database stock    # 建立名為stock的數(shù)據(jù)庫(kù),之后程序中會(huì)用到
mysql> show databases;  # 顯示已有的數(shù)據(jù)庫(kù)

3) Sqlite數(shù)據(jù)庫(kù)

$ sudo apt install sqlite3  
$ sqlite stock.db   # stock.db是數(shù)據(jù)庫(kù)文件,將在運(yùn)行示例程序時(shí)生成
sqlite > .tables        # 查看數(shù)據(jù)表
sqlite > select * from s002230; # 遍歷表s002230中的數(shù)據(jù)

(也可使用圖形界面工具sqliteman查看數(shù)據(jù)庫(kù))

3. 程序

# -*- coding: utf-8 -*-

import tushare as ts
from sqlalchemy import create_engine
import pandas as pd

#ADDR = 'mysql://root:1234@localhost:3306/stock?charset=utf8'   # 使用mysql,用戶(hù)名root,密碼1234,庫(kù)名為stock,端口3306為mysql默認(rèn)端口
ADDR = 'sqlite:///stock.db'     # 使用sqlite,當(dāng)前目錄的stock.db作為數(shù)據(jù)庫(kù)文件

engine = create_engine(ADDR)
stocklist = ['002230','601318']

def save(code):
    print "save code:",code
    try:
        df = ts.get_h_data(code, start='1990-01-01', retry_count = 5)
        df = df.sort_index(ascending=True)
        name = 's'+code
        df.to_sql(name, engine, if_exists='fail')
    except:
        print code, " save failed"

for i in range(0, len(stocklist)):
    save(stocklist[i])

4. 其它

1) 運(yùn)行SQL語(yǔ)句

sqlalchemy也支持直接運(yùn)行SQL語(yǔ)句,形如:

result = engine.execute(‘select * from stock’)

使用sqlalchemy后,除了方便與pandas中的數(shù)據(jù)對(duì)接以外,也基本屏蔽了不同數(shù)據(jù)庫(kù)之間的差異,換庫(kù)時(shí)無(wú)需大量調(diào)整代碼,十分方便。

2) 多線程下載

歷史日線數(shù)據(jù)量較大,可使用python中的multiprocessing.dummy.Pool多線程下載。

3) 從數(shù)據(jù)庫(kù)中讀出數(shù)據(jù)

和to_sql相對(duì)的是read_sql,它可以從數(shù)據(jù)庫(kù)中讀出數(shù)據(jù),并轉(zhuǎn)換成DataFrame的格式。具體使用形如:
stocklist = pd.read_sql('table1',engine) # 其中stocklist是DataFrame格式數(shù)據(jù),pd是import pandas as pd,table1是庫(kù)名,engine同上例一樣,指向數(shù)據(jù)庫(kù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容