NaN für stats.describe entfernen und rel. Pfade für "gft"

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.
Antworten
Wechselbalg
User
Beiträge: 7
Registriert: Sonntag 24. Februar 2013, 13:44

Mahlzeit zusammen,

Habe nach intensiver Suche (u.a. http://stackoverflow.com/questions/1157 ... ython-list) noch keinen Ansatz gefunden, wie ich aus folgendem Datensatz, "n.a."-Werte (also NaN-Werte) entfernen kann, um diese einer Schleife mit stats.describe zu übergeben:

Code: Alles auswählen

from numpy import genfromtxt
from scipy.stats import describe

columns=range(2,12)
Daten=genfromtxt("data1.csv", delimiter=";",skip_header=11, usecols=columns)

Casshape=Casey.shape[1]
for i in range (Casshape):
    print describe(Casey[:,i])
Die Funktionen filter (in Verbindung mit lambda, s. Adresse oben) und remove habe ich schon angewendet, leider ohne Erfolg.

Des Weiteren: Wie könnte ich mit genfromtxt relative Pfade angeben?

Hat vll. jemand von euch eine Idee?

Gruß und Dank im voraus
Zuletzt geändert von Anonymous am Sonntag 24. Februar 2013, 14:23, insgesamt 1-mal geändert.
Grund: Code-Formatierung korrigiert
lunar

@Wechselbalg Wie kann man den Knopf für Fettdruck finden, aber den direkt darunter befindlichen Knopf für Python-Quelltext übersehen?! ;) Bitte formatiere Deine Beiträge in Zukunft mit diesem Knopf, da so die in Python-Programmen wichtige Einrückung erhalten bleibt, und der Quelltext zudem noch optisch ansprechend hervorgehoben wird. Danke!
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Wechselbalg,

Du hast eine Matrix mit nan-Werten? Wie soll man daraus einzelne Elemente rauslöschen können?
Entweder Du entfernst ganze Zeilen oder ganze Spalten oder Du willst an sich nur jede Spalte einzeln
anschauen, wie man aus Deinem Code-Geschreibsel erraten könnte.

Weil heute Sonntag ist:

Code: Alles auswählen

for column in casey.T:
  print describe(column[~numpy.isnan(column)])
BlackJack

@Wechselbalg: In der Regel solltest Du Beispiele ausprobieren oder deutlich kennzeichnen, dass es sich um keinen lauffähigen Quelltext handelt. Hier rate ich jetzt einfach mal das `Casey` eigenlich `Daten` heissen sollte (oder umgekehrt).

Du solltest am besten mal ein Numpy-Tutorial durcharbeiten, um zu lernen wie man mit `numpy`-Arrays umgeht. Die Python-Grundfunktionen für Listen und andere Sequenzen funktionieren zwar auch auf `numpy`-Arrays weil das auch Sequenzen sind, aber das besondere an `numpy` ist ja gerade, dass man nicht mit Schleifen von aussen auf einzelne Elemente zugreifen muss, sondern dass dieser Typ Operationen ermöglicht, die auf alle/viele der Elemente „gleichzeitig” wirken und dann die Schleife(n) intern in Code für den Prozessor ausgeführt wird, statt in Bytecode vom Python-Interpreter. Wenn man im Zusammenhang mit `numpy`-Arrays eine Python-Schleife schreibt, sollte man sich überlegen ob sich das nicht so umschreiben lässt, dass `numpy` das übernimmt. Dafür sind diese Arrays gedacht und wenn man das nicht nutzt, stellt sich die Frage warum man es überhaupt „benutzt”.

Dein Problem könnte man beispielsweise lösen, in dem man alle endlichen Zahlen aus den jeweiligen Daten per Indexzugriff nimmt:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
import numpy as np
from scipy.stats import describe


def main():
    data = np.genfromtxt(
        'data1.csv',
        delimiter=';',
        skip_header=11,
        usecols=range(2, 12),
        unpack=True
    )
    for row in data:
        print describe(row[~np.isfinite(row)])


if __name__ == '__main__':
    main()
Das Array wird durch `unpack` transponiert, damit man einfach in einer Schleife *direkt* über die Spalten, die jetzt die Zeilen sind, iterieren kann, ohne einen zusätzlichen Index verwenden zu müssen.

Diese ``for``-Schleife bekommt nicht nicht weg, weil die einzelnen Spalten ja unterschiedliche Anzahlen von NaNs haben können. Falls es allerdings so sein sollte, dass es immer nur komplette Zeilen in der Eingabedatei betrifft, dann könnte und sollte man diese Schleife los werden.

Du rufst `genfromtxt()` doch in dem Beispiel mit einem relativen Pfad auf. Darum verstehe ich die Frage nicht‽ Grundätzlich macht es keinen Unterschied ob man dort einen relativen oder absoluten Pfad angibt.
Wechselbalg
User
Beiträge: 7
Registriert: Sonntag 24. Februar 2013, 13:44

Sirius3 hat geschrieben:Hallo Wechselbalg,

Du hast eine Matrix mit nan-Werten? Wie soll man daraus einzelne Elemente rauslöschen können?
Entweder Du entfernst ganze Zeilen oder ganze Spalten oder Du willst an sich nur jede Spalte einzeln
anschauen, wie man aus Deinem Code-Geschreibsel erraten könnte.

Weil heute Sonntag ist:

Code: Alles auswählen

for column in casey.T:
  print describe(column[~numpy.isnan(column)])
Dieser Code ist mir am besten erläuterbar. Aber ginge das nicht auch ohne die Struktur zu verändern und die describe-Ausgabe in folgende Ausgabe einzubetten ? :

Code: Alles auswählen

fieldnames[i],"n, min/man, arithmetic average, variation, skewness, kurtosis:", describe(Casey[:,i]),\
"\nStandarddev:", round((std(Casey[:,i])),2), "\nmedian:", round((median(Casey[:,i])),2)
Gruß und Dank
BlackJack

@Wechselbalg: Warum sollte man das wollen? Das macht die Sache komplexer. Ziel sollte es sein das `i` weg zu bekommen, oder zumindest auf die Fälle zu beschränken wo man das `i` *wirklich* braucht, also *nicht* um es als Index zu verwenden. Denn letztendlich brauchst Du das nur weil Du über die Spalten iterieren willst, aber die „natürliche” Reihenfolge beim iterieren über das Array in Python über die Zeilen erfolgt.

Falls `mean()` und `std()` von `numpy` sind, dann braucht man da noch nicht einmal die Spalten einzeln behandeln, denn die kennen im Gegensatz zu `describe()` ein `axis`-Argument. `describe()` ist da ein wenig doof. Eventuell könntest Du das was `describe()` macht, auch ohne die Funktion erreichen, mit Funktionen bei denen man angeben kann über welche Achse aggregiert werden soll. Dann brauchst Du die Schleife nur noch zur Ausgabe, und die Berechnungen laufen alle innerhalb der `numpy`-Typen ab.

Statt des '\' am Zeilenende und '\n' in den Ausgaben solltest Du das vielleicht auf mehrere ``print``\s aufteilen. Ist weniger fehleranfällig und auch übersichtlicher.
Antworten