DolphinDB 函数化编程案例教程

胸怀万里世界, 放眼无限未来。这篇文章主要讲述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"))

【DolphinDB 函数化编程案例教程】请注意:在自定义函数体内对数据进行处理时,请尽量使用本地的修改(以!结尾的函数)来提升性能。
调用  ??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 datetimeopenhighlowclose volumeturnoverunixTime
------ -------- ----- ---------- ---------- ------------------- ----- ----- ----- ------- ---------- -------------
000001 SZSE12018.01.02 2018.01.02 09:31:00.00013.35 13.39 13.35 13.38 2003635 2.678558E7 1514856660000
000001 SZSE12018.01.02 2018.01.02 09:32:00.00013.37 13.38 13.33 13.33 8671811.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"

    推荐阅读