2011-06-17 4 views
4

Ce que j'essaie d'accomplir semble assez ordinaire pour qu'il y ait une solution efficace.Fusionner des séries temporelles dans mathematica efficacement

J'utilise et j'ai un certain nombre de différents du type {{date1, value1}, {date1, value1} ...} - le type que vous pourriez transmettre à DateListPlot.

Cependant, le problème est que ces se chevauchent que partiellement (certains peuvent avoir des données 95-2004, certains 1999-2011 et ainsi de suite)

Maintenant ce que j'aimerais être en mesure de faire est de fusionner ceux-ci dans une grande liste avec un calendrier commun qui est l'Union [] de toutes les dates disponibles. Ensuite, il y aurait des tableaux pour les valeurs, mais avec des zéros là où il n'y a pas de données.

Existe-t-il un moyen efficace d'y parvenir? J'ai des centaines de ces timeseries et faire quelque chose qui boucle l'ensemble n'est probablement pas très efficace (et même assez fastidieux à faire)

toute aide est grandement appréciée!

+1

Pourriez-vous donner des exemples d'entrée et de sortie? – acl

+1

Étant donné que Mathematica n'a pas besoin de "pad" les ensembles de données pour les tracer sur le même graphique, avez-vous vraiment besoin de cela? Ou allez-vous l'exporter vers quelque chose comme Excel, où les équivalents de NaN sont nécessaires? – Verbeia

+0

@Verbeia mais cela dépend de ce que "cela" est nécessaire, n'est-ce pas? devrait-on créer les dates manquantes et les ajouter avec 0 comme données? créer certaines des dates manquantes? Certaines dates sont-elles fournies mais sans données et, si oui, sous quelle forme? ça aiderait à savoir! – acl

Répondre

2

Par exemple,

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

puis

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

cède {{date1, value1}, {date2, value3}, {date3, value5}, {date4, value4}}. Cela signifie que si vous avez deux points de données pour la même date et qu'ils sont différents, un sera perdu. Ce n'est pas clair (pour moi) si c'est ce dont vous avez besoin ou non, alors peut-être pourriez-vous ajouter plus de détails.

D'autre part, cette

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

élimine les en-têtes en double et recueille les valeurs dans chaque en-tête ainsi:

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

(c.-à-elle rassemble toutes les valeurs pour chaque date).

Quelques exemples de ce que vous voulez serait bien.

2

Si je comprends bien votre question, vous voulez

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

Pour devenir

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

Si oui, quelque chose comme cela pourrait fonctionner:

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

Selon la façon dont vous voulez plusieurs points de données à la même date dans une série donnée à traiter, vous devrez peut-être précéder la fonction Cases [] n avec Sequence @@ ou First @, par ex.

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

Je suis à la maison maintenant et celui-ci a été vérifié pour les erreurs de syntaxe :-)

+0

mais ici cela donne '{{{date1, value1}, {date1, value2}}, {{date2, value3}}, {{date4, value4} }, {valeur5, 0}, {valeur6, 0}} '. peut-être qu'il y a une erreur couper-coller quelque part – acl

+0

C'est parce que je suis un idiot. Doit avoir été Union [l1 [[All, 1]], l2 [[All, 1]]] pas Union [l1 [[All, 1]], l2 [[All, 2]]] - corrigé maintenant – Verbeia

+0

Merci les gars. Je me suis retrouvé à faire la solution que j'ai pris le syndicat de tous les délais. En sauvant cela en disons datevar j'ai ensuite utilisé Mapthread de la manière suivante – JohnKay

0

Merci les gars. Je me suis retrouvé à faire la solution que j'ai pris le syndicat de tous les délais.Enregistrement que nous allons dire daterange i alors utilisé Mapthread de la manière suivante

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 fait ce que j'ai besoin, mais il ne fait vraiment mal mon point de vue esthétique des choses.

+0

il peut être plus facile de comprendre ce que cela est censé faire si vous fournissez des exemples pour '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – acl

Questions connexes