前言:

重新复习了下之前写的代码,发现从tushare下载的数据有些是NaN值,自己研究了下这些NaN值的股票,都是些要么退市要么面临退市的风险问题股,之前在我写的文章代码里,生成的docx文档里含有0不明类别的分析报告,这些0的分类其实都是些问题股,于是先加句代码完善下当前的分析报告,注意:此次的代码有点不同上次的代码,主要是对前面写的三篇文章的代码总合,完成了在下载的同时同时生成docx分析报告,所以在运行的时候请自己修改下载的路径跟解析的路径,完善后的完整代码如下:

import os
import docx
import time
import warnings
import pandas as pd
import tushare as ts
from docx.shared import Cm, Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH
warnings.filterwarnings('ignore')#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')# 显示居中
#os.chdir()用于改变当前工作目录到指定的路径
#此路径必须改为放数据的路径且中间的不能缺失任何一天数据,例如get_analysis_stockdata('20200101', '20200106'),
#那么你放数据文件夹内不能缺少任何一个这段时期内的交易数据文件,否则报错
os.chdir('D:/stock_data/')  #保存的绝对路径,需要自己修改跟创建,就是切换默认的工作目录到你设置的路径
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):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 ')#基本数据跟行情数据合并,再跟每日指标数据合并生成一个csv数据文件#on='ts_code'以ts_code为索引,合并数据,how='outer',取并集df_first = pd.merge(left=df_basic, right=df_daily, on='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)#在'name', 'area', 'industry', 'market'列内循环填充NaN值for w in ['name', 'area', 'industry', 'market']:df_all[w].fillna('问题股', inplace=True)#强制转换成str字符串格式df_all['ts_code'] = df_all['ts_code'].astype(str)# 保存数据,不保存索引,如果index=True,则保存索引会多出一列df_all.to_csv(str(date) + '_ts.csv', index=False, encoding='gbk')print(df_all)print('%s is downloaded.' % (str(date)))return df_all#分析数据并生成docx文档,存储至本地D盘D:/stock_analysis/
def get_analysis_stockdata(st_date, ed_date):#获取st_date,ed_date时间段内的交易日期trade_d = pro.trade_cal(exchange='SSE', is_open='1',start_date=st_date,end_date=ed_date,fields='cal_date')for date_now in trade_d['cal_date'].values: #将以上获取时间段的交易日期赋值给date_now# 读取时间段内每日的股票数据df = pd.read_csv('{}_ts.csv'.format(str(date_now)), encoding='gbk')#fillna填充缺失数据,传入inplace=True直接修改原对象df.fillna(0, inplace=True)#astype强制将涨幅,PE,总市值,流通市值转换成float格式,ts_code转化成str后,NAN也变成nan str格式df[['change', 'pe', 'total_mv', 'circ_mv']] = df[['change', 'pe', 'total_mv', 'circ_mv']].astype(float)df['list_date'] = pd.to_datetime(df['list_date'])df['ts_code'] = df['ts_code'].astype(str)# 添加交易所列df.loc[df['ts_code'].str.startswith('3'), 'exchange'] = 'CY'df.loc[df['ts_code'].str.startswith('6'), 'exchange'] = 'SH'df.loc[df['ts_code'].str.startswith('0'), 'exchange'] = 'SZ'# 找出上涨的股票df_up = df[df['change'] > 0.00]# 走平股数df_even = df[df['change'] == 0.00]# 找出下跌的股票df_down = df[df['change'] < 0.00]# 找出涨停的股票limit_up = df[df['change'] >= 9.70]limit_down = df[df['change'] <= -9.70]# 涨停股数中的未封板股,上市日期小于15天limit_up_new = limit_up[pd.to_datetime(date_now) - limit_up['list_date'] <= pd.Timedelta(15)]# 涨停股数中次新股,上市日期小于1年limit_up_fresh = limit_up[pd.to_datetime(date_now) - limit_up['list_date'] <= pd.Timedelta(365)]# 涨停股数中的未封板股,上市日期小于15天limit_down_new = limit_down[pd.to_datetime(date_now) - limit_down['list_date'] <= pd.Timedelta(15)]# 涨停股数中次新股,上市日期小于1年limit_down_fresh = limit_down[pd.to_datetime(date_now) - limit_down['list_date'] <= pd.Timedelta(365)]#df_up.shape[0]获取上涨的行数print('A股上涨个数: %d, A股下跌个数: %d, A股走平个数: %d。' % (df_up.shape[0], df_down.shape[0], df_even.shape[0]))print('A股总成交额:%d, 总成交量:%d' % (df['amount'].sum(), df['vol'].sum()))print('A股平均市盈率:%.2f, 平均流通市值 %.2f 亿, 平均总市值 %.2f 亿' % (df['pe'].mean(), df['circ_mv'].mean(), df['total_mv'].mean()))print('涨停数量:%d 个, 涨停中上市日期小于15天的:%d, 涨停中上市日期小于1年的:%d' % (limit_up.shape[0], limit_up_new.shape[0], limit_up_fresh.shape[0]))print('跌停数量:%d 个, 涨停中上市日期小于15天的:%d, 涨停中上市日期小于1年的:%d' % (limit_down.shape[0], limit_down_new.shape[0], limit_down_fresh.shape[0]))def get_output(df, columns='_industry', name='_limit_up'):# df.copy(deep= False)和df.copy()都是浅拷贝,是复制了旧对象的内容,然后重新生成一个新对象,改变旧对象不会影响新对象。df = df.copy()output = pd.DataFrame()#df.groupby(columns)根据列值分组数据,并根据股票代码统计数据output = pd.DataFrame(df.groupby(columns)['ts_code'].count())output['pe_mean'] = round(df.groupby(columns)['pe'].mean(),2)output['nmc_mean'] = round(df.groupby(columns)['circ_mv'].mean(),2)output['mktcap_mean'] = round(df.groupby(columns)['total_mv'].mean(),2)output['volume_mean'] = round(df.groupby(columns)['vol'].mean(),2)output['amount_mean'] = round(df.groupby(columns)['amount'].mean(),2)#依据ts_code进行降序,排序后的数据集替换原来的数据output.sort_values('ts_code', ascending=False, inplace=True)#改列值名字,将ts_code改成name+‘_count’的形式output.rename(columns={'ts_code': name + '_count'}, inplace=True)return outputfile = docx.Document()file.add_paragraph('A股上涨个数: %d, A股下跌个数: %d, A股走平个数: %d。' % (df_up.shape[0], df_down.shape[0], df_even.shape[0]))file.add_paragraph('A股总成交额:%d, 总成交量:%d' % (df['amount'].sum(), df['vol'].sum()))file.add_paragraph('A股平均市盈率:%.2f, 平均流通市值 %.2f 亿, 平均总市值 %.2f 亿' % (df['pe'].mean(), df['circ_mv'].mean(), df['total_mv'].mean()))file.add_paragraph('涨停数量:%d 个, 涨停中上市日期小于15天的:%d, 涨停中上市日期小于1年的:%d' % (limit_up.shape[0], limit_up_new.shape[0], limit_up_fresh.shape[0]))file.add_paragraph('跌停数量:%d 个, 涨停中上市日期小于15天的:%d, 涨停中上市日期小于1年的:%d' % (limit_down.shape[0], limit_down_new.shape[0], limit_down_fresh.shape[0]))file.add_paragraph('\n')for i in ['industry', 'exchange', 'area']:# 对涨停的股票分析output_limit_up = get_output(limit_up, columns=i, name='limit_up').reset_index()# 对跌停的股票分析output_limit_down = get_output(limit_down, columns=i, name='limit_down').reset_index()# 对全量的股票分析output_total = get_output(df, columns=i, name='total').reset_index()file.add_paragraph('类别:%s' % (i))print(output_limit_up)print(output_limit_down)print(output_total)for j in [output_limit_up, output_limit_down, output_total]:tb = file.add_table(rows=len(j.index)+1, cols=len(j.columns),style='Medium Grid 3 Accent 1')tb.autofit = False  #关闭表格行宽自适应for x in range(len(j.columns)):tb.cell(0, x).text = j.columns[x]  #添加表列头tb.cell(0, x).width = Inches(1.2)  #设置行宽tb.cell(0, x).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER  #文字居中for row in range(len(j.index)):for col in range(len(j.columns)):tb.cell(row+1, col).text = str(j.iloc[row, col]) #设置行宽tb.cell(row+1, col).paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.CENTER #文字居中file.add_paragraph('\n')    #表格换行#之所以生成文件慢是因为output_total这个统计需要长时间写入docx,如果需要速度快你可以试着把output_total去掉#生成一个docx文件我的电脑需要3到4分钟左右file.save('D:\\stock_analysis\\{}_分析报告.docx'.format(str(date_now)))print('{}_分析报告分析完成'.format(str(date_now)))
if __name__=="__main__":get_all_stockdata('20200101', '20200103')get_analysis_stockdata('20200101', '20200102')


tushare注册链接:link

Python tushare股票大数据分析与报告生成(优化版1)相关推荐

  1. python 涨停统计_Python tushare股票大数据分析与报告生成(优化版2)

    import os import docx import time import warnings import pandas as pd import tushare as ts from docx ...

  2. python 涨停统计_Python tushare股票大数据分析与报告生成(优化版1)

    import os import docx import time import warnings import pandas as pd import tushare as ts from docx ...

  3. 向大家介绍我的新书:《基于股票大数据分析的Python入门实战》

    我在公司里做了一段时间Python数据分析和机器学习的工作后,就尝试着写一本Python数据分析方面的书.正好去年有段时间股票题材比较火,就在清华出版社夏老师指导下构思了这本书.在这段特殊时期内,夏老 ...

  4. 基于股票大数据分析的Python入门实战(视频教学版)的插图汇总

    在我写的这本书,<基于股票大数据分析的Python入门实战(视频教学版)>里,用能吸引人的股票案例,带领大家入门Python的语法,数据分析和机器学习. 京东链接是这个:https://i ...

  5. python金融大数据分析视频_Python金融大数据分析 PDF 全书超清版

    给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python金融.大数据分析方面的内容,本书是由人民邮电出版社出版,格式为PDF,资源大小47.8 MB,希尔皮斯科编写,目前豆瓣.亚马逊. ...

  6. python大数据分析实例-Python实现的大数据分析操作系统日志功能示例

    本文实例讲述了Python实现的大数据分析操作系统日志功能.分享给大家供大家参考,具体如下: 一 代码 1.大文件切分 import os import os.path import time def ...

  7. python tushare量化股票大数据分析整合版

    前言:对前面的代码功能进行一次简要整合,简要添加了多线程功能: 1.tushare股票数据本地csv格式. 2.csv格式文件mysql化. 3.tushare股票数据分析word文档化. 代码如下: ...

  8. python数据分析买什么书_向大家介绍我的新书:《基于股票大数据分析的Python入门实战》...

    我在公司里做了一段时间Python数据分析和机器学习的工作后,就尝试着写一本Python数据分析方面的书.正好去年有段时间股票题材比较火,就在清华出版社夏老师指导下构思了这本书.在这段特殊时期内,夏老 ...

  9. python股票交易编程最好的书_向大家介绍我的新书:《基于股票大数据分析的Python入门实战》...

    我在公司里做了一段时间Python数据分析和机器学习的工作后,就尝试着写一本Python数据分析方面的书.正好去年有段时间股票题材比较火,就在清华出版社夏老师指导下构思了这本书.在这段特殊时期内,夏老 ...

最新文章

  1. 利用边缘检测计算物体面积(内含源码)
  2. 让Redis在你的系统中发挥更大作用
  3. Oracle入门(十四A)之PL/SQL 基本结构
  4. html中padding和margin的区别和用法与存在的bug消除
  5. C语言指针-字符指针整型指针char*s int*a
  6. LeetCode 1227. 飞机座位分配概率(DP+数学归纳法)
  7. dremwere怎样让多个图片并列排放_国标双壁波纹管直径200、300、400、500、600、800图片展示...
  8. JAVA设置按钮无效_JAVA设置的按钮监听没有反应
  9. C++ - STL迭代器失效
  10. 如何保障大数据平台的安全性
  11. Android7.1 audio 播放流程(三十五)
  12. 信号与系统_严国志_第一章_绪论
  13. 单向链表中的数据排序问题
  14. HTML实现简单的贪吃蛇小游戏(附完整源码)
  15. 【资讯】1225- Flutter 2.10发布,稳定支持Windows
  16. 初学入门YOLOv5手势识别之制作并训练自己的数据集
  17. 云阶月地,关锁千重(一.独享锁/共享锁)
  18. JVM虚拟机(JDK8)
  19. 什么是敏感型货物,被海关扣押之后如何处理?
  20. 常见职位英文缩写词解释

热门文章

  1. 我的网络通信相关文章
  2. 微商必死?揭秘那些江湖骗局!
  3. 股份有限公司章程范本
  4. 【数据结构与算法】八大排序(中)快速排序 快排居然还能这么优化?快排的非递归该如何写?
  5. 初识Odoo的辅助核算
  6. weka操作实现决策树算法中打球与天气的关系
  7. 微软IE不再“孤单” 首选12种浏览器曝光(每日关注2009.12.18)
  8. 安装ROS-Academy-for-Beginners教学包时安装依赖的时候老是失败
  9. Human Brain Mapping:多项目工作记忆的时空和波谱动态特性—基于MEG的研究
  10. 对数函数log的物理含义