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

CSV-Datensatz nach Intervallen aufspalten

 

Nemo2002
Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2013, 15:35     Titel: CSV-Datensatz nach Intervallen aufspalten
  Antworten mit Zitat      
Hey Jungs,

ich bin relativ neu bei MATLAB und hab halt noch einige Probleme....wollte deswegen mal gucken ob mir hier vll wer helfen kann.

Geht um folgendes:

Ich habe einen relativ großen Datensatz in .csv vorliegen, ich wollte daraus Matritzen mit kleineren Datensätze bilden (also clustering sozusagen) um besser damit arbeiten zu können.
Aber irgendwie zeigt er mir immer einen Fehler an...

Im Anhang ist ein Ausschnitt von meinem Datensatz, ich will den Datensatz anhand von 'latitude' aufspalten..aslo z.b. alles mit 37 davor soll ein Datensatz sein und so weiter. Das kann ich ja später auch auf 'longtitude' ausweiten um ne genaue Ortsangabe zu haben....

Meine Idee sieht so aus:

Code:

clc
clear all

fid = fopen('train.csv');
data = textscan(fid,'%s %s %s %s %s %s %s %s %s %s %s','delimiter',';');

A= [];
for a = 1:length(data(:,1))
    for aa = 37:37.99
        if data(a,2) == aa;
        A = [A;,data(a,:)];
        end
    end
end


B= [];
for b = 1:length(data(:,1))
    for bb = 38:38.99
        if data(b,2) == bb;
        B = [B;,data(b,:)];
        end
    end
end

 


Bekomme aber immer einen Fehler

Undefined function 'eq' for input arguments of type 'cell'.

Error in test1 (line 10)
if data(a,2) == aa;


kann mir wer helfen was ich falsch mache?
Bin da irgendwie am verzweifeln....

Vll noch als Info was ich genau machen will: Das Ziel ist es ein Programm zuschreiben, dass mir num_votes, num_comments und num_views vorhersagt...hab noch nen anderes Datenset wo diese Sachen eben fehlen und ich die vorhersagen muss...vll hat da auch einer ne Idee wie man das einfach machen könnte? Smile

bild.jpg
 Beschreibung:

Download
 Dateiname:  bild.jpg
 Dateigröße:  146 KB
 Heruntergeladen:  822 mal
Private Nachricht senden Benutzer-Profile anzeigen


Nemo2002
Themenstarter

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2013, 20:38     Titel:
  Antworten mit Zitat      
hier noch die Original-csv datei, ohne die in excel irgendwie verändert zu haben....da fällt mir sofort auf, dass der Delimiter ein , ist und kein ;....

bild1.jpg
 Beschreibung:

Download
 Dateiname:  bild1.jpg
 Dateigröße:  220.21 KB
 Heruntergeladen:  803 mal
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: 26.10.2013, 22:17     Titel: Re: CSV-Datensatz nach Intervallen aufspalten
  Antworten mit Zitat      
Hallo Nemo2002,

Daten-Files als Bilder zu posten ist sehr unpraktisch. Die Leser können sie so nicht benutzen.

Zunächst rate ich mal, wie so oft, "clear all" unbedingt wegzulassen. Wer immer das auch empfohlen haben mag, es ist eine wirklich schlechte Idee: Es löscht auch alle Breakpoints, und alles, was den Debugger behindert ist ein Feind des Programmierers.

"size(data, 1)" ist deutlich eleganter als "length(data(:,1))".

Was soll "for aa = 37:37.99" machen? Der Vektor "37:37.99" ist die Liste der Zahlen in ganzen Schritten von 37 bis 37.99, also die Zahl 37 selbst.

Ich vermute, Du meinst:
Code:
index = data(:, 2) > 37 && data(:, 2) <= 37.99;
A = data(index, :);

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

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2013, 22:42     Titel:
  Antworten mit Zitat      
danke für deine Antwort,

okay, das mit clear all wurd uns so in dem Seminar (wo ich eben auch mich grad mit MATLAB abmühe) so beigebracht, aber gut zu wissen.

Ich hab mit deiner Lösung mal etwas rumexperementier
Code:
fid = fopen('trorg.csv');
data = textscan(fid,'%f %f %f %f %f %f %f %f %f %f %f','delimiter',',');

%A = data(index, :);
%for a = 1:size(data, 1)
    %if index = data(:, 2) > 37 && data(:, 2) <= 37.99;
    %end
