In [2]:
# 📦 Importy
import json
from pathlib import Path
from collections import Counter
import matplotlib.pyplot as plt
import numpy as np

# 🔧 Ścieżki
INPUT_PATH = Path("../data/labeled/labeled_dockerfiles.jsonl")
TOP_RULES_PATH = Path("../data/metadata/top_rules.json")

# 🧪 Inicjalizacja zmiennych
labels_counter = Counter()
rules_counter = Counter()
rules_per_file = []
lines_with_errors_per_file = []
line_positions = []
lengths = []
fixable_counter = 0
unique_rules_with_fixes = set()

# 📂 Wczytywanie danych
with open(INPUT_PATH, encoding="utf-8") as f:
    for line in f:
        obj = json.loads(line)
        labels_counter[obj["label"]] += 1

        if obj["label"] == "bad":
            rules = obj.get("rules_triggered", [])
            rules_counter.update(rules)
            rules_per_file.append(len(rules))

            fixes = obj.get("fix_suggestions", {})
            if fixes:
                fixable_counter += 1
                unique_rules_with_fixes.update(fixes.keys())

            lines = obj.get("lines", {}).values()
            lines_with_errors_per_file.append(len(set(lines)))
            line_positions.extend(lines)

        lengths.append(len(obj["content"]))

print("✅ Dane wczytane.")
✅ Dane wczytane.
In [3]:
# 📊 Statystyki ogólne
print(f"✅ Good: {labels_counter['good']}")
print(f"❌ Bad:  {labels_counter['bad']}")
print(f"🧩 Unikalne reguły: {len(rules_counter)}")
print(f"🛠 Plików z co najmniej jednym możliwym fixem: {fixable_counter}")
print(f"🔧 Reguły z przypisanym fixem: {len(unique_rules_with_fixes)}")
✅ Good: 1500
❌ Bad:  15000
🧩 Unikalne reguły: 127
🛠 Plików z co najmniej jednym możliwym fixem: 15000
🔧 Reguły z przypisanym fixem: 49
In [4]:
# 🏆 Top 30 reguł
top_rules = rules_counter.most_common(30)
for code, count in top_rules:
    print(f"{code}: {count}x")

with open(TOP_RULES_PATH, "w", encoding="utf-8") as f:
    json.dump([code for code, _ in top_rules], f, indent=2)

print(f"💾 Zapisano top 30 do {TOP_RULES_PATH}")
DL4006: 7895x
DL3008: 6372x
SC2086: 6334x
DL3003: 5372x
DL3015: 4657x
DL3047: 4625x
DL3009: 4286x
DL3004: 3437x
DL4001: 2776x
DL4000: 2759x
DL3059: 2552x
DL3018: 1926x
SC2016: 1817x
SC2046: 1709x
DL3006: 1614x
SC2028: 1480x
DL3027: 1444x
DL3020: 1098x
DL3025: 996x
DL3042: 981x
DL3013: 796x
DL3007: 793x
DL3033: 723x
SC2043: 703x
DL3019: 551x
DL3005: 407x
DL3002: 394x
DL3048: 348x
DL3045: 309x
DL3032: 293x
💾 Zapisano top 30 do ../data/metadata/top_rules.json
In [5]:
# 📏 Statystyki długości plików
lengths_np = np.array(lengths)
print(f"📏 Średnia długość: {lengths_np.mean():.2f}")
print(f"📏 Mediana długości: {np.median(lengths_np):.0f}")
print(f"📏 Min: {lengths_np.min()}, Max: {lengths_np.max()}")
📏 Średnia długość: 48.42
📏 Mediana długości: 47
📏 Min: 5, Max: 532
In [6]:
# 📊 Histogram liczby reguł na plik
plt.figure()
plt.hist(rules_per_file, bins=range(1, max(rules_per_file)+2), color="salmon", edgecolor="black")
plt.title("Liczba reguł naruszonych na plik")
plt.xlabel("Liczba reguł")
plt.ylabel("Liczba plików")
plt.grid(True)
plt.tight_layout()
plt.show()
No description has been provided for this image
In [7]:
# 📊 Histogram liczby błędnych linii na plik
plt.figure()
plt.hist(lines_with_errors_per_file, bins=range(1, max(lines_with_errors_per_file)+2), color="orchid", edgecolor="black")
plt.title("Liczba linii z błędami w pliku")
plt.xlabel("Liczba linii z błędami")
plt.ylabel("Liczba plików")
plt.grid(True)
plt.tight_layout()
plt.show()
No description has been provided for this image
In [8]:
# 📊 Histogram pozycji linii błędów
plt.figure()
plt.hist(line_positions, bins=50, color="gold", edgecolor="black")
plt.title("Rozkład pozycji błędów (linie)")
plt.xlabel("Numer linii")
plt.ylabel("Liczba błędów")
plt.grid(True)
plt.tight_layout()
plt.show()
No description has been provided for this image
In [ ]: