使用pymysql庫,將tushare股票信息保存入本地MySQL數據庫
1、前言
由於tushare存在積分權限限制,高頻讀取tushare數據容易擠占服務器帶寬,因此對於常用的tushare數據,我們可以在第一次請求后,將DataFrame保存入我們本地的MySQL數據庫,方便后續的使用。😁
2、具體步驟
-
導入所用庫:
import tushare as ts import pymysql import numpy as np
-
構建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
-
新增DataFrame轉為List的函數,方便后續數據入庫:
def dataFrame_To_List(df): dataset = np.array(df) datalist = dataset.tolist() return datalist
-
構建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()
-
操作實現:
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已經存在,所以無法再次插入數據。😄
5、結語
本次我暫時的是將Tushare平台中的股票交易日期數據 保存入本地MySQL數據庫,當然若要保存其他數據可以修改mysqlMethod類中的insert_Datas()方法相關的mysql命令即可。🍎