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

Daten "Matchen"

 

Thurki
Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 28.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.12.2013, 14:15     Titel: Daten "Matchen"
  Antworten mit Zitat      
Hallo Leute,

ich bin ein ziemlicher Anfänger was Matlab angeht und benötige daher eure Hilfe bei einem vermutlich relativ leichten Problem.

Ich habe eine Datei mit sehr viele Daten und möchte diese paarweise "matchen" , das heißt in meiner "fertigen" Matrix sollen nur die Werte der Spalten 1 und 2 (und folgende) auftauchen wo auch beide wirklich einen Wert und kein NaN haben. Es gibt also immer eine Spalte mit einer daneben stehenden Referenzspalte, 1+2, 3+4, 5+6 usw.

Ich hab das ganze jetzt mit einer Schleife versucht, Problem ist das mir in der Endmatrix immer nur die beiden Werte der letzten beiden Spalten angezeigt werden. Die anderen Werte gehen unter.

Code:

n = size(mPrices,2);
i = 1;
while i < n
   i = i+2;
% richtige Daten aufrufen, immer ein Fonds mit der nebenstehenden Benchmark
mMatchedData = mPrices(1:end , i:i+1);
% Anzahl Spalten ermitteln
iCols = size(mMatchedData,2);
% Nicht NaN Eintrage feststellen
lIsNotNaNmat = ~isnan(mMatchedData);
% Zeilensummen bilden
vRowSum = sum(lIsNotNaNmat,2);
% Vektor der zu selektierenden Zeilen
lSelect = vRowSum == iCols;
% Daten selektieren
mMatch1 = mMatchedData(lSelect,:);
%end
 


An alle Profis entschuldige ich mich schon mal, der Code ist bestimmt extrem unelegant =)

Vielen Dank für Hilfe, Anregungen und Ideen.
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.12.2013, 14:59     Titel: Re: Daten "Matchen"
  Antworten mit Zitat      
Hallo Thurki,

Ich verstehe Deine Beschreibung nicht.
Kannst Du ein konkretes Beispiel geben, das die gewünschte Prozedur erklärt?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Thurki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 28.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.12.2013, 00:08     Titel:
  Antworten mit Zitat      
Klar =)

Also ich habe die Renditedaten (als Zeitreihe) verschiedener Investmentfonds. In der daneben stehenden Spalte habe ich jeweils die Benchmark für den vorherigen Fonds. Ich möchte nun jeweils paarweise gucken dass sowohl beim Fonds als auch bei der Benchmark alle NaN Werte gelöscht werden. Also es sollen bei diesem paarweisen Vergleich alle Zeilen gelöscht werden bei dem einer der beiden NaN Werte hat.

Und das ganze dann halt nicht nur für einen Fonds + Benchmark sondern für alle Fonds jeweils in Bezug auf ihre nebenstehende Benchmark.

Kleines Beispiel:

    Fonds 1 | Benchmark 1 | Fonds 2 | Benchmark 2 | ...
    12.....................19...................43.............NaN
    11.....................21...................44..............21
    NaN...................20...................21..............13


Jetzt soll es in der Ergebnismatrix so aussehen:

    Fonds 1 | Benchmark 1 | Fonds 2 | Benchmark 2 | ...
    12................19...................(Daten gelöscht)
    11................21.................44...............21
    ....(Daten gelöscht)............21...............13


Ziel ist es halt alle NaN Werte auszusortieren und möglichst wenig Daten zu verlieren.

Ich hoffe damit konnte ich mein Problem anschaulich und halbwegs verständlich erklären =)

Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.12.2013, 00:26     Titel:
  Antworten mit Zitat      
Hallo Thurki,

Zeitreihe, Rendite, Benchmakr, Fonds: Das ist für das eigentliche Probleme vollkommen egal. Es könnten auch Temperaturen und Bananen sein.

Zitat:
    Fonds 1 | Benchmark 1 | Fonds 2 | Benchmark 2 | ...
    12.....................19...................43.............NaN
    11.....................21...................44..............21
    NaN...................20...................21..............13

Das Beispiel sagt mir gar nichts. Die Punkte dienen wohl der Optik.

Bitte poste, was Du in Matlab vorliegen hast. Das wird wohl eine Matrix sein. Die Bedeutung der Zahlen spielt gar keine Rolle.
Aber es kommt darauf an, ob dies ein File ist, ob Du es bereits importieren kannst oder ob es bereits ein Array ist. Bitte zeige uns also den bisherigen Code. Was bedeutet "Daten gelöscht"? Was soll statt dessen dort erscheinen?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Thurki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 28.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.12.2013, 13:37     Titel:
  Antworten mit Zitat      
Code:

clear all
close all
clc

% Allgemeines

[num, txt, raw] = xlsread( 'Fondsdaten.xls', 'A1:AMJ1217', 'basics' );
% einlesen der Datei aus Excel
mPrices = num(1:end , 2:end);
% Zuordnung der relevanten Daten in eine Matrix mPrices

n = size(mPrices,2);
i = 1;
while i < n
   i = i+2;
% richtige Daten aufrufen, immer ein Fonds mit der nebenstehenden Benchmark
mMatchedData = mPrices(1:end , i:i+1);
% Anzahl Spalten ermitteln
iCols = size(mMatchedData,2);
% Nicht NaN Eintrage feststellen
lIsNotNaNmat = ~isnan(mMatchedData);
% Zeilensummen bilden
vRowSum = sum(lIsNotNaNmat,2);
% Vektor der zu selektierenden Zeilen
lSelect = vRowSum == iCols;
% Daten selektieren
mMatch1 = mMatchedData(lSelect,:);
%end

 


Das ist der Code den ich bisher hab. Die "gelöschten Daten" sollen nicht mehr auftauchen, die Zeilen sollen gelöscht werden.

Tut mir leid aber ich weiß nicht wie ich das ganze noch anders beschreiben soll?! Ich hab ne Menge Daten und möchte die NaN Werte rausgelöscht haben, dabei gehören immer zwei Spalten zusammen und wenn in Spalte 1 in Zeile 15 ein NaN ist soll in der zugehörigen zweiten Spalte auch der Wert aus Zeile 15 gelöscht werden.

Bei meinem Beispiel dienen die Punkte der Optik.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

die Frage ist, was anstelle der gelöschten Daten stehen soll.
"Nichts" gibt es innerhalb einer numerischen Matrix nicht. Das, was einem "nichts" am nähesten kommt, ist NaN.
Wenn in einer numerischen Matrix etwas wirklich gelöscht (und nicht nur durch NaN ersetzt) werden soll, dann muss man komplette Zeilen oder Spalten entfernen.
Falls du, wenn in einer Spalte NaN steht, den Nachbareintrag auf NaN setzen willst, ginge das so für die ersten beiden Spalten z.B. so:
Code:
A(isnan(A(:,1)), 2) = NaN;
A(isnan(A(:,2)), 1) = NaN;


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 28.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.12.2013, 03:00     Titel:
  Antworten mit Zitat      
Hmm so richtig hab ich es wohl noch nicht geschafft richtig zu vermitteln was ich genau haben möchte ...

Also ich meine wenn beispielsweise in Zeile 47 ein NaN auftaucht dann soll Zeile 47 verschwinden, also direkt von 46 auf 48, und dass dann sowohl für Spalte 1 als auch für Spalte 2.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.12.2013, 11:19     Titel:
  Antworten mit Zitat      
Hallo,

und was soll dann mit dem Inhalt von Spalten 3 und 4 in Zeile 47 passieren?

Wenn diese erhalten bleiben sollen, dann ist es bei einer numerischen Matrix generell nicht möglich, dass Spalte 1 und 2 von Zeile 47 verschwinden.
Ausnahme: es ist sicher gestellt, dass in jeder Spalte die gleiche Anzahl von Elementen verschwinden sollen. Das wird aber wohl allgemein nicht der Fall sein.

Wenn in diesem Fall die gesamte Zeile gelöscht werden soll:
Code:
A(any(isnan(A),2),:) = [];


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 28.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2014, 17:08     Titel:
  Antworten mit Zitat      
Ah vielen Dank, jetzt hab ich das Problem erst richtig realisiert. Dann muss ich mir dafür noch was anderes überlegen.

Könnte ich dich noch bei einem anderen Problem um Hilfe bitten?

Also ich möchte von den Daten meiner Matrix jeweils für die Spalten 1,3,5 usw. einen Wert B ausrechnen. Der errechnet sich indem man die Kovarianz von Spalte 1 und Spalte 2 durch die Varianz von Spalte 2 teilt. In der Ergebnismatrix soll dann für jede 2te Spalte ein B-Wert ausgegeben werden.

Das ist mein bisheriger Code, leider bekomm ich so immer nur den B Wert für die letzte Spalte heraus.

Code:

% Beta Berechnung

i = 1;
for i = 1:7 %size(mReturns,2)
   
% Vektor für die Renditen des Assets
x = mReturns(1:end , i);
% Vektor für die Renditen des Market / Benchmark
y = mReturns(1:end , i+1);

%Berechnung der Kovarianz
Kovarianz = cov(x,y);
%Berechnung der Varianz der Benchmark
Varianz = var(y);

%Berechnung des Beta's
Beta = Kovarianz(2) / Varianz;
end
 


Vielen Dank im Vorraus.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.01.2014, 20:28     Titel:
  Antworten mit Zitat      
Hallo,

du musst für beta auch einen Index verwenden. Zudem rechnest du mit je zwei aufeinanderfolgenden Spalten statt nur 1 und 2, 3 und 4 etc.

Vorschlag:

Code:
i = 1;
for i = 1:size(mReturns,2)/2
   
% Vektor für die Renditen des Assets
x = mReturns(: , 2*i-1);
% Vektor für die Renditen des Market / Benchmark
y = mReturns(: , 2*i);

%Berechnung der Kovarianz
Kovarianz = cov(x,y);
%Berechnung der Varianz der Benchmark
Varianz = var(y);

%Berechnung des Beta's
Beta(i) = Kovarianz(2) / Varianz;
end
 


Grüße,
Harald

P.S.: für ein neues Thema bitte das nächste Mal einen neuen Thread aufmachen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Thurki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 10
Anmeldedatum: 28.12.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.01.2014, 23:47     Titel:
  Antworten mit Zitat      
Vielen Dank klappt super!
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.