WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zeile in Matrix einfügen und interpolieren

 

Danyo83
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 21.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.08.2010, 02:12     Titel: Zeile in Matrix einfügen und interpolieren
  Antworten mit Zitat      
Hallo Zusammen,

ich habe ein Problem. Ich habe eine Finanzzeitreihe (minuten-kurse) aus einer csv datei hochgeladen. da ab und zu eine minute oder manchmal auch mehrere übersprungen wurde, will ich an die jeweilige stelle in der matrix eine zeile mit der fehlenden uhrzeit einfügen und die kurse linear interpolieren.
Ich habe es schon mit der for-schleife in kombination mit einer if-bedingung, dass die Uhrzeit kontinuierlich +1 minute ansteigen soll, aber immer kleiner als 23:59 (habe einfach den ':' weggelassen) sein soll. Ich bekomme nur leider nicht hin, dass die neugebildete matrix diese zeile drin hat und dann mit den alten werten weitermacht.
Habt ihr Vorschläge???

Vielen Dank für eure Hilfe
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.08.2010, 10:32     Titel:
  Antworten mit Zitat      
Hallo,

es kommt drauf an, in welcher Form die Zeitreihe dann vorliegt. Konkretes Beispiel?
Normalerweise sollte es mit interp1 gehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Danyo83
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 21.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2010, 10:06     Titel:
  Antworten mit Zitat      
Hallo Harald,

ich habe eine Zeitreihe mit 5Minuten-Kursen (Wecheselkurse z.B. EUR/GBP) auf 5 Jahre. Ich habe das Problem, dass manchmal einfach Zeilen fehlen. z.B.

Date Time Open High Low Close
29.07.10 00:05 0.83733 0.83745 0.83733 0.83745
29.07.10 00:10 0.83746 0.83749 0.83743 0.83744
29.07.10 00:20 0.83745 0.83746 0.83738 0.83743
29.07.10 00.25 0.83741 0.83748 0.83736 0.83748
.
.
.

dabei fehlen alle WErte für 00:15. um mit den Kursen richtig arbeiten zu können müssen sie alle in getrennte Vektoren, d.h. nach dem hochladen teile ich sie in 6 Vektoren (n:1). Das bekomm ich hin, nur ist zum einen das Problem, dass Matlab die Uhrzeit nur als String erkennt, was mir nichts nützt, weil ich nur durch die Uhrzeit die fehlenden Werte identifizieren kann. Dass das Datum ein String ist, stört mich nicht für die weitere Arbeit(denke ich). Um das Problem mit der Zeit zu lösen ändere ich bereits in der csv datei das format und mache eine dezimalzahl daraus um sie numerisch und somit lesbar für amtlab zu machen. so kann ich feststellen, da der abstand zwischen den zeiten äquidistant ist, wenn eine Zeile fehlt. (Ist das die beste variante??).

Mein Ziel ist es: z.B. eine Schleife mit einer if-Bedingung zu kombinieren, so dass wenn matlab erkennt, dass eine Zeile fehlt, eine neue eingefügt wird und die Werte dabei linear interpoliert zwischen dem vorherigen und nachfolgendem Kurs (Bsp: 00.10 und 00.20Uhr). Dabei verändert sich die Größe der Matrix bzw. der Vektoren. Was auch wichtig ist, falls einmal mehrere Zeilen hintereinander fehlen, erledigt das die Schleife dann auch, weil ja skuzessive eine neue gebildet wird? Eine weitere Besonderheit ist der Stundenwechsel. Egal welches Format die Uhrzeit hat, die reihe fängt spätestens beim neuen Tag wieder von vorne an. Dieser umbruch muss ebenfalls berücksichtigt werden, weil sonst permanent Fehler auftreten.

Mein bisheriger Ansatz für die Schleife + If-Bedingung sieht wie folgt aus:

for i=2:1:n;
if (Uhrzeit(i,1)==(Uhrzeit(i-1,1)+1)) || (Uhrzeit(i,1)==0)); % würde ~Uhrzeit(i,1)==0 die Ausnahmeregel sein?
A=Uhrzeit(i,1);
else
A(1:i-1,1)=Uhrzeit(1:i-1,1); A(i,1)= Uhrzeit(i-1,1)+1; A(i+1,1)=Uhrzeit(i,1);
end;
end;

Ich wollte dass Matlab den Vektor repliziert bis eine Fehlermeldung wegen fehlender Zeile auftritt. Dann eine Zeile einfügt und anschließend den vektor weiter repliziert. Funktinoiert logischewrweise nicht, nur mir fällt keine andere Lösung ein.

Ich hoffe wirklich du kannst mir helfen.

Vielen Dank im Voraus.

Viele Grüße

Daniel
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.08.2010, 18:38     Titel:
  Antworten mit Zitat      
Hallo,

hier mein Vorschlag:

Code:
fid = fopen('daten.txt');
D = textscan(fid, '%s %s %f %f %f %f', 'Headerlines', 1);
fid = fclose(fid);
zeit = datenum(D{1},'dd.mm.yyyy') + datenum(D{2}, 'HH:MM');
werte = [D{3:6}];
alle_zeiten = zeit(1):5/(24*60):zeit(end);
alle_werte = interp1(zeit, werte, alle_zeiten);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.