%end

index = data(:, 2) > 38 && data(:, 2) <= 38.99;
B = data(index, :);
 


Aber irgendwie bekomm ich immer den Fehler:

Undefined function 'gt' for input arguments of type 'cell'.

Error in lesen (line 12)
index = data(:, 2) > 38 && data(:, 2) <= 38.99;

mit etwas suchen hier im forum hab ich jetzt, dass das gt für greater steht aber das wirft irgendwie nurnoch mehr Fragen auf

trorg.rar
 Beschreibung:

Download
 Dateiname:  trorg.rar
 Dateigröße:  3.92 MB
 Heruntergeladen:  587 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.10.2013, 22:55     Titel:
  Antworten mit Zitat      
Hallo,

schau doch mal in den Workspace, da steht der Datentyp der Variable.
Bei data steht vermutlich, wie bei der Rückgabe von textscan üblich, Cell Array - und für solche sind eben Operatoren wie > nicht definiert. Sinnvoll wäre es, die Rückgabe von textscan in ein Double Array umzuwandeln, z.B. mit cell2mat.

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

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2013, 23:15     Titel:
  Antworten mit Zitat      
ja, data ist eine 1x11 cell

hab es mal jetzt so versucht:

Code:
fid = fopen('trorg.csv');
data = textscan(fid,'%f %f %f %f %f %f %f %f %f %f %f','delimiter',',');
data2= cell2mat(data)

%A = data(index, :);
%for a = 1:size(data, 1)
    %if index = data(:, 2) >= 37 && data(:, 2) <= 37.99;
    %end
%end

index = data2(:, 2) > 38 %&& data2(:, 2) <= 38.99;
B = data2(index, :);
 


Ich hab erstmal nur für > 38 gemacht, da mir sonst wegen dem && ein Fehler kommt, aber das klappt auch nicht...bekomme zwar eine Matrix für data2, aber sie ist vollkommen leer, genau wie B
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.10.2013, 23:26     Titel:
  Antworten mit Zitat      
Hallo,

das Problem liegt schon beim Einlesen und führt dazu, dass data2 leer ist. Das wird auch im Command Window so ausgegeben.

Schau doch also erst mal, dass die Datei überhaupt richtig eingelesen wird, bevor du dich an die Analyse machst.

Du hast da eine recht kompliziert aufgebaute Datei, in der es definitiv keinen Sinn macht, wie von dir angegeben 8 Doubles einzulesen. Welche Informationen brauchst du denn aus der Datei?

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

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2013, 23:39     Titel:
  Antworten mit Zitat      
Naja, das Ziel ist halt, num_votes, num_comments und num_views vorherzusagen (siehe 1. Beitrag mit dem foto der excel-datei).

Ich hatte vor den Datensatz aufzuteilen, da er ja ziemlich groß ist. Meine Idee war diese aufteilung anhand der Längen- und Breitengrade zu machen, bzw. erstmal mit einem davon und wenn es klappt gucken ob man es erweitern kann.
Auch brauch ich das 11. Feld (tag_type)..dies wollte ich mit MATLAB so umwandenln, das jedem Ereignis eine Zahl zugeordnet wird und diese dann in der Matrix abgespeichert wird, sodass man auch damit das clustering machen könnte.
Das Feld 'description' wollte ich die Anzahl der Zeichen zählen und diese in der Matrix speichern.
Auch brauch ich die Uhreiz, wobei das Format vll problematisch sein könnte....

Wichtig wären eigentlich nur die Spalten id, latitude, longitude, created_time, tag_type
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

die Datei ist sehr schwierig zu lesen, da Komma mal Trennzeichen ist und mal nicht. Die Anführungszeichen helfen zwar, werden aber teilweise leider auch innerhalb der Strings verwendet, was dann wieder alles andere als hilfreich ist. Ich würde generell versuchen, Daten in einem halbwegs vernünftigen Format zu bekommen.

Hier ein Versuch, diese Datei ordentlich einzulesen und die Inhalte zu extrahieren:

Code:
fid = fopen('trorg.csv');
s = textscan(fid, '%s', 'delimiter', '', 'headerlines', 1);
s = s{1}(2:10000);
fclose(fid);
s = cellfun(@(s) [s, ','], s, 'UniformOutput', false);
t = regexp(s, '"([^"]*)",', 'tokens');
clear s
t(cellfun(@numel, t) ~= 11) = []; % hier werden nicht konforme Zeilen (es sind in diesem Datensatz 2) ignoriert
t = vertcat(t{:});
t = cellfun(@(t) t, t);
id = str2double(t(:,1));
latitude = str2double(t(:,2));
longitude = str2double(t(:,3));
num_votes = str2double(t(:,6));
num_comments = str2double(t(:,7));
num_views = str2double(t(:,8));
created_time = datenum(t(:,10),'yyyy-mm-dd HH:MM:SS');
tag_type = nominal(t(:,11));
clear t


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

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2013, 10:44     Titel:
  Antworten mit Zitat      
super!

Vielen dank.....das ist schonmal klasse, ich hab die Werte jetzt endlich eingelesen...

Einzig bei der created_time hackt es noch....dort kommt immer sowas raus:

734869,137962963
734869,152638889
734869,583113426


weißt du vll woran das liegt, dass es nicht richtig angezeigt wird?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

ich habe die Datumsangaben in numerisches Format umgewandelt (Tage ab 1.1.0000). Damit kannst du am besten weiterarbeiten und z.B. Vergleiche durchführen.

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

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2013, 11:40     Titel:
  Antworten mit Zitat      
ah okay, das ist hilfreich zu wissen, so kann man dann auch anhand von Monaten clustern.

Und noch eine Sache:

Ich wollte jetzt anhand von lagitute die Intervalle bilden und kleinere Matrizen erstellen.

Dazu hab ich folgendes hinzugefügt:

Code:
data_mat = [id,latitude,longitude,num_comments,num_views,num_votes,created_time];
index = data_mat(:, 2) <= 38 && data_mat(:, 2) <= 37.99;
A = data_mat(index, :);


Dies klappt aber nur für das <=38, wegen dem && gibt er mir folgenden Fehler:
Operands to the || and && operators must be convertible to logical scalar values.

Und 2.:
Kann ich auch tag_types irgendwie in die Matrix einbinden? der Vektor ist ja nominal, kann man den in double umwandeln? Oder wärs möglich irgendwie den verschiedenen Ausdrücken in tag_types eine Zahl zuzuordnen? Es sind nur 43 verschiedene Ausdrücke....könnte man das irgendwie codieren?

Sorry wenn ich dich mit den vll einfachen Fragen nerv.


Schonmal vielen vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

zu 1.:
du hast in deinem "Intervall" zweimal <=. Bei Vektoren musst du & statt & nehmen.
Code:
index = data_mat(:, 2) <= 38 & data_mat(:, 2) > 37.99;


zu 2.:
Code:
tag_type = double(tag_type)


Eine Möglichkeit wäre auch, Dataset Arrays (oder ab R2013b: Tables) zur Verwaltung der Daten zu verwenden. Kannst du dir ja mal in der Doku anschauen.

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

Forum-Anfänger

Forum-Anfänger



Beiträge: 22
Anmeldedatum: 26.10.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.10.2013, 11:59     Titel:
  Antworten mit Zitat      
DANKE!

Das ist top, vielen Dank....jetzt geht es, auch mit dem einfachen begriff double scheinen die kategorien in ne zahl umgewandelt zu sein, das reicht mir.....
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: 27.10.2013, 12:39     Titel:
  Antworten mit Zitat      
Hallo Nemo2002,

"734869,137962963" sagt nicht genau aus, was das ist. Ist das ein String, Cell string oder eine Dezimal-Zahl bei der Du aus optischen Gründen ein Komma statt des Dezimal-Punktes verwendest. Wir können auch nicht erraten, wieso Du das "nicht richtig" findest. Was wäre denn richtig? Es könnte sich um einen serielles Date-Format handeln, siehe z.B. "help datenum". Es könnte aber auch das serielle Datumsformat von Excel sein, dann lohnt sich eine suche im Netz nach "Matlab serial date Excel".

Bitte schicke doch mal den Seminar-Leiter in dieses Forum für eine Diskussion über "clear all". Während irgendwelche Dozenten das immer wieder anpreisen, führe ich im Forum einen langwierigen und für die regelmäßigen Leser bestimmt schon lächerlichen Kampf dagegen, da so viele Probleme von den Fragenden selbst geklärt werden könnten, wenn sie nur den Debugger benutzen könnten.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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 - 2024 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.