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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 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 对数据索引进行检查如果没有再创建。
完成了对数据的增量更新。同时保证数据不重复。

SouthEast

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
20天前
|
数据处理 Python
如何使用Python的Pandas库进行数据排序和排名
【4月更文挑战第22天】Pandas Python库提供数据排序和排名功能。使用`sort_values()`按列进行升序或降序排序,如`df.sort_values(by='A', ascending=False)`。`rank()`函数用于计算排名,如`df['A'].rank(ascending=False)`。多列操作可传入列名列表,如`df.sort_values(by=['A', 'B'], ascending=[True, False])`和分别对'A'、'B'列排名。
24 2
|
20天前
|
存储 Python
使用Pandas库对非数值型数据进行排序和排名
在Pandas中,支持对非数值型数据排序和排名。可按以下方法操作:1) 字符串排序,使用`sort_values()`,如`sorted_df = df.sort_values(by='Name', ascending=False)`进行降序排序;2) 日期排序,先用`to_datetime()`转换,再排序,如`sorted_df = df.sort_values(by='Date')`;3) 自定义排序,结合`argsort()`和自定义规则。
27 2
|
2月前
|
数据格式 Python
如何使用Python的Pandas库进行数据透视图(melt/cast)操作?
Pandas的`melt()`和`pivot()`函数用于数据透视。基本步骤:导入pandas,创建DataFrame,然后使用这两个函数转换数据格式。示例代码展示了如何通过`melt()`转为长格式,再用`pivot()`恢复为宽格式。输入数据是包含'Name'和'Age'列的DataFrame,最终结果经过转换后呈现出不同的布局。
44 6
|
2月前
|
数据处理 Python
如何使用Python的Pandas库进行数据排序和排名?
Pandas在Python中提供数据排序和排名功能。使用`sort_values()`进行排序,如`df.sort_values(by='A', ascending=False)`进行降序排序;用`rank()`进行排名,如`df['A'].rank(ascending=False)`进行降序排名。多列操作可传入列名列表,如`df.sort_values(by=['A', 'B'], ascending=[True, False])`。
32 6
|
2月前
|
索引 Python
如何使用Python的Pandas库进行数据合并和拼接?
【2月更文挑战第28天】【2月更文挑战第103篇】如何使用Python的Pandas库进行数据合并和拼接?
|
2月前
|
索引 Python
如何在Python中,Pandas库实现对数据的时间序列分析?
Pandas在Python中提供强大的时间序列分析功能,包括:1) 使用`pd.date_range()`创建时间序列;2) 通过`pd.DataFrame()`将时间序列转为DataFrame;3) `set_index()`设定时间列作为索引;4) `resample()`实现数据重采样(如按月、季度);5) `rolling()`进行移动窗口计算,如计算移动平均;6) 使用`seasonal_decompose()`进行季节性调整。这些工具适用于各种时间序列分析场景。
44 0
|
16天前
|
数据采集 数据处理 索引
如何使用 Pandas 删除 DataFrame 中的非数字类型数据?
如何使用 Pandas 删除 DataFrame 中的非数字类型数据?
27 3
|
18天前
|
存储 数据挖掘 数据处理
使用pandas高效读取筛选csv数据
本文介绍了使用Python的Pandas库读取和处理CSV文件。首先,确保安装了Pandas,然后通过`pd.read_csv()`函数读取CSV,可自定义分隔符、列名、索引等。使用`head()`查看数据前几行,`info()`获取基本信息。Pandas为数据分析提供强大支持,是数据科学家的常用工具。
23 0
|
19天前
|
数据挖掘 数据处理 索引
如何使用Python的Pandas库进行数据筛选和过滤?
Pandas是Python数据分析的核心库,提供DataFrame数据结构。基本步骤包括导入库、创建DataFrame及进行数据筛选。示例代码展示了如何通过布尔索引、`query()`和`loc[]`方法筛选`Age`大于19的记录。
21 0
|
19天前
|
索引 Python
如何使用Pandas进行数据合并?
Pandas提供`merge()`, `join()`, `concat()`等方法进行数据合并。基本步骤包括导入pandas库、创建或加载DataFrame,然后调用这些方法合并数据。示例中展示了如何使用`merge()`和`join()`:创建两个DataFrame `df1`和`df2`,通过`merge()`基于索引合并,以及`join()`进行外连接合并。
21 0