/ / Deedle: zoskupenie časových radov v top 3 a zvyšok - f #, časové rady, deedle

Deedle: zoskupenie časových radov v hornej časti 3 a odpočinku - f #, časová séria, deedle

Mám seriál Deedle s údajmi o voľbách:

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

Chcem vytvoriť novú sériu takto:

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

Takže chcem vziať top 3, ako sú a súčet všetkých ostatných ako nový riadok. Aký je najlepší spôsob, ako to urobiť?

odpovede:

5 pre odpoveď č. 1

Nemyslím si, že v Deedle máme niečo, čo by z toho urobilo jedno-liner (ako sklamanie ...) Takže najlepšie, čo som si myslel, je získať kľúče pre top 3 strany a potom použiť Series.groupInto s voličom kľúčov, ktorý vráti buď názov strany (pre hornú 3) alebo vráti "Iné" (pre ostatné strany):

// 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)