Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Bücher:

MATLAB 7 für Ingenieure: Grundlagen und Programmierbeispiel

Fachkräfte:
weitere Angebote

Partner:


Vermarktungspartner


Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Beobachtungen aufgrund des Monats löschen

 

Patrick1
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 29.12.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.12.2019, 21:08     Titel: Beobachtungen aufgrund des Monats löschen
  Antworten mit Zitat      
Hallo zusammen,

ich habe in diesem Forum schon einige gute Lösungsvorschläge gesehen, welche mir weiter geholfen haben. Leider konnte ich noch keine gute Lösung für mein aktuelles Problem finden.

Ich arbeite aktuell mit einer Tabelle, welche Börsendaten enthält (etwa 1.6 mio. Zeilen und 45 Spalten). Dabei ist jede Zeile eine Beobachtung welche in jeder Spalte Informationen enthält wie: Firma, Datum, Preis und so weiter. Da ich nicht alle Beobachtungen davon benötige, habe ich diverse Filter eingebaut. Nun hänge ich bei einem Filter für die Marktkapitalisierung. Dabei berechne ich für jede Firma die durchschnittliche Marktkapitalisierung pro Monat. Sollte ein gewisser Wert unterschritten werden, z.B. eine Million, dann sollen alle Beobachtungen für diesen Monat für diese Firma gelöscht werden. Der Hacken bei der Sache ist, dass die Beobachtungen nur gelöscht werden sollen, wenn im Monatsdurchschnitt der Wert nicht erreicht wird. Deshalb kann ich nicht mit einem Filter arbeiten, welcher direkt alle Beobachtungen löscht unter einem Wert.

Ich habe mir für den Filter eine Tabelle erstellt, welche den Wert 1 an nimmt, sollte für eine bestimmte Firma ein bestimmter Monat gelöscht werden. Diese Tabelle habe ich genommen um mir die beiden Tabellen "firmithDate" und "firmith" zu berechnen. Dabei steht in "firmithDate" der Monat (1. Spalte der Monatserste, 2. Spalte der Monatsletzte) welcher für diese spezielle Firma gelöscht werden soll. "firmith" zeigt dabei alle Beobachtungen, welche mein Datensatz zu dieser Beobachtung beinhaltet (1. Spalte das Symbol der Firma, welches als Identifier verwendet wird, 2. Spalte das tag genaue Datum der Beobachtung).

Nun habe ich zum löschen der Monate folgende Schleife gebaut (Vor allem bei der 2. Schleife mit k habe ich Probleme):

Code:


for i = 1:size(TickerPartlyDelete,2) % jedes i entspricht einer Firma
    % Hilfsvektor, welche alle Beobachtungen der i-ten Firma enthält.
    % Da es bereits feststeht, welche Monate gelöscht werden sollen, wird für diesen Vektor nur das Symbol (als Kontrolle) und das Datum genommen
firmith = OTC.Filtered_7((OTC.Filtered_7.Symbol == TickerPartlyDelete(1,i)),[{'Symbol' 'ClosingBestBidDate'}]);
    % Dieser Vektor zeigt an, in welchen Zeilen die Beobachtungen im Basisvektor stehen
firmithRows = find(OTC.Filtered_7.Symbol == TickerPartlyDelete(1,i));

% Hier wird der Vektor erstellt, welcher die Monate beinhaltet, die gelöscht werden sollen
firmithDate = Date.Monthly(logical(OTC.MarketCap(:,i)),:);


for k = 1:size(firmithDate,1) % jedes k entspricht einem Monat

    % Suche alle Beobachtungen, welche innerhalb des gewünschten Monats liegen
    firmithRowToDelete = (firmith.ClosingBestBidDate >= firmithDate(k,1) & firmith.ClosingBestBidDate <= firmithDate(k,2));

    % Nun wird geschaut, welche Beobachtungen gelöscht werden sollen und in welcher Zeile diese in der ursprünglichen Tabelle stehen
      RowsToDelete = firmithRows(firmithRowToDelete);

      % Beobachtungen löschen
      OTC.Filtered_7(RowsToDelete,:)=[];

end
 


Kurze Erklärung was die einzelnen Vektoren beinhalten:

    TickerPartlyDelete: 1 x 2300 categorical, enthält alle Identifier der Firmen, welche von der Schleife betroffen sind
    OTC.Filtered_7: 1.592.802 x 47 table, enthält alle Beobachtungen der Börsendaten. Dies ist die Tabelle, welche weiter verkleinert werden soll
    firmith: X x 2 table: Enthält für eine Firma alle Beobachtungen von OTC.Filtered_7
    firmithRows: X x 1 double: gibt an in welchen Zeilen die Beobachtungen von firmith in OTC.Filtered zu finden sind
    firmithDate: X x 2 datetime: gibt den Start und den Ende des Monats wieder, welcher bei der aktuellen Firma gelöscht werden soll
    firmithRowToDelete: X x 1 logical: gibt an, welche Beobachtungen von firmith gelöscht werden sollen
    RowsToDelete: X x 1: "übersetzt", basierend auf firmithRowToDelete, welche Zeilen in OTC.Filtered_7 gelöscht werden sollen
    OTC.MarketCap: 52 x 2300 double: enthält eine 1 wenn ein Monat gelöscht werden soll. Es gibt in meinen Daten 52 Monate und 2300 Firmen welche gefiltert werden sollen


Wie schon gesagt liegt mein Hauptproblem bei der 2. Schleife (k). Dazu habe ich euch zwei Tabellen angehängt, welche für eine zufällige Firma stehen. Problematisch an diesem Teil ist, dass der Code sehr langsam ist, ich denke aufgrund der UND-Abfrage des Datums, welche für jedes Datum alle Beobachtungen des firmith einzeln ab frägt. Habt ihr eine Idee wie man dies schneller machen kann? Ich habe davor auch schon mit einer If-Abfrage gearbeitet, welche jedoch auch sehr lange gebraucht hat.

Ein anderes Problem tritt auf wenn ich die gesamte Schleife durchlaufen lasse. Matlab zeigt mir nach einiger Berechnungszeit dann folgenden Fehler an: "Row index exceeds table dimensions.". Ich habe schon versucht i zu setzten und nur k in der Schleife laufen zu lassen, was jedes mal geklappt hat. Nur wenn i und k in der Schleife laufen passt es nicht.



Das ist mein erster Post in diesem Forum, ich hoffe ich habe mein Problem gut beschrieben und jemand hat eine Idee für mich wie ich weiter machen könnte.

Viele Grüße
Patrick

Matlab_Tabelle_firmithDate.mat
 Beschreibung:
14x2 datetime mit den zu löschenden Monaten

Download
 Dateiname:  Matlab_Tabelle_firmithDate.mat
 Dateigröße:  12.93 KB
 Heruntergeladen:  61 mal
Matlab_Tabelle_firmith.mat
 Beschreibung:
142x2 table mit den Beobachtungen

Download
 Dateiname:  Matlab_Tabelle_firmith.mat
 Dateigröße:  6 MB
 Heruntergeladen:  51 mal
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
.


goMatlab ist ein Teil des goForen-Labels
goForen.de goMATLAB.de goLaTeX.de


 Impressum  | Nutzungsbedingungen  | Datenschutz  | Werbung/Mediadaten | Studentenversion | FAQ | goMatlab RSS Button RSS


Copyright © 2007 - 2020 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
Partner: LabVIEWforum.de

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.