Relative Frequency, histogram

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
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

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
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

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)
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

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]
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)
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Da du eh schon numpy benutzt, würde ich mir mal ``numpy.loadtxt`` angucken, da kann man einen Konverter für die Spalten angeben.
DanielMamba
User
Beiträge: 28
Registriert: Dienstag 27. Januar 2009, 14:20

HI,

vielen Dank für Eure Hilfe!!!

Viele Grüsse. DanielMamba
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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
Antworten