python3mysql包_顺利迈过Tushare+python3+mySql读取金融数据的坑

26fa11530db2ca4c534120ff0e98cd047e6ad8ed_size4687_w1601_h748.png

许久没有写了,上线发现后台界面变了,感觉不错。给凤凰点个赞,找个时间写个关于大风号的评论,蹭下平台的热度。

今天,主要讲一下最近在学习Tushare中遇到的一个坑。本人折腾python也快大半年了,python入门容易,提高难。前段时间被tensorflow折腾得半死,一路都是坑。现在又开始折腾量化了。那想量化的第一步,就是获取数据资源这一步,就出现了坑。好不容易爬了出来,怕忘记,也想与朋友们分享。

一、 Tushare数据源

地址:http://tushare.org/index.html

Tushare数据资源包括股票、期货等,是雅虎金融的较为理想的数据替代源。

26fa11530db2ca4c534120ff0e98cd047e6ad8ed_size4687_w1601_h748.png

二、系统环境

1、python 3.6 (命令行下输入:python -V可以查看)

2、Anaconda3.0

3、TensorFlow2.0(它要求的环境的版本较高,估计坑的根源在此)

4、Mysql8.0+workbench

5、Kettle(应该关系不大)

三、坑和解

1、 Tushare文档有误

gif;base64,R0lGODlhAQABAIAAAP

实际代码应该是这样:

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中处理了。

gif;base64,R0lGODlhAQABAIAAAP

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值