Дидл: группировка временных рядов в топ-3 и остальные

У меня есть серия Deedle с данными о выборах, такими как:

   "Party A", 304
   "Party B", 25 
   "Party C", 570
   ....
   "Party Y", 2
   "Party Z", 258

Я хотел бы создать новую серию следующим образом:

   "Party C", 570
   "Party A", 304 
   "Party Z", 258
   "Others", 145

Итак, я хочу взять первые 3, как они есть, и суммировать все остальные как новую строку. Как лучше всего это сделать?


person forki23    schedule 17.12.2014    source источник


Ответы (1)


Я не думаю, что у нас есть что-то в Deedle, что сделало бы это остротой (как разочаровывает...). Таким образом, лучшее, что я мог придумать, — это получить ключи для трех верхних сторон, а затем использовать Series.groupInto с селектором ключей, который возвращает либо имя стороны (для первых 3), либо возвращает «Другое» (для других сторон):

// Sample data set with a bunch of parties
let election =
 [ "Party A", 304
   "Party B", 25 
   "Party C", 570
   "Party Y", 2
   "Party Z", 258 ]
 |> series

// Sort the data by -1 times the value (descending)
let byVotes = election |> Series.sortBy (~-)
// Create a set with top 3 keys (for efficient lookup)
let top3 = byVotes |> Series.take 3 |> Series.keys |> set

// Group the series using key selector that tries to find the party in top3
// and using an aggregation function that sums the values (for one or multiple values)
byVotes |> Series.groupInto 
    (fun k v -> if top3.Contains(k) then k else "Other")
    (fun k s -> s |> Series.mapValues float |> Stats.sum)
person Tomas Petricek    schedule 18.12.2014
comment
Как вы думаете, стоит ли добавить более простой метод в Deedle? Я думаю, что это довольно распространенная проблема, и, по крайней мере, мне это очень нужно. - person forki23; 18.12.2014