Seite 1 von 1

Anzahl pro Minute / Hochrechnung

Verfasst: Freitag 25. November 2022, 10:42
von cbesi
Hallo,

irgendwie fehlt mir ein Ansatz wie ich mein Problem lösen kann.

"Mein" googlen, brachte mir leider auch nicht den erhofften Gedankenblitz.

Vielleicht hat hier ja jemand einen Ansatz für mich.

Ich habe einen Wert, wenn dieser von 8 auf 6 wechselt wird die Anzahl einen hochgesetzt. Dies ist z.B. ein Pick von einem Band.

Nun möchte ich live anzeigen bei einem bestehenden Tempo, wie viele "Picks" pro Minute erfolgen würden / erfolgen.

Kann mir jemand auf die Sprünge helfen? Ich stocke bei zaehler +1 :-), bzw. wie ich es weiter angehe?

Re: Anzahl pro Minute / Hochrechnung

Verfasst: Freitag 25. November 2022, 10:57
von Sirius3
Bei dieser Frage fehlt sehr viel Kontext. Woher kommt der Wert, wo läuft das ganze?
Das wäre meine Lösung:

Code: Alles auswählen

if vorheriger_wert == 8 and aktueller_wert == 6:
    anzahl += 1

Re: Anzahl pro Minute / Hochrechnung

Verfasst: Freitag 25. November 2022, 11:11
von cbesi
Hi, Danke für deine Antwort, genau da stehe ich.
Ich denke ich habe es nicht gut erklärt.

Meine Anzahl wir bei jeder Änderung einmal hochgesetzt. So weit bin ich.

Aber wie kann ich es lösen das mir angezeigt wird, wie oft es pro Minute sein wird?

Also
Änderung 1 = 11:00:09
Änderung 2 = 11:00:12
Änderung 3 = 11:00:45

Das wäre 3 Picks pro Minute....

Re: Anzahl pro Minute / Hochrechnung

Verfasst: Freitag 25. November 2022, 11:32
von __deets__
Du merkst dir einfach die Zeitstempel in einer Liste. Mit zb dem bisect Modul ermittelst du den Index, der die Zeitstempel in die kleiner und die größer als eine Minute Teilt. Die Anzahl der ersteren ist deine PPM. Den Rest schmeißt du weg.

Re: Anzahl pro Minute / Hochrechnung

Verfasst: Freitag 25. November 2022, 11:45
von DeaD_EyE
Ich würde die Zeitstempel erfassen (mit Datum) und dann die Differenzen bilden. Aus den Zeitdifferenzen den Mittelwert bilden (in Sekunden). Dann 60 / Ergebnis.
Das sollten dann die picks pro Minute sein. Mit der queue aus collections kann man eine maximale Länge festlegen. Wenn die deque voll ist, werden die ältesten Einträge entfernt.


Code: Alles auswählen

import statistics
import time
from collections import deque
from datetime import datetime as DatetTime
from datetime import timedelta as TimeDelta
from itertools import pairwise
from random import uniform


class Picks:
    def __init__(self, queuesize=10):
        self.queuesize = queuesize
        self.queue = deque(maxlen=queuesize)

    def pick(self):
        now = DatetTime.now()
        print("Pick", now)
        self.queue.append(now)

    def forget(self, max_age_seconds):
        newer_than = DatetTime.now() - TimeDelta(seconds=max_age_seconds)
        self.queue = deque([dt for dt in self.queue if dt > newer_than], self.queuesize)

    @property
    def picks_per_minute(self):
        delta_times = [b - a for a, b in pairwise(self.queue)]
        try:
            median = statistics.median(delta_times)
        except statistics.StatisticsError:
            return 0.0
            
        return 60 / (median / TimeDelta(seconds=1))


p = Picks()

# 10 simulierte picks
for _ in range(10):
    p.pick()
    time.sleep(uniform(0.5, 5))

print(p.picks_per_minute)
# Einträge entfernen, die älter als 10 Sekunden sind
# p.forget(10)

Re: Anzahl pro Minute / Hochrechnung

Verfasst: Dienstag 29. November 2022, 07:55
von cbesi
Hallo DeaD_EyE,

vielen Dank für dein ausführliches Beispiel. Ich habe es ausprobiert, es macht genau das was ich wollte. Ich hatte zwischenzeitlich einen etwas umständlicheren Weg begonnen, mir die Timestamps in eine SQLite zu schreiben. Dann mit einem SQL zu berechnen. Aber dein Beispiel ist wesentlich besser, und die Lernkurve dadurch wesentlich steiler.

Vielen Dank dafür.....