Seite 1 von 1

Extremwerte von Graphen entfernen und zu einem zusammenfassen

Verfasst: Donnerstag 17. Mai 2018, 12:35
von TheLüddy
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()

Re: Extremwerte von Graphen entfernen und zu einem zusammenfassen

Verfasst: Donnerstag 17. Mai 2018, 12:57
von Sirius3
@TheLüddy: sobald man anfängt Variablen durchzunummerieren, sollte man eine Liste verwenden. Statt das csv-Modul und händisches Konvertieren, benutze numpy.loadtxt.

Re: Extremwerte von Graphen entfernen und zu einem zusammenfassen

Verfasst: Donnerstag 17. Mai 2018, 14:57
von TheLüddy
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.

Re: Extremwerte von Graphen entfernen und zu einem zusammenfassen

Verfasst: Donnerstag 17. Mai 2018, 19:25
von Sirius3
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?

Re: Extremwerte von Graphen entfernen und zu einem zusammenfassen

Verfasst: Freitag 18. Mai 2018, 13:04
von TheLüddy
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.

Re: Extremwerte von Graphen entfernen und zu einem zusammenfassen

Verfasst: Freitag 18. Mai 2018, 13:40
von Sirius3
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?

Re: Extremwerte von Graphen entfernen und zu einem zusammenfassen

Verfasst: Freitag 18. Mai 2018, 14:47
von TheLüddy
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

Re: Extremwerte von Graphen entfernen und zu einem zusammenfassen

Verfasst: Samstag 19. Mai 2018, 09:30
von Sirius3
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=','))

Re: Extremwerte von Graphen entfernen und zu einem zusammenfassen

Verfasst: Montag 21. Mai 2018, 10:23
von ThomasL
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=','))

Re: Extremwerte von Graphen entfernen und zu einem zusammenfassen

Verfasst: Montag 21. Mai 2018, 11:46
von __deets__
@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.