Seite 1 von 1

Relative Frequency, histogram

Verfasst: Dienstag 27. Januar 2009, 14:28
von DanielMamba
Hi!

Ich habe folgendes Problem. ich versuche gerade in python messwerte aus einem csv-File (Ursprung deutsche Openoffice calc-Datei) einzulesen. Nach einigem herumprobieren ist mir dies auch gelungen, allerdings auf wie ich finde sehr kopliziertem Wege (Einlesen in Liste, extrahieren in ein Array, ersetzen des Kommas durch einen Punkt und letztenendes Casten von String in Float), aber das nur nebenbei, vielleicht kennt jemand von Euch ja eine raffiniertere und effizientere Methode.
Mein Hauptproblem ist allerdings wie ich aus meinen Daten ein Histogramm mit relativen Häufigkeiten für meine Messwerte erstellen.

Vielen Dank,

DanielMamba

Verfasst: Dienstag 27. Januar 2009, 15:44
von Leonidas
Hallo DanielMamba,

ohne deinen Quelltext zu sehen, wird es kompliziert, dir zu helfen. Wenn er zu lang ist, poste ihn doch einfach in das Pocoo-Lastebin, Lodgeit.

Verfasst: Dienstag 27. Januar 2009, 16:06
von DanielMamba
OK hier das Codebeispiel:

data = zeros(1)
reader = csv.reader(open("***.csv"), delimiter=",")
for row in reader:
data = concatenate((data, row))
for ii in xrange(size(data)):
data[ii] = replace(data[ii], ",", ".")
data2 = zeros(size(data))
jj = 0
while jj < size(data):
data2[jj] = float(data[jj])
jj+=1

Problem: ich muesste noch das erste Item im Array Data löschen.

Vielen Dank für Eure Antworten,

DanielMamba

Verfasst: Dienstag 27. Januar 2009, 16:17
von HerrHagen
Bitte setz deinen Code in CodeTags (Button: Python) und bring sie in eine Form in der sie jmd. anderes auch ausführen kann (Einrückung, imports rein)

Verfasst: Dienstag 27. Januar 2009, 16:22
von DanielMamba
OK dann eben nochmal:


Code: Alles auswählen

data = zeros(1)
reader = csv.reader(open("***.csv"), delimiter=",")
for row in reader:
        data = concatenate((data, row))
for ii in xrange(size(data)):
        data[ii] = replace(data[ii], ",", ".")
data2 = zeros(size(data))
jj = 0
while jj < size(data):
        data2[jj] = float(data[jj])
        jj+=1
Problem: ich muesste noch das erste Item im Array Data löschen.

Vielen Dank für Eure Antworten,

DanielMamba[/code]

Verfasst: Dienstag 27. Januar 2009, 19:51
von BlackJack
@DanielMamba: Das sieht in der Tat etwas umständlich aus. Es fehlen Informationen wie die Importe. Da würde ich mal auf `numpy` tippen!? Das würde ich erst im letzten Schritt verwenden weil `numpy`-Arrays bei normalen Python-Objekten wie Zeichenketten keinen wirklichen Vorteil bieten.

Warum verwendest Du zwei verschiedene Arten von Schleifen mit Index?

Wenn Du das erste Element nicht in das Array steckst, brauchst Du es später auch nicht löschen. ;-)

Ich würde die Daten wahrscheinlich in eine Liste einlesen und dabei auch schon in Fliesskommazahlen umwandeln und danach ein `numpy.array` daraus machen.

Ungetestet:

Code: Alles auswählen

import csv
from numpy import array


def main():
    data_file = open('test.csv')
    data = list()
    for row in csv.reader(data_file, delimiter=','):
        data.extend(float(s.replace(',', '.')) for s in row)
    data_file.close()
    data = array(data)

Verfasst: Mittwoch 28. Januar 2009, 10:19
von Darii
Da du eh schon numpy benutzt, würde ich mir mal ``numpy.loadtxt`` angucken, da kann man einen Konverter für die Spalten angeben.

Verfasst: Donnerstag 29. Januar 2009, 12:26
von DanielMamba
HI,

vielen Dank für Eure Hilfe!!!

Viele Grüsse. DanielMamba

Verfasst: Donnerstag 29. Januar 2009, 14:55
von CM
Und numpy hat auch eine Histogramm-Funktion. Beispiele zu den Funktionen findest Du hier:
http://www.scipy.org/Numpy_Example_List_With_Doc

Und matplotlib (Beispiele auf der Seite) hat eine eingebaute Plotting-Funktion für Histogramme.

HTH
Christian