Funktion mit Wertrückgabe in Python

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Guten Tag,

    wieder einmal hängt es bei mir mit dem WIE ;)

    Ich benötige eine Funktion, die welche mit der Rückgabe eine statistische Auswertung macht.

    Python
    def statistic(table):

    Jetzt möchte zu einem:

    - den Minimal- und Maximalwert von table als Tuple zurückgeben. Soweit kein Problem.

    Python
    return (min(table, max(table)), durchschnitt, trend)

    - den Durchschnittswerte ohne die beiden Extrema MIN und MAX

    -> hier habe ich absolut keine Idee für einen Lösungsansatz

    - und als letztes einen Trendbewertung der Einzelwerte aus table, mit dem Rückgabeergebnis "0" für alle Einzelwerte von table sind annähernd gleich, "1" für einen Aufwärtstrend und "-1" für einen Abwärtstrend.

    Danke :danke_ATDE: für eure Unterstützung

    es grüßt euer
    Willy

  • - den Durchschnittswerte ohne die beiden Extrema MIN und MAX

    -> hier habe ich absolut keine Idee für einen Lösungsansatz

    Ich gehe mal von einer Liste aus. Du willst also nicht den Durchschnitt

    Python
    durchschnitt = sum(table)/len(table)

    sondern den Mittelwert (https://docs.python.org/3/library/stat…atistics.median)

    Python
    import statistics
    
    #[]...
    
    mittelwert = statistics.median(table)

    Das mit dem Trend müsstest Du mal etwas aufführlicher beschreiben, denn ich schnalls nicht.

  • Guten Tag,

    Ich gehe mal von einer Liste aus. Du willst also nicht den Durchschnitt

    Im Prinzip hast du mit dieser Angabe sum(table) / len(table)  vollkommen recht. Nur sollten zuvor die Extrema Minimalwert, und Maximalwert zuvor aus der table irgendwie entfernt werden, und im Anschluss die Berechnung genauso durchgeführt werden.
    Das ich mit table.count(min(table)) bzw. table.count(max(table)) die Anzahl der beiden Extremstellen feststellen , soweit bin ich schon. Nur wie bekomme ich diese aus table gelöscht um die Durchschnittsberechnung durchzuführen ?

    Ja der Trend ist hat der Verlauf, wenn man das grafisch darstellen würde, dass man sagen könnte die Werte sind nun vermehrt steigend, oder abfallend, oder sie halten sich ungefähr alle im Bereich des mathematischen Durchschnittswertes auf.

    Danke

    es grüßt euer
    Willy

  • Guten Tag,

    dann verrate doch erstmal, welche Datenstruktur `table` hat. Ohne die Info ist keine sinnvolle Hilfe möglich.

    Entschuldigt bitte dieses Säumnis. Es sind positive Nachkommazahlen ( Float-Point ) im Bereich 10 bis ca 48.000. Table hat selber eine sehr unterschiedliche, laufzeitanhängige Länge / Umfang von minimum 500 Werten bis ca. 250.000 Einträgen.

    es grüßt euer
    Willy

  • Im Prinzip hast du mit dieser Angabe sum(table) / len(table) vollkommen recht. Nur sollten zuvor die Extrema Minimalwert, und Maximalwert zuvor aus der table irgendwie entfernt werden, und im Anschluss die Berechnung genauso durchgeführt werden.

    Dann mit einer zweiten temporären Liste arbeiten und aus der die beiden Werte entfernen.

    Python
    def statistic(table):
        
        temp_table=table.copy()
        temp_table.remove(min(table))
        temp_table.remove(max(table))
        
        durchschnitt = sum(temp_table)/len(temp_table)
        mittelwert = statistics.median(table)
       
        return (min(table), max(table), durchschnitt, mittelwert) 

    Den Mittelwert habe mal drinnen gelassen, damit Du einen Vergleich hast zum Durchschnitt.

    Zum Trend habe ich gerade keine Idee, wie man das umsetzen könnte..

  • Hallo,

    WillyR_aus_C : das beantwortet die Frage nicht nach der Datenstruktur von deinem ominösen "table"... ist das eine Liste, ein 1-dimensionaler Numpy Array, ein Array aus dem Python "array", ...?

    Zweite Frage: kommen Minima und Maxima genau 1x vor oder können die auch mehrfach vorkommen? Also z.B. [1, 2, 3, 4] vs. [1, 2, 1, 3, 4]? Wenn mehrfach: sollen alle Vorkommen von Minima und Maxima entfernt werden?

    Zitat

    - und als letztes einen Trendbewertung der Einzelwerte aus table, mit dem Rückgabeergebnis "0" für alle Einzelwerte von table sind annähernd gleich, "1" für einen Aufwärtstrend und "-1" für einen Abwärtstrend

    Definiere "annährend gleich"... und wie viele Werte müssen nicht "annährend gleich" sein, damit es einen Trend noch oben (oder unten gibt). Was ist, wenn X Elemente ein positiven Trend haben _und_ Y Elemente einen negativen?

    Ein IMHO simple Implementierung wäre, eine Trendlinie / Ausgleichsgrade durch alle Punkte zu legen und dann die Steigung der Geraden zu bestimmen. Ob das für dich ausreicht muss du entscheiden. Wenn die Werte stark schwanken bekommst du ziemlich sicher einen schlechten R Quadrat Wert. Je niedriger R Quadrat ist, desto ungenauer ist der Trend.

    Gruß, noisefloor

  • Guten Abend,

    Den Mittelwert habe mal drinnen gelassen, damit Du einen Vergleich hast zum Durchschnitt.


    Zum Trend habe ich gerade keine Idee, wie man das umsetzen könnte..

    Wenn ich das jetzt anhand der Rückgabewerte richtig sehe, oder verstehe, dann ist dieses statistische Mittel sowas wie wieder ein Durchschnittswert des Bereiches in dem die meisten Werte anzutreffen sind ? Ich habe mir mal die ganzen Werte in ein Tabelle geladen und mit Excel grafisch angesehen, dann ist dieser median() Wert so etwas wie wo ungefähr die meisten Werte aus table in der Nähe sind. So würde ich das jetzt interpretieren, obwohl mir dafür die mathematischen Kenntnisse fehlen. Ich habe auch schon mit den ganzen anderen Funktionen herumgespielt, die mit in der Anleitung aufgeführt waren. Jedoch einen Trendverlauf steigend, gleichbleibend oder fallend habe ich dabei nicht heraus bekommen.
    Danke für diese ersten Lösungsschritte und deine Unterstützung

    es grüßt euer
    Willy

  • Guten Abend,

    das beantwortet die Frage nicht nach der Datenstruktur von deinem ominösen "table"... ist das eine Liste, ein 1-dimensionaler Numpy Array, ein Array aus dem Python "array", ...?

    Es ist eine Liste die in der Hauptroutine mit .append(<Float>) gefüttert wird. Ja es ist nur eine Reihe, oder wie du wahrscheinlich mit 1-Dimensional meinst.

    Zweite Frage: kommen Minima und Maxima genau 1x vor oder können die auch mehrfach vorkommen? Also z.B. [1, 2, 3, 4] vs. [1, 2, 1, 3, 4]? Wenn mehrfach: sollen alle Vorkommen von Minima und Maxima entfernt werden?

    Das kann ich dir leider jetzt noch nicht eindeutig sagen, ob es möglich sein könnte, daß diese Extrema mehrfach auftreten können. Wenn dann sollten jedoch alle entfernt werden.

    Definiere "annährend gleich"... und wie viele Werte müssen nicht "annährend gleich" sein, damit es einen Trend noch oben (oder unten gibt). Was ist, wenn X Elemente ein positiven Trend haben _und_ Y Elemente einen negativen?

    Ein IMHO simple Implementierung wäre, eine Trendlinie / Ausgleichsgrade durch alle Punkte zu legen und dann die Steigung der Geraden zu bestimmen. Ob das für dich ausreicht muss du entscheiden. Wenn die Werte stark schwanken bekommst du ziemlich sicher einen schlechten R Quadrat Wert. Je niedriger R Quadrat ist, desto ungenauer ist der Trend.

    Ja, wie soll ich das jetzt am einfachsten beschreiben ? Aber ich versuche es mal so, um eine Versinnbildlichung zu erreichen.
    Nehmen wir an, diese Tabelle / Liste ist die Fortschreibung der aktuellen Tagestemperatur. Diese Auswertung erfolgt nun nach gewissen festen immer wiederkehrenden Zeitabständen. Also wenn die Aufzeichnung Mitternacht beginnen würde wäre es "Arschkalt", dann gegen 8 Uhr geht die Sonne auf, also haben wir ein tendenziellen Anstieg der Temperatur. Mittag schneit es dann, die Temperaturen sinken wieder also haben wir wieder einen Abwärtstrend. Nachmittags kommt nochmal die Sonne raus, und die Temperaturen steigen wieder. Aber am Ende der Aufzeichnung, wäre einfach nur der erste mit dem letzten Wert zu vergleichen um einen Gesamttrend / Temperaturentwicklung darstellen zu können, oder eine entsprechende Aussage zu treffen. Falls es dir weiter helfen würde, ich kann den Punkt genau bestimmen, wann eine Aufzeichnung beginnt und endet, und dann die nächste Aufzeichnung beginnt. Die Temperatur ist jetzt nur als Beispiel genannt. Genaugenommen es sind Prozesszeiten in Millisekunden.

    es grüßt euer
    Willy

  • Hallo,

    wenn das min und max mehrfach vorkommen können, dann kannst du alle Vorkommen so entfernen:

    Python
    >>> data = [1, 2, 3, 1, 4, 2, 4]
    >>> min = min(data)
    >>> max = max(data)
    >>> cleaned_data = [x for x in data if x > min and x < max]
    >>> cleaned_data
    [2, 3, 2]
    >>>

    Den Punkt mit dem Trend verstehe ich nach deiner Erklärung nicht mehr... wenn du die Punkte kennst, dann brauchst du die Wert doch nur subtrahieren, das Vorzeichen des Ergebnis prüfen und dann noch schauen, ob die Differenz im Bereich "fast gleich" oder "nicht fast gleich" ist.

    Gruß, noisefloor

  • Guten Abend,

    Danke @Tell für dein Codebeispiel.

    Leider habe ich keine Ahnung wie ich das Einordnen soll.
    Du verwendest hier "Willyconst".

    Deswegen habe ich mal eine Ausgabe erstellt, die Wertebereinigt um die Extrema wie dargestellt aussieht.
    Wo würde jetzt WILLLYCONST liegen ?

    Danke im Voraus

    es grüßt euer
    Willy

  • Sorry, falscher Index. So passt es:

    Die gewaltigen Ausreisser in den Daten koennen aber die Ergebnisse verfaelschen!

  • Guten Abend,

    Sorry, falscher Index. So passt es:

    Danke. Tippfehler können doch mal passieren, solange sie bemerkt werden ist doch die Welt in Ordnung. Ich werde mal diese Nacht wieder Werte sammeln lassen, und melde mich bei Rückfragen noch einmal.

    Danke erst einmal für die tolle Unterstützung.

    es grüßt euer
    Willy

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!