FAQ > 金融建模 > 第三方交互 > Python

Q:python如何把天软数据分批导入到本地    

  • 说明:
     在获取行情大数据时有时会发现电脑卡顿甚至死机的情况,需要合理分批导出数据到本地。下载说明请参考:FAQ:Q:如何合理下载大量高频行情数据?
     有时在与python交互时也需要实现这样的需求,请参考以下使用范例。注:导入数据与导出同理,可参考代码仿写。
    FAQ:天软pyTSL接口
    FAQ:2019-05-08-应用专题-第三方交互07:天软平台和PYTHON的交互
    FAQ:Q:python中如何将数组类型的参数传入天软函数中执行?

    pytsl交互分批导出数据:可通过register_proc与Batch模型实现
    范例1:call模型获取天软数据(register_proc)
    #把stocks中各代码的行情数据按代码文件分别导出数据到本地,相关模型参考天软pyTSL接口
    import pandas as pd
    import pyTSL
    c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443) #user为天软账号,password 为账号密码
    if c.login() == 0:
      print(c.last_error())
    else:
      def rdo(df,name):
        #本地路径+文件名(这里用代码)
        path="C:/Users/86152/Desktop/"+name+".xlsx"
        df= pd.DataFrame(df)
        df.to_excel(path)
        return 1
      pyTSL.register_proc("a",rdo)
      test = '''
          function get_value(stocks,begt,endt);
          begin
           for i in stocks do
           begin
             stock:=stocks[i];
             t:= select ['StockID'],datetimetostr(['date']) as 'date',['close']
               from Markettable datekey inttodate(begt) to inttodate(endt) of stock end;
             rdo2 a(t,stock);
           end
           return array("执行完成");
          end;
          '''
      stocks = ['SH600000','SH600004','SH600006','SH600007']
      #获取开始日至截止日分钟线行情
      r = c.call('get_value', stocks, 20210701,20210705 , code=test,cycle="1分钟线")
      if r.error():
        print(r.message())
      else:
        print(r.value())
      c.logout()#退出登录
    #执行完成 在本地路径下分别有序导出四个代码的行情数据表


    范例2:call模型获取天软数据(Batch(消耗多个并发资源并发运行,效率更高))
    #把stocks中各代码的行情数据按代码文件分别导出数据到本地,相关模型参考天软pyTSL接口
    import pandas as pd
    import pyTSL
    c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443) #user为天软账号,password 为账号密码
    if c.login() == 0:
      print(c.last_error())
    else:
      test = '''
          function get_value(stock,begt,endt);
          begin
            t:= select ['StockID'],datetimetostr(['date']) as 'date',['close']
              from Markettable datekey inttodate(begt) to inttodate(endt) of stock end;   
           return t;
          end;
          '''
      batch=pyTSL.Batch(4)#设置4个并发数,用户可根据账号并发资源合理控制
      stocks = ['SH600000','SH600004','SH600006','SH600007']
      #获取开始日至截止日分钟线行情
      for s in stocks:
          r = batch.call(c, "get_value", s, 20210701, 20210705, code=test, cycle="1分钟线", key=s)
      it = iter(batch)
      for r in it:
        path = "C:/Users/86152/Desktop/" + r.key() + ".xlsx"
        df = pd.DataFrame(r.value())
        df.to_excel(path)
      print("执行完成!")
    #执行完成 在本地路径下分别有序导出四个代码的行情数据表


    范例3:exec模型获取天软数据
    #把stocks中各代码的行情数据按代码文件分别导出数据到本地,相关模型参考天软pyTSL接口
    import pandas as pd
    import pyTSL
    c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443) #user为天软账号,password 为账号密码
    if c.login() == 0:
      print(c.last_error())
    else:
      def rdo(df,name):
        #本地路径+文件名(这里用代码)
        path="C:/Users/86152/Desktop/"+name+".xlsx"
        df= pd.DataFrame(df)
        df.to_excel(path)
        return 1
      pyTSL.register_proc("a",rdo)
      test = '''
         stocks:=array("SH600000","SH600004","SH600006","SH600007");
         for i in stocks do
         begin
           stock:=stocks[i];
           t:= select ['StockID'],datetimetostr(['date']) as 'date',['close']
             from Markettable datekey inttodate(20210701) to inttodate(20210720) of stock end;
           rdo2 a(t,stock);
         end
         return array("执行完成");
          '''
      #通过天软代码获取分钟线行情
      r=c.exec(test,cycle="1分钟线")
      if r.error():
        print(r.message())
      else:
        print(r.dataframe())
      c.logout()#退出登录
    #执行完成 在本地路径下分别有序导出四个代码的行情数据表

    范例4:pyTSL交互分批导出数据:按股票代码导出财报数据(资产负债表)
    import pandas as pd
    import pyTSL
    c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443) #user为天软账号,password 为账号密码
    c.login()
    if c.login() == 0:
      print(c.last_error())
    else:
      test = '''
      function get_data(stocks);
      begin
        path:="C:/Users/chent/Desktop/资产负债表/";//导出路径
        SetSysParam(pn_reportmode(),-1);//返回调整前后的所有数据
        rt:=array();
        for i,stock in stocks do
        begin
          if i % 500 = 0 then echo i$"_"$stock;
          t:= select * from infotable 44 of stock end;
          ret:=rdo2 ExportFile(ftXLS(),"",path+stock+".xlsx",t);
          if ret then
            v:="导出成功";
          else
            v:="导出失败";
          rt[i,"stock"]:=stock;
          rt[i,"取数结果"]:=v;
        end
        return rt;
      end;
      '''
      stocks = c.exec("return getbk('上证50');").value()

      #获取资产负责表数据
      r = c.call('get_data', stocks , code=test)
      if r.error():
        print(r.message())
      else:
        print(r.dataframe())
      c.logout()#退出登录
    #执行完成 在本地路径下分别有序导出指定代码列表所有的代码的资产负债表数据


    TSLpy交互分批导出数据:直接调用天软代码即可
    范例5:RemoteExecute执行天软语句
    # 把stocks中各代码的行情数据按代码文件分别导出数据到本地,相关模型参考天软python交互文档
    import TSLPy3 as ts
    import sys
    sys.path.append("C:\Program Files\Tinysoft\Analyse.NET")
    #导出路径
    path="C:/Users/86152/Desktop/"
    test = '''
       stocks:=array("SH600000","SH600004","SH600006","SH600007");
       for i in stocks do
       begin
         stock:=stocks[i];
         t:= select ['StockID'],datetimetostr(['date']) as 'date',['close']
           from Markettable datekey inttodate(20210701) to inttodate(20210720) of stock end;
         rdo2 exportfile(ftxls(),"","%s"+stock+".xlsx",t);
       end
       return "执行完成";
        '''%(path)
    #通过天软代码获取行情
    data=ts.RemoteExecute(test, {"Cycle" : "5秒线"})
    if not data[0]:
      print(data[1])
    else:
      print(data[0],data[2].decode("gbk"))

    范例6:RemoteCallFunc调用天软函数
    封装天软函数:
    Function download_testdata(stocks,path);
    Begin
    {
      stocks: 一维字符串数组 证券列表
      path: string 导出路径
    }

      for i in stocks do
      begin
       stock:=stocks[i];
       t:= select ['StockID'],datetimetostr(['date']) as 'date',['close']
        from Markettable datekey inttodate(20210701) to inttodate(20210720) of stock end;
       pathname:=path+stock+".xlsx";
       rdo2 exportfile(ftxls(),"",pathname,t);
      end
      return "执行完成";
    End;

    python代码:
    import TSLPy3 as ts
    import sys
    sys.path.append("C:\Program Files\Tinysoft\Analyse.NET")
    #导出路径
    path="C:/Users/86152/Desktop/"
    stocks=["SH600000","SH600004","SH600006","SH600007"]
    #通过天软函数获取行情
    data=ts.RemoteCallFunc("download_testdata",[stocks,path], {"Cycle" : "5秒线"})
    if not data[0]:
      print(data[1])
    else:
      print(data[0],data[2].decode("gbk"))
    #执行完成 在本地路径下分别导出四个代码的行情数据表

    范例7:TSLPy交互分批导出数据:按股票代码导出财报数据(资产负债表)
    import TSLPy3 as ts
    import sys
    sys.path.append("C:\Program Files\Tinysoft\Analyse.NET")
    #导出路径
    path="C:/Users/86152/Desktop/"
    test = '''
       stocks:=array("SH600000","SH600004","SH600006","SH600007");
       for i in stocks do
       begin
         stock:=stocks[i];
         t:= select * from infotable 44 of stock end;
         rdo2 exportfile(ftxls(),"","%s"+stock+".xlsx",t);
       end
       return "执行完成";
        '''%(path)
    #通过天软代码获取行情
    data=ts.RemoteExecute(test, {})
    if not data[0]:
      print(data[1])
    else:
      print(data[0],data[2].decode("gbk"))
    #执行完成 在本地路径下分别导出四个代码的资产负债表数据