Messdaten (100.000+) auswerten, Diagramme erzeugen

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.
Mogician
User
Beiträge: 29
Registriert: Samstag 3. November 2018, 21:40

Hallo,

ich muss in einer Arbeit sehr viele Messdaten auswerten und daraus diverse Diagramme erzeugen.
Ich hatte das mit Excel angefangen, doch wird Excel mit der Menge an Daten nicht fertig sprich Programm langsam und stürzt ab.


Ich habe keinerlei Erfahrung mit Python. Ist Python dafür geeignet? Nächste Frage wäre, wenn Python dafür geeignet, ist es kompliziert das mit Python auszuwerten?

Danke
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

"Messdaten auswerten" kann alles mögliche bedeuten. Du müsstest schon etwas genauer sagen, was du vorhast. Für einfache deskriptive Statistik gibt es ein Moul in der Standardbibliothek. Für alles, was darüber honaisgeht, gibt es verschiedene Bibliotheken für Python, die statistische Verfahren implementieren und Grafikfunktionen bereitstellen. Ansonsten wird R auch gerne in dem Bereich genommen und für Diagramme gnuplot.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Python mit den entsprechenden Bibliotheken ist perfekt dafür geeignet.
Lies dich mal hier https://www.python-kurs.eu/pandas.php
und hier ein https://www.grund-wissen.de/informatik/ ... andas.html

Zur Darstellung der Daten wird dann
Matplotlib https://matplotlib.org/gallery/index.html
oder Seaborn https://seaborn.pydata.org
benutzt, welches auf Matplotlib aufbaut.

Die "perfekte" interaktive Platform dafür sind Jupyter Notebooks oder das Jupyter Lab. https://jupyter.org

Eine Einführung in Pandas kannst du zB hier anschauen https://www.youtube.com/playlist?list=P ... q8LL5U3u9y

Alternativen wären MATLAB https://de.mathworks.com/products/matlab.html (kostenpflichtig)
oder der freie "Clon" GNU Octave https://www.gnu.org/software/octave/
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Mogician
User
Beiträge: 29
Registriert: Samstag 3. November 2018, 21:40

Danke für die Antworten.

Es geht um Temperaturdaten, die über dem zeitlichen Verlauf dargestellt werden sollen. Je Messstelle etwa 3.000 Daten und es gibt ca 50 Messstellen. Mit der Menge an Daten wird Excel einfach nicht fertig, die Funktionen hätten sonst voll ausgereicht.


Also ich muss eine Datei.csv einlesen und dann eben auswählen, welche Daten als Diagramm dargestellt werden solllen. Und eventuell noch ein Delta der Messstellen bilden, also zb Messstelle 2 - Messstelle 1 und das dann als Diagramm darstellen.
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Da hast du eigentlich freie Auswahl: Entweder Python mit den von ThomasL vorgeschlagenen Bibliotheken (pandas und matplotlib), R mit ggplot2 oder gnuplot. Viel Arbeit ist das mit keiner der genannten Lösung, mit gnuplot vmtl. am wenigsten (abgesehen von den Deltas evtl.).
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ist alles machbar mit Pandas und Matplotlib.
Hast du denn den Willen und die Zeit dich da einzuarbeiten oder ist Termindruck aktuell dein Problem?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Du müsstest Dir halt mal Python installieren und dann pandas und matplotlib und dazu dann noch jupyter lab, was m. E. für den Bereich Datenverarbeitung der Standard ist. Wenn Du an einer Arbeit sitzt, wirst Du Hilfe brauchen, weil Du in einer sehr kurzen Zeit allein die Einarbeitung in Python, matplotlib und pandas nicht schaffen wirst - zumindest, wenn Du vorher noch keine Erfahrung mit Programmierung hattest. Ich kenne R von einer sehr kurzen Einführung und ich kann mir niemand richtig vorstellen, der das ohne Not programmieren möchte, auch wenn es den Standard für Bereiche mit mathematischem Background darstellt.

Du kannst mal folgenden Code in einem Jupyter lab eingeben:

Code: Alles auswählen

import csv
from random import choice, randint

import pandas as pd
import matplotlib.pyplot as plt

upper_limit = 12
value = 10           # initial value

change = [(i / 10) for i in range(1, upper_limit)]
values = [["ID", "Value"]]


for i in range(50000):
    if randint(0,1):
        value += choice(change)
    else:
        value -= choice(change)
        if value < 0:
            value *= -1
        if value < 2:
            value += randint(1, 3) * 0.33
    values.append([i, value])

with open('bigdata.csv', 'w', newline='') as csvfile:
    csvwriter = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
    for line in values:
        csvwriter.writerow(line)

