使用pymysql庫,將tushare股票信息保存入本地MySQL數據庫


使用pymysql庫,將tushare股票信息保存入本地MySQL數據庫


 

1、前言

由於tushare存在積分權限限制,高頻讀取tushare數據容易擠占服務器帶寬,因此對於常用的tushare數據,我們可以在第一次請求后,將DataFrame保存入我們本地的MySQL數據庫,方便后續的使用。😁

 

2、具體步驟

  1. 導入所用庫:

    import tushare as ts
    import pymysql
    import numpy as np
    

     

  2. 構建tushareMethod類,將所有涉及tushare數據請求的方法放入這個類中:

    class tushareMethod:
        pro = None
    
        def set_Token(self):
            ts.set_token('填入你自己的Token')
            self.pro = ts.pro_api()
    
        # 調用trade_cal接口,設置起始日期和終止日期
        def get_Trade_cal(self,start,end): 
            df = self.pro.query('trade_cal', start_date=start, end_date=end, fields='cal_date,is_open,pretrade_date')
            return df
    

     

  3. 新增DataFrame轉為List的函數,方便后續數據入庫:

    def dataFrame_To_List(df):
        dataset = np.array(df)
        datalist = dataset.tolist()
        return datalist
    

     

  4. 構建mysqlMethod類,將所有mysql方法放入本類中:

    class mysqlMethod:
        db = None
        cursor = None
    
        def connect_To_Mysql(self, user_, password_, db_="mystockdatas"):
            # 打開數據庫連接
            self.db = pymysql.connect(host='localhost', port=3306, user=user_, passwd=password_, db=db_ ,charset='utf8mb4')
            self.cursor = self.db.cursor()
    
        def insert_Datas(self,table,keys_list,values_list):
            suc_count = 0
            err_count = 0
            sql = "INSERT INTO {} ({}) VALUES (%s,%s,%s)".format(table, keys_list)
            for i in values_list:
                try:
                    self.cursor.execute(sql,i)
                    self.db.commit()
                    suc_count += 1
    
                except Exception as e:
                    print("Error:{}".format(e))
                    self.db.rollback()
                    err_count += 1
            print("Finnish! Successed:{}, Failed:{}".format(suc_count,err_count))
    
        def disconnect_to_Mysql(self):
            self.cursor.close()
            self.db.close()
    

     

  5. 操作實現:

    if __name__ == '__main__':
    
        # 實例化對象
        Obj_tushare = tushareMethod()
        Obj_mysql = mysqlMethod()
    
        # 設置Token
        Obj_tushare.set_Token()
    
        # 從tushare獲取交易日數據
        df1 = Obj_tushare.get_Trade_cal("20160101","20180101")
    
        # 轉換為list
        data = dataFrame_To_List(df1)
    
        # 連接數據庫
        Obj_mysql.connect_To_Mysql("root","123456")
    
        # 新增數據
        Obj_mysql.insert_Datas("trade_cal", "cal_date,is_open,pretrade_date", data)
    
        # 斷開數據庫連接
        Obj_mysql.disconnect_to_Mysql()
    

 

3、整體代碼

import tushare as ts
import pymysql
import numpy as np


def dataFrame_To_List(df):
    dataset = np.array(df)
    datalist = dataset.tolist()
    return datalist

class tushareMethod:
    pro = None

    def set_Token(self):
        ts.set_token('你自己的Token')
        self.pro = ts.pro_api()

    def get_Trade_cal(self,start,end): # 調用trade_cal接口,設置起始日期和終止日期
        df = self.pro.query('trade_cal', start_date=start, end_date=end, fields='cal_date,is_open,pretrade_date')
        return df


class mysqlMethod:
    db = None
    cursor = None

    def connect_To_Mysql(self, user_, password_, db_="mystockdatas"):
        # 打開數據庫連接
        self.db = pymysql.connect(host='localhost', port=3306, user=user_, passwd=password_, db=db_ ,charset='utf8mb4')
        self.cursor = self.db.cursor()

    def insert_Datas(self,table,keys_list,values_list):
        suc_count = 0
        err_count = 0
        sql = "INSERT INTO {} ({}) VALUES (%s,%s,%s)".format(table, keys_list)
        for i in values_list:
            try:
                self.cursor.execute(sql,i)
                self.db.commit()
                suc_count += 1

            except Exception as e:
                print("Error:{}".format(e))
                self.db.rollback()
                err_count += 1
        print("Finnish! Successed:{}, Failed:{}".format(suc_count,err_count))

    def disconnect_to_Mysql(self):
        self.cursor.close()
        self.db.close()

if __name__ == '__main__':

    # 實例化對象
    Obj_tushare = tushareMethod()
    Obj_mysql = mysqlMethod()

    # 設置Token
    Obj_tushare.set_Token()

    # 從tushare獲取交易日數據
    df1 = Obj_tushare.get_Trade_cal("20160101","20180101")

    # 轉換為list
    data = dataFrame_To_List(df1)

    # 連接數據庫
    Obj_mysql.connect_To_Mysql("root","123456")

    # 新增數據
    Obj_mysql.insert_Datas("trade_cal", "cal_date,is_open,pretrade_date", data)

    # 斷開數據庫連接
    Obj_mysql.disconnect_to_Mysql()

 

4、運行結果

這里我請求的是2016-2018年的所有數據,返回的結果是366個數據成功入庫,366個失敗,原因是我數據庫中原有2017-2018年的數據,這里主鍵PRIMARY已經存在,所以無法再次插入數據。😄

image-20220210150852998

image-20220210152106117

 

5、結語

本次我暫時的是將Tushare平台中的股票交易日期數據 保存入本地MySQL數據庫,當然若要保存其他數據可以修改mysqlMethod類中的insert_Datas()方法相關的mysql命令即可。🍎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM