[PYTHON] Ich möchte die zulässige Ausfallzeit aus der Betriebsrate berechnen

Oft sprechen SLA usw. über die Betriebsrate und die zulässigen Ausfallzeiten, aber ich möchte in der Lage sein, schnell danach zu fragen.

Mathematisch ist es wie folgt.

Nutzungsrate= \frac{Gesamtzeit-Ausfallzeit}{Gesamtzeit}

Beispiel: "Wenn die Betriebsrate 99% beträgt, wie viel Aussetzung ist pro Monat oder Jahr zulässig?" Wird nicht in Zahlen angegeben. Schreiben wir also ein Programm, damit es berechnet werden kann. Es hat viel zweites Abkochen, aber lass es in Ruhe.

Ich würde es gerne in Python schreiben.

Annahme

Ein Monat ist 30 Tage (24 x 60 x 60 Sekunden).

Ein Jahr ist 365 Tage (365 x 24 x 60 x 60 Sekunden).

Bestätigte Python-Version.

$ python3 -V
Python 3.6.9

Thema

Finden Sie die folgenden drei.

Stellen Sie die oben genannten Informationen entweder anhand der Verfügbarkeitsrate, der monatlich zulässigen Ausfallzeit oder der jährlich zulässigen Ausfallzeit zur Verfügung.

Kurz gesagt, ich möchte etwas machen, das das andere Element sucht, wenn eines gegeben wird.

Außerdem ist die zulässige Stoppzeit in Einheiten von "s" (Sekunden), "m" (Minuten), "h" (Stunden) und "d" (Tage) anzugeben, und wenn sie weggelassen wird, ist sie als Sekunden zu interpretieren. Muss.

Das Ergebnis wird im Markdown-Tabellenformat ausgegeben.

Programm

Hier ist der, den ich erstellt habe.

calc.py

import datetime

year_time =  365 * 24 * 60 * 60
month_time = 30 * 24 * 60 * 60

units = {"s": "seconds", "m": "minutes", "h": "hours", "d": "days"}

def calc_from_percentage(percentage):
    stop_time_per_year_raw = year_time * ((100 - percentage) / 100)
    stop_time_per_month_raw = month_time * ((100 - percentage) / 100)

    def format_time(time):
        if time > 24 * 60 * 60:
            formatted_time = f"{time / (24 * 60 * 60):.2f}Tag"
        elif time > 60 * 60:
            formatted_time = f"{time / (60 * 60):.2f}Zeit"
        elif time > 60:
            formatted_time = f"{time / 60:.2f}Protokoll"
        else:
            formatted_time = f"{time:.2f}Sekunden"

        return formatted_time

    stop_time_per_year = format_time(stop_time_per_year_raw)
    stop_time_per_month = format_time(stop_time_per_month_raw)

    return (f"{percentage}%", stop_time_per_month, stop_time_per_year)

def calc_from_month_stop_time(stop_time):
    try:
        seconds = int(stop_time)
    except ValueError:
        t = int(stop_time[:-1])
        unit = units[stop_time[-1]]

        seconds = datetime.timedelta(**{unit: t}).total_seconds()
        
    percentage = 100 - ((seconds * 100) / month_time)
    return calc_from_percentage(percentage)

def calc_from_year_stop_time(stop_time):
    try:
        seconds = int(stop_time)
    except ValueError:
        t = int(stop_time[:-1])
        unit = units[stop_time[-1]]

        seconds = datetime.timedelta(**{unit: t}).total_seconds()
        
    percentage = 100 - ((seconds * 100) / year_time)
    return calc_from_percentage(percentage)

def print_table(percentages_or_stop_times, calc_func):
    print("|Nutzungsrate|Monatlich zulässige Ausfallzeit|Jährlich zulässige Ausfallzeit|")
    print("|:------:|:----------------:|:----------------:|")


    if isinstance(percentages_or_stop_times, list):
        targets = percentages_or_stop_times
    else:
        targets = [percentages_or_stop_times]

    for t in targets:
        result = calc_func(t)
        print(f"| {result[0]} | {result[1]} | {result[2]} |")