df = pd.read_csv("bigdata.csv")
df[["Value"]].plot(figsize=(40,10))
Das "Subtrahieren" der Messwerte einer Messstation von einer anderen Messstation ist mit pandas sehr schnell zu bewerkstelligen. Ich bin allerdings kein Experte, weder für pandas noch für matplotlib.

Bild

Bzw.: https://ibb.co/gfZ4xf

Ich habe das Bild dann per Screenshot aus meinem Jupyterlab herausgeholt. Ein Abspeichern liefert bei mir keine annehmbaren Ergebnisse, vielleicht können Dir da dann aber andere helfen...

PS: Falls Du alle Berechnungen mit Excel erledigen kannst, dann könntest Du da die Berechnungen erledigen und die Sachen, die du plotten willst, als csv speichern und dann mit meinem obigen Code auch schon plotten. Du kannst den Charts dann noch eine Achsenbeschriftung, einen Titel beigeben und eine Code-Änderung sollte auch helfen die x-Achse korrekt zu beschriften (mit Werten zu versorgen), was ich mir hier gespart habe. Verbesserungen am Diagramm können sicherlich andere noch beitragen...
Mogician
User
Beiträge: 29
Registriert: Samstag 3. November 2018, 21:40

Richtig ThomasL, etwas Zeit habe ich, aber nicht viel. Etwa zwei drei Tage, um damit arbeiten zu können.

@pixewakb: Danke, das sieht gut aus und ist wirklich eine interessante Lösung. Denn nur das plotten stellt ein Problem in Excel dar, die Berechnungen wären leicht möglich.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Wenn Du fertige csv-files mit Excel generieren kannst, dann kommst du in python bei Nutzung von jupyter lab mit folgenden Code-Zeilen (denke ich) aus:

Code: Alles auswählen

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("bigdata.csv")
df[["Value"]].plot(figsize=(40,10))
Der Code lädt die Bibliotheken pandas und matplotlib und in der nächsten Zeile wird dann die Datei bigdata.csv von pandas in ein DataFrame (df) geladen. Die folgende Zeile plottet dann die Werte der Spalte Value und bestimmt die Größe des Plots (hier 40 in der Breite und 10 in der Höhe), was du an deine eigenen Bedürfnisse anpassen kannst. Die Zeilen dazwischen nutze ich, um randomisierte Testdaten zu erzeugen und in ein csv-File zu laden, was du ja nicht bräuchtest, weil du Testdaten vorliegen hast.

Ich hatte früher Probleme mit LO Calc, was mit einem Wechsel des Rechners gelöst ist. Hintergrund ist, dass der neue Rechner mehr verarbeiten kann. Auf das Problem könntest Du auch treffen.

Im Netz findest Du m. E. Anleitungen, wie du noch Sachen zu Plot hinzufügen kannst (Titel, Achsenbeschriftung) usw. Auch das Plotten von mehreren Spalten in einem Plot geht, dafür bin ich aber nicht immer der Experte...
Mogician
User
Beiträge: 29
Registriert: Samstag 3. November 2018, 21:40

Dankeschön!
Ich probiere das heute nachmittag dann aus. Ich benutze im moment Anaconda bzw habe mir das gestern mal installiert.

In der csv sind allerdings alle Messdaten, getrennt mit Tabstopp. Das müsste ich irgendwie mit Python isolieren.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Anaconda müsste pandas mitbringen und Python ist dann auch dabei. Bei jupyter lab bin ich mir nicht sicher.

Ein Tabstopp ist letztlich wie ein Semikolon (wird als Steuerzeichen mit "\t" repräsentiert), das solltest du beim Einlesen bei Excel oder LO Calc angeben können und könntest folglich die Daten direkt einlesen, ohne Probleme. pandas sollte das im Idealfall erkennen und entsprechend behandeln. Klingt alles nach lösbaren Problemen. Wenn dein Rechner einigermaßen schnell ist, sollte es keine Probleme geben.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

wenn du Anaconda installiert hast, mach mal danach im Anaconda Prompt (mit Adminrechten starten)
conda update --all
und danach
conda install jupyter jupyterlab
und wenn installiert dann mit
jupyter lab
starten.
Vorher mit cd <Pfad> in dein Homedir wechseln, da sonst die Notebookdatei im Verzeichnis C:\windows\system32 angelegt wird.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Mogician
User
Beiträge: 29
Registriert: Samstag 3. November 2018, 21:40

Habe ich so gemacht. Jetzt hat sich ein Tab geöffnet, wo ich gerade nicht weiß, wie ich jetzt ins Programm reinkomme.

