PythonStock(2):tushare宏观数据使用pandas入库,增加唯一索引
来源:互联网 发布:unity3d 联机游戏 编辑:程序博客网 时间:2024/05/21 09:40
1,对pandas入数据库
pandas代码中自带了to_sql的方法可以直接使用。
但是数据字段是text的,需要修改成 varchar的,否则不能增加索引。
在增加了主键之后可以控制数据不能再增量修改了。
增加:dtype类型可以解决
dtype={col_name: NVARCHAR(length=255) for col_name in data.columns.tolist()}
to_sql 中带的 if_exists 是针对不存在的数据表操作的。而不是数据。
查看了pandas io 下面的 sql.py
2,分析下入库
sql.py 使用了SQLAlchemy 进行数据存储。分为普通SQLDatabase和SQLiteTable两个实现类,实现操作 read_sql 和 to_sql 两个方法。
实现了数据库的读取和数据库的入库。
思路本来是想找到入库的SQL,发现只是在SQLiteTable 才拼接了INSERT INTO 。在操作mysql的时候根本没有调用。而是直接使用 SQLAlchemy 进行面向对象入库的。
目标是拼接下 INSERT IGNORE INTO ,支持增量插入数据。
并增加 PRIMARY KEY,数据不被重复插入。
最后找到一个方法,直接修改sqlalchemy 下 mysql的代码:
sed -i -e 's/executemany(statement/executemany(statement.replace\("INSERT INTO","INSERT IGNORE INTO")/g' \ /usr/local/lib/python3.5/dist-packages/sqlalchemy/dialects/mysql/mysqldb.py
即可解决重复入库的问题。
也就是把 “INSERT INTO” 替换成 “INSERT IGNORE INTO” 的方式。
让数据库不保存,保证数据更新成功。
非常简单暴力的方式。
3,增加唯一索引
增加索引很简单:
ALTER IGNORE TABLE `ts_deposit_rate` ADD PRIMARY KEY (`date`,`deposit_type`);
直接可以增加,但是数据在增加完索引之后,就不能重复再增加了。
数据库会报错误。就需要对数据库的表的索引进行判断了。
还好 sqlalchemy 的 inspect 功能非常的强大。
可以直接获得表的 primary key。再判断下就好了。
#定义engineengine = common.engine()#使用 http://docs.sqlalchemy.org/en/latest/core/reflection.html#使用检查检查数据库表是否有主键。insp = inspect(engine)# 存款利率data = ts.get_deposit_rate()data.to_sql(name="ts_deposit_rate", con=engine, schema=common.MYSQL_DB, if_exists='append', dtype={col_name: NVARCHAR(length=255) for col_name in data.columns.tolist()}, index=False)if insp.get_primary_keys("ts_deposit_rate") == []:#判断是否存在主键 with engine.connect() as con: con.execute('ALTER IGNORE TABLE `ts_deposit_rate` ADD PRIMARY KEY (`date`,`deposit_type`);')
对 tushare的存款利率进行处理。
对代码进行下封装批量处理下 TuShare 数据:
#!/usr/local/bin/python# -*- coding: utf-8 -*-import sysimport timeimport pandas as pdimport tushare as tsfrom sqlalchemy.types import NVARCHARfrom sqlalchemy import inspectimport datetimeMYSQL_USER=""MYSQL_PWD=""MYSQL_HOST=""MYSQL_DB=""def engine(): engine = create_engine( "mysql+mysqldb://" + MYSQL_USER + ":" + MYSQL_PWD + "@" + MYSQL_HOST + "/" + MYSQL_DB + "?charset=utf8", encoding='utf8', convert_unicode=True) return engine#定义通用方法函数,插入数据库表,并创建数据库主键,保证重跑数据的时候索引唯一。def insert_db(data, table_name, primary_keys): # 定义engine engine = engine() # 使用 http://docs.sqlalchemy.org/en/latest/core/reflection.html # 使用检查检查数据库表是否有主键。 insp = inspect(engine) data.to_sql(name=table_name, con=engine, schema=common.MYSQL_DB, if_exists='append', dtype={col_name: NVARCHAR(length=255) for col_name in data.columns.tolist()}, index=False) # 判断是否存在主键 if insp.get_primary_keys(table_name) == []: with engine.connect() as con: # 执行数据库插入数据。 con.execute('ALTER IGNORE TABLE `%s` ADD PRIMARY KEY (%s);' % (table_name, primary_keys))####### 3.pdf 方法。宏观经济数据def stat_all(tmp_datetime): # 存款利率 data = ts.get_deposit_rate() insert_db(data, "ts_deposit_rate", "`date`,`deposit_type`") # 贷款利率 data = ts.get_loan_rate() insert_db(data, "ts_loan_rate", "`date`,`loan_type`") # 存款准备金率 data = ts.get_rrr() insert_db(data, "ts_rrr", "`date`") # 货币供应量 data = ts.get_money_supply() insert_db(data, "ts_money_supply", "`month`") # 货币供应量(年底余额) data = ts.get_money_supply_bal() insert_db(data, "ts_money_supply_bal", "`year`") # 国内生产总值(年度) data = ts.get_gdp_year() insert_db(data, "ts_gdp_year", "`year`") # 国内生产总值(季度) data = ts.get_gdp_quarter() insert_db(data, "ts_get_gdp_quarter", "`quarter`") # 三大需求对GDP贡献 data = ts.get_gdp_for() insert_db(data, "ts_gdp_for", "`year`") # 三大产业对GDP拉动 data = ts.get_gdp_pull() insert_db(data, "ts_gdp_pull", "`year`") # 三大产业贡献率 data = ts.get_gdp_contrib() insert_db(data, "ts_gdp_contrib", "`year`") # 居民消费价格指数 data = ts.get_cpi() insert_db(data, "ts_cpi", "`month`") # 工业品出厂价格指数 data = ts.get_ppi() insert_db(data, "ts_ppi", "`month`")# main函数入口if __name__ == '__main__': # 使用方法传递。 stat_all()
增加后的数据库表:
存储的数据:使用TuShare 入库的工业品出厂价格指数
4,总结
本文的原文连接是: http://blog.csdn.net/freewebsys/article/details/75669782 未经博主允许不得转载。
博主地址是:http://blog.csdn.net/freewebsys
TuShare 和pandas 都是非常强大的。配合起来非常的方便,抓取后的股票数据直接入库。
在这个基础上进行优化,把字段修改成varchar 类型,并且增加索引主键。
同时利用 sqlalchemy 对数据索引进行检查如果没有再创建。
完成了对数据的增量更新。同时保证数据不重复。
- PythonStock(2):tushare宏观数据使用pandas入库,增加唯一索引
- PythonStock(10):使用notebook + tushare + pandas 简单的股票分析,蜡烛图
- PythonStock(14):使用pandas 批量处理股票数据,批量计算股票指标
- PythonStock(11):使用pandas计算股票波峰波谷猜想
- PythonStock(12):使用python,pandas进行股票分析
- TuShare(2):使用TuShare,抓取股票数据并存储到数据库
- TuShare(3):使用pandas 压缩存储hdf5文件
- PythonStock(15):使用bokeh 展示股票报表数据
- TensorFlow(2):给TensorFlow Image 打补丁增加 TuShare 支持
- pandas 增加一行数据
- PythonStock(7):使用 dataTable+Editor+python+Tornado 实现数据通用CRUD
- PythonStock(9):使用优矿uqer.io 进行简单的数据分析
- pandas数据索引变换
- Tushare + pyalgotrade + pandas 环境搭建(MAC环境)
- Tushare + pyalgotrade + pandas 环境搭建(MAC环境)
- [bigdata-038] tushare 金融数据 安装使用
- python金融数据分析1:tushare使用
- tushare 使用
- maven淘宝镜像
- Ubuntu下Apache,PHP,MySQL安装方法(亲测)
- day1
- Android源码解析系列
- 平衡二叉树,AVL树之图解篇
- PythonStock(2):tushare宏观数据使用pandas入库,增加唯一索引
- 常用linux命令和例子,后续补充中。。。
- CSDN上传资源规则之删除及其删除资源的3种方法
- XCode7以上免证书真机调试教程
- apk破解(二) 简单修改一个so文件
- Nginx+Tomcat代理环境下JS无法完全加载问题的处理
- MyEclipse中Maven配置
- 模拟实现string(深浅拷贝,传统现代写法)
- linux之文本操作命令