序列操纵器
以下序列操作器 C 函数接受各种输入序列参数,并生成如表中所述的结果序列:
filter_first_pos
mco_seq_filter_first_pos()
返回布尔序列 cond
中前 n 个为真的元素的位置的整数序列结果。
MCO_RET mco_seq_filter_first_pos(
mco_seq_iterator_h result,
mco_seq_iterator_h cond,
mco_size_t n
);
reverse
mco_seq_reverse_TYPE()
反转输入序列中的元素。
MCO_RET mco_seq_reverse_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h input
);
concat
mco_seq_concat()
将任意类型的两个序列连接起来,即将right
序列附加到left
序列之后。result
序列的类型将与left
和right
序列的类型相同。
MCO_RET mco_seq_concat(
mco_seq_iterator_h result,
mco_seq_iterator_h left,
mco_seq_iterator_h right
);
cat
mco_seq_cat()
将任意类型的两个序列连接起来,将right
序列附加到left
序列之后。result
序列的类型为字符型。
MCO_RET mco_seq_cat(
mco_seq_iterator_h result,
mco_seq_iterator_h left,
mco_seq_iterator_h right
);
limit
mco_seq_limit_TYPE()
将input
序列中从from
到till
位置的子序列复制到结果序列中。
MCO_RET mco_seq_limit_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h input,
mco_seq_no_t from,
mco_seq_no_t till
);
get
mco_seq_get_TYPE()
从input
序列中提取数据到缓冲区 buf
中,缓冲区的长度由参数 size
指定。若成功,返回值为 MCO_S_OK
,参数 size
包含实际放置在缓冲区中的元素数量。
MCO_RET mco_seq_get_TYPE(
mco_seq_iterator_h input,
TYPE* buf,
mco_size_t* size
);
get_nullable
mco_seq_get_nullable_TYPE()
从输入序列中提取数据(包括空值)到长度由参数 size
指定的缓冲区 buf
中。若成功,返回值为 MCO_S_OK
,参数 size
包含实际放置在缓冲区中的元素数量。参数 nulls
是一个位图,指示序列中的空值。
MCO_RET mco_seq_get_TYPE(
mco_seq_iterator_h input,
TYPE* buf,
mco_size_t* size,
mco_bitmap_word_t const * nulls
);
unget
mco_seq_unget_TYPE()
遍历先前使用 mco_seq_get_TYPE()
创建的缓冲区 buf
中的元素,以返回相同类型的result
。参数 buf_size
是缓冲区的长度。
MCO_RET mco_seq_unget_TYPE(
mco_seq_iterator_h result,
TYPE const* buf,
mco_size_t buf_size
);
unget_nullable
mco_seq_unget_nullable_TYPE()
遍历先前使用 mco_seq_get_TYPE()
创建的缓冲区 buf
中的元素(包括空值),以返回相同类型的序列结果。参数 buf_size
是缓冲区的长度。参数 nulls
是一个位图,用于指示序列中的空值。
MCO_RET mco_seq_unget_TYPE(
mco_seq_iterator_h result,
TYPE const* buf,
mco_size_t buf_size
mco_bitmap_word_t const * nulls
);
uniq
mco_seq_uniq_TYPE()
将有序序列中重复的元素“合并”后,仅将唯一的元素复制到结果序列中。
MCO_RET mco_seq_uniq_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h input
);
skip_nan
mco_seq_skip_nan_TYPE()
mco_seq_skip_nan_TYPE()
API 将输入序列复制到结果中,跳过 NaN(非数字)元素。
请注意,NaN 是一种特殊类型的浮点数或双精度数,因此输入序列必须是这些类型之一。该函数对整数或字符类型无用。
MCO_RET mco_seq_skip_nan_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h input
);
在 Microsoft Windows 环境中,NULL
值表示为 0.0/0.0
,而非nan
字符串。这是传递给 SQL 语句的值。 请注意,如果在 C/C++ 应用程序中将 0.0/0.0
作为参数传递,Visual Studio 2013 没有定义“nan
”或“nanf
”符号(从 Visual Studio 2015 开始,“nan
”和“nanf
”符号就存在了)。因此,可以在应用程序代码中使用以下解决方法:
#ifdef _WIN32
#if _MSC_VER < 1900 /* Visual Studio 2013 and earlier */
#include <float.h>
#define isnan _isnan
const unsigned long nan[2]={0xffffffff, 0x7fffffff};
#define nan(s) (*( double* )nan)
#define nanf(s) (*( float* )nan)
#endif
#endif
norm
mco_seq_norm_TYPE()
在结果中返回归一化的输入序列;即,将每个序列元素除以所有元素平方和的平方根。
MCO_RET mco_seq_norm_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h input
);
thin
mco_seq_thin_TYPE()
将输入序列复制到结果中,选择具有指定起始位置和步长的元素。
MCO_RET mco_seq_thin_TYPE(mco_seq_iterator_h result,
mco_seq_iterator_h input,
mco_size_t origin,
mco_size_t step);
diff
mco_seq_diff_TYPE()
返回输入中每对序列元素之间的差值。
MCO_RET mco_seq_diff_TYPE(mco_seq_iterator_h result,
mco_seq_iterator_h input);
trend
mco_seq_trend_TYPE()
通过比较输入序列中成对的元素来返回结果中的“趋势”:即成对不相等序列元素之间差值的符号。
例如,输入序列 {1,2,3,3,2,2,4,5,6,5,5
} 将会生成结果 {0,1,1,1,-1,-1,1,1,1,-1,-1}
。
MCO_RET mco_seq_trend_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h input
);
const
mco_seq_const_TYPE()
构建一个序列结果,其中元素具有恒定值 val
。
请注意,这里没有长度参数,因此结果序列实际上是无限的,可以对其调用 mco_seq_next()
。
MCO_RET mco_seq_const_TYPE(
mco_seq_iterator_h result,
TYPE val
);
parse
mco_seq_parse_TYPE()
从字符串字面值 str
构造序列结果,例如 "{1.0, -1.1, 0}"
。
MCO_RET mco_seq_parse_TYPE(
mco_seq_iterator_h result,
char const* str
);
join
mco_seq_join_TYPE()
使用元迭代器来合并多个序列。有关更详细的说明,请参阅 [seq_join](mco_seq_join_TYPE C) 函数页面。
MCO_RET mco_seq_join_TYPE(
mco_seq_iterator_h result,
mco_seq_meta_iterator_h meta_iterator
);
union
mco_seq_union_TYPE()
在结果中返回按指定顺序合并的两个有序序列的并集。请注意,结果将包含来自两个输入序列的不同元素。
MCO_RET mco_seq_union_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h left,
mco_seq_iterator_h right,
mco_seq_order_t order
);
tee
mco_seq_tee()
为同一个输入序列创建两个迭代器(即分叉序列迭代器)。输入序列可以是任何类型。
请注意,这些迭代器应一起遍历(即在同一个表达式中使用)。
MCO_RET mco_seq_tee(
mco_seq_iterator_h iterator1,
mco_seq_iterator_h iterator2,
mco_seq_iterator_h input
);
map
mco_seq_map_TYPE()
在结果中返回从输入序列中根据 positions
序列中指定的位置提取的元素。这些位置应按升序提供。
MCO_RET mco_seq_map_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h input,
mco_seq_iterator_h positions
);
repeat
mco_seq_repeat_TYPE()
在结果中返回输入序列中的每个元素重复 n_times
次。
MCO_RET mco_seq_repeat_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h input,
int n_times
);
stretch
mco_seq_stretch_TS_TYPE_VAL_TYPE()
在结果中返回由“values”序列中的元素拉伸至“ts1”序列长度的元素,方法是在“ts2”序列中对应的时刻大于“ts1”序列中的时刻时重复“values”序列中的元素;对于“ts2”序列中对应的时刻小于“ts1”序列中的时刻的情况,则使用填充值。
例如,假设 ts1 = {1,2,3,4,5}
,ts2 = {2,4}
,values = {1.1,2.2}
以及 filler = 1.0
。对于这些输入序列,结果将是 {1.1,2.2,2.2,1.0,1.0}
。
此函数可用于计算拆股调整后的价格,在这种情况下,需要还原拆股的时间序列,计算累积乘积并乘以价格。
MCO_RET mco_seq_stretch_TS_TYPE1_VAL_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h ts1,
mco_seq_iterator_h ts2,
mco_seq_iterator_h values,
TYPE2 filler
);
stretch0
mco_seq_stretch0_TS_TYPE_VAL_TYPE()
在结果中返回值序列和填充序列的元素,通过在序列 ts2 中对应的时间戳与 ts1 中的时间戳匹配时插入值序列的元素来实现。对于序列 ts2 中的时间戳在 ts1 中没有匹配项的元素,则使用填充值。
例如,假设 ts1 = {1,2,3,5}
,ts2 = {2,3,4}
,values = {1.1,1.2,1.3}
以及 filler = 0.0
。对于这些输入序列,结果将是 {0.0,1.1,1.2,1.3,0.0}
。
MCO_RET mco_seq_stretch0_TS_TYPE1_VAL_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h ts1,
mco_seq_iterator_h ts2,
mco_seq_iterator_h values,
TYPE2 filler
);
asof_join
mco_seq_asof_join_TS_TYPE_VAL_TYPE()
返回与 ts1 的时间戳最接近的 ts2 的时间戳所对应的 values 序列中的元素。
例如,假设 ts1 = {4,9}
,ts2 = {1,3,6,10}
,values = {0.1,0.3,0.6,1.0}
。对于这些输入序列,结果将是 {0.3,1.0}
。
MCO_RET mco_seq_asof_join_TS_TYPE1_VAL_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h ts1,
mco_seq_iterator_h ts2,
mco_seq_iterator_h values
);
cross
mco_seq_cross_TYPE()
在结果中返回输入序列中穿过零的位置。如果整数参数 first_cross_direction
为正,则结果序列从第一个高于零的交叉点开始;如果为负,则从低于零的交叉点开始;如果 first_cross_direction
为零,则无关紧要,即第一个交叉点可以高于或低于零。
MCO_RET mco_seq_cross_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h input,
int first_cross_direction
);
extrema
mco_seq_extrema_TYPE()
在结果中返回输入序列中极值(局部最小值和最大值)的位置。如果整数参数 first_extremum
为正,则结果序列以第一个局部最大值开始;如果为负,则以局部最小值开始;如果 first_extremum
为零,则顺序无关紧要。
MCO_RET mco_seq_extrema_TYPE(
mco_seq_iterator_h result,
mco_seq_iterator_h input,
int first_extremum);
示例
以下是演示序列操纵器函数的示例代码片段:
{
mco_trans_h trans;
mco_cursor_t quote_cursor;
Quote quote;
mco_seq_iterator_t high_iterator, low_iterator, result_iterator;
MCO_RET rc;
...
for (rc = mco_cursor_first(trans, "e_cursor);
rc != MCO_S_CURSOR_END;
rc = mco_cursor_next(trans, "e_cursor))
{
Quote_from_cursor(trans, "e_cursor, "e);
Quote_high_iterator("e, &high_iterator);
Quote_low_iterator("e, &low_iterator);
...
rc = mco_seq_cross_float(&result_iterator, &low_iterator, &high_iterator);
...
}
...
}