用尺子量海 发表于 2020-11-14 16:49:30

tushare作业求助

已经改了好多次了,现在问题是结果代码运行没问题,但是无法用plot显示出来,我这里觉得是第161行和162行的结果出现了问题,结果导致所有的数据为0,显示不出来图形,求大牛解救!




import os
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import shutil

#获取所有股票的指定类型、时间范围内的K线数据,
def getData(BaseDir,start,end,ktype):
    #创建存放数据的文件夹
    if os.path.exists(BaseDir):
      shutil.rmtree(BaseDir)
    os.mkdir(BaseDir)
    #获取所有股票的代码
    # ts.set_token('315e2234fb9e0862dae6277be3f8d69c6bb827e35dd9d5125876ceaa')
    # pro = ts.pro_api()
    # stock_list = pro.daily()
    # print(stock_list)
    stock_list=ts.get_stock_basics()
    # print(ts.get_stock_basics())
    #遍历循环所有股票代码,获取所有股票的数据
    for stock_code in stock_list.index[:3]:
      # print(stock_code)
      #获取指定一支股票的指定类型的K线数据
      stock_data=ts.get_hist_data(stock_code,start,end,ktype=ktype)
      #拼接存储一支股票的文件的文件名,文件名包括三个部分:目录、代码和扩展名
      filename="./"+BaseDir+"/"+stock_code+".txt"
      # print(filename)
      #判断是否成功获取到K线数据
      if stock_data is not None:
            #按照时间(行索引)升序排列所有数据
            stock_data.sort_index(inplace=True, ascending=True) #存储数据
            stock_data.to_csv(filename)


#获取2020年10月份的交易日期,参数filename为存储日k线数据的文件名
def getDateList(filename):
    stock_data_day = pd.read_csv(filename, index_col='date')
    # print(stock_data_day)
    a = stock_data_day.index[:].values
    return stock_data_day.index[:].values


#获取2020年10月份中每个交易日前一天的收盘价,
#参数filename为存储日k线数据的文件名,Date_List为交易日期
def getPrevDayClose(filename,Date_list_prev):
    stock_data_day=pd.read_csv(filename,index_col='date')
    #获取前一日的收盘价
    prev_day_close=stock_data_day[:-2]['close'].values
    # print(prev_day_close)
    #创建存储前一日收盘价的Series,索引为交易日期
    d =len((Date_list_prev))
    a = prev_day_close.shape
    Prev_Day_Close=pd.Series(prev_day_close,index=Date_list_prev)
    #print(Prev_Day_Close)
    return Prev_Day_Close
#
#获取2019年10月份中每个交易日当天的收盘价
#参数filename为存储日k线数据的文件名,Date_List为交易日期
def getCurtDayClose(filename,Date_list_curt):
    stock_data_day = pd.read_csv(filename, index_col='date')
    #获取前一日的收盘价
    curt_day_close=stock_data_day['close'].values
    #创建存储前一日收盘价的Series,索引为交易日期
    Curt_Day_Close=pd.Series(curt_day_close,index=Date_list_curt)
    return Curt_Day_Close

# #获取2019年10月份中每个交易日后一天的收盘价
# #参数filename为存储日k线数据的文件名,Date_List为交易日期
def getNextDayClose(filename,Date_list_next):
    stock_data_day=pd.read_csv(filename,index_col='date')
    #获取前一日的收盘价
    next_day_close=stock_data_day['close'].values
    #创建存储后一天收盘价的Series,索引为交易日期
    Next_Day_Close=pd.Series(next_day_close,index=Date_list_next)
    return Next_Day_Close

#获取2019年10月份中每个交易日中指定时段的的收盘价,参数start指定时段
#参数filename为存储日30分钟K线数据的文件名,Date_List为交易日期
def getCurtSegClose(filename_30,Date_list,start):
    stock_data_30=pd.read_csv(filename_30,index_col='date')
    #获取指定时段的30分钟K线收盘价
    # print(stock_data_30)
    curt_seg_close=stock_data_30['close'].values
    # print(curt_seg_close)
    #判定数据是否为空
    a = curt_seg_close.shape
    b = len(Date_list)
    if len(Date_list) !=curt_seg_close.shape:
      return None
    #创建存储指定时段收盘价的Series,索引为Date_List
    Curt_Seg_Close=pd.Series(curt_seg_close,index=Date_list)
    d =Curt_Seg_Close
    return Curt_Seg_Close


#处理八个时段的所有股票数据
#参数Base_AnaResult_Dir用于指明存放分析结果的目录
def prepAllSegAllStockData(Base_AnaResult_Dir):
             #创建用于存储分析结果的目录,该目录下将有8个文件
             #每个文件保存一个时段的数据
    if os.path.exists(Base_AnaResult_Dir ):
      shutil.rmtree(Base_AnaResult_Dir )
    os.mkdir(Base_AnaResult_Dir)
    for i in range(8):
      print("Seg:",i)
      prepOneSegAllStockData(Base_AnaResult_Dir,i)
#处理一个时段的所有股票的数据,SegIndex指明处理的时段
#参数Base_AnaResult_Dir指定用于存储分析结果的目录,SegIndex指定分析那个时段
def prepOneSegAllStockData(Base_AnaResult_Dir,SegIndex):
    BaseDir_M30 = "Stock_Data_30"
    BaseDir_Day = "Stock_Data_Day"
    OneSegAllStock_data = pd.DataFrame([], columns=['code', 'prev_day_close',
'curt_seg_close', 'curt_day_close', 'next_day_close', 'curt_seg_updown', 'next_day_updown'])
               #获取30分钟K线目录下有哪些文件
    filenames=os.listdir(BaseDir_M30)
    for filename in filenames:
      #对一个30分钟k线的文件(一只股票)进行处理
      day_filename=os.path.join(BaseDir_Day,filename)
      m30_filename=os.path.join(BaseDir_M30,filename)
      if not os.path.exists(day_filename):
            continue
      if not os.path.exists(m30_filename):
            continue
      #得到一支股票在指定时段的处理数据
      OneSegOneStock_data = prepOneSegOneStockData(day_filename,m30_filename,SegIndex)
      #将结果拼接到一个时段的总结果中
      OneSegAllStock_data=pd.concat()
      # print(OneSegAllStock_data)
      #存储一个时段所有股票的分析结果
      if OneSegAllStock_data is not None:
            break
    SegResultFileName=os.path.join(Base_AnaResult_Dir,str(SegIndex)+".txt")
    # print(SegResultFileName)
    OneSegAllStock_data.to_csv(SegResultFileName)


def prepOneSegOneStockData(DayKFileName, M30KFileName, SegIndex):
    OneSegOneStock_data = pd.DataFrame([], columns=['code', 'prev_day_close', 'curt_seg_close', 'curt_day_close',
                                                    'next_day_close', 'curt_seg_updown', 'next_day_updown'])
    # 获取该股票的交易日信息
    date_list = getDateList(DayKFileName)
    # 获取这支股票在指定时段的收盘价
    date_list_1 = date_list[:-1]
    Cur_Seg_Close = getCurtSegClose(M30KFileName, date_list_1, SegIndex)
    # print(Cur_Seg_Close)
    if Cur_Seg_Close is None:
      return None
    # 分别获取该股票的四个信息:
    OneSegOneStock_data['curt_seg_close'] = getCurtSegClose(M30KFileName, date_list_1, SegIndex)
    a = getCurtSegClose(M30KFileName, date_list_1, SegIndex)
    OneSegOneStock_data['prev_day_close'] = getPrevDayClose(DayKFileName, Date_list_prev)
    b = getPrevDayClose(DayKFileName, Date_list_prev)
    OneSegOneStock_data['curt_day_close'] = getCurtDayClose(DayKFileName, Date_list_curt)
    c = getCurtDayClose(DayKFileName, Date_list_curt)
    OneSegOneStock_data['next_day_close'] = getNextDayClose(DayKFileName, Date_list_next)
    d = getNextDayClose(DayKFileName, Date_list_next)
    # 计算指定时段的长跌幅和次日涨跌幅
    OneSegOneStock_data['curt_seg_updown'] = (OneSegOneStock_data['curt_seg_close'] - OneSegOneStock_data[
      'prev_day_close']) / OneSegOneStock_data['prev_day_close']
    e = OneSegOneStock_data['curt_seg_updown']
    OneSegOneStock_data['next_day_updown'] = (getNextDayClose(DayKFileName, Date_list_next) - OneSegOneStock_data[
      'curt_day_close']) / OneSegOneStock_data['curt_day_close']
    # 设置股票代码
    code = DayKFileName.split('.')
    OneSegOneStock_data['code'] = code
    return OneSegOneStock_data

# 显示所有数据的处理结果
# 参数Base_AnaResult_Dir为存储各时段分析结果的目录
def ShowData(Base_AnaResult_Dir):
    # 指定画布尺寸
    plt.figure(figsize=(30, 40))
    # 绘制8个时段的图形
    for segindex in range(8):
      # 拼接一个时段的数据分析结果文件的文件名
      filename = os.path.join(Base_AnaResult_Dir, str(segindex) + ".txt")
      datas = pd.read_csv(filename)
      # 行过滤,判定当前时段是否涨停
      datas = datas > 0.099]
      plt.subplot(2, 4, segindex + 1)
      # 绘制一个时段次日涨幅的分布直方图
      b = datas
      a = datas['next_day_updown']
      plt.hist(datas['next_day_updown'], bins=np.linspace(-0.1, 0.1, 21))

      # 设置坐标轴
      plt.xlim(-0.1, 0.1)
      plt.ylim(0, 40)
      plt.xticks(np.linspace(-0.1, 0.1, 5))
      plt.yticks(np.linspace(0, 40, 11))
      plt.grid()
    plt.show()

#日K线数据
BaseDir_Day = "Stock_Data_Day"
getData(BaseDir_Day, "2020-09-30", "2020-11-02", "D")
# 30分钟数据
BaseDir_30 = "Stock_Data_30"
getData(BaseDir_30,"2020-10-01","2020-10-02","30")

filename = ("./Stock_Data_Day/300442.txt")
# filename = os.path.join("./Stock_Data_Day")
# print(getDateList(filename))
Date_list = getDateList(filename)

Date_list_prev = Date_list[:-2]
getPrevDayClose(filename,Date_list_prev)


Date_list_curt = Date_list
getCurtDayClose(filename,Date_list_curt)

Date_list_next = Date_list
getNextDayClose(filename,Date_list_next)

filename_30 = "./Stock_Data_30/300442.txt"
Date_list = Date_list[:-1]
getCurtSegClose(filename_30,Date_list,0)

Base_AnaResult_Dir = "./Stock_Data"
prepAllSegAllStockData(Base_AnaResult_Dir )

ShowData(Base_AnaResult_Dir)

用尺子量海 发表于 2020-11-16 14:06:19

import os
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import shutil



def ShowData(Base_AnaResult_Dir):
    # 指定画布尺寸
    plt.figure(figsize=(30, 40))
    # 绘制8个时段的图形
    for segindex in range(8):
      # 拼接一个时段的数据分析结果文件的文件名
      filename = os.path.join(Base_AnaResult_Dir,str(segindex)+".txt")
      datas = pd.read_csv(filename)
      # 行过滤,判定当前时段是否涨停
      plt.subplot(2, 4, segindex + 1)
      # 绘制一个时段次日涨幅的分布直方图
      datas = datas.dropna()
      a = datas['next_day_updown']
      print(a)
      plt.hist(datas['next_day_updown'], bins=np.linspace(-0.1, 0.1, 21),facecolor="blue", edgecolor="black")

      # 设置坐标轴
      plt.xlim(-0.025, 0.025)
      plt.ylim(0, 20)
      plt.xticks(np.linspace(-0.025, 0.025, 10))
      plt.yticks(np.linspace(0, 20, 11))
      plt.grid()
    plt.show()


Base_AnaResult_Dir = "./Stock_Data"
ShowData(Base_AnaResult_Dir)
页: [1]
查看完整版本: tushare作业求助