AI опыт

Deedle как альтернатива pandas под C#

Время прочтения: 4 мин.

Данные – это новое золото. Данные рассматриваются как чрезвычайно ценный ресурс, который может предоставить организациям действенную информацию, которая повысит их деловые возможности. Данные можно сравнить с нефтью: при «перегонке» через МО и ИИ можно получить ценный продукт. В последнее время языком, на котором ведется общение с данными, ведется обработка методами МО и ИИ, является Python (с редкими «вкраплениями» других языков). Причин для этого много, не будем пытаться выделить все, но, безусловно,  одной из основных причин является наличие удобного инструментария для работы с данными, например pandas. Pandas — программная библиотека на языке Python для обработки и анализа данных, которая предоставляет специальные структуры данных и операции для манипулирования числовыми таблицами и временными рядами. Имеется довольно большой набор возможностей по работе с многомерными структурированными наборами информации, в первую очередь предназначенных для очистки и первичной оценки данных по общим показателям (например, по среднему значению, квантилям и некоторым другим статистическим показателям).

Однако работа с данными — это не всегда Python. Под большую часть популярных языков существуют различные наборы библиотек, которые позволяют получать схожий, пусть и не всегда исчерпывающий функционал. Например, для C#  есть Accord.Net, который решает множество задач в рамках широкого понятия «Data Science». Однако, манипуляция с внешними данными не всегда выглядит так удобно и легко, как выглядела бы на Python с использованием pandas. На помощь в данной ситуации может прийти Deedle. Как сообщает нам сайт Deedle: «Deedle — это библиотека с открытым исходным кодом .NET для программирования фреймов данных. Deedle позволяет вам манипулировать данными способом, аналогичным R-фреймам данных и фреймам данных Pandas в Python».

Установка  Deedle достаточно проста и полностью аналогична установке любого другого внешнего пакета:

  1. Откройте диспетчер пакетов (Инструменты | Диспетчер пакетов NuGet | Консоль диспетчера пакетов)
  2. Установите Deedle с помощью следующей команды: PM> Install-Package Deedle

Попробуем, решить какую-нибудь несложную задачу с ее помощью. Предположим, у нас есть ежедневные данные по стоимости каких-либо акций. Пусть в этих данных будут: дата, стоимость на момент открытия, максимальная стоимость, минимальная стоимость, стоимость на момент закрытия и количество. Допустим, нам интересно было бы узнать разницу между открытием и закрытием и, например, вычислить ежедневный доход.
Для начала считываем данные и выводим их на экран

var root = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
var aaplData = Frame.ReadCsv(Path.Combine(root, "table_aapl.csv"));
Console.WriteLine("-- Raw Data --");
aaplData.Print();

Получаем:

Пока все просто, для того чтобы выполнить необходимые вычисления, было бы не лишним проиндексировать данные по дате. Это также происходит довольно просто

var aapl = aaplData.IndexRows("Date").SortRowsByKey();

После этого, наши данные выглядят так

Чтобы рассчитать процентное изменение от открытия к закрытию нужно сделать следующее (вычисляем значение и добавляем к нашим данным):

var openCloseChange = 
((
aapl.GetColumn("Close") - aapl.GetColumn("Open")
) / aapl.GetColumn("Open")) * 100.0;
aapl.AddColumn("openCloseChange", openCloseChange);

И снова, никаких сложностей. На выходе имеем

Наконец, после смещения цен закрытия на одну строку и вычисления дневной доходности таким образом:

var dailyReturn = aapl.Diff(1).GetColumn("Close") / aapl.GetColumn("Close") * 100.0;
aapl.AddColumn("dailyReturn", dailyReturn);

Получаем следующие данные

Выше приводится пример проекта Deedle. Можно заметить, что операции манипулирования, для которых потребовались бы определенные навыки и немалое количество строк кода на C#, можно выполнить всего в пару «движений», что отлично работает в случае если мы применяем Deedle в совокупности с Accord.Net, при разработке ML решений для C# и.Net.

Советуем почитать