49 lines
1.5 KiB
C++
49 lines
1.5 KiB
C++
#include "aggregation.hpp"
|
|
#include <map>
|
|
#include <algorithm>
|
|
#include <limits>
|
|
|
|
std::vector<DayStats> aggregate_days(const std::vector<Record>& records) {
|
|
// Накопители для каждого дня
|
|
struct DayAccumulator {
|
|
double avg_sum = 0.0;
|
|
double open_min = std::numeric_limits<double>::max();
|
|
double open_max = std::numeric_limits<double>::lowest();
|
|
double close_min = std::numeric_limits<double>::max();
|
|
double close_max = std::numeric_limits<double>::lowest();
|
|
int64_t count = 0;
|
|
};
|
|
|
|
std::map<DayIndex, DayAccumulator> days;
|
|
|
|
for (const auto& r : records) {
|
|
DayIndex day = static_cast<DayIndex>(r.timestamp) / 86400;
|
|
auto& acc = days[day];
|
|
|
|
double avg = (r.low + r.high) / 2.0;
|
|
acc.avg_sum += avg;
|
|
acc.open_min = std::min(acc.open_min, r.open);
|
|
acc.open_max = std::max(acc.open_max, r.open);
|
|
acc.close_min = std::min(acc.close_min, r.close);
|
|
acc.close_max = std::max(acc.close_max, r.close);
|
|
acc.count++;
|
|
}
|
|
|
|
std::vector<DayStats> result;
|
|
result.reserve(days.size());
|
|
|
|
for (const auto& [day, acc] : days) {
|
|
DayStats stats;
|
|
stats.day = day;
|
|
stats.avg = acc.avg_sum / static_cast<double>(acc.count);
|
|
stats.open_min = acc.open_min;
|
|
stats.open_max = acc.open_max;
|
|
stats.close_min = acc.close_min;
|
|
stats.close_max = acc.close_max;
|
|
stats.count = acc.count;
|
|
result.push_back(stats);
|
|
}
|
|
|
|
return result;
|
|
}
|