Deedle.Frame.AggregateRowsBy с использованием нескольких столбцов для оценки aggFunc
Вопрос: возможно ли иметь Deedle.Frame.AggregateRowsBy(groupBy, aggBy, aggFunc)
где aggFunc
возвращает значение на основе нескольких столбцов, а не только aggby
столбец?
Возможно ли это вообще или я должен подумать о добавлении средних шагов, чтобы мой aggFunc
всегда работает над одним столбцом?
Пример ниже: у меня есть Deedle.Frame df
это в упрощенном виде выглядит так, как показано ниже.
Round Group Goals
1 1 10
1 2 12
1 3 9
2 1 11
2 2 12
2 3 12
3 2 10
3 3 12
Я хочу определить, для каждого отдельного Round
значение, которое Group
значение является "победителем" (т.е. тот, чей Goals
значение выше).
В приведенном выше примере я ожидаю следующую итоговую оценку:
Group Points
1 0
2 1.5
3 1.5
(За Round == 2
есть ничья между Group == 2
а также Group == 3
отсюда и 0,5 в балле. Другими словами, для каждого Group1
есть 1 балл, который делится поровну между всеми Group
кто забил больше всего Goals
,
Если первая таблица была List<Tuple<int, int, int>> allGoals
Я мог бы использовать LinQ для оценки того, что я хочу сделать:
Dictionary<int, double> finalScorePerGroup = new Dictionary<int, double>();
// Pretend there is some code to add keys 1, 2, 3 to finalScorePerGroup
// Group the tuples by its Round value
IEnumerable<IGrouping<int, Tuple<int, int, int>> groupedByRound =
allGoals.GroupBy(x => x.Item1);
double pointsScored;
// Loop through each Grouping
foreach (IGrouping<int, Tuple<int, int, int>> group in groupedByRound) {
// For a given Round value, find which is the maximum number of Goals
double maxPts = group.Select(x => x.Item3).Max();
// Find out how many Group scored maximum number of Goals in this Round
double noWinners = group.Where(x => x.Item3.Equals(maxPts)).Count();
// Now loop through every Group, and if they scored maximum Goals, add
// to their final score
foreach(Tuple<int, int, int>> result in group) {
pointsScored = result.Item3.Equals(maxPts) ? maxPts/noWinners : 0;
finalScorePerGroup[result.Item2] += pointsScored;
}
}
Теперь, если я хочу оценить то же самое на кадре, я знаю, что мне нужно что-то вроде:
Frame<int, string> aggFrame = df.AggregateRowsBy<double, double>(
new[] { "Round" },
new[] { "Group" }, some aggregating function);
Я думаю, что в этом случае я бы хотел, чтобы моя функция агрегирования возвращала Группу или Группы, набравшие максимальное количество баллов в этом раунде, то есть после агрегации:
Round Group
1 2
2 {2,3}
3 3
Я довольно новичок в Deedle, не стесняйтесь указывать, если это имеет мало смысла или если мой подход неверен.
Буду признателен за любую оказанную помощь.