Я думаю использовать deedle, чтобы соединить сотни серий в рамку. Каков наилучший функциональный способ достижения этого?
Непосредственная (императивная) мысль состоит в том, чтобы создать держатель объекта рамки вне цикла. то в цикле этот объект старше используется как левая сторона объединения серии.
на второй мысли, рекурсия хвоста C#
? я сделал некоторые исследования, я немного потерял, как С# может выполнять хвостовую рекурсию. Существует только пример F #
из книги Tomas "Функциональное программирование для реального мира",
Кроме того, у кого-нибудь была рамка deedle с сотнями колонок (1000 строк)? есть ли большое влияние на производительность? это может звучать чрезмерно, но это делается в таблицах довольно часто
Любое предложение приветствуется. Спасибо, casbby
Правильный подход для создания фрейма зависит от того, откуда поступают ваши данные.
Если у вас уже есть все серии, и вы хотите создать фрейм, который содержит их в виде столбцов, то метод Frame.FromColumns
, вероятно, подходит. Метод берет набор пар значений ключа, где ключ - это имя столбца, а значение - столбец (серия).
Вот минимальный пример, который создает массив пар ключевых значений с именами и рядом:
var cols = new KeyValuePair<string, Series<int, object>>[]{
KeyValue.Create("IDs", (new object[] {1,2,2}).ToOrdinalSeries() ),
KeyValue.Create("Namess", (new object[] {"A", "B", "C"}).ToOrdinalSeries() )
};
var frame = Frame.FromColumns(cols);
Я предполагаю, что в вашем случае у вас уже есть серия в какой-то коллекции, поэтому функциональный подход заключается в использовании LINQ и Select
для проектирования ваших данных в нужном формате. Таким образом, ваш код может выглядеть примерно так:
var cols = someSource.Select(item =>
KeyValue.Create(item.Key, item.Series));
var frame = Frame.FromColumns(cols);
Операция FromColumns
использует внешнее соединение под обложкой, но оптимизирована (например, если у вас есть серия с одним и тем же индексом). В документации С# для Deedle есть ряд дополнительных примеров.