Datenauswertung mittels Python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Larusso hat geschrieben:-In euren Vorschlägen arbeitet ihr mit with .. as zum öffnen, welchen Grund hat das genau?
Dass man das Schließen der Datei nicht mehr vergessen kann (so wie du es ganz am Ende tust) und dass Dateien auch im Fehlerfall immer ordentlich geschlossen werden.
Larusso hat geschrieben:- Ist datei.close() bei csv-reader überhaupt erforderlich?
Ja, viele Systeme haben ein maximum für geöffnete Dateien.

Du solltest auch noch ein wenig über die Namen nachdenken. "datei" sagt nichts aus, nur dass es eine Datei ist. Du solltest den Namen danach wählen, was in der Datei drin streckt. Auch ist "Ausgabe" kein schöner Name. Zum einen sollten Variablen in Python mit einem Kleinbuchstaben anfangen (ein Großbuchstabe deutet auf einen Typ hin), zum anderen wird gar nichts ausgegeben. Die Frage ist auch hier wieder: was steckt da drin? Selber Fall mit "rohdaten". Da Strecken keine Rohdaten drin.

Auch solltest du dich für eine Sprache entscheiden. Entweder alle Namen in Deutsch oder alle Namen in Englisch. Dein jetziger Mix ist ein wenig gruselig.
Das Leben ist wie ein Tennisball.
Larusso
User
Beiträge: 14
Registriert: Dienstag 25. Februar 2014, 10:44

Danke für eure Antworten. Sobald ich mich an die weitere Verarbeitung mache, werde ich mich sicherlich wieder zu Wort melden

Code: Alles auswählen

# -*- coding: utf-8 -*-

import csv

eingelesenedaten = open("complete.csv", "rb")

gueltigedaten = []

rohdaten = csv.reader(eingeleseneDaten, delimiter = ";")

for zeile in rohdaten:
    if zeile[5] != "nan":
        gueltigedaten.append(zeile)

datei.close()

gefiltertedaten = open("_gefiltert.csv","wb")
writer = csv.writer(gefiltertedaten)
writer.writerows(gueltigedaten)
gefiltertedaten.close()
BlackJack

@Larusso: `eingelesenedaten` und `gefilterdaten` sind immer noch unpassende Namen, denn der jeweilige Wert sind keine Daten sondern Dateien. Und `eingelesenedaten` klingt so als wenn da, nun ja, eingelesene Daten dahinter stecken, was ja mal gar nicht stimmt.

Die Daten tatsächlich komplett in den Speicher zu lesen ist auch überflüssig.

Edit: Ausprobiert hast Du das offensichtlich nicht, denn in Zeile 9 gibt es einen `NameError`. Und wenn man den Schreibfehler ausbessert gibt es den nächsten in Zeile 15.

Code: Alles auswählen

#!/usr/bin/env python
import csv
 

def main():
    with open('complete.csv', 'rb') as in_file:
        reader = csv.reader(in_file, delimiter=';')
        with open('_gefiltert.csv', 'wb') as out_file:
            writer = csv.writer(out_file)
            writer.writerows(row for row in reader if row[5] != 'nan')


if __name__ == '__main__':
    main()
Larusso
User
Beiträge: 14
Registriert: Dienstag 25. Februar 2014, 10:44

Hi BlackJack,

ja ich gebs zu, ich habe es nur auf Sicht geändert ;). Asche auf mein Haupt

Code: Alles auswählen

import csv

eingelesenedatei = open("complete.csv", "rb")

gueltigedaten = []

rohdaten = csv.reader(eingelesenedatei, delimiter = ";")

for zeile in rohdaten:
    if zeile[5] != "nan":
        gueltigedaten.append(zeile)

eingelesenedatei.close()

gefiltertedatei = open("gefiltert.csv","wb")

writer = csv.writer(gefiltertedatei)
writer.writerows(gueltigedaten)

