| 3564 | // XXX: not stable for long array with very small `stddev / average` |
| 3565 | template <typename ArrayType> |
| 3566 | std::pair<double, double> WelfordVar(const ArrayType& array) { |
| 3567 | const auto values = array.raw_values(); |
| 3568 | BitmapReader reader(array.null_bitmap_data(), array.offset(), array.length()); |
| 3569 | double count = 0, mean = 0, m2 = 0; |
| 3570 | double mean_adjust = 0, m2_adjust = 0; |
| 3571 | for (int64_t i = 0; i < array.length(); ++i) { |
| 3572 | if (reader.IsSet()) { |
| 3573 | ++count; |
| 3574 | double delta = static_cast<double>(values[i]) - mean; |
| 3575 | KahanSum(mean, mean_adjust, delta / count); |
| 3576 | double delta2 = static_cast<double>(values[i]) - mean; |
| 3577 | KahanSum(m2, m2_adjust, delta * delta2); |
| 3578 | } |
| 3579 | reader.Next(); |
| 3580 | } |
| 3581 | return std::make_pair(m2 / count, m2 / (count - 1)); |
| 3582 | } |
| 3583 | |
| 3584 | // Test random chunked array |
| 3585 | template <typename ArrowType> |