Wie benutzt man

Laden und starten Sie es in der interaktiven Shell von Python.

$ python3 -i calc.py 
>>> 

Ermitteln Sie die zulässigen Ausfallzeiten aus der Betriebsrate. Wenn Sie mehr als eine geben möchten, verwenden Sie die Liste.

>>> print_table(99, calc_from_percentage)
|Nutzungsrate|Monatlich zulässige Ausfallzeit|Jährlich zulässige Ausfallzeit|
|:------:|:----------------:|:----------------:|
| 99% | 7.20 Stunden| 3.65 Tage|


>>> print_table([90, 95, 99, 99.5, 99.9, 99.95, 99.99, 99.999, 99.9999], calc_from_percentage)
|Nutzungsrate|Monatlich zulässige Ausfallzeit|Jährlich zulässige Ausfallzeit|
|:------:|:----------------:|:----------------:|
| 90% | 3.00 Tage| 36.50 Tage|
| 95% | 1.50 Tage| 18.25 ..|
| 99% | 7.20 Stunden| 3.65 Tage|
| 99.5% | 3.60 Stunden| 1.82 ..|
| 99.9% | 43.20 Minuten| 8.76 Stunden|
| 99.95% | 21.60 Minuten| 4.38 Stunden|
| 99.99% | 4.32 Minuten| 52.56 Minuten|
| 99.999% | 25.92 Sekunden| 5.26 Minuten|
| 99.9999% | 2.59 Sekunden| 31.54 Sekunden|

Dies ist der Tisch, den ich wollte.

Nutzungsrate Monatlich zulässige Ausfallzeit Jährlich zulässige Ausfallzeit
90% 3.00 Tage 36.50 Tage
95% 1.50 Tage 18.25 ..
99% 7.20 Stunden 3.65 Tage
99.5% 3.60 Stunden 1.82 ..
99.9% 43.20 Minuten 8.76 Stunden
99.95% 21.60 Minuten 4.38 Stunden
99.99% 4.32 Minuten 52.56 Minuten
99.999% 25.92 Sekunden 5.26 Minuten
99.9999% 2.59 Sekunden 31.54 Sekunden

Berechnet aus der monatlich zulässigen Ausfallzeit.

>>> print_table("10", calc_from_month_stop_time)
|Nutzungsrate|Monatlich zulässige Ausfallzeit|Jährlich zulässige Ausfallzeit|
|:------:|:----------------:|:----------------:|
| 99.99961419753086% | 10.00 Sekunden| 2.03 Minuten|


>>> print_table(["3d", "10m", "10s", "10"], calc_from_month_stop_time)
|Nutzungsrate|Monatlich zulässige Ausfallzeit|Jährlich zulässige Ausfallzeit|
|:------:|:----------------:|:----------------:|
| 90.0% | 3.00 Tage| 36.50 Tage|
| 99.97685185185185% | 10.00 Minuten| 2.03 Stunden|
| 99.99961419753086% | 10.00 Sekunden| 2.03 Minuten|
| 99.99961419753086% | 10.00 Sekunden| 2.03 Minuten|

Ich dachte, die Anzahl der Stellen in Prozent wäre diesmal gut ...

Berechnet aus der jährlich zulässigen Ausfallzeit.

>>> print_table("30d", calc_from_year_stop_time)
|Nutzungsrate|Monatlich zulässige Ausfallzeit|Jährlich zulässige Ausfallzeit|
|:------:|:----------------:|:----------------:|
| 91.78082191780823% | 2.47| 30.00 Tage|


>>> print_table(["30d", "45m", "30s", "30"], calc_from_year_stop_time)
|Nutzungsrate|Monatlich zulässige Ausfallzeit|Jährlich zulässige Ausfallzeit|
|:------:|:----------------:|:----------------:|
| 91.78082191780823% | 2.47| 30.00 Tage|
| 99.99143835616438% | 3.70 Minuten| 45.00 Minuten|
| 99.99990487062405% | 2.47 Sekunden| 30.00 Sekunden|
| 99.99990487062405% | 2.47 Sekunden| 30.00 Sekunden|

