Среднее значение набора чисел - это просто сумма чисел, деленная на общее количество значений в наборе.
Если ваша цепочка методов возвращает ha sh, где значения являются целыми числами, то это должно быть просто:
hash = Spree::Order
.group_by_day_of_week(:created_at, range: @start_date..@end_date, format: '%a')
.count
average = hash.values.sum.to_f / hash.count.to_f
Вы можете или не хотите преобразовывать целые числа в числа с плавающей точкой, но вы, вероятно, будете. Если в итоге вы получите число вроде:
average == 0.15728715728715728
Возможно, вы захотите округлить его до 2 десятичных знаков
avearge.round(2)
=>0.16
Не думаю, что вы действительно хотите это сделать .group_by_hour_of_day(:created_at, format: "%-l %P")
в той же цепочке, но, вероятно, отдельная цепочка вызовов для этого, но я не уверен.