胸怀万里世界, 放眼无限未来。这篇文章主要讲述DolphinDB 函数化编程案例教程相关的知识,希望能为你提供帮助。
DolphinDB支持函数化编程:函数对象可以作为高阶函数的参数。这提高了代码表达能力,可以简化代码,复杂的任务可以通过一行或几行代码完成。
本教程介绍了一些常见场景下的函数化编程案例,重点介绍 DolphinDB 的高阶函数及其使用场景。
内容主要包括:
- 数据导入
- Lambda表达式
- 高阶函数使用案例
- 部分应用案例
- 金融场景相关案例
- 机器学习相关案例
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);
这里通过(3)导入数据extractTextSchema
获取表结构。用户也可以自定义表结构。
可以通过自定义函数 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"推荐阅读
- 开发环境Ubuntu 安装 Visual Studio Code 开发环境 ( 下载 Visual Studio Code 安装器 | Ubuntu 安装 deb 包 )
- 用户组管理及用户权限
- Samba的使用教程
- 开发环境Ubuntu 中使用 VSCode 开发 C/C++ ⑤ ( tasks.json 中的 args 数组配置分析 | 编译并执行 C++ 程序 )
- 如何计算磁盘IOPS
- Linux 内核 内存管理RCU 机制 ⑤ ( RCU 层次架构概念 | RCU 层次架构源码解析 | RCU 层次架构每层最多叶子数 | RCU 层次架构每个叶子 CPU 数量 )
- C语言-004
- Go语言 unsafe.Pointer 浅析
- docker-compose 安装 jenkins 指定版本