Steigung vs. Wachstum

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.
Antworten
Benutzeravatar
pixewakb
User
Beiträge: 1407
Registriert: Sonntag 24. April 2011, 19:43

Hallo zusammen,

ich stehe momentan auf dem Schlauch und bräuchte mal Hilfe, um zu verstehen, was ich da eigentlich machen sollte:

Code: Alles auswählen

liste = [8, 5, 3, 2, 1.9, 1.8, 2, 4, 6, 8]


wachstum = []
for i, item in enumerate(liste):

    if i == 0:
        wachstum.append(float("NaN"))
    else:
        wachstum.append((item - liste[i - 1]) / liste[i - 1] * 100)


steigung = []
for i, item in enumerate(liste):

    if i == 0:
        steigung.append(float("NaN"))
    else:
        steigung.append((1 - 0) / (item - liste[i - 1]))



print("| Wert   | Wachs. | Steig. |")
print("+--------+--------+--------+")
for a, b, c in zip(liste, wachstum, steigung):
    print("| {:6.2f} | {:6.2f} | {:6.2f} |".format(a, b, c))
Liefert bei mir folgende Ergebnisse:

Code: Alles auswählen

| Wert   | Wachs. | Steig. |
+--------+--------+--------+
|   8.00 |    nan |    nan |
|   5.00 | -37.50 |  -0.33 |
|   3.00 | -40.00 |  -0.50 |
|   2.00 | -33.33 |  -1.00 |
|   1.90 |  -5.00 | -10.00 |
|   1.80 |  -5.26 | -10.00 |
|   2.00 |  11.11 |   5.00 |
|   4.00 | 100.00 |   0.50 |
|   6.00 |  50.00 |   0.50 |
|   8.00 |  33.33 |   0.50 |
Ich habe Listen mit Messwerten, die wie in Wellen-Form aussehen, nur leider nicht sehr elegant. Bildlich könnte ich von einer Achterbahn sprechen: Meine Werte fahren in der Achterbahn schnell hoch, wobei die Geschwindigkeit verlangsamt (die Werte wachsen langsamer), dann bleibt der Wagen fast oben stehen (die Werte verändern sich kaum noch), dann nimmt der Wagen wieder langsam Fahrt auf (die Werte steigen leicht) und dann geht es in voller Fahrt bergab (die Werte nehmen schnell zu), verlangsamen dann wieder, während sie unten fast zum stehen kommen (Geschwindigkeit bei fast 0) und beschleunigen dann wieder, wenn der Wagen den Berg wieder hochgezogen wird.

Ich sehe also in einem Chart, dass es oben und unten langsam wird. Bei einer Achterbahn könnte ich das ja auch sehen, nun versuche ich einen Weg zu finden, um das irgendwie - einfach - mathematisch darzustellen. Ich habe das Wachstum zwischen zwei Werten berechnet und ich habe die Steigung zwischen zwei Werten berechnet, nur leider passen die Werte nicht zu dem, was ich sehen will: Bei der Steigung ist der Wert unten am extremsten, während die Werte sich da kaum noch verändern (die Geschwindigkeit ist fast 0 und der Wagen kommt fast zum Stehen), was nicht zu meinem Bild passt. Beim Wachstum finde ich die Werte irgendwie extrem, ich hätte mir da eher "unten" etwas vorgestellt, was gegen 0 geht...

Es sollte auffallen, dass ich nicht viel mit Mathematik zu tun habe. Falls jemand eine Idee hat, wäre ich für einen Hinweis durchaus dankbar. Die Problembeschreibung bitte ich zu entschuldigen. Ich überlege momentan den Winkel zwischen einer Geraden durch zwei Messpunkte und einer imaginierten Horizontale durch meinen ersten Messpunkt zu berechnen. Da muss ich mir noch ansehen, wie ich Winkel berechne.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dieser Code den du da geschrieben hast ist umstaendlich und komisch. Du hast doch numpy? Dann reicht

Code: Alles auswählen

import numpy as np
liste = [8, 5, 3, 2, 1.9, 1.8, 2, 4, 6, 8]

a = np.array(liste)
print(np.diff(a))
Da kommt dann

Code: Alles auswählen

[-3.  -2.  -1.  -0.1 -0.1  0.2  2.   2.   2. ]
raus, wie es sein soll. Und das ist ja letztlich die Ableitung. Wie du daraus nun wiederum eine Steigung berechnen willst, ohne eine x-Schrittweite zu haben - das erschliesst sich mir nicht. Das gedividiere durch den Wert davor jedenfalls ist nichts, das mathematisch in meinen Augen Sinn ergeben wuerde.
Benutzeravatar
pixewakb
User
Beiträge: 1407
Registriert: Sonntag 24. April 2011, 19:43

Numpy kenne ich dem Namen nach, habe ich aber noch nie nutzen können. Pandas nutze ich, brauche ich aber auch nur sporadisch, das passt (noch) nicht in meinen workflow.

Auf die Berechnung der Differenzen bin ich noch gar nicht gekommen. Das könnte tatsächlich einfach und gut sein und mein Problem lösen.
Wie du daraus nun wiederum eine Steigung berechnen willst, ohne eine x-Schrittweite zu haben - das erschliesst sich mir nicht. Das gedividiere durch den Wert davor jedenfalls ist nichts, das mathematisch in meinen Augen Sinn ergeben wuerde.
Ich habe mir die Formel aus dem Wikipedia-Artikel https://de.wikipedia.org/wiki/Steigung geholt:

m = (y2 - y1) / (x2 - x1)

Ich habe dank Deiner Rückmeldung einen Fehler in meiner Formel entdeckt und erhalte jetzt:

Code: Alles auswählen

