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

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: 17748
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"
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Schick mir einen Link bei einem Hoster deiner Wahl per PN.
Schreiben sich die Spalten mit kleinem ti101 oder grossem TI101, das ist Case Sensitiv.
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

Oh okay, dann gibt es mit dem neuen code schon einen Unterschied.

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))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-18-9a464363557d> in <module>
      3 
      4 df = pd.read_csv("daten.csv", delimiter="\t")
----> 5 df[["TI101"]].plot(figsize=(40,10))

~\Anaconda3\lib\site-packages\pandas\plotting\_core.py in __call__(self, x, y, kind, ax, subplots, sharex, sharey, layout, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, secondary_y, sort_columns, **kwds)
   2939                           fontsize=fontsize, colormap=colormap, table=table,
   2940                           yerr=yerr, xerr=xerr, secondary_y=secondary_y,
-> 2941                           sort_columns=sort_columns, **kwds)
   2942     __call__.__doc__ = plot_frame.__doc__
   2943 

~\Anaconda3\lib\site-packages\pandas\plotting\_core.py in plot_frame(data, x, y, kind, ax, subplots, sharex, sharey, layout, figsize, use_index, title, grid, legend, style, logx, logy, loglog, xticks, yticks, xlim, ylim, rot, fontsize, colormap, table, yerr, xerr, secondary_y, sort_columns, **kwds)
   1975                  yerr=yerr, xerr=xerr,
   1976                  secondary_y=secondary_y, sort_columns=sort_columns,
-> 1977                  **kwds)
   1978 
   1979 

~\Anaconda3\lib\site-packages\pandas\plotting\_core.py in _plot(data, x, y, subplots, ax, kind, **kwds)
   1802         plot_obj = klass(data, subplots=subplots, ax=ax, kind=kind, **kwds)
   1803 
-> 1804     plot_obj.generate()
   1805     plot_obj.draw()
   1806     return plot_obj.result

~\Anaconda3\lib\site-packages\pandas\plotting\_core.py in generate(self)
    256     def generate(self):
    257         self._args_adjust()
--> 258         self._compute_plot_data()
    259         self._setup_subplots()
    260         self._make_plot()

~\Anaconda3\lib\site-packages\pandas\plotting\_core.py in _compute_plot_data(self)
    371         if is_empty:
    372             raise TypeError('Empty {0!r}: no numeric data to '
--> 373                             'plot'.format(numeric_data.__class__.__name__))
    374 
    375         self.data = numeric_data

TypeError: Empty 'DataFrame': no numeric data to plot
Neuer Error.
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Da stimmt etwas mit deinen Daten nicht: In Excel werden schon einige Zahlen nicht als Zahlen erkannt und deshalb linksbündig ausgerichtet. Ferner ist mir nicht klar, was Komma ist, weil sonst Zahlen für Temperaturen zu groß wären... Möglicherweise musst du noch mal auf die Ursprungsdaten zurückgehen.
Mogician
User
Beiträge: 29
Registriert: Samstag 3. November 2018, 21:40

pixewakb hat geschrieben: Sonntag 4. November 2018, 20:21 Da stimmt etwas mit deinen Daten nicht: In Excel werden schon einige Zahlen nicht als Zahlen erkannt und deshalb linksbündig ausgerichtet. Ferner ist mir nicht klar, was Komma ist, weil sonst Zahlen für Temperaturen zu groß wären... Möglicherweise musst du noch mal auf die Ursprungsdaten zurückgehen.
Stimmt, das ist merkwürdig. Bei der Auswertung mit Excel ging das noch, ich schaue es mir gerade an.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Dateien sind angekommen, schau sie mir gerade an. Gib mir ein wenig Zeit und ich sende dir ein Notebook zurück.
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
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Wie sind denn die Zahlenwerte der Spalten TIxxx zu interpretieren?

Code: Alles auswählen

	Date	Time	TI101	TI102	TI103	TI104	TI105	TI106	TI107	TI108	...	TI148	TI149	TI150	TI151	TI152	TI153	TI154	TI155	TI156	TI157
0	02.11.2018	12:28:57	83.829.002	83.908.996	80.165.001	80.096.001	84.275.002	84.022.003	88.922.996	88.781.998	...	1372	1372	1372	1372	1372	1372	1372	1372	1372	1372
1	02.11.2018	12:28:58	83.626.999	83.765.999	79.987	79.905.998	84.067.001	83.832.001	88.745.003	88.616.997	...	1372	1372	1372	1372	1372	1372	1372	1372	1372	1372
2	02.11.2018	12:29:01	83.115.997	83.244.003	79.392.998	79.300.003	83.443.001	83.252.998	88.156.998	88.037.002	...	1372	1372	1372	1372	1372	1372	1372	1372	1372	1372
3	02.11.2018	12:29:03	82.938.004	82.899.002	78.988.998	78.931.999	83.083	82.825.996	87.758.003	87.653	...	1372	1372	1372	1372	1372	1372	1372	1372	1372	1372
4	02.11.2018	12:29:05	82.628.998	82.566.002	78.621.002	78.528	82.655.998	82.418.999	87.412.002	87.282.997	...	1372	1372	1372	1372	1372	1372	1372	1372	1372	1372
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

