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

Q:pyTSL如何使用并发取数后把结果导出到一个文件中?    

  • A:当并发任务执行结果返回的结果集格式是一样时,可以将所有结果导出到一个表中。
    实现方法参考如下:
    方法一将第一个包含列名的结果集导出后再导出其它不含列名的结果集
    方法二将所有结果集在python合并后导出包含列名的结果集,适用于数量较小的的情况。

    pyTSL开启并发任务:FAQ:Q:pyTSL接口中如何并发执行多个天软任务
    其它导出数据说明:FAQ:Q:python如何把天软数据分批导入到本地
    实现范例
    范例一:逐个结果导出到csv文件
    python代码:
    import pyTSL
    c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
    if c.login() :
      print("登陆成功")
    else:
      print("登陆失败:",c.login(),c.last_error())
    test = '''
     function get_value(stock);
     begin
      Setsysparam(pn_cycle(),cy_1m()); //设置高频数据的周期
      begt:=20240312t;
      endt:=20240312.1600t;
      return select *,datetimetostr(["date"]) as "date"
          from markettable datekey begt to endt of stock end;
     end;
     '''
    stocks = ['SH600000','SH600004','SH600006','SH600007']
    batch=pyTSL.Batch(4)#设置4个并发数,用户可根据账号并发资源合理控制
    for s in stocks:
     t=batch.call(c, "get_value", s, code=test,key=s)

    path="C:\\Users\\86152\\Desktop\\markettable.csv"
    it=iter(batch)
    first=next(it) #取第一个结果
    df=first.dataframe()
    df.to_csv(path,index=False,header=True,encoding="gbk")#导出结果带列名
    for data in it: #取剩下的结果
      df = data.dataframe()
      df.to_csv(path,mode="a",index=False,header=False,encoding="gbk")#导出结果新增再文件末尾不带列名

    执行结果:数据文件成功导出到本地


    范例二:合并取数结果导出到csv文件
    python代码
    import pandas as pd
    import pyTSL
    c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
    if c.login() :
      print("登陆成功")
    else:
      print("登陆失败:",c.login(),c.last_error())
    test = '''
     function get_value(stock);
     begin
      Setsysparam(pn_cycle(),cy_1m()); //设置高频数据的周期
      begt:=20240312t;
      endt:=20240312.1600t;
      return select *,datetimetostr(["date"]) as "date"
          from markettable datekey begt to endt of stock end;
     end;
     '''
    stocks = ['SH600000','SH600004','SH600006','SH600007']
    batch=pyTSL.Batch(4)#设置4个并发数,用户可根据账号并发资源合理控制
    for s in stocks:
     t=batch.call(c, "get_value", s, code=test,key=s)
    df=pd.DataFrame()
    for data in iter(batch):
      df=pd.concat([df,data.dataframe()],axis=0)#合并结果
    path="C:\\Users\\86152\\Desktop\\markettable.csv"
    df.to_csv(path,index=False,header=True,encoding="gbk")#导出结果带列名

    执行结果:数据已导出

    范例三:逐个结果导出到txt文件
    python代码
    import pyTSL
    c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
    if c.login() :
      print("登陆成功")
    else:
      print("登陆失败:",c.login(),c.last_error())

    test = '''
     function get_value(stock);
     begin
      Setsysparam(pn_cycle(),cy_1m()); //设置高频数据的周期
      begt:=20240312t;
      endt:=20240312.1600t;
      return select *,datetimetostr(["date"]) as "date"
          from markettable datekey begt to endt of stock end;
     end;
     '''
    stocks = ['SH600000','SH600004','SH600006','SH600007']
    batch=pyTSL.Batch(4)#设置4个并发数,用户可根据账号并发资源合理控制
    for s in stocks:
     t=batch.call(c, "get_value", s, code=test,key=s)

    path="C:\\Users\\86152\\Desktop\\test.txt"
    it=iter(batch)
    first=next(it).value()#取第一个结果

    with open(path,"w") as file:
      line=','.join([key for key in first[0].keys()])#第一个结果集写入列名到首行
      file.write(line + '\n')
      for row in first:
        line = ','.join([str(row[key]) for key in row.keys()])
        file.write(line + '\n')
      
      for data in it:
        for row in data.value():
          line = ','.join([str(row[key]) for key in row.keys()])
          file.write(line + '\n')
      file.close()

    执行结果:数据文件成功导出到本地


    范例四:合并结果导出到txt文件
    python代码
    import pyTSL
    c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
    if c.login() :
      print("登陆成功")
    else:
      print("登陆失败:",c.login(),c.last_error())
    test = '''
     function get_value(stock);
     begin
      Setsysparam(pn_cycle(),cy_1m()); //设置高频数据的周期
      begt:=20240312t;
      endt:=20240312.1600t;
      return select *,datetimetostr(["date"]) as "date"
          from markettable datekey begt to endt of stock end;
     end;
     '''
    stocks = ['SH600000','SH600004','SH600006','SH600007']
    batch=pyTSL.Batch(4)#设置4个并发数,用户可根据账号并发资源合理控制
    for s in stocks:
     t=batch.call(c, "get_value", s, code=test,key=s)

    path="C:\\Users\\86152\\Desktop\\test.txt"
    data=[]
    for t in iter(batch):
      data+=(t.value())#数据合并
    with open(path,"w") as file:
      line=','.join([key for key in data[0].keys()])#第一行写入列名
      file.write(line + '\n')
      for row in data:
        line = ','.join([str(row[key]) for key in row.keys()])
        file.write(line + '\n')
      file.close()

    执行结果:合并结果已导出