Управление временными сериями в c # - PullRequest
2 голосов
/ 29 января 2012

Я хотел бы узнать ваше мнение о том, как лучше всего управлять временными рядами в c # с вашей точки зрения.Мне нужно иметь 2-мерную матрицу, подобную объекту Datetime, в качестве индекса строк (упорядоченных и без дубликатов), и каждый столбец будет представлять стоимость акций для соответствующего Datetime.Я хотел бы знать, сможет ли какой-либо из этих объектов обработать отсутствующие данные для даты: добавление столбца или временной серии добавит отсутствующую дату в индекс строки и добавит «ноль» или «н / д» дляпропущенные значения для существующих дат.

Многие вещи уже доступны в c # по сравнению с c ++, и я не хочу пропустить что-то очевидное.

Ответы [ 4 ]

4 голосов
/ 29 января 2012

Вы можете использовать сопоставление между датой и стоимостью акции, например Dictionary<DateTime, decimal>.Таким образом, даты могут быть редкими.

Если вам нужны цены нескольких акций на каждую дату, и не каждая акция появляется для каждой даты, тогда вы можете выбрать между Dictionary<DateTime, Dictionary<Stock, decimal>> иDictionary<Stock, Dictionary<DateTime, decimal>>, в зависимости от того, как вы хотите получить доступ к значениям впоследствии (или даже к обоим, если вы не против сохранить значения дважды).

3 голосов
/ 15 марта 2013

TeaFiles.Net - библиотека для хранения временных рядов в плоских файлах. Насколько я понимаю, вы хотите хранить данные только в памяти, в этом случае вы должны использовать MemoryStream и передавать их в ctor.

// the time series item type
struct Tick
{
    public DateTime Time;
    public double Price;
    public int Volume;
}

// create file and write some values
var ms = new MemoryStream();
using (var tf = TeaFile<Tick>.Create(ms))
{
    tf.Write(new Tick { Price = 5, Time = DateTime.Now, Volume = 700 });
    tf.Write(new Tick { Price = 15, Time = DateTime.Now.AddHours(1), Volume = 1700 });
    // ...
}

ms.Position = 0; // reset the stream

// read typed
using (var tf = TeaFile<Tick>.OpenRead(ms))
{
    Tick value = tf.Read();
    Console.WriteLine(value);
}

https://github.com/discretelogics/TeaFiles.Net

Вы можете установить библиотеку через менеджер пакетов NuGet "TeaFiles.Net"
Пример проекта vsix также доступен в галерее VS.

0 голосов
/ 29 января 2012

Как вы упомянули в своем комментарии к ответу Марка, я считаю, что SortedList является более подходящей структурой для хранения данных вашего временного ряда.

ОБНОВЛЕНИЕ

Как упомянул zmbq в своем комментарии к вопросу Марка, SortedList реализован в виде массива, поэтому, если требуется более быстрое время вставки / удаления, тогда SortedDictionary будет лучшим выбором.

См. Ответ Джона Скита на на этот вопрос для обзора различий в производительности.

0 голосов
/ 29 января 2012

Объект DateTime в C # является значением типа, что означает, что он инициализируется со значением по умолчанию, а именно: день = 1 месяц = ​​1 год = 1 час = 1 минута = 1 секунда = 1.(или это был час = 12, я не совсем уверен).

Если я вас правильно понял, вам нужна структура данных, которая содержит объекты DateTime, которые упорядочены каким-либо образом, а когда вы вставляете новый объект, смежный объект dateTimeобъекты будут меняться, чтобы сохранить ваш заказ.

В этом случае я бы сосредоточил внимание больше на структуре данных, чем на объекте dateTime.

Напишите простой класс, который, например, наследует от Lits <>, и включитефункциональность, которую вы хотите использовать для операции вставки или удаления.

Что-то вроде:

public class DateTimeList : List<DateTime> {

public void InsertDateTime (int position, DateTime dateTime) {

    // insert the new object
    this.InsertAt(position, dateTime)

    // then take the adjacent objects (take care of integrity checks i.e.
    // exists the index/object? in not null ? etc.        

    DateTime previous = this.ElementAt<DateTime>(position - 1);

    // modify the previous DateTime obejct according to your needs.

    DateTime next = this.ElementAt<DateTime>(position + 1);

    // modify the next DateTime obejct according to your needs.    

}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...