Zum Inhalt

Modelle erstellen

Die zentrale Klasse ist FairModel. Jede Instanz steht für ein FAIR-Modell mit eigenem Abhängigkeitsbaum, Eingabe-Parser und Berechnungswerk.

Konstruktor

FairModel(name, n_simulations=10_000, random_seed=42,
          model_uuid=None, creation_date=None)
Parameter Bedeutung
name Menschenlesbare Bezeichnung.
n_simulations Anzahl Monte-Carlo-Iterationen (mehr = genauer, langsamer).
random_seed Seed für Reproduzierbarkeit – gleicher Seed → gleiches Ergebnis.
model_uuid, creation_date Werden automatisch vergeben.

UUID/Datum

model_uuid und creation_date nicht selbst setzen – das ist nur für die JSON-Deserialisierung gedacht und kann sonst Dinge zerstören.

Faktoren eingeben

Ein FAIR-Modell wird befüllt, indem du einen Schnitt durch den FAIR-Baum eingibst: jeden Ast so weit herunterbrechen, bis du den Faktor schätzen kannst. Nur die Blätter deines Schnitts musst du eingeben – die Engine rechnet nach oben bis Risk.

model.input_data(target, **kwargs)

target ist der Faktorname, kwargs die Verteilungsparameter. Alle Eingabearten sind ausführlich unter Eingaben & Verteilungen beschrieben. input_data gibt das Modell zurück, ist also verkettbar:

(model
    .input_data('Loss Event Frequency', low=10, mode=20, high=100)
    .input_data('Loss Magnitude', constant=50_000)
    .calculate_all())

Weitere Eingabemethoden

Methode Zweck
input_data(target, **kwargs) Einzelner Faktor (Legacy oder strukturiert).
bulk_import_data(dict) Mehrere Faktoren auf einmal ({target: params}).
input_multi_data(target, dict) Mehrere Posten, die zu einem Faktor aggregieren (v. a. Sekundärverluste).
input_raw_data(target, array) Fertiges Sample direkt einspeisen (Länge = n_simulations).
model.bulk_import_data({
    'Loss Event Frequency': {'mean': 90, 'stdev': 10},
    'Loss Magnitude': {'constant': 4_000},
})

input_multi_data für mehrteilige Sekundärverluste (z. B. Reputation + Recht):

model.input_multi_data('Secondary Loss', {
    'Reputation': {
        'Secondary Loss Event Frequency': {'constant': 0.4},
        'Secondary Loss Event Magnitude': {'low': 10_000, 'mode': 20_000, 'high': 100_000},
    },
    'Recht': {
        'Secondary Loss Event Frequency': {'constant': 0.2},
        'Secondary Loss Event Magnitude': {'low': 5_000, 'mode': 15_000, 'high': 60_000},
    },
})

Rohdaten

input_raw_data speichert das komplette Array unkomprimiert in der Modell-JSON (es lässt sich nicht aus Parametern reproduzieren). Das kann serialisierte Modelle stark aufblähen.

Rechnen

model.calculate_all()

Berechnet alle noch offenen Knoten. Sind die nötigen Eingaben unvollständig, wird eine FairException mit den Knoten-Status geworfen. Prüfen lässt sich das vorab mit:

model.calculation_completed()   # bool
model.get_node_statuses()       # pandas.Series: Knoten -> Status

Mögliche Status sind u. a. Supplied (eingegeben), Calculable (berechenbar), Calculated (fertig) und Required (fehlt noch).

Reihenfolge der Vulnerability

Intern wird Vulnerability aus Threat Capability (TC) und Control Strength (CS) berechnet (TC vs. RS/CS) – die Engine berücksichtigt dabei die korrekte Reihenfolge automatisch.

Ergebnisse exportieren

Methode Rückgabe
export_results() pandas.DataFrame – eine Spalte je Faktor, eine Zeile je Simulation.
export_results_csv(output_path=None, sep=';', decimal=',', index=False) Schreibt die Ergebnistabelle als CSV (Default deutsche Trennzeichen) und gibt den Pfad zurück.
export_params() Aufgelöste Eingabeparameter (Dictionary).
df = model.export_results()
df['Risk'].quantile([0.5, 0.9, 0.95])     # Median, P90, P95
model.export_results_csv('ergebnis.csv')

Faktornamen & Abkürzungen

input_data versteht Voll- und Kurznamen (Groß-/Kleinschreibung egal):

Faktor Abkürzungen
Loss Event Frequency LEF
Threat Event Frequency TEF
Vulnerability V, S, Susceptibility
Contact Frequency C, CF
Probability of Action A, PoA, POA
Threat Capability TC
Control Strength CS
Loss Magnitude LM
Primary Loss PL
Secondary Loss SL
Secondary Loss Event Frequency SLEF
Secondary Loss Event Magnitude SLEM

Inspektion

Methode Rückgabe
get_name() Modellname.
get_uuid() Eindeutige Modell-ID.
get_node_statuses() Status je Knoten.
calculation_completed() Ob alle Abhängigkeiten erfüllt sind.

Speichern/Laden als JSON behandelt das Kapitel Serialisierung & Datenbank.