Verfasst am: 29.12.2019, 20:08
Titel: Beobachtungen aufgrund des Monats löschen
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);
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.
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
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.