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 为账号密码
    c.login()
    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分钟线")
    print(r.value())
    #执行完成 在本地路径下分别有序导出四个代码的行情数据表


    范例2:call模型获取天软数据(Batch(取数更快))

    #把stocks中各代码的行情数据按代码文件分别导出数据到本地,相关模型参考天软pyTSL接口
    import pandas as pd
    import pyTSL
    c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443) #user为天软账号,password 为账号密码
    c.login()
    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()
    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("执行完成!")
    #执行完成 在本地路径下分别有序导出四个代码的行情数据表


    范例2:exec模型获取天软数据

    #把stocks中各代码的行情数据按代码文件分别导出数据到本地,相关模型参考天软pyTSL接口
    import pandas as pd
    import pyTSL
    c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443) #user为天软账号,password 为账号密码
    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分钟线")
    print(r.value())
    #执行完成 在本地路径下分别有序导出四个代码的行情数据表


    TSLpy交互分批导出数据:直接调用天软代码即可
    范例4: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)
    #通过天软代码获取行情
    r=ts.RemoteExecute(test, {"Cycle" : "5秒线"})
    print(r[1].decode("gbk"))
    #执行完成 在本地路径下分别导出四个代码的行情数据表

    范例5: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"]
    #通过天软函数获取行情
    r=ts.RemoteCallFunc("download_testdata",[stocks,path], {"Cycle" : "5秒线"})
    print(r[1].decode("gbk"))
    #执行完成 在本地路径下分别导出四个代码的行情数据表