tushare宏观数据使用pandas入库,增加唯一索引

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 1,对pandas入数据库pandas代码中自带了to_sql的方法可以直接使用。 但是数据字段是text的,需要修改成 varchar的,否则不能增加索引。 在增加了主键之后可以控制数据不能再增量修改了。增加:dtype类型可以解决dtype={col_name: NVARCHAR(length=255) for col_name in dat

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。再判断下就好了。

#定义engine
engine = 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 sys
import time
import pandas as pd
import tushare as ts
from sqlalchemy.types import NVARCHAR
from sqlalchemy import inspect
import datetime

MYSQL_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 对数据索引进行检查如果没有再创建。
完成了对数据的增量更新。同时保证数据不重复。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
4月前
|
数据采集 安全 数据挖掘
Pandas数据合并:10种高效连接技巧与常见问题
在数据分析中,数据合并是常见且关键的步骤。本文针对合并来自多个来源的数据集时可能遇到的问题,如列丢失、重复记录等,提供系统解决方案。基于对超1000个复杂数据集的分析经验,总结了10种关键技术,涵盖Pandas库中`merge`和`join`函数的使用方法。内容包括基本合并、左连接、右连接、外连接、基于索引连接、多键合并、数据拼接、交叉连接、后缀管理和合并验证等场景。通过实际案例与技术原理解析,帮助用户高效准确地完成数据整合任务,提升数据分析效率。
389 13
Pandas数据合并:10种高效连接技巧与常见问题
|
8月前
|
存储 人工智能 自然语言处理
Pandas数据应用:自然语言处理
本文介绍Pandas在自然语言处理(NLP)中的应用,涵盖数据准备、文本预处理、分词、去除停用词等常见任务,并通过代码示例详细解释。同时,针对常见的报错如`MemoryError`、`ValueError`和`KeyError`提供了解决方案。适合初学者逐步掌握Pandas与NLP结合的技巧。
219 20
|
8月前
|
存储 数据挖掘 计算机视觉
Pandas数据应用:图像处理
Pandas 是一个强大的 Python 数据分析库,主要用于处理结构化数据。尽管它不是专门为图像处理设计的,但可以利用其功能辅助图像处理任务。本文介绍如何使用 Pandas 进行图像处理,包括图像读取、显示、基本操作及常见问题解决方法。通过代码案例解释如何将图像转换为 DataFrame 格式,并探讨数据类型不匹配、内存溢出和颜色通道混淆等问题的解决方案。总结中指出,虽然 Pandas 可作为辅助工具,但在实际项目中建议结合专门的图像处理库如 OpenCV 等使用。
190 18
|
7月前
|
监控 物联网 数据处理
Pandas高级数据处理:数据流式计算
本文介绍了如何使用 Pandas 进行流式数据处理。流式计算能够实时处理不断流入的数据,适用于金融交易、物联网监控等场景。Pandas 虽然主要用于批处理,但通过分块读取文件、增量更新 DataFrame 和使用生成器等方式,也能实现简单的流式计算。文章还详细讨论了内存溢出、数据类型不一致、数据丢失或重复及性能瓶颈等常见问题的解决方案,并建议在处理大规模数据时使用专门的流式计算框架。
462 100
Pandas高级数据处理:数据流式计算
|
8月前
|
机器学习/深度学习 存储 算法
Pandas数据应用:客户流失预测
本文介绍如何使用Pandas进行客户流失预测,涵盖数据加载、预处理、特征工程和模型训练。通过解决常见问题(如文件路径错误、编码问题、列名不一致等),确保数据分析顺利进行。特征工程中创建新特征并转换数据类型,为模型训练做准备。最后,划分训练集与测试集,选择合适的机器学习算法构建模型,并讨论数据不平衡等问题的解决方案。掌握这些技巧有助于有效应对实际工作中的复杂情况。
231 95
|
8月前
|
机器学习/深度学习 数据采集 JSON
Pandas数据应用:机器学习预处理
本文介绍如何使用Pandas进行机器学习数据预处理,涵盖数据加载、缺失值处理、类型转换、标准化与归一化及分类变量编码等内容。常见问题包括文件路径错误、编码不正确、数据类型不符、缺失值处理不当等。通过代码案例详细解释每一步骤,并提供解决方案,确保数据质量,提升模型性能。
331 88
|
8月前
|
数据采集 存储 供应链
Pandas数据应用:库存管理
本文介绍Pandas在库存管理中的应用,涵盖数据读取、清洗、查询及常见报错的解决方法。通过具体代码示例,讲解如何处理多样数据来源、格式不一致、缺失值和重复数据等问题,并解决KeyError、ValueError等常见错误,帮助提高库存管理效率和准确性。
252 72
|
7月前
|
数据采集 数据可视化 数据处理
Pandas高级数据处理:数据仪表板制作
《Pandas高级数据处理:数据仪表板制作》涵盖数据清洗、聚合、时间序列处理等技巧,解决常见错误如KeyError和内存溢出。通过多源数据整合、动态数据透视及可视化准备,结合性能优化与最佳实践,助你构建响应快速、数据精准的商业级数据仪表板。适合希望提升数据分析能力的开发者。
166 31
|
7月前
|
缓存 数据可视化 BI
Pandas高级数据处理:数据仪表板制作
在数据分析中,面对庞大、多维度的数据集(如销售记录、用户行为日志),直接查看原始数据难以快速抓住重点。传统展示方式(如Excel表格)缺乏交互性和动态性,影响决策效率。为此,我们利用Python的Pandas库构建数据仪表板,具备数据聚合筛选、可视化图表生成和性能优化功能,帮助业务人员直观分析不同品类商品销量分布、省份销售额排名及日均订单量变化趋势,提升数据洞察力与决策效率。
124 12
|
7月前
|
消息中间件 数据挖掘 数据处理
Pandas高级数据处理:数据流式计算
在大数据时代,Pandas作为Python强大的数据分析库,在处理结构化数据方面表现出色。然而,面对海量数据时,如何实现高效的流式计算成为关键。本文探讨了Pandas在流式计算中的常见问题与挑战,如内存限制、性能瓶颈和数据一致性,并提供了详细的解决方案,包括使用`chunksize`分批读取、向量化操作及`dask`库等方法,帮助读者更好地应对大规模数据处理需求。
153 17