许久没有写了,上线发现后台界面变了,感觉不错。给凤凰点个赞,找个时间写个关于大风号的评论,蹭下平台的热度。
今天,主要讲一下最近在学习Tushare中遇到的一个坑。本人折腾python也快大半年了,python入门容易,提高难。前段时间被tensorflow折腾得半死,一路都是坑。现在又开始折腾量化了。那想量化的第一步,就是获取数据资源这一步,就出现了坑。好不容易爬了出来,怕忘记,也想与朋友们分享。
一、 Tushare数据源
地址:http://tushare.org/index.html
Tushare数据资源包括股票、期货等,是雅虎金融的较为理想的数据替代源。
二、系统环境
1、python 3.6 (命令行下输入:python -V可以查看)
2、Anaconda3.0
3、TensorFlow2.0(它要求的环境的版本较高,估计坑的根源在此)
4、Mysql8.0+workbench
5、Kettle(应该关系不大)
三、坑和解
1、 Tushare文档有误
实际代码应该是这样:
from sqlalchemy import create_engine
import tushare as ts
from pandas import DataFrame
from sqlalchemy.types import VARCHAR
#df:DataFrame = ts.get_tick_data('600848', date='2014-12-22')
#df = ts.get_tick_data('600848', date='2017-12-22')
df = ts.get_hist_data('600848')
engine = create_engine('mysql+mysqlconnector://root:203102@127.0.0.1/shares?charset=utf8')
#print (df)
#存入数据库
#df.to_sql('tick_data3',engine)
df.to_sql('tick_data5',engine,if_exists='replace',dtype={'date':VARCHAR(df.index.get_level_values('date').str.len().max())})
2、问题1:报错
ModuleNotFoundError: No module named 'MySQLdb'
解决办法:
pip install mysqlclient
pip install PyMySQL
3、问题2:参数的设置上,python3和python2不一样
解决办法:
engine= create_engine('mysql+pymysql://root:root@127.0.0.1/tushare?charset=utf8')
或者
engine= create_engine('mysql+mysqlconnector://root:root@127.0.0.1/tushare?charset=utf8')
此处还有小坑:utf8不要写成utf-8
4、问题3:sqlalchemy.exc.ProgrammingError: (mysql.connector.errors.ProgrammingError) 1170 (42000): BLOB/TEXT column 'date' used in key specification without a key length
[SQL: CREATE INDEX ix_tick_data3_date ON tick_data3 (date)]
(Background on this error at: http://sqlalche.me/e/f405)
解决办法:
此处较为明显为Mysql的问题,怎么破呢,Tushare读进的数据是在数据库中建立的新表,我怎么修改得了主码呢?我想过改变列的顺序,也想过加一列,就是没有想到数据类型转换。
df.to_sql('tick_data5',engine,if_exists='replace',dtype={'date':VARCHAR(df.index.get_level_values('date').str.len().max())})
tick_data5是要新建的表, VARCHAR(df.index.get_level_values('date').str.len().max())将时间类型转成字符集。
但 VARCHAR是来源于sqlalchemy.types。
四、执行效果
数据顺利取下来,以后可以在KETTLE中处理了。