| Signature | Description | Parameters |
|---|---|---|
#include <DataFrame/DataFrameStatsVisitors.h> template<typename T, typename I = unsigned long, std::size_t A = 0> struct DiffVisitor; |
This is a "single action visitor", meaning it is passed the whole data vector in one call and you must use the single_act_visit() interface. This visitor calculates the distance between shifted data points in the given column.
explicit
DiffVisitor(long periods = 1,
bool skipnan = true,
bool non_zero = false,
bool abs_val = false)
period: Periods to shift the data
skipnan: If true, it ignores the NaN values
non_zero: If true and there is a zero diff, every diff will be adjusted by an epsilon
abs_val: If true, the diff will be between absolute values of data
|
T: Column data type. I: Index type. A: Memory alignment boundary for vectors. Default is system default alignment |
static void test_diff() { std::cout << "\nTesting Diff ..." << std::endl; const double my_nan = std::numeric_limits<double>::quiet_NaN(); const double epsilon = 0.0000001; StlVecType<unsigned long> idx = { 123450, 123451, 123452, 123453, 123454, 123455, 123456, 123457, 123458, 123459, 123460, 123461, 123462, 123466, 123467, 123468, 123469, 123470, 123471, 123472, 123473 }; StlVecType<double> d1 = { my_nan, 16, 15, 18, my_nan, 16, 21, 0.34, 1.56, 0.34, 2.3, my_nan, 19.0, 0.387, 0.123, 1.06, my_nan, 2.03, 0.4, 1.0, my_nan }; StlVecType<double> d2 = { 1.23, 1.22, 1.21, 1.20, 1.19, 1.185, 1.181, 1.19, 1.195, 1.189, 1.185, 1.18, 1.181, 1.186, 1.189, 1.19, 1.194, 1.198, 1.199, 1.197, 1.193 }; StlVecType<int> i1 = { 22, 23, 24, 25, 99 }; MyDataFrame df; df.load_data(std::move(idx), std::make_pair("col_1", d1), std::make_pair("col_2", d2), std::make_pair("col_3", i1)); DiffVisitor<double, unsigned long, 128> diff_visit(1, false); const auto &result = df.single_act_visit<double>("col_1", diff_visit).get_result(); assert(result.size() == 21); assert(std::isnan(result[0])); assert(std::isnan(result[1])); assert(result[2] == -1.0); assert(result[3] == 3); assert(std::isnan(result[4])); assert(std::isnan(result[17])); assert(result[18] == -1.63); assert(result[19] == 0.6); assert(std::isnan(result[20])); DiffVisitor<double, unsigned long, 128> diff_visit2(-1, false); const auto &result2 = df.single_act_visit<double>("col_1", diff_visit2).get_result(); assert(result2.size() == 21); assert(std::isnan(result2[0])); assert(result2[1] == 1.0); assert(result2[2] == -3); assert(std::isnan(result2[4])); assert(std::isnan(result2[16])); assert(result2[17] == 1.63); assert(result2[18] == -0.6); assert(std::isnan(result2[19])); assert(std::isnan(result2[20])); DiffVisitor<double, unsigned long, 128> diff_visit3(3, false); const auto &result3 = df.single_act_visit<double>("col_1", diff_visit3).get_result(); assert(result3.size() == 21); assert(std::isnan(result3[0])); assert(std::isnan(result3[1])); assert(std::isnan(result3[2])); assert(std::isnan(result3[4])); assert(result3[5] == 1.0); assert(result3[6] == 3.0); assert(std::isnan(result3[7])); assert(std::isnan(result3[16])); assert(fabs(result3[17] - 1.907) < epsilon); assert(result3[18] == -0.66); assert(std::isnan(result3[19])); assert(std::isnan(result3[20])); DiffVisitor<double, unsigned long, 128> diff_visit4(-3, false); const auto &result4 = df.single_act_visit<double>("col_1", diff_visit4).get_result(); assert(result4.size() == 21); assert(std::isnan(result4[0])); assert(std::isnan(result4[1])); assert(result4[2] == -1.0); assert(result4[3] == -3.0); assert(std::isnan(result4[4])); assert(std::isnan(result4[13])); assert(fabs(result4[14] - -1.907) < epsilon); assert(result4[15] == 0.66); assert(std::isnan(result4[16])); assert(std::isnan(result4[17])); assert(std::isnan(result4[18])); assert(std::isnan(result4[19])); assert(std::isnan(result4[20])); DiffVisitor<double, unsigned long, 128> diff_visit5(3, true); const auto &result5 = df.single_act_visit<double>("col_1", diff_visit5).get_result(); assert(result5.size() == 10); assert(result5[0] == 1.0); assert(result5[1] == 3.0); assert(result5[2] == -14.44); assert(result5[7] == -17.94); assert(fabs(result5[8] - 1.907) < epsilon); assert(result5[9] == -0.66); DiffVisitor<double, unsigned long, 128> diff_visit6(-3, true); const auto &result6 = df.single_act_visit<double>("col_1", diff_visit6).get_result(); assert(result6.size() == 10); assert(result6[0] == -1.0); assert(result6[1] == -3.0); assert(result6[2] == 14.44); assert(result6[7] == 17.94); assert(fabs(result6[8] - -1.907) < epsilon); assert(result6[9] == 0.66); }