python tushare直接写入mysql数据库

前言:前面的几篇文章都是记录tushare先写入本地硬盘变成csv格式,然后再从csv取数据进行分析再导入mysql。以下代码是直接将tushare获取到数据直接导入mysql,先大体放出简单代码,后面再记录完善的代码:

import pandas as pd
import tushare as ts
import pymysql
from urllib import parse
from sqlalchemy import create_engine

#pd.set_option()就是pycharm输出控制显示的设置
pd.set_option('expand_frame_repr', False)#True就是可以换行显示。设置成False的时候不允许换行
pd.set_option('display.max_columns', None)# 显示所有列
#pd.set_option('display.max_rows', None)# 显示所有行
pd.set_option('colheader_justify', 'centre')# 显示居中

pro = ts.pro_api('要到tushare官网注册个账户然后将token复制到这里,可以的话请帮个忙用文章末我分享的链接注册,谢谢')
#df_basic = pro.stock_basic() 获取基础信息数据,包括股票代码、名称、上市日期、退市日期等
#df_daily = pro.daily()  获取所有股票日行情信息,或通过通用行情接口获取数据,包含了前后复权数据,停牌期间不提供数据
#df_daily_basic = pro.daily_basic()获取全部股票每日重要的基本面指标,可用于选股分析、报表展示等。

def get_all_stockdata(st_date, ed_date):
    #此方法连接数据库,密码可以输入特殊字符串
    engine = create_engine('mysql://root:%[email protected]:3306/你的数据库名称?charset=utf8' % parse.unquote_plus(''你的数据库密码'))
    print('数据库连接成功')
    trade_d = pro.trade_cal(exchange='SSE', is_open='1',start_date=st_date,end_date=ed_date,fields='cal_date')
    for date in trade_d['cal_date'].values:
        df_basic = pro.stock_basic(exchange='', list_status='L')    #再获取所有股票的基本信息
        df_daily = pro.daily(trade_date=date)    # 先获得所有股票的行情数据,成交额单位是千元,成交量是手
        df_daily_basic = pro.daily_basic(ts_code='', trade_date=date,fields='ts_code, turnover_rate, turnover_rate_f,'
                                                                            ' volume_ratio, pe, pe_ttm, pb, ps, ps_ttm,'
                                                                            ' dv_ratio, dv_ttm, total_share, float_share,'
                                                                            ' free_share, total_mv, circ_mv ')    #获取每日指标,单位是万股,万元
        df_first = pd.merge(left=df_basic, right=df_daily, on='ts_code', how='outer')  # on='ts_code'以ts_code为索引,合并数据,how='outer',取并集
        df_all = pd.merge(left=df_first, right=df_daily_basic, on='ts_code', how='outer')
        # 数据清洗,删除symbol列数据,跟ts_code数据重复
        df_all = df_all.drop('symbol', axis=1)
        for w in ['name', 'area', 'industry', 'market']:  # 在'name', 'area', 'industry', 'market'列内循环填充NaN值
            df_all[w].fillna('问题股', inplace=True)

        #df_all['amount'] = df_all['amount'] / 100000  # 千转亿
        #df_all['circ_mv'] = df_all['circ_mv'] / 10000  # 万转亿
        #df_all['total_mv'] = df_all['total_mv'] / 10000  # 万转亿

        df_all['ts_code'] = df_all['ts_code'].astype(str)  # 强制转换成str字符串格式
        df_all['list_date'] = pd.to_datetime(df_all['list_date'])  # 本地储存前一定要先转化成日期格式先
        df_all['trade_date'] = pd.to_datetime(df_all['trade_date'])

        #对获取的股票数据列名称进行重命名以方便阅读
        df_all = df_all.rename(columns={
    
    'ts_code': '股票代码', 'name': '股票名称', 'area': '所在地域', 'industry': '行业'
                                        , 'market': '市场类型', 'list_date': '上市日期', 'trade_date': '交易日期', 'change': '涨跌额'
                                        , 'pct_chg': '涨跌幅', 'vol': '成交量(手)', 'amount': '成交额(千元)', 'turnover_rate': '换手率(%)'
                                        , 'turnover_rate_f': '流通换手率', 'volume_ratio': '量比', 'pe': '市盈率', 'pe_ttm': '滚动市盈率'
                                        , 'pb': '市净率', 'ps': '市销率', 'ps_ttm': '滚动市销率', 'dv_ratio': '股息率'
                                        , 'dv_ttm': '滚动股息率', 'total_share': '总股本(万股)', 'float_share': '流通股本 (万股)'
                                        , 'free_share': '自由流通股本(万股)', 'total_mv': '总市值 (万元)', 'circ_mv': '流通市值(万元)'})
        #亏损的为空值

        engine.execute('drop table if exists {}_ts;'.format(date))  #删除重复的数据表
        print('%s is downloading....' % (str(date)))
        df_all.to_sql('{}_ts'.format(date),engine,index=False)
        print('{}成功导入数据库'.format(date))

if __name__=="__main__":
    get_all_stockdata('20200501', '20200509')

tushare注册链接:link

猜你喜欢

转载自blog.csdn.net/Wilburzzz/article/details/107046528