gefiltertedatei.close()
Weiter gehts für mich.

MfG
Zuletzt geändert von Larusso am Dienstag 4. März 2014, 12:03, insgesamt 1-mal geändert.
Larusso
User
Beiträge: 14
Registriert: Dienstag 25. Februar 2014, 10:44

Jetzt habe ich die Prüfung mit isnan() eingebaut und die Headerzeile wird mittels eines Counters übergangen. Ok so? Oder unelegant?

Code: Alles auswählen

import csv
import math as m
eingelesenedatei = open("complete.csv", "rb")

gueltigedaten = []

rohdaten = csv.reader(eingelesenedatei, delimiter = ";")
counter = -1
for zeile in rohdaten:
    counter = counter+1
    if counter == 0:
        gueltigedaten.append(zeile)
    elif counter >0:
        value = float(zeile[5])
        if not m.isnan(value) and value < 0.5:
            gueltigedaten.append(zeile)

eingelesenedatei.close()

gefiltertedatei = open("gefiltert.csv","wb")

writer = csv.writer(gefiltertedatei)
writer.writerows(gueltigedaten)

gefiltertedatei.close()
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@Larusso: wenn man in einer for-Schleife einen Counter braucht gibt es in Python die Funktion enumerate dafür.
In Deinem Fall hilft einfach ein next:

Code: Alles auswählen

import csv
import math

def main():
    with open("rda116_complete.csv", "rb") as eingelesenedatei:
        rohdaten = csv.reader(eingelesenedatei, delimiter = ";")
        gueltigedaten = [ next(rohdaten) ]
        for zeile in rohdaten:
            value = float(zeile[5])
            if not math.isnan(value) and value < 0.5:
                gueltigedaten.append(zeile)
    with open("_rda116_gefiltert.csv","wb") as gefiltertedatei:
        writer = csv.writer(gefiltertedatei)
        writer.writerows(gueltigedaten)

if __name__ == '__main__':
    main()
Larusso
User
Beiträge: 14
Registriert: Dienstag 25. Februar 2014, 10:44

Moin liebe Pythonexperten,

erstmal vielen Dank für eure bisherige Hilfe.

Ich möchte die im vorherigen Programm gefilterten Daten nun gerne weiterverarbeiten. Die csvdateien besteht nun aus einigen Tausend zeilen folgender Struktur:

27.09.2010, 05:12:00,13,3.9627,3.72807,0.434492,0.408765,36.1692,2.25385,6.65385,988.7

Statt wie am Anfang erwähnt jegliche Kombinationen darzustellen, möchte ich nun gerne eine statistische Auswertung in Form einer Klassierung der Daten nach den Spalteneinträgen 7 und 8 jeder Zeile durchführen.
Es handelt sich bei den Einträgen um Temperaturen.

Ich stelle mir den Programmablauf folgendermaßen vor:

1.Bestimme Minimal- und Maximaltemperatur der Spalte 7 bzw. 8, (Wie kann ich das Minimum und Maximum aller Einträge hier finden? Klassierung ggf. nach 2 Merkmalen gleichzeitig möglich?)

2. Klassenbreite vorgeben (z.B. 1K) und aus der Differenz des Maxi- und Minimums für jede Klasse eine Liste erzeugen, (Wie erzeuge ich eine variable Anzahl an Listen für die jew. sich ergebende Anzahl an statistischen Klassen, da mehrere Dateien und somit verschiedene Minima und Maxima?)

3. Mittels Schleife die jeweiligen Zeilen in die dafür vorgesehene Klassenliste schreiben,

4. Ausgabe der Klassen

Ich werde nun versuchen meine obige Vorgehensweise in Code zu fassen. Für Hilfestellungen und Anregungen wäre ich wieder sehr dankbar.

Viele Grüße

Larusso
BlackJack

@Larusso: Es gibt die Funktionen `min()` und `max()`, und `collections.defaultdict()` könnte nützlich sein.
Antworten