Hab die Urdatei nochmal mit notepad bearbeitet und dann nochmal ausprobiert mit dem Ergebnis.

Code: Alles auswählen

import pandas as pd
import matplotlib.pyplot as plt
​
df = pd.read_csv("Kopie_Daten.csv", delimiter="\t")
df[["TI101"]].plot(figsize=(40,10))
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-25-7047e00903df> in <module>
      3 
      4 df = pd.read_csv("Kopie_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"

df.head()
​
Date;Time;TI101;TI102;TI103;TI104;TI105;TI106;TI107;TI108;TI109;TI110;TI111;TI112;TI113;TI114;TI115;TI116;TI117;TI118;TI119;TI120;TI121;TI122;TI123;TI124;TI125;TI126;TI127;TI128;TI129;TI130;TI131;TI132;TI133;TI134;TI135;TI136;TI137;TI138;TI139;TI140;TI141;TI142;TI143;TI144;TI145;TI146;TI147
0	02.11.2018;11:45:18;50,20;36,12;45,20;45,78;40...
1	02.11.2018;11:45:20;50,76;37,00;46,39;46,96;41...
2	02.11.2018;11:45:22;51,95;37,95;47,54;48,02;42...
3	02.11.2018;11:45:24;53,02;38,89;48,59;49,15;43...
4	
Also wieder der alte Error


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

ThomasL hat geschrieben: Sonntag 4. November 2018, 20:50 Wie sind denn die Zahlenwerte der Spalten TIxxx zu interpretieren?

Code: Alles auswählen

	Date	Time	TI101	TI102	TI103	TI104	TI105	TI106	TI107	TI108	...	TI148	TI149	TI150	TI151	TI152	TI153	TI154	TI155	TI156	TI157
0	02.11.2018	12:28:57	83.829.002	83.908.996	80.165.001	80.096.001	84.275.002	84.022.003	88.922.996	88.781.998	...	1372	1372	1372	1372	1372	1372	1372	1372	1372	1372
1	02.11.2018	12:28:58	83.626.999	83.765.999	79.987	79.905.998	84.067.001	83.832.001	88.745.003	88.616.997	...	1372	1372	1372	1372	1372	1372	1372	1372	1372	1372
2	02.11.2018	12:29:01	83.115.997	83.244.003	79.392.998	79.300.003	83.443.001	83.252.998	88.156.998	88.037.002	...	1372	1372	1372	1372	1372	1372	1372	1372	1372	1372
3	02.11.2018	12:29:03	82.938.004	82.899.002	78.988.998	78.931.999	83.083	82.825.996	87.758.003	87.653	...	1372	1372	1372	1372	1372	1372	1372	1372	1372	1372
4	02.11.2018	12:29:05	82.628.998	82.566.002	78.621.002	78.528	82.655.998	82.418.999	87.412.002	87.282.997	...	1372	1372	1372	1372	1372	1372	1372	1372	1372	1372
Sorry, da hat Excel was zerhackt. Es sind im Prinzip Temperaturen, also 83,83 würde voll reichen. Ich weiß nicht, warum Excel da zwei Punkte reingehauen hat.
An dem Computer, wo die Daten herkommen, ist wohl nach amerikanischer norm eingestellt udn deshalb Punkt statt Komma.
Ich habe das jetzt mal mit notepad geöffnet, ersetzt und dann mit Excel geöffnet und zur csv gemacht.
Ich schicke dir nochmal Daten okay?
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Was sollen denn diese doppelten eckigen Klammern?
Was passiert bei:

Code: Alles auswählen

df["TI101"].plot(figsize=(40,10))
?
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Sirius3 hat geschrieben: Sonntag 4. November 2018, 21:06 Was sollen denn diese doppelten eckigen Klammern?
Was passiert bei:

Code: Alles auswählen

df["TI101"].plot(figsize=(40,10))
?
@Sirius3: <s>Danke für den Hinweis, wahrscheinlich ein Fragment, was ich von irgendwo mitschleppe.</s> Ich plotte meist mehrere Spalten in einem Durchgang und dann brauche ich die doppelten eckigen Klammern. Das ist der Grund dafür. Im obigen Beispiel kommst du ohne aus; wenn der Threadstarter mal mehrere Spalten plotten will, braucht er das wieder.

@Mogician: Pandas braucht wahrscheinlich amerikanisches Format, Rest käme auf einen Test an, ob ein Komma auch erkannt würde.
Mogician
User
Beiträge: 29
Registriert: Samstag 3. November 2018, 21:40

Also ich bekomme immer einen der beiden Error, egal ob ich Komma oder Punkt mache.
Hab eben mal alle anderen TI-Zeilen gelöscht, und die TI101 mit Punkt und Komma ausprobiert, error war immer "TypeError: Empty 'DataFrame': no numeric data to plot".
Mogician
User
Beiträge: 29
Registriert: Samstag 3. November 2018, 21:40

Hat vielleicht noch einer eine Lösung oder ein Beispiel mit einer einfachen Datei, wo es funktioniert?

Danke

edit: Frage nach einem Beispiel besteht jetzt nicht mehr unbedingt, da ThomasL (Danke dafür) das schon macht. Wenn jemand trotzdem einen Einfall hat wäre das natürlich immer noch interessant. Danke an alle!
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Mogician hat geschrieben: Sonntag 4. November 2018, 19:32 Natürlich gerne. Soll ich das irgendwo hochladen und dir den Link schicken oder geht das auch irgendwo hier, oder direkt?
Falls möglich, stell den Link zur Originaldatei doch gerne hier rein, da ist die Schwelle dir zu helfen für alle niedriger.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Mogician, du hast das Notebook in deinem Postfach

Code: Alles auswählen

import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline

df = pd.read_table('Daten_02112018114518.txt', skiprows=[0,1,2,3,4,5,6,7,8,9,10,11,13], index_col=False)
df.info()

df.head(2)

# zusammenfügen der Spalten DATE und TIME zu einer vom Typ DATETIME
newdate = df['Date'] + ' ' + df['Time']
newdate = pd.to_datetime(newdate, errors='raise')
newdate = pd.DataFrame(newdate, columns=['date_time'])
df = pd.concat([newdate, df], axis=1)

# die DATETIME Spalte als Index definieren
df.set_index('date_time', inplace=True)
df.head(2)

df['TI101'].plot(kind='line', figsize=(10,5), color=['black'], ylim=[40, 140], xlim=['2018-02-11 11:44:50', '2018-02-11 12:25:22'])
plt.title('TI101')
plt.ylabel('Messwert')
plt.xlabel('Zeitpunkt')
plt.show()

TI101_102 = df[['TI101', 'TI102']]
diff = pd.DataFrame(df.TI101 - df.TI102, columns=['Difference'])
TI101_102 = pd.concat([TI101_102, diff], axis=1)
TI101_102.plot(kind='line', color=['blue', 'green', 'red'], figsize=(18,5), rot=90, xlim=['2018-02-11 11:44:50', '2018-02-11 12:25:22'])
plt.title('TI101 und TI102, sowie Differenz der beiden')
plt.ylabel('Messwert')
plt.xlabel('Zeitpunkt')
plt.legend(labels=TI101_102.columns, loc='best')
plt.show()

fig = plt.figure() # create figure

ax0 = fig.add_subplot(1, 2, 1) # add subplot 1 (1 row, 2 columns, first plot)
ax1 = fig.add_subplot(1, 2, 2) # add subplot 2 (1 row, 2 columns, second plot). See tip below**

# Subplot 1: 
df[['TI101', 'TI102']].plot(kind='line', figsize=(18,5), ax=ax0, color=['blue', 'green'], xlim=['2018-02-11 11:44:50', '2018-02-11 12:25:22'])  # add to subplot 1
ax0.set_title('T1101 und TI102')
ax0.set_ylabel('Messwerte')
ax0.set_xlabel('Zeitpunkte')

# Subplot 2:
diff = pd.DataFrame(df.TI101 - df.TI102, columns=['Differenz'])
diff.plot(kind='line', figsize=(18, 5), ax=ax1, ylim=[-5,17], xlim=['2018-02-11 11:44:50', '2018-02-11 12:25:22'])  # add to subplot 2
ax1.set_title ('Differenz')
ax1.set_ylabel('Messwerte')
ax1.set_xlabel('Zeitpunkte')
ax1.annotate('Was ist das für eine Spitze?', xy=('2018-02-11 12:01:00', -3))

plt.show()
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

Super, der code hilft mir schon massiv weiter. Eine Frage hätte ich jetzt noch.
Wie greife ich einen bestimmten Wertebereich raus auf der x-Achse, also zb wenn die Messung von 12h bis 15h lief, und man nur von 13h-14h plotten möchte?
Für die y-Achse hab ich das geschafft, aber wegen dem Zeitformat noch nicht auf der x-Achse.

Also ich habe probiert den code von ThomasL anzuwenden

Code: Alles auswählen

xlim=(['2018-02-11 11:44:50', '2018-02-11 12:25:22'])
und auch

Code: Alles auswählen

plt.axis([0, 50, 12, 20])
und den letzten dann auch mit diversen xmin und xmax Werten aber im Ergebnis kriege ich immer was ganz anderes auf der x-Achse

Danke
Antworten