| Wert   | Wachs. | Steig. |
+--------+--------+--------+
|   8.00 |    nan |    nan |
|   5.00 | -37.50 |  -3.00 |
|   3.00 | -40.00 |  -2.00 |
|   2.00 | -33.33 |  -1.00 |
|   1.90 |  -5.00 |  -0.10 |
|   1.80 |  -5.26 |  -0.10 |
|   2.00 |  11.11 |   0.20 |
|   4.00 | 100.00 |   2.00 |
|   6.00 |  50.00 |   2.00 |
|   8.00 |  33.33 |   2.00 |
Das ist also genau das, was Du gezeigt hast, nur die Differenz zwischen den zwei Werten... DANKE!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

pandas besteht doch auf numpy? Oder nicht? Doch: https://github.com/pandas-dev/pandas/bl ... tup.py#L38

Insofern benutz das doch einfach, wie du siehst, macht es dieses Problem voellig trivial.

Und deine Formel ist zwar richtig, aber wie gesagt - du *HAST* kein x. Bei einer eindimensionalen Liste von Werten gibt es doch kein x. Das kann man dann nur konstant annehmen. Womit alles was deine Steigung ist, im Grunde nur die Ableitung mal irgendeinem Faktor ist. Somit ohne Erkenntnisgewinn.
Benutzeravatar
pixewakb
User
Beiträge: 1407
Registriert: Sonntag 24. April 2011, 19:43

In meinen Workflow passt pandas momentan nicht rein und für die Einarbeitung in numpy fehlt mir momentan die Zeit. Ich habe eine etwas längere Bug- und Wish list und komme da nicht aus dem Brei.

Mein Workflow ist grob: Ich lade Datasets, verarbeite die mit eigenen Bibliotheken und erzeuge dann Berichte über die Berechnungen. Die eigenen Bibliotheken sind m. E. nicht wirklich pandas-fähig oder ich sehe das momentan noch nicht. (Dafür fehlt mir auch etwas die Zeit.)

Ich muss in vielen Datasets die langsamen Achterbahn-Strecken finden, daher denke ich momentan noch, dass es mir hilft und Erkenntisgewinn liefert. Möglicherweise fehlt mir auch das mathematische Verständnis, um deine Kritik zu verstehen.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn wir uns oben deine Liste anschauen, mit den Werten die du vorgegeben hast, und dann die Formel hernehmen, die du aus der Wikipedia hast - dann ist welcher Wert in der Formel welcher? ZB fuer die erste (berechenbare) Steigung, natuerlich nicht dein NAN-Kram?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Oder anders gesagt: fuer eine Steigung braucht es ZWINGEND zwei Werte: den y-Abschnitt, und den x-Abschnitt.

Wenn ich jede Stunde die Temperatur messe, und in eine *EINDIMENSIONALE* Liste so wie du eintrage, dann kommen dabei Werte herum.

[22, 24, 30, 28, 27 , 25]

Dazu gehoert dann aber die zweite Liste mit den Stunden:

[10, 11, 12, 13, 14, 15]

Womit die Steigung fuer den ersten Abschnitt (24 - 22) / (11 - 10) == 2 ist.

Wo sind deine Stunden? Ich sehe nur Temperaturwerte.
Benutzeravatar
pixewakb
User
Beiträge: 1407
Registriert: Sonntag 24. April 2011, 19:43

Ich habe gedanklich die zweiten Werte auf 0 und 1 gesetzt. Ich vermute mal, dass du mir sagen möchtest, dass ich nur die Zuwächse berechne und keine Steigung?
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich weiß nicht genau was du mit Zuwachs meinst. Alles was du (sinnvoll) berechnen kannst ist die Differenz zwischen zwei aufeinander folgenden werten. Das ist dann die Steigung (oder numerische Ableitung, das ist dann Synonym) wenn das Intervall zwischen der Erfassung der Werte gleich ist.

Wenn NICHT, dann haben die Differenzen wenig Aussagekraft.

Was sind denn das für Daten?
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@pixewakb: es lohnt sich schon, Nunpy mal anzuschauen, zumindest die Grundlagen. Das ist, wie __deets__ dir schon gezeigt hat, bei so Datenreihen wie hier extrem praktisch. Für den Anfang reicht es ja, mal über das Quickstart-Tutorial zu lesen: https://docs.scipy.org/doc/numpy/user/quickstart.html
Numpy hat des weiteren diverse Methoden für lineare Algebra an Bord.

Pandas kommt ja erst dann ins Spiel, wenn du verschiedene Datentypen hast (also z.B. eine Zeit-Werte Liste). Pandas kann ja pro Spalte einen Datentyp haben, bei Numpy ist ein Array immer der gleiche Datentyp.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei es bei Numpy auch Record-Arrays gibt, wo die Spalten unterschiedliche Typen haben können.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Wobei es bei Numpy auch Record-Arrays gibt, wo die Spalten unterschiedliche Typen haben können.
Ok, kannt ich nicht - nie gehört. Danke :-)

Kommt wahrscheinlich in der freien Wildbahn eher selten zum Einsatz?

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also vor Pandas vielleicht öfter. Und wenn man schon irgendwelche ”legacy”-Binärdaten hat die so vorliegen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@pixewakb: Du brauchst weder numpy noch pandas, sondern zunächst das Verständnis, warum es für Deine Problemstellung wichtig ist, eine zweite Dimension (Achse) zu haben (worauf __deets__ bereits hinwies). Selbst wenn die Daten äquidistant sein sollten, so fehlen zudem die jeweiligen zugehörigen physikalischen Dimensionen. Ohne diese Informationen haben sämtliche Berechnungen keine Aussagekraft.
Antworten