.csv Tabelle plotten

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
Dabudda
User
Beiträge: 3
Registriert: Dienstag 20. April 2021, 09:22

Hallo liebes Forum,

ich bin gerade dabei meine ersten CSV Dateien zu bearbeiten. In einer .csv Datei sind mir verschiedene Frequenzen über der Strömungsgeschwindigkeit für unterschiedliche Durchmesser gegeben. Und ich soll den Verlauf davon darstellen.

Hier mein Ansatz:

import numpy as np
import csv
import os
import matplotlib.pyplot as plt

messdaten = open('vf.csv',newline = '')
inhalt= messdaten.read()

zeilen = inhalt.split('\n')
tabelle = []

for zeile in range(len(zeilen)):
spalten = zeilen[zeile].split(',')
tabelle.append(spalten)
tabelle[zeile][1:1]= [float(zahl) for zahl in tabelle[zeile][1:1]]

pass

# Plotten
durchmesser = [zeile[0] for zeile in tabelle]
frequenz = [zeile[1] for zeile in tabelle]

plt.scatter(durchmesser,frequenz)

plt.xlabel("Strömungsgeschwindigkeit")
plt.ylabel("Durchmesser in mm")
plt.title("Verlauf der Frequenzen über der Strömungsgeschwindigkeit")



Die Messreihe:
/Users/mr.s/Desktop/Messreihe foto.png
Benutzeravatar
__blackjack__
User
Beiträge: 14019
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Dabudda: ``pass`` einfach so auf Modulebene stehen zu haben macht überhaupt keinen Sinn.

Das `newline`-Argument bei `open()` wird so für das `csv`-Modul benötigt. Und das sollte man hier auch verwenden. Oder eine entsprechende Funktion aus dem `numpy`-Modul. Im Moment werden `csv`, `os`, und `numpy` importiert, aber nicht verwendet.

Dateien die man öffnet, sollte man auch wieder schliessen. Bei Dateien/`open()` erreicht man das am einfachsten und sichersten in dem man die Datei mit der ``with``-Anweisung zusammen öffnet.

`zeilen` enthält die Zeilen, aber `zeile` enthält nicht *eine Zeile* sondern den *Index* einer Zeile. Das ist aber sowieso ein „anti pattern“ in Python über den Umweg über einen Laufindex auf Elemente von Sequenzen zuzugreifen wenn man direkt über die Elemente iterieren kann.

Das Aufsplitten in Zeilen und Spaltenwerte ist aber sowieso Aufgabe des `csv`-Moduls.

Du ersetzt Elemente in den Sublisten von `tabelle` die Zeichenketten waren, durch Zahlen. Das macht man eher nicht. Man baut da eine neue Datenstruktur mit den umgewandelten Daten auf.

Wobei das so auch gar nicht funktioniert, weil der Slice 1:1 ist immer leer, weil der die Länge 0 hat:

Code: Alles auswählen

In [79]: items
Out[79]: ['1', '2', '3']

In [80]: items[1:1]                                                                 
Out[80]: []
Du willst an der Stelle auch *beide* Werte in jeder Zeile umwandeln und nicht nur die Frequenz.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import csv

import matplotlib.pyplot as plt


def main():
    with open("vf.csv", encoding="ascii", newline="") as messdaten_datei:
        tabelle = [
            list(map(float, datensatz))
            for datensatz in csv.reader(messdaten_datei)
        ]

    durchmesser = [zeile[0] for zeile in tabelle]
    frequenz = [zeile[1] for zeile in tabelle]

    plt.scatter(durchmesser, frequenz)
    plt.xlabel("Strömungsgeschwindigkeit")
    plt.ylabel("Durchmesser in mm")
    plt.title("Verlauf der Frequenzen über der Strömungsgeschwindigkeit")
    plt.show()


if __name__ == "__main__":
    main()
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Dabudda
User
Beiträge: 3
Registriert: Dienstag 20. April 2021, 09:22

__blackjack__ hat geschrieben: Montag 5. Juli 2021, 15:43 @Dabudda: ``pass`` einfach so auf Modulebene stehen zu haben macht überhaupt keinen Sinn.

Das `newline`-Argument bei `open()` wird so für das `csv`-Modul benötigt. Und das sollte man hier auch verwenden. Oder eine entsprechende Funktion aus dem `numpy`-Modul. Im Moment werden `csv`, `os`, und `numpy` importiert, aber nicht verwendet.

Dateien die man öffnet, sollte man auch wieder schliessen. Bei Dateien/`open()` erreicht man das am einfachsten und sichersten in dem man die Datei mit der ``with``-Anweisung zusammen öffnet.

`zeilen` enthält die Zeilen, aber `zeile` enthält nicht *eine Zeile* sondern den *Index* einer Zeile. Das ist aber sowieso ein „anti pattern“ in Python über den Umweg über einen Laufindex auf Elemente von Sequenzen zuzugreifen wenn man direkt über die Elemente iterieren kann.

Das Aufsplitten in Zeilen und Spaltenwerte ist aber sowieso Aufgabe des `csv`-Moduls.

Du ersetzt Elemente in den Sublisten von `tabelle` die Zeichenketten waren, durch Zahlen. Das macht man eher nicht. Man baut da eine neue Datenstruktur mit den umgewandelten Daten auf.

Wobei das so auch gar nicht funktioniert, weil der Slice 1:1 ist immer leer, weil der die Länge 0 hat:

Code: Alles auswählen

In [79]: items
Out[79]: ['1', '2', '3']

In [80]: items[1:1]                                                                 
Out[80]: []
Du willst an der Stelle auch *beide* Werte in jeder Zeile umwandeln und nicht nur die Frequenz.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import csv

import matplotlib.pyplot as plt


def main():
    with open("vf.csv", encoding="ascii", newline="") as messdaten_datei:
        tabelle = [
            list(map(float, datensatz))
            for datensatz in csv.reader(messdaten_datei)
        ]

    durchmesser = [zeile[0] for zeile in tabelle]
    frequenz = [zeile[1] for zeile in tabelle]

    plt.scatter(durchmesser, frequenz)
    plt.xlabel("Strömungsgeschwindigkeit")
    plt.ylabel("Durchmesser in mm")
    plt.title("Verlauf der Frequenzen über der Strömungsgeschwindigkeit")
    plt.show()


if __name__ == "__main__":
    main()
@__blackjack__



Vielen lieben Dank für die Antwort und Hilfestellung, ich werde mich direkt mal wieder dran setzen !
Antworten