Extremwerte von Graphen entfernen und zu einem zusammenfassen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
TheLüddy
User
Beiträge: 20
Registriert: Freitag 27. April 2018, 10:17

Hallo Leute,

ich habe aus 15 verschiedenen CSV-Dateien Werte extrahiert und dargestellt. Dies sieht dann so aus:

https://drive.google.com/file/d/1AT5zMv ... sp=sharing

Nun muss ich aber Extremwerte, die dem Durchschnitt 10% oder so abweichen, löschen. Weiterhin möchte ich an jedem Punkt von e_y (x-Achse) den Mittelwert von allen y-Werten berechnen und dies in einer Geraden darstellen. Dabei sollte die 2 Punkte, welche am meisten vom Durchschnitt abweichen, irgendwie durch einen Punkt oder eine Gerade dargestellt werden. Dies sähe dann etwa so aus:

https://www.google.ch/search?q=graph+mi ... YMzvQsBTM:


Hier mein bisheriger Code: (wäre froh wenn mir noch jemand sagen könnte wie ich das zusammenfassen kann, verstehe nicht wie ich eine Variable definieren muss mit einer iterierenden Zahl im Namen)

Code: Alles auswählen

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


achse_t1 = np.arange(0.0,0.055,0.00125)
achse_t2 = np.arange(0.0,0.0575,0.00125)  
achse_t3 = np.arange(0.0,0.0525,0.00125)  
achse_t4 = np.arange(0.0,0.0525,0.00125)  
achse_t5 = np.arange(0.0,0.05625,0.00125)  
achse_t6 = np.arange(0.0,0.05125,0.00125)
##achse_t7 = np.arange(0.0,0.5,0.00125)  
achse_t8 = np.arange(0.0,0.0575,0.00125)
achse_t9 = np.arange(0.0,0.05375,0.00125)
achse_t10 = np.arange(0.0,0.05375,0.00125)
achse_t11 = np.arange(0.0,0.05375,0.00125)
achse_t12 = np.arange(0.0,0.055,0.00125)
achse_t13 = np.arange(0.0,0.05375,0.00125)
achse_t14 = np.arange(0.0,0.05625,0.00125)
achse_t15 = np.arange(0.0,0.055,0.00125)  

for i in range(1,2):
    with open("specimen_"+str(i)+"_nonholed.csv") as f:    
        reader = csv.reader(f)                  #reads nonholed data
        _ = next(reader)                        #ignores header
        data1 = list(reader)                    #creates a list of read data

with open("specimen_2_nonholed.csv") as f:    
    reader = csv.reader(f)                  #reads holed data
    _ = next(reader)                        #ignores header
    data2 = list(reader)                    #creates a list of read data

with open("specimen_3_nonholed.csv") as f:    
    reader = csv.reader(f)                  #reads patched data
    _ = next(reader)                        #ignores header
    data3 = list(reader)                    #creates a list of read data

with open("specimen_4_nonholed.csv") as f:    
    reader = csv.reader(f)                  #reads nonholed data
    _ = next(reader)                        #ignores header
    data4 = list(reader)                    #creates a list of read data

with open("specimen_5_nonholed.csv") as f:    
    reader = csv.reader(f)                  #reads nonholed data
    _ = next(reader)                        #ignores header
    data5 = list(reader)                    #creates a list of read data

with open("specimen_6_nonholed.csv") as f:    
    reader = csv.reader(f)                  #reads nonholed data
    _ = next(reader)                        #ignores header
    data6 = list(reader)                    #creates a list of read data

##with open("specimen_7_nonholed.csv") as f:    
##    reader = csv.reader(f)                  #reads nonholed data
##    _ = next(reader)                        #ignores header
##    data7 = list(reader)                    #creates a list of read data

with open("specimen_8_nonholed.csv") as f:    
    reader = csv.reader(f)                  #reads nonholed data
    _ = next(reader)                        #ignores header
    data8 = list(reader)                    #creates a list of read data

with open("specimen_9_nonholed.csv") as f:    
    reader = csv.reader(f)                  #reads nonholed data
    _ = next(reader)                        #ignores header
    data9 = list(reader)                    #creates a list of read data

with open("specimen_10_nonholed.csv") as f:    
    reader = csv.reader(f)                  #reads nonholed data
    _ = next(reader)                        #ignores header
    data10 = list(reader)                    #creates a list of read data

with open("specimen_11_nonholed.csv") as f:    
    reader = csv.reader(f)                  #reads nonholed data
    _ = next(reader)                        #ignores header
    data11 = list(reader)                    #creates a list of read data

with open("specimen_12_nonholed.csv") as f:    
    reader = csv.reader(f)                  #reads nonholed data
    _ = next(reader)                        #ignores header
    data12 = list(reader)                    #creates a list of read data

