Как функционально объединить несколько серий Deedle в C #?

1

Я думаю использовать deedle, чтобы соединить сотни серий в рамку. Каков наилучший функциональный способ достижения этого?

Непосредственная (императивная) мысль состоит в том, чтобы создать держатель объекта рамки вне цикла. то в цикле этот объект старше используется как левая сторона объединения серии.

на второй мысли, рекурсия хвоста C#? я сделал некоторые исследования, я немного потерял, как С# может выполнять хвостовую рекурсию. Существует только пример F # из книги Tomas "Функциональное программирование для реального мира",

Кроме того, у кого-нибудь была рамка deedle с сотнями колонок (1000 строк)? есть ли большое влияние на производительность? это может звучать чрезмерно, но это делается в таблицах довольно часто

Любое предложение приветствуется. Спасибо, casbby

Теги:
functional-programming
f#
tail-recursion
deedle

1 ответ

3
Лучший ответ

Правильный подход для создания фрейма зависит от того, откуда поступают ваши данные.

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

  • 0
    Еще раз спасибо большое Томас. После того, как я опубликовал вопрос, я начал разбираться в VS и, в конце концов, придумал что-то похожее на ваше предложение: Series <int, double> s1 = new SeriesBuilder <int, double> () {{1, 2.5}, {2 , 3.1}, {3, 4.5}} .Series; Series <int, double> s2 = new SeriesBuilder <int, double> () {{1, double.NaN}, {2, 3.1}, {3, double.NaN}} .Series; var s = new SeriesBuilder <string, Series <int, double> (); s.Add ("A", s1) .Add ("B", s1) .Add ("C", s1) .Add ("D", s2); var sObjt = s.Series; var dFrame = Frame.FromColumns <string, int, double> (sObjt);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню