Эффективное объединение временных рядов в Mathematica - PullRequest
4 голосов
/ 17 июня 2011

то, что я пытаюсь выполнить, кажется достаточно обычным, чтобы найти эффективное решение.

Я использую , и у меня есть несколько различных типа {{date1, value1}, {date1, value1} ...} - сортировка, которую вы можете передать DateListPlot.

Однако проблема в том, что эти только частичноперекрытия (некоторые могут иметь данные за 95–2004 годы, некоторые за 1999–2011 годы и т. д.)

Теперь я хотел бы иметь возможность объединить их в один большой список с общей временной шкалой, котораяСоюз [] всех доступных дат.Тогда были бы массивы для значений, но с нулями, где нет данных.

Есть ли эффективный способ сделать это?У меня есть сотни таких временных рядов, и создание чего-то, что зацикливает все это, вероятно, не очень эффективно (и даже довольно утомительно)

любая помощь очень ценится!

Ответы [ 3 ]

2 голосов
/ 17 июня 2011

Если я правильно понимаю ваш вопрос, вы хотите

l1 = {{date1, value1}, {date1, value2}, {date2, value3}, {date4, value4}}
l2 = {{date3, value5}, {date4, value5}, {date5, value6}}

Стать

l1 = {{date1, value1}, {date1, value2}, 
     {date2, value3}, {date3, 0}, {date4, value4}, {date5,0}}
l2 = {{date1, 0}, {date2, 0}, {date3, value5}, {date4, value5}, {date5, value6}}

Если так, что-то вроде этого может работать:

If[MemberQ[l1[[All,1]],#],Cases[l1,{#,_}],{#,0}]& /@ Union[l1[[All,1]],l2[[All,2]] ]

В зависимости от того, как вы хотите, чтобы обрабатывались несколько точек данных в одну и ту же дату в данной серии, вам может потребоваться предшествовать функции Cases [] с Sequence @@ или First @, например,

If[MemberQ[l1[[All,1]],#],Sequence @@ Cases[l1,{#,_}],{#,0}]& /@   
  Union[l1[[All,1]],l2[[All,1]] ]

Сейчас я дома, поэтому этот был проверен на синтаксические ошибки: -)

2 голосов
/ 17 июня 2011

Например,

ClearAll[l1, l2];
l1 = {{date1, value1}, {date1, value2}, {date2, value3}, {date4, value4}}
l2 = {{date3, value5}, {date4, value5}, {date1, value6}}

, затем

DeleteDuplicates[Union[l1, l2], #1[[1]] \[Equal] #2[[1]] &]

дает {{date1, value1}, {date2, value3}, {date3, value5}, {date4, value4}}.Это означает, что если у вас есть две точки данных на одну и ту же дату, и они разные, одна будет потеряна.Неясно (для меня), если это то, что вам нужно или нет, поэтому, возможно, вы могли бы добавить больше деталей.

С другой стороны, это

Transpose[{DeleteDuplicates[Last@Last@Reap@Scan[Sow[#[[1]]] &, Union[l1, l2]]],
 Last@Reap[Scan[Sow[#[[2]], #[[1]]] &, Union[l1, l2]]]}]

устраняет дублирующиеся заголовки и собираетзначения под каждым заголовком, таким образом:

{{date1, {value1, value2, value6}}, 
 {date2, {value3}}, 
 {date3, {value5}}, 
 {date4, {value4, value5}}} 

(т.е. он собирает все значения для каждой даты).

Несколько примеров того, что вы хотите, было бы неплохо.

0 голосов
/ 28 июня 2011

Спасибо, ребята. Я закончил тем, что делал решение, которое я взял за объединение всех сроков. Сохраняя это, скажем, в Daterange, я затем использовал Mapthread следующим образом

daterange= Union[DatesOfFirstTimeseries,DatesOfSecondTimeseries];

NewVersionOfFirstTimeSeries = (daterange /. 
     MapThread[Rule, {DatesOfFirstTimeseries, ValuesOfFirstTimeseries}] /. 
    MapThread[
     Rule, {daterange, Table[Indeterminate, {Length[daterange]}]}]);

NewVersionOfSecondTimeSeries = (daterange /. 
     MapThread[Rule, {DatesOfSecondTimeseries, ValuesOfSecondTimeseries}] /. 
    MapThread[
     Rule, {daterange, Table[Indeterminate, {Length[daterange]}]}]);

tjis сделал то, что мне нужно, но это действительно вредит моему эстетическому взгляду на вещи.

...