So was.

Recommended Posts

Ich möchte die zulässige Ausfallzeit aus der Betriebsrate berechnen
Ich möchte den Dateinamen von DataLoader sehen
Ich möchte automatisch hochwertige Teile aus den von mir aufgenommenen Videos finden
Ich möchte Spyder an die Taskleiste anheften
Ich möchte kühl auf die Konsole ausgeben
Ich möchte mit dem Reim Teil1 umgehen
Ich möchte mit dem Reim part3 umgehen
Ich möchte ein Glas aus Python verwenden
Ich möchte den Fortschrittsbalken anzeigen
Ich möchte mit dem Reim part2 umgehen
Ich möchte mit dem Reim part5 umgehen
Ich möchte mit dem Reim part4 umgehen
Ich möchte nur ein Signal vom Sub-Thread zum Haupt-Thread senden
Ich möchte aus verschiedenen Sprachen eine Verbindung zu PostgreSQL herstellen
Ich möchte mit Python eine E-Mail von Google Mail senden.
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Ich möchte mit dem Reim part7 (BOW) umgehen
Ich möchte Passungen aus meinem Kopf machen
Ich möchte Ceres Solver aus Python verwenden
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
Ich möchte C ++ - Code aus Python-Code erstellen!
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich möchte die Aktivierungsfunktion Mish verwenden
Ich möchte den Fortschritt in Python anzeigen!
[LINE Messaging API] Ich möchte eine Nachricht vom Programm an alle LINE senden
[Ansible] Ich möchte meine eigene Funktion über das Vorlagenmodul (Makro) aufrufen.
Ich möchte Bilder von Katzen von Instagram erkennen
Ich habe versucht, Iris aus dem Kamerabild zu erkennen
Ich möchte das Ausführungsergebnis von strace erfassen
Ich wollte die Python-Bibliothek von MATLAB verwenden
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte die Grundlagen von Bokeh vollständig verstehen
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich möchte mit dem Reim part6 umgehen (einmal organisieren)
Ich möchte ssh mit dem Befehl expected automatisieren!
Ich möchte das Produkt zu den niedrigsten Kosten veröffentlichen
Ich habe die Chainer-Referenz gelesen (von Zeit zu Zeit aktualisiert).
Ich möchte R-Datensatz mit Python verwenden
Ich möchte mit dem Reim part8 umgehen (einmal fertig)
Ich möchte die Sicherheit der SSH-Verbindung erhöhen
[Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!
[TensorFlow] Ich möchte die Indizierung für Ragged Tensor beherrschen
Ich möchte initialisieren, wenn der Wert leer ist (Python)
Ich möchte das symbolische Linkziel von / lib64 unter CentOS von / usr / lib64 in / my-lib64 ändern
Ich möchte die von LINE an S3 gesendeten Fotos speichern
Ich möchte ssh mit dem Befehl expected automatisieren! Teil 2
maya Python Ich möchte die gebackene Animation wieder reparieren.
Ich möchte vorerst Selen bewegen [für Mac]
Ich möchte viele Prozesse von Python aus starten
Ich möchte nur die SudachiPy-Normalisierungsverarbeitung verwenden
Ich möchte Betriebsinformationen über die Yahoo-Route erhalten
Ich habe vom Terminal getwittert!
Ich möchte mit Numpy die japanische Flagge in die Palau-Flagge ändern
Berechnen des aus ABC134-D gelernten Rechenaufwands
Ich möchte SUDOKU lösen
[Python] Ich möchte die Option -h mit argparse verwenden
Ich möchte die Authentizität eines Elements eines numpy-Arrays bestimmen
Ich möchte das Paket aus den Anforderungen.txt mit Poesie installieren
Ich möchte eine Nachricht von Python an LINE Bot senden