Daten auswertung mit Python ideen gesucht?
Servus ich brühte gerade über meinen Daten. ich habe mal einen Standard Graphen angehängt. Ich habe effektiv viele Datensätze die dem bsp plot ähnlich sehen. Ich muss immer den Hochpunkt und diesen 2 "Hügel" extrahieren. Benötigen tue ich nur den x Wert.
Erstmal der Graph:
Nun dachte ich erst dass ich einfach über mein array die amin und amax Funktion drüber rennen lasse, dies hat nicht so recht funktioniert (makiert im ersten Diagramm).
Der 2 Ansatz war dass ich die numerische Ableitung bilde ( Also einfach die Steigung?) und die mal plotte.
Nun ist mir klar dass ich einfach immer den bereich suche in dem meine Steigung "Konstant" ist. Nun stehe ich gerade einwenig auf dem Schlauch wie ich dass gut machen könnte? Dachte an einen Dynmaischen Mittelwert der immer aus x Datenpunkten generiert wird um den Datenpunkt den ich gerade überprüfen möchte. Ist aber auch nicht so gut umsetzbar.
Wäre super wenn jemand eine idee hat.
5 Antworten
Also ich hab mal ein bisschen rumprobiert.
Der erste rote Strich ist das Maximum. Dann geht es weiter mit jeweils Grün für Start und Rot für Ende.
Der Code ist hier: https://pastebin.com/yu0kPqu8
Ich habe jetzt in Jupyter Notebook einfach mal drauf losgetippt und mir die Zwischenergebnisse immer mal angesehen. Also es dürfte klar sein, dass man noch einiges verkürzen und verbessern kann.
Zudem kann es sein dass man ein paar Parameter dynamisch anpassen müsste. Vielleicht abhängig von der Anzahl der Samples...

Nicht wirklich. Ich meine es klappt für ein paar datensätze, aber bei weitem nicht für alle. Deshalb habe ich nun angefangen von Hand abzulesen, da mein Betreuer schon einwenig ungeduldig wurde. Ich denke wenn ich nochmal zeit habe schaue ich nach einem anderem ansatz. ggf. Sogar einfach mit bildanalyse und nicht mit grafik analyse? Mal schauen. Nun muss ich erstmal ein paar ergebnisse liefern damit wir weiter kommen. Danke nochmal für dein Hilfe und deine Zeit
Es ist vielleicht nicht besonders mathematisch, aber für die von dir zur Verfügung gestellten Daten komme ich auf gute Werte.
Klar ist mir auch, dass man je nach Kurvenverlauf noch die ein oder andere Abwandlung entwickeln müsste....
Ich hoffe dir hilft es erstmal etwas weiter.
Andererseits dachte ich an Kreuzkorellation, aber ich denke das wird auch nicht ganz einfach, wegen den unterschiedlichen Datensätzen...
Hey danke erstmal für deine Zeit.
ich habe in rot nochmal eingezeichnet welche werte ich bestimmen möchte. Blau/Grüne sind die werte die ich aktuell bestimme mit amax und amin. Ledilich der Grüne ist gewollt die beiden blauen sind sozusagen versetzt. D.h. ich denke ich komme hier nicht mit amin und amax weiter.
https://pastebin.com/eD0gUsiP hier der datensatz

@Kreasteve Edit: wusste nicht ob ich personen makieren kann
Leider kann man keine Punkte fix setzen. Es handelt sich quasi um Halbwertszeiten welche varrieren, je nach Experiment Konstellationen um Faktor 100.
hinzu kommt dass das 2. maxima nicht immer vorhanden ist. oder es erst auf null absinkt und dann nochmal steigt bevor es wieder auf null absinkt.
Die Minima und Maxima erhält man, wenn man die erste Ableitung 0 setzt. Also müsstest du in deinen Daten heraus finden wann das Vorzeichen gewechselt wird.
Aber ich denke es ist besser wenn du das maximum mit max() suchst. In einer Liste kannst du dann mit a.index(a.max()) den x Wert ermitteln. Hast du eine Liste in der x dem Index entspricht? Oder stehen die x Werte mit im array/dict?
Vielleicht kannst du ja mal einen Datensatz auf pastebin.com teilen und hier verlinken... Oder gar dein ganzes Programm mit einer mit Daten gefüllten variable.
Nur frage ich mich gerade welche zwei weiteren Hügel du finden willst. In deinen Diagrammen sehe ich keine. Was meinst du damit?
Hey danke für deine Zeit habe unten nochmal eine Antwort gemacht um nochmal bilder zu teilen dort habe ich auch einen pastebin erstellt und effektiv auf deine Antwort reagiert.
Was für ein Problem siehst Du beim finden des globalen Maximums? Das sieht doch ganz gut aus.
Das zweite lokale Maximum ist schwierig zu finden. Üblicherweise führen numerische ableitungen zu starkem Rauschen und jedes Gezappel wird dabei noch schlimmer. Ich kenne als Lösung, eine Glättungsfunktion drüber zu legen. Müsste es irgendwo im numpy oder scipy auch geben, ist aber m.e. auch nicht schwer zu programmieren.
ich hatte einwenig gehofft ums glätten drumherum zu kommen : D
Hey dir auch erstmal vielen Dank für deine Zeit.
Ja Das erste maximum ist auch echt nicht dass Problem, dies geht gut mit (array.amax). Das treffe ich bei meinen Daten schon recht exakt. Es geht mir nun wirklich darum das ich das 2 maximum (bzw. Plateau) treffe. Habe in einer Seperaten Antwort nochmal genau makiert welche werte ich effektiv rausziehen muss.
Vielleicht hilft das noch. Ich denke ums Glätten kommst Du nicht rum.
http://www.statistics4u.info/fundstat_germ/cc_filter_savgolay.html
Naja gut wenn ich nun meine Kurve gegelättet und abgeleitet habe wie komme ich dann an meine Gewollten Punkte? Ich meine dann einfach via for schleife abfragen ib der punkt nah genug an null dran ist würde mir nun einfallen oder fällt dir was besseres ein?
Noch eine andere Vorgehensweise: Du findest den Hauptpeak und dann das "Plateau" am Ende.
Relevant ist der Bereich dazwischen, dort suchst Du nach ableitung=0 (oder klein genug, denn möglicherweise macht Di die Glättung aus den schwachen Maxima Terrassenpunkte, da fehlt mir jetzt das Gefühl)
Die Ableitung mit vorheriger glättung über http://scipy.github.io/devdocs/generated/scipy.signal.savgol_filter.html#scipy.signal.savgol_filter
sieht so aus:

Ja super, passt doch! Bei 4.5 oder etwas drüber ist die ableitung 0. Da ist der zweite Peak.
ja gut das sehe ich auch aber ich will dass eigentlich nicht mehr ablesen ^^
Ich schau mal wie sehr das ganze null ist und ob ich dass über ein if rausbekomme
Ich habe schon verstanden, dass das automatisch bestimmt werden soll ;-)
Wie ist das denn mit den Nulldurchgängen der ableitung? Du hast natürlich zwei, denn vor dem Maximum kommt nochmal ein schwache ausgeprägtes Minimum.
Die Nulldurchgänge können doch auch programmtechnisch bestimmt werden. Oder zappelt das zu sehr um die Null rum? Zeige doch mal den ausschnitt von x~4.5 bis 5
Hey Das habe ich versucht, dass zappelt leider viel zu sehr rum. Ich müsste dafür den bereich sehr groß setzen. Irgendwie doof. Naja dass was der Kollege weiter oben vorgeschlagen hat ist auch nur eine "Semi" Autmatisierte Lösung. Ich denke der Ansatz über die Null durchgänge ist am besten. Aber da mein Betreuer schon einwenig ungeduldig wurde habe ich angefangen die Werte von hand einzulesen...
ja macht sinn soweit. Vielen Dank ich schau mal morgen Abend nochmal genauer rein bin ehrlich gesagt recht müde. Vielen Dank! Sieht aufjedenfall hilfreich aus. dass was du da mit r machst habe ich mir effektiv auch überlegt aber keinen ordentlichen Weg gefunden wie ich dass machen soll.