Deedle.Frame.AggregateRowsBy с использованием нескольких столбцов для оценки aggFunc - PullRequest
0 голосов
/ 05 декабря 2018

Вопрос: возможно ли иметь 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, не стесняйтесь указывать, если это имеет мало смысла или если мой подход неверен.

Любая помощь очень ценится.

...