Bild Bild
Mogician
User
Beiträge: 29
Registriert: Samstag 3. November 2018, 21:40

Also der Code sieht jetzt so aus.

Code: Alles auswählen

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("daten.csv")
df[["TI101"]].plot(figsize=(40,10))
Bekomme dann das hier.

Code: Alles auswählen

---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_tokens()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_with_dtype()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._string_convert()

pandas\_libs\parsers.pyx in pandas._libs.parsers._string_box_utf8()

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf8 in position 0: invalid start byte

During handling of the above exception, another exception occurred:

UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-7-70ec0e3d43e0> in <module>
      2 import matplotlib.pyplot as plt
      3 
----> 4 df = pd.read_csv("daten.csv")
      5 df[["Value"]].plot(figsize=(40,10))

~\Anaconda3\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, escapechar, comment, encoding, dialect, tupleize_cols, error_bad_lines, warn_bad_lines, skipfooter, doublequote, delim_whitespace, low_memory, memory_map, float_precision)
    676                     skip_blank_lines=skip_blank_lines)
    677 
--> 678         return _read(filepath_or_buffer, kwds)
    679 
    680     parser_f.__name__ = name

~\Anaconda3\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
    444 
    445     try:
--> 446         data = parser.read(nrows)
    447     finally:
    448         parser.close()

~\Anaconda3\lib\site-packages\pandas\io\parsers.py in read(self, nrows)
   1034                 raise ValueError('skipfooter not supported for iteration')
   1035 
-> 1036         ret = self._engine.read(nrows)
   1037 
   1038         # May alter columns / col_dict

~\Anaconda3\lib\site-packages\pandas\io\parsers.py in read(self, nrows)
   1846     def read(self, nrows=None):
   1847         try:
-> 1848             data = self._reader.read(nrows)
   1849         except StopIteration:
   1850             if self._first_chunk:

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader.read()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._read_low_memory()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._read_rows()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_column_data()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_tokens()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_with_dtype()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._string_convert()

pandas\_libs\parsers.pyx in pandas._libs.parsers._string_box_utf8()

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf8 in position 0: invalid start byte

TI101
import pandas as pd
import matplotlib.pyplot as plt
​
df = pd.read_csv("daten.csv")
df[["TI101"]].plot(figsize=(40,10))
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_tokens()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_with_dtype()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._string_convert()

pandas\_libs\parsers.pyx in pandas._libs.parsers._string_box_utf8()

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf8 in position 0: invalid start byte

During handling of the above exception, another exception occurred:

UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-8-ee95a1149030> in <module>
      2 import matplotlib.pyplot as plt
      3 
----> 4 df = pd.read_csv("daten.csv")
      5 df[["TI101"]].plot(figsize=(40,10))

~\Anaconda3\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, escapechar, comment, encoding, dialect, tupleize_cols, error_bad_lines, warn_bad_lines, skipfooter, doublequote, delim_whitespace, low_memory, memory_map, float_precision)
    676                     skip_blank_lines=skip_blank_lines)
    677 
--> 678         return _read(filepath_or_buffer, kwds)
    679 
    680     parser_f.__name__ = name

~\Anaconda3\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
    444 
    445     try:
--> 446         data = parser.read(nrows)
    447     finally:
    448         parser.close()

~\Anaconda3\lib\site-packages\pandas\io\parsers.py in read(self, nrows)
   1034                 raise ValueError('skipfooter not supported for iteration')
   1035 
-> 1036         ret = self._engine.read(nrows)
   1037 
   1038         # May alter columns / col_dict

~\Anaconda3\lib\site-packages\pandas\io\parsers.py in read(self, nrows)
   1846     def read(self, nrows=None):
   1847         try:
-> 1848             data = self._reader.read(nrows)
   1849         except StopIteration:
   1850             if self._first_chunk:

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader.read()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._read_low_memory()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._read_rows()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_column_data()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_tokens()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._convert_with_dtype()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._string_convert()

pandas\_libs\parsers.pyx in pandas._libs.parsers._string_box_utf8()

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf8 in position 0: invalid start byte

Also die Messstellen heißen TI101 - TI1xx.
Hänge den Screenshot von einer csv mal an. Es wird eigentlich als txt gespeichert und in Excel erzeige ich dann die csv.

Bild
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Öffne die Daten-Datei mal mit Notepad++, wähle alles aus, schneide es aus, stelle dann unter Kodierung auf UTF-8 um und füge dann alles wieder ein. Teste das mal. Es gibt offenbar ein Zeichen (oder mehr Zeichen), die nicht von pandas gelesen werden konnten. Ich vermute halt ein Kodierungsproblem.

