Tushare是一非常好用的数据接口,金融数据包含广,便利而实用。
本文主要介绍如何通过Tushare的pro接口查询股票数据,并且保存到数据库Mysql中。
首先是安装工具包
import tushare as ts import datetime import pymysql
datetime是专门用来获取和编辑时间的一个工具包。
第一步,用自己的Tushare社区的token建立同数据接口的连接,同时与数据库建立连接
token='****************'##星号代指你的token ts.set_token(token) pro=ts.pro_api() db=pymysql.connect(host='127.0.0.1',user='root',passwd='2022',db='stock',charset='utf8')
pro=ts.pro_api():用pro代称数据接口(pro_api).
pymysql.connect:与数据库建立连接,参数:host=服务器地址,本文是自己的主机;user=用户名,passwd=mysql的密码,db=你决定实用的database的名称,charset=连接编码,以上参数后面均接str.
第二步,设置时间,获取数据
start_dt='20220524'##设置初始时间
time_temp=datetime.datetime.now()-datetime.timedelta(days=1)##减号前面表示获取当前的时间,减号后面的timedelta(days=1)与前面的部分表示昨天
end_dt=time_temp.strftime('%y%m%d')##规范时间的格式,保留到日
df=pro.daily(ts_code='300672.SZ',start_date=start_dt,end_date=end_dt)
timedelta.()函数的作用是对已有时间进行加减,可以是增减天(days)/小时(hours)/分钟(minute)/秒(second),但不进行粘合月的加减(年月周要用relativedelta()函数),不能单独使用,注意开始时间(start_dt)和结束时间(end_dt)时间上的精度要统一(这也就是strftime的作用).
pro.daily:通过pro接口调取日股票数据,主要是价格数据,参数:ts_share=股票代码,start_date=开始时间,end_date=结束时间,以上参数均为str。获取到的数据是dataframe形式的。
第三步在已经选定的database下建立一个表(table)
import pandas as pd
df=df.rename(columns={'change':'chg'})
cursor=db.cursor()
cursor.execute("CREATE TABLE frompython(ts_code VARCHAr(10),trade_date VARCHAr(10),open VARCHAr(10),high VARCHAr(10),low VARCHAr(10),close VARCHAr(10),pre_close VARCHAr(10),chg VARCHAr(10),pct_chg VARCHAr(10),vol VARCHAr(10),amount VARCHAr(10)))")
先来解释一下,本文为什么把dataframe中一列的名字从change换成了chg。本文在跑代码的时候发现老是有1064错误,换了之后就万事大吉了,原因在于change是一个关键字。
cursor().execute()函数可以简单的理解为就是python到mysql的一个传令兵。execute()括号中是传达的命令,注意格式,基本同mysql的命令一样。注意如果是先将命令以字符串的形式赋给一个变量再将变量填入括号中也是可以的,但是如果命令过长就会出现问题,因为在这种情况下命令传达给mysql的时候会自动换行产生‘/n',mysql无法识别命令,本文作者当时没琢磨明白的时候着实头痛了一阵,如果必须用变量也可以,但是语法要稍微改一下,大家可以自行搜一下,以后的文章也会写,在此不再赘述。
最后一步利用sqlalchemy和pd.io.sql.to_sql直接保留dataframe
from sqlalchemy import create_engine
cnn=create_engine('mysql+pymysql://root:2022@localhost:3306/stock?charset=utf8')
pd.io.sql.to_sql(df,'frompython',con=conn,schema='stock',if_exists='append',index=False)
上图第二句建立与数据库的连接,create_engine()中的字符串是有严格规定的,格式如下
'mysql+pymysql://root:数据库的密码@localhost:端口/选中的database的名称?charset=连接编码‘
接下来就是通过前面这个连接,向数据库内传数据。pd.io.sql.to_sql(需要传dedataframe
,'table名',con=create_engine产生的连接体,schema='选中的database名称',if_exists='append',index=False),if_exists表示怎么把数据存到table里,是接在原有的数据后面(append),还是替换掉原来的数据(replace),是或是如果tabel里有数据就放弃存储(fail),默认为fail.
index指是否把指定的dataframe中的命令列也作为table的一列传到table里,这里True /False的选择要与前面cursor.execute()中的命令规定的字段一致,如果前面有则True,反之,False,默认是True ,不一致会有错误1054, "Unknown column 'False' in 'field list'"。
结果
在cmd中查看
在DataGrip中查看
以上就是学习的新的和一些经验,希望能对大家有所帮助。



