Orca
在DolphinDB
上实现了Pandas API
。
《DolphinDB基础概念理解:Orca》
《DolphinDB使用案例21:orca入门及底层实现》
因为先有DolphinDB
与Pandas
,后有Orca
,Dol
的底层都已经写好了,导致Orca
在实现Pandas
时限于底层架构,会与Pandas
有些细节差异。
DolphinDB | Pandas | 备注 | |
---|---|---|---|
整数字面量 | 默认解析为32 位INT 类型 |
默认解析为64位 | DolphinDB 支持CHAR 、SHORT 、INT 、LONG 等不同字节数的整数类型 |
字符串类型 | - STRING 可以进行max ,min 等比较运算;- SYMBOL 不允许,类似pandas 中category 的功能 |
底层存储是np.object ;经过优化的 category 类型,使用整数作为底层存储,对于取值范围有限的数据,能减少内存占用。 |
pandas 允许将任何数据类型的数据转换为category 类型,而DolphinDB 只允许字符串类型。 |
日期和时间类型 | DATE ;MINUTE ;SECOND ;TIME ;NANOTIME ;… |
np.datetime64[ns] ,以freq 表示时间单位 |
|
同一列数据类型 | 同一列中元素的数据类型必须相同 | 允许一个Series 中的数据有不同数据类型 |
DolphinDB 中字符串类型的NULL 值实际上是一个空字符串,而pandas 中字符串类型的空值是np.NaN 。 |
Orca
提供以下通用函数:
函数 | 描述 |
---|---|
connect |
将会话连接到DolphinDB 服务器 |
merge |
连接两个DataFrame |
concat |
按照columns 对齐连接两个DataFrame |
date_range |
创建时间序列 |
to_datetime |
将字符串转换成时间类型 |
isna |
判断是否是空值 |
isnull |
判断是否是空值 |
notna |
判断是否不是空值 |
notnull |
判断是否不是空值 |
Orca
现在支持的Input/output
函数有:read_csv
和read_table
下表展示Orca
的read_csv
与Pandas
的read_csv
函数的差异:
# engine = 'dolphindb'前提下的参数可能
read_csv(path, sep=',', delimiter=None, names=None, index_col=None,engine='dolphindb', usecols=None, squeeze=False, prefix=None, dtype=None, partitioned=True, db_handle=None, table_name=None, partition_columns=None, *args, **kwargs):
Orca | Pandas | 备注 | |
---|---|---|---|
engine |
{’c ’,默认在python 客户端目录下寻找要导入的文件 ‘ python ’, 默认在python 客户端目录下寻找要导入的文件’dolphindb’默认在 DolphinDB 服务端目录下寻找要导入的文件} |
{’c ’,’python ’} |
当engine参数设置为‘python’或者‘c’时,Orca的read_csv 函数相当于调用了pandas的read_csv 函数进行导入。下面列出的差异均是在engine参数设置为‘dolphindb’的前提下的差异。 |
dtype |
还支持以字符串的方式指定DolphinDB 的提供的所有数据类型,包括所有时间类型和字符串类型 |
该参数接收一个字典,键是列名,值是Python原生类型(bool , int , float , str )或np 的dtype (np.bool , np.int8 , np.float32 , etc .) |
|
sep /delimiter |
不支持 | 支持对正则表达式的解析 | |
partitioned |
True :允许分区方式将数据导入(实际上是调用DolphinDB 的ploadText函数);False :强制以非分区的方式导入数据(实际上是调用DolphinDB 的loadText函数) |
bool 类型,具体见Orca分区表的特殊差异。 |
|
db_handle , table_name 以及partition_columns |
用于在导入数据的时通过指定DolphinDB 的数据库和表等相关信息,将数据导入到DolphinDB 的分区表 |
具体用法与示例请参见Orca分区表的特殊差异。(包括read_table 函数) |
Pandas | Orca | 备注 | |
---|---|---|---|
创建 | 允许在定义一个Series 时不设置name 参数,或者使用数字作为name |
相当于在DolphinDB server 端新建一个只含有一列的表,而表的列名则不允许为空值 且不能使用数字 。因此,在创建 Orca 的Series 而不指定名字时,系统会默认为该Series 自动生成一个名字,当然,用户不会感知到自动生成的名字,只是会看到Orca 抛出的WARNING 信息。 |
|
修改 | 向下取整 | 四舍五入取整 | 将一个精度更高的数据类型的值赋值给一个精度更低的Series |
追加数据 | 允许通过直接访问一个不存在的index去增加新的行 | 不允许 |
Pandas | Orca | 备注 | |
---|---|---|---|
空值的处理 | 任何数与空值比较,返回都是False,这其实是Python中NaN比较的规则 | 将空值视为该类型的最小值 | |
空字符串的处理 | 字符串会区分NaN值和空字符串 | 空字符串就是NaN | |
零的处理 | 非零数除以零得到同符号的无穷大;零除以零得到NaN | 任何数除以零得到NULL |
Pandas | Orca | 备注 | |
---|---|---|---|
Attributes and underlying data | 唯一没有支持的属性就是memory_usage |
||
Conversion | 由于Orca 的优势在于对批量数据读写与计算,因此目前在Conversion 方面的功能并不完善,现在仅支持Series.to_numpy 这一功能 |
||
Indexing, iteration | 见下表 |
关于Indexing
, iteration
,orca.DataFrame对象
和orca.Series对象
支持以下函数:
函数 | 描述 |
---|---|
head | 返回前n个值 |
tail | 返回最后n个值 |
loc | 通过index访问 |
iloc | 通过下标访问 |
where | 用NaN填充不符合过滤条件的值 |
mask | 用NaN填充符合过滤条件的值 |
orca.DataFrame对象
还具备以下函数:
函数 | 描述 |
---|---|
items | 遍历DataFrame |
iteritems | 遍历DataFrame |
lookup | 根据标签查询数据 |
get | 访问某一列 |
通过loc
访问Series
和DataFrame
Orca
暂不支持通过loc
去访问带有DatetimeIndex
的Series
和DataFrame
。
当DataFrame
的表中有重复的index
时,pandas
不支持以重复的index
值为slice
的下界,而Orca
则以第一个出现的重复值为slice
的下界输出结果。
通过loc
与iloc
修改Series
和DataFrame
中值的类型
pandas
可以通过loc
和iloc
更改DataFrame中一个列(Series)的类型。更改其中一个值的类型会导致整列类型变更,也可以直接通过调用astype
函数更改整列的类型。而Orca不允许修改列的类型。
通过loc
与iloc
修改Series
和DataFrame
中的值
Orca
不支持:当index
有重复的列,通过一个DataFrame
以index
对齐的原则去修改另一个DataFrame
的值
通过loc
向DataFrame
新增一行或者一列
pandas
支持直接通过loc
访问不存在的index
或者columns
来新增行或者列,而Orca
暂不支持。
loc
与iloc
暂不支持对MultiIndex
的访问
除了combine和combine_first函数之外,Orca支持pandas提供的所有二元函数。
以下函数可用于orca.DataFrame对象和orca.Series对象:
函数 | 描述 |
---|---|
apply | 应用多个函数 |
agg | 应用多个聚合函数 |
aggregate | 应用多个聚合函数 |
groupby | 分组运算 |
rolling | 滑动窗口 |
ewm | 指数加成滑动 |
以下函数可用于orca.DataFrame对象和orca.Series对象:
函数 | 描述 |
---|---|
abs | 绝对值 |
all | 判断是否为空 |
any | 判断是否为空 |
clip | 返回介于阈值之间的值 |
clip_lower | 返回大于下界的值 |
clip_upper | 返回小于上界的值 |
corr | 相关性 |
count | 非空元素的个数 |
cov | 协方差 |
cummax | 累计最大值 |
cummin | 累计最小值 |
cumprod | 累乘 |
cumsum | 累加 |
kurt | 倾斜度 |
kurtosis | 峰度 |
mad | 平均绝对利差 |
max | 最大值 |
mean | 平均值 |
median | 中位数 |
min | 最小值 |
mode | 众数 |
pct_change | 百分比变化率 |
prod | 返回乘积 |
product | 返回乘积 |
quantile | 分位数 |
rank | 排名 |
round | 规整 |
sem | 无偏标准差 |
skew | 无偏斜 |
std | 标准差 |
sum | 求和 |
var | 方差 |
nunique | 返回非重复值的个数 |
orca.Series对象还具备以下函数:
函数 | 描述 |
---|---|
between | 返回介于阈值之间的值 |
unique | 返回不重复的值 |
is_unique | 判断是否有重复的值 |
is_monotonic | 判断是否单调 |
is_monotonic_increasing | 判断是否单调递增 |
is_monotonic_decreasing | 判断是否单调递减 |
以下函数可用于orca.DataFrame对象和orca.Series对象:
函数 | 描述 |
---|---|
drop_duplicates | 删除重复的值 |
duplicated | 判断是否重复 |
first | 返回第一个值 |
head | 返回前n个值 |
idxmax | 返回index的最大值 |
idxmin | 返回index的最小值 |
last | 返回最后一个值 |
rename | 重命名 |
tail | 返回最后n个值 |
orca.DataFrame对象还具有以下函数:
函数 | 描述 |
---|---|
drop | 删除某列 |
reindex | 重置index |
reset_index | 重置index |
set_index | 设置index |
Orca
目前支持sort_values
函数,该函数仅支持ascending
参数。在排序中,Orca
将NaN
值视为最小值处理。
Orca支持pandas所支持的所有序列化相关函数,并提供一个to_pandas
函数,该函数将一个Orca对象转化为pandas的对象。
Orca目前支持的Index类型有Index,Int64Index,DatetimeIndex和MultiIndex,下面介绍Index对象所支持的属性和方法。
Orca的Index对象具有以下属性:
属性 | 描述 |
---|---|
values | 返回取值 |
is_monotonic | 判断是否单调 |
is_monotonic_increasing | 判断是否单调递增 |
is_monotonic_decreasing | 判断是否单调递减 |
is_unique | 判断是否有重复的值 |
hasnans | 判断是否有空值 |
dtype | 返回数据类型 |
shape | 返回形状 |
name | 返回名字 |
nbytes | 返回字节数 |
ndim | 返回维度 |
size | 返回大小 |
T | 返回转置 |
Orca的Index对象支持以下函数:
函数 | 描述 |
---|---|
max | 最大值 |
min | 最小值 |
Orca的groupby
函数目前仅支持by参数,且只能对DataFrame进行groupby。
以下函数可用于orca.DataFrameGroupBy对象:
函数 | 描述 |
---|---|
all | 判断是否为空 |
any | 判断是否为空 |
bfill | 向后填充 |
count | 非空元素的个数 |
cumcount | 累计非空元素的个数 |
cummax | 累计最大值 |
cummin | 累计最小值 |
cumprod | 累乘 |
cumsum | 累加 |
ffill | 向前填充 |
first | 返回第一个元素 |
last | 返回最后一个元素 |
mad | 平均绝对利差 |
max | 最大值 |
mean | 平均值 |
median | 中位数 |
min | 最小值 |
ohlc | 忽略空值求和 |
pct_change | 百分比变化率 |
resample | 重采样 |
size | 元素个数 |
sem | 无偏标准差 |
skew | 无偏斜 |
std | 标准差 |
sum | 求和 |
var | 方差 |
Orca支持resample
函数,该函数目前支持的参数如下:
参数 | 说明 |
---|---|
rule | DateOffset,可以是字符串或者是dateoffset对象 |
on | 时间列,采用该列进行重采样 |
level | 字符串或整数,对于MultiIndex,采用level指定的列进行重采样 |
Orca支持的DateOffset如下:
Date Offset | Frequency String |
---|---|
BDay or BusinessDay | ‘B’ |
WeekOfMonth | ‘WOM’ |
LastWeekOfMonth | ‘LWOM’ |
MonthEnd | ‘M’ |
MonthBegin | ‘MS’ |
BMonthEnd or BusinessMonthEnd | ‘BM’ |
BMonthBegin or BusinessMonthBegin | ‘BMS’ |
SemiMonthEnd | ‘SM’ |
SemiMonthBegin | ‘SMS’ |
QuarterEnd | ‘Q’ |
QuarterBegin | ‘QS’ |
BQuarterEnd | ‘BQ’ |
BQuarterBegin | ‘BQS’ |
FY5253Quarter | ‘REQ’ |
YearEnd | ‘A’ |
YearBegin | ‘AS’ or ‘BYS’ |
BYearEnd | ‘BA’ |
BYearBegin | ‘BAS’ |
FY5253 | ‘RE’ |
Day | ‘D’ |
Hour | ‘H’ |
Minute | ‘T’ or ‘min’ |
Second | ‘S’ |
Milli | ‘L’ or ‘ms’ |
Micro | ‘U’ or ‘us’ |
Nano | ‘N’ |
pandas作为全内存计算的分析工具,无法解决当数据量过大时带来的内存不足,计算效率低下等问题。DolphinDB是一个分布式时序数据库,并且内置了丰富的计算和分析功能。它可以将TB级的海量数据存储在多台物理机器上,充分利用CPU,对海量数据进行高性能分析计算。
Orca作为基于DolphinDB开发的分布式pandas接口,其最大的优势就是在语法和pandas保持一致的前提下很好地解决了pandas的瓶颈:大数据场景下的性能问题。而这一问题的解决,则依赖于DolphinDB分区表。在Orca中,我们也引入Orca分区表的概念。
read_csv
函数read_table
函数在DolphinDB中,分区表与内存表存在着一些差异,在Orca中,分区表的操作也存在这诸多限制。
all
,any
和median
函数