Anzahl pro Minute / Hochrechnung

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
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

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?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

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
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

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....
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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)
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
cbesi
User
Beiträge: 41
Registriert: Dienstag 11. August 2020, 22:04

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.....
Antworten