BTW: Du solltest die zweite Zeile in Excel herauslöschen, wenn das nur ein Hinweis auf die Einheit ist - in den Spalten Date und Time ist die Einheit ohnehin ganz falsch. Das erleichtert das Plotten mit pandas. Btw: Ich würde immer backups der Daten machen, mit denen du arbeitest, aber ich gehe davon aus, dass du das ohnehin schon machst.
Mogician
User
Beiträge: 29
Registriert: Samstag 3. November 2018, 21:40

Ja, richtig, dieses Symbol für den Durchschnitt hat das verursacht. Und stimmt, die Zeile kann ich ganz löschen.

Jetzt kommt aber das hier.

Code: Alles auswählen

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-13-ee95a1149030> in <module>
      3 
      4 df = pd.read_csv("daten.csv")
----> 5 df[["TI101"]].plot(figsize=(40,10))

~\Anaconda3\lib\site-packages\pandas\core\frame.py in __getitem__(self, key)
   2680         if isinstance(key, (Series, np.ndarray, Index, list)):
   2681             # either boolean or fancy integer index
-> 2682             return self._getitem_array(key)
   2683         elif isinstance(key, DataFrame):
   2684             return self._getitem_frame(key)

~\Anaconda3\lib\site-packages\pandas\core\frame.py in _getitem_array(self, key)
   2724             return self._take(indexer, axis=0)
   2725         else:
-> 2726             indexer = self.loc._convert_to_indexer(key, axis=1)
   2727             return self._take(indexer, axis=1)
   2728 

~\Anaconda3\lib\site-packages\pandas\core\indexing.py in _convert_to_indexer(self, obj, axis, is_setter)
   1325                 if mask.any():
   1326                     raise KeyError('{mask} not in index'
-> 1327                                    .format(mask=objarr[mask]))
   1328 
   1329                 return com._values_from_object(indexer)

KeyError: "['TI101'] not in index"
Mit "Value" das gleiche. Da hab ich wohl irgendwie den Zusammenhang nicht geschnallt.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Er findet keine Spalte mit Namen 'TI101'
Du kannst mit df.head() dir die ersten 5 Zeilen anzeigen lassen, da werden auch die Spaltennamen aufgeführt, kopier das mal hier rein
Falls du die Möglichkeit hast, mir eine Sample csv Datei (zB nur 50 Zeilen oder so) zur Verfügung zu stellen, kann ich dir ein Notebook mit Beispielschritten basteln, wie ich vorgehen würde.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Mogician
User
Beiträge: 29
Registriert: Samstag 3. November 2018, 21:40

Ich werde das dann mal jetzt probieren.

edit: Bild



Natürlich gerne. Soll ich das irgendwo hochladen und dir den Link schicken oder geht das auch irgendwo hier, oder direkt?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Du Tabs als Trennzeichen hast, solltest Du die beim Lesen auch angeben:

Code: Alles auswählen

df = pd.read_csv("daten.csv", delimiter="\t")
Mogician
User
Beiträge: 29
Registriert: Samstag 3. November 2018, 21:40

Danke, aber ich bekomme im Ergebnis erstmal den gleichen Error.

Code: Alles auswählen

import pandas as pd
import matplotlib.pyplot as plt
​
df = pd.read_csv("daten.csv", delimiter="\t")
df[["ti101"]].plot(figsize=(40,10))
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-17-8e7b8287bf5a> in <module>
      3 
      4 df = pd.read_csv("daten.csv", delimiter="\t")
----> 5 df[["ti101"]].plot(figsize=(40,10))

~\Anaconda3\lib\site-packages\pandas\core\frame.py in __getitem__(self, key)
   2680         if isinstance(key, (Series, np.ndarray, Index, list)):
   2681             # either boolean or fancy integer index
-> 2682             return self._getitem_array(key)
   2683         elif isinstance(key, DataFrame):
   2684             return self._getitem_frame(key)

~\Anaconda3\lib\site-packages\pandas\core\frame.py in _getitem_array(self, key)
   2724             return self._take(indexer, axis=0)
   2725         else:
-> 2726             indexer = self.loc._convert_to_indexer(key, axis=1)
   2727             return self._take(indexer, axis=1)
   2728 

~\Anaconda3\lib\site-packages\pandas\core\indexing.py in _convert_to_indexer(self, obj, axis, is_setter)
   1325                 if mask.any():
   1326                     raise KeyError('{mask} not in index'
-> 1327                                    .format(mask=objarr[mask]))
   1328 
   1329                 return com._values_from_object(indexer)

KeyError: "['ti101'] not in index"
Antworten