with open("specimen_13_nonholed.csv") as f:    
    reader = csv.reader(f)                  #reads nonholed data
    _ = next(reader)                        #ignores header
    data13 = list(reader)                    #creates a list of read data

with open("specimen_14_nonholed.csv") as f:    
    reader = csv.reader(f)                  #reads nonholed data
    _ = next(reader)                        #ignores header
    data14 = list(reader)                    #creates a list of read data

with open("specimen_15_nonholed.csv") as f:    
    reader = csv.reader(f)                  #reads nonholed data
    _ = next(reader)                        #ignores header
    data15 = list(reader)                    #creates a list of read data

##print("Der Maximalwert (nonholed) lautet: ", max(float(row[1])*100 for row in data1), "%")
##print("Der Maximalwert (holed) lautet: ", max(float(row[1])*100 for row in data2), "%")
##print("Der Maximalwert (patched) lautet: ", max(float(row[1])*100 for row in data3), "%")
    
achse_y1 = list(float(row[2])*100 for row in data1)
achse_y2 = list(float(row[2])*100 for row in data2)
achse_y3 = list(float(row[2])*100 for row in data3)
achse_y4 = list(float(row[2])*100 for row in data4)
achse_y5 = list(float(row[2])*100 for row in data5)
achse_y6 = list(float(row[2])*100 for row in data6)
##achse_y7 = list(float(row[2])*100 for row in data7)
achse_y8 = list(float(row[2])*100 for row in data8)
achse_y9 = list(float(row[2])*100 for row in data9)
achse_y10 = list(float(row[2])*100 for row in data10)
achse_y11 = list(float(row[2])*100 for row in data11)
achse_y12 = list(float(row[2])*100 for row in data12)
achse_y13 = list(float(row[2])*100 for row in data13)
achse_y14 = list(float(row[2])*100 for row in data14)
achse_y15 = list(float(row[2])*100 for row in data15)

plt.plot(achse_t1,achse_y1, label="1")
plt.plot(achse_t2,achse_y2, label="2")
plt.plot(achse_t3,achse_y3, label="3")
plt.plot(achse_t4,achse_y4, label="4")
plt.plot(achse_t5,achse_y5, label="5")
plt.plot(achse_t6,achse_y6, label="6")
##plt.plot(achse_t7,achse_y7, label="7")
plt.plot(achse_t8,achse_y8, label="8")
plt.plot(achse_t9,achse_y9, label="9")
plt.plot(achse_t10,achse_y10, label="10")
plt.plot(achse_t11,achse_y11, label="11")
plt.plot(achse_t12,achse_y12, label="12")
plt.plot(achse_t13,achse_y13, label="13")
plt.plot(achse_t14,achse_y14, label="14")
plt.plot(achse_t15,achse_y15, label="15")

                
plt.xlabel('e_y [%]')
plt.ylabel('e_xx [%]')
plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3, ncol=2, borderaxespad=0.)
plt.show()
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@TheLüddy: sobald man anfängt Variablen durchzunummerieren, sollte man eine Liste verwenden. Statt das csv-Modul und händisches Konvertieren, benutze numpy.loadtxt.
TheLüddy
User
Beiträge: 20
Registriert: Freitag 27. April 2018, 10:17

Könntest du mir ein Beispiel geben was ich hier anders machen müsste? Ich verstehe deine Aussage, jedoch mangelt es mir an Können um diese auch korrekt umzusetzen.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Wo hakt es denn? Schleifen und Listen kennst Du doch schon.

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt

data = []
achsen = []
for i in range(1,16):
    data.append(np.loadtxt("specimen_{}_nonholed.csv".format(i), skiprows=1))
    achsen.append(np.arange(0, 0.00125 * data[-1].shape[0], 0.00125))

for nr, (t, y) in enumerate(zip(achsen, data)):
    plt.plot(t, y[:, 2] * 100, label="{}".format(nr))
plt.xlabel('e_y [%]')
plt.ylabel('e_xx [%]')
plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3, ncol=2, borderaxespad=0.)
plt.show()
Muß man die Zahlen für die t-Achse wirklich berechnen, oder sind die nicht in den csv-Dateien enthalten?
TheLüddy
User
Beiträge: 20
Registriert: Freitag 27. April 2018, 10:17

vielen Dank! Nun ja ich verstehe dein Programm, habe es jedoch irgendwie alleine nicht geschafft. Nun ist leider das Problem, dass bei der CSV File als erstes immer der Name kommt, und erst dann die Zahlen. Folglich kommt der Fehler sobald das Programm die erste Zeile auslesen will.

