DolphinDB 函数化编程案例教程

Posted DolphinDB

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DolphinDB 函数化编程案例教程相关的知识,希望对你有一定的参考价值。

DolphinDB支持函数化编程:函数对象可以作为高阶函数的参数。这提高了代码表达能力,可以简化代码,复杂的任务可以通过一行或几行代码完成。

本教程介绍了一些常见场景下的函数化编程案例,重点介绍 DolphinDB 的高阶函数及其使用场景。

内容主要包括:

  1. 数据导入
  2. Lambda表达式
  3. 高阶函数使用案例
  4. 部分应用案例
  5. 金融场景相关案例
  6. 机器学习相关案例

1. 数据导入


1.1 整型时间转化为 TIME 格式并导入

CSV 数据文件中常用整数表示时间,如 “93100000” 表示 “9:31:00.000”。为了便于查询分析,建议将这类数据转换为时间类型,再存储到 DolphinDB 数据库中。

针对这种场景,可通过 ​​​​loadTextEx​​​​ 函数的 ​​transform​​ 参数将文本文件中待转化的时间列指定为相应的数据类型。

本例中会用到 CSV 文件 ​​candle_201801.csv​​,数据样本如下:

symbol,exchange,cycle,tradingDay,date,time,open,high,low,close,volume,turnover,unixTime
000001,SZSE,1,20180102,20180102,93100000,13.35,13.39,13.35,13.38,2003635,26785576.72,1514856660000
000001,SZSE,1,20180102,20180102,93200000,13.37,13.38,13.33,13.33,867181
......

(1)建库

用脚本创建如下分布式数据库(按天进行值分区):

login(`admin,`123456)
dataFilePath="/home/data/candle_201801.csv"
dbPath="dfs://DolphinDBdatabase"
db=database(dbPath,VALUE,2018.01.02..2018.01.30)

(2)建表

下面先通过 ​​extractTextSchema​​ 函数获取数据文件的表结构。csv 文件中的 time 字段被识别为整型。若要将其存为 TIME 类型,可以通过 update 语句更新表结构将其转换为 TIME 类型,然后用更新后的表结构来创建分布式表。该分布式表的分区列是 date 列。

schemaTB=extractTextSchema(dataFilePath)
update schemaTB set type="TIME" where name="time"
tb=table(1:0, schemaTB.name, schemaTB.type)
tb=db.createPartitionedTable(tb, `tb1, `date);

这里通过 extractTextSchema 获取表结构。用户也可以自定义表结构。

(3)导入数据

可以通过自定义函数 i2t 对时间列 time 进行预处理,将其转换为 TIME 类型,并返回处理后的数据表。

def i2t(mutable t)
return t.replaceColumn!(`time, t.time.format("000000000").temporalParse("HHmmssSSS"))

请注意:在自定义函数体内对数据进行处理时,请尽量使用本地的修改(以!结尾的函数)来提升性能。

调用 ​​loadTextEx​​ 函数导入 csv 文件的数据到分布式表,这里指定 ​​transform​​ 参数为 ​​i2t​​ 函数,导入时会自动应用 ​​i2t​​ 函数处理数据。

tmpTB=loadTextEx(dbHandle=db, tableName=`tb1, partitionColumns=`date, filename=dataFilePath, transform=i2t);

(4)查询数据

查看表内前 2 行数据,可以看到结果符合预期。

select top 2 * from loadTable(dbPath,`tb1);

symbol exchange cycle tradingDay date time open high low close volume turnover unixTime
------ -------- ----- ---------- ---------- -------------- ----- ----- ----- ----- ------- ---------- -------------
000001 SZSE 1 2018.01.02 2018.01.02 09:31:00.000 13.35 13.39 13.35 13.38 2003635 2.678558E7 1514856660000
000001 SZSE 1 2018.01.02 2018.01.02 09:32:00.000 13.37 13.38 13.33 13.33 867181 1.158757E7 1514856720000

完整代码如下:

login(`admin,`123456)
dataFilePath="/home/data/candle_201801.csv"
dbPath="dfs://DolphinDBdatabase"
db=database(dbPath,VALUE,2018.01.02..2018.01.30)
schemaTB=extractTextSchema(dataFilePath)
update schemaTB set type="TIME" where name="time"
tb=table(1:0,schemaTB.name,schemaTB.type)
tb=db.createPartitionedTable(tb,`tb1,`date);

def i2t(mutable t)
return t.replaceColumn!(`time,t.time.format("000000000").temporalParse("HHmmssSSS"))


tmpTB=loadTextEx(dbHandle=db,tableName=`tb1,partitionColumns=`date,filename=dataFilePath,transform=i2t);

关于文本导入的相关函数和案例,可以参考 ​DolphinDB数据导入教程​


1.2 有纳秒时间戳的文本导入

本例将以整数类型存储的纳秒级数据导入为NANOTIMESTAMP类型。本例使用文本文件 ​​nx.txt​​,数据样本如下:

SendingTimeInNano#securityID#origSendingTimeInNano#bidSize
1579510735948574000#27522#1575277200049000000#1
1579510735948606000#27522#1575277200049000000#2
...

每一行记录通过字符#来分隔列,SendingTimeInNano 和 origSendingTimeInNano 用于存储纳秒时间戳。

(1)建库建表

首先定义分布式数据库和表,脚本如下:

dbSendingTimeInNano = database(, VALUE, 2020.01.20..2020.02.22);
dbSecurityIDRange = database(, RANGE, 0..10001);
db = database("dfs://testdb", COMPO, [dbSendingTimeInNano, dbSecurityIDRange]);

nameCol = `SendingTimeInNano`securityID`origSendingTimeInNano`bidSize;
typeCol = [`NANOTIMESTAMP,`INT,`NANOTIMESTAMP,`INT];
schemaTb = table(1:0,nameCol,typeCol);

db = database("dfs://testdb"干货丨DolphinDB元编程教程

用 Kafka + DolphinDB 实时计算K线

为啥 dolphindb 脚本中的函数无法访问外部范围内的变量

基于 K8S 的 DolphinDB 部署教程

时序数据库DolphinDB历史数据回放教程

干货丨时序数据库DolphinDB横截面引擎教程