| 2431 | } |
| 2432 | |
| 2433 | double columnQuantile(double p, const std::string_view& variable, const std::weak_ptr<Parsing::Payload> payload) { |
| 2434 | const auto pd = std::dynamic_pointer_cast<PayloadColumn>(payload.lock()); |
| 2435 | if (!pd) { |
| 2436 | assert(pd); // Debug build |
| 2437 | return NAN; |
| 2438 | } |
| 2439 | |
| 2440 | if (p < 0) |
| 2441 | return NAN; |
| 2442 | |
| 2443 | const Column* column = nullptr; |
| 2444 | for (const auto& formulaData : pd->formulaData) { |
| 2445 | if (formulaData.variableName().compare(QLatin1String(variable)) == 0) { |
| 2446 | column = formulaData.column(); |
| 2447 | break; |
| 2448 | } |
| 2449 | } |
| 2450 | if (!column) |
| 2451 | return NAN; |
| 2452 | |
| 2453 | double value = 0.0; |
| 2454 | switch (column->columnMode()) { // all types |
| 2455 | case AbstractColumn::ColumnMode::Double: { |
| 2456 | auto data = reinterpret_cast<QVector<double>*>(column->data()); |
| 2457 | value = nsl_stats_quantile(data->data(), 1, column->statistics().size, p, nsl_stats_quantile_type7); |
| 2458 | break; |
| 2459 | } |
| 2460 | case AbstractColumn::ColumnMode::Integer: { |
| 2461 | auto* intData = reinterpret_cast<QVector<int>*>(column->data()); |
| 2462 | |
| 2463 | QVector<double> data = QVector<double>(); // copy data to double |
| 2464 | data.reserve(column->rowCount()); |
| 2465 | for (auto v : *intData) |
| 2466 | data << static_cast<double>(v); |
| 2467 | value = nsl_stats_quantile(data.data(), 1, column->statistics().size, p, nsl_stats_quantile_type7); |
| 2468 | break; |
| 2469 | } |
| 2470 | case AbstractColumn::ColumnMode::BigInt: { |
| 2471 | auto* bigIntData = reinterpret_cast<QVector<qint64>*>(column->data()); |
| 2472 | |
| 2473 | QVector<double> data = QVector<double>(); // copy data to double |
| 2474 | data.reserve(column->rowCount()); |
| 2475 | for (auto v : *bigIntData) |
| 2476 | data << static_cast<double>(v); |
| 2477 | value = nsl_stats_quantile(data.data(), 1, column->statistics().size, p, nsl_stats_quantile_type7); |
| 2478 | break; |
| 2479 | } |
| 2480 | case AbstractColumn::ColumnMode::DateTime: // not supported yet |
| 2481 | case AbstractColumn::ColumnMode::Day: |
| 2482 | case AbstractColumn::ColumnMode::Month: |
| 2483 | case AbstractColumn::ColumnMode::Text: |
| 2484 | break; |
| 2485 | } |
| 2486 | return value; |
| 2487 | } |
| 2488 | |
| 2489 | double columnPercentile(double p, const std::string_view& variable, const std::weak_ptr<Parsing::Payload> payload) { |
| 2490 | return columnQuantile(p / 100., variable, payload); |
no test coverage detected