Code: Alles auswählen

ValueError: could not convert string to float: '"untitled-0044_0.out",0,0,0,0,0,0,0,0,0,0'
Kann ich irgendwie den ersten Wert rauslöschen? 'usecols' in der np.loadtext Einstellung funktioniert nicht.
Ich wollte in data einfach bei jeder list die erste Position rauslöschen, was aber auch nicht geht, da der Fehler schon bei der "data.append" Zeile auftaucht.

für die t-Achse ist es so, dass die csv-Files verschieden viele Einträge besitzen. So hat vielleicht specimen_1_nonholed 40 Einträge, specimen_2_nonholed vielleicht aber 45. Somit wusste ich mir nicht besser zu helfen als alle einzeln zu schreiben ^^




EDIT:
Ich vestehe wohl doch noch nicht alles. Bei der Zeile:

Code: Alles auswählen

achsen.append(np.arange(0, 0.00125 * data[-1].shape(0), 0.00125))
Was macht das 0.00125*data[-1].shape[0], bzw wieso data[-1]? shape(0) gibt ja die Anzahl Zeilen an, um diese dann mit 0.00125 zu multiplizieren.
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

0.00125 ist die Schrittweite Deiner t-Werte. Die Frage ist aber, warum stehen diese t-Werte nicht in irgendeiner Spalte (z.B. der zweiten).

`usecols` funktioniert wunderbar. Was hast Du versucht?
TheLüddy
User
Beiträge: 20
Registriert: Freitag 27. April 2018, 10:17

Nun die t-Werte stehen nicht in der CSV datei, da das Programm welche diese CSV generiert, Bilder analysiert. Jede Zeile beinhaltet verschiedene Daten welches einem Bild zugeordnet werden. Diese Bilder wurden separat in einem vorherigen Prozess mit einer Geschwindigkeit von 2 Bilder per Sekunde geschossen. Somit weiss das Programm nicht zu welcher Zeit welches Bild geschossen wurde, und kann dies dementsprechend nicht zuordnen.
Ich könnte jedoch eine Funktion anwenden, welche die Nummerierung der Zeile in eine gewisse Zeit umwandelt - oder?
(Hoffe ist klar genug was ich meine ^^)

Wollte usecols so einfügen:

Code: Alles auswählen

data.append(np.loadtxt("specimen_{}_holed.csv".format(i), skiprows=1, usecols=()))
Bin mir nur nicht sicher was in die Klammer kommt, da usecols ja die Zeilen rauspickt welche verwendet werden sollen. Soll ich also die Zeile so schreiben?

Code: Alles auswählen

data.append(np.loadtxt("specimen_{}_holed.csv".format(i), skiprows=1, usecols=(1,2,3,4,5,6,7,8,9,10)))

EDIT:
Der Fehler folgt:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\patri\Desktop\Data\Excel holed\extract_exx_vs_eyy_holed.py", line 27, in <module>
    data.append(np.loadtxt("specimen_{}_holed.csv".format(i), skiprows=1, usecols=(1,2,4,5,6,7,8,9,10)))
  File "C:\Users\patri\AppData\Local\Programs\Python\Python36-32\lib\site-packages\numpy\lib\npyio.py", line 1092, in loadtxt
    for x in read_data(_loadtxt_chunksize):
  File "C:\Users\patri\AppData\Local\Programs\Python\Python36-32\lib\site-packages\numpy\lib\npyio.py", line 1012, in read_data
    vals = [vals[j] for j in usecols]
  File "C:\Users\patri\AppData\Local\Programs\Python\Python36-32\lib\site-packages\numpy\lib\npyio.py", line 1012, in <listcomp>
    vals = [vals[j] for j in usecols]
IndexError: list index out of range
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast Komma-separierte Zellen, also

Code: Alles auswählen

data.append(np.loadtxt("specimen_{}_holed.csv".format(i), skiprows=1, usecols=(1,2,3,4,5,6,7,8,9,10), delimiter=','))
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Hallo Sirius3,
ich gehe davon aus, du bist ein alter Python Fuchs, ich bin erst seit 5 Monaten dabei
aber sind F-Strings nicht etwas mehr "pythonic"?

Code: Alles auswählen

data.append(np.loadtxt(f"specimen_{i}_holed.csv", skiprows=1, usecols=(1,2,3,4,5,6,7,8,9,10), delimiter=','))
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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

@ThomasL f-strings sind neu. Ich hab die noch gar nicht genutzt. Macht der Gewohnheit. Persönlich muss ich sagen bin ich noch ein bisschen unsicher, wie gut ich die finde. Bei Ruby gibt es dieses Feature schon immer, und da hat’s mich erstmal abgestoßen.
Antworten