6.6 KiB
6.6 KiB
In [ ]:
from pathlib import Path
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
DATA_PATH = Path("data/malware_features.csv")
if not DATA_PATH.exists():
raise FileNotFoundError(
"Missing data/malware_features.csv. Follow data/README.md, place the three "
"official UCI CSV files under data/raw/, and run: python data/prepare_dataset.py"
)In [ ]:
# TODO 1: load data/malware_features.csv into df.
df = None
# TODO 2: verify that source and label exist, then create feature_cols.
required_columns = {"source", "label"}
feature_cols = None
print("Dataset shape:", None)
print("Number of candidate features:", None)
df.head()In [ ]:
# TODO 3: calculate class counts and class proportions.
class_counts = None
class_proportions = None
# TODO 4: create a source-by-label cross-tabulation with margins.
source_by_label = None
display(pd.DataFrame({"count": class_counts, "proportion": class_proportions}))
display(source_by_label)In [ ]:
numeric_features = df[feature_cols].apply(pd.to_numeric, errors="coerce")
# TODO 5: count infinite numeric values and exact duplicate rows.
infinite_count = None
duplicate_count = None
# TODO 6: calculate per-feature missing rates and find constant features.
missing_summary = None
constant_features = None
# TODO 7: find feature names containing possible label, source, filename, or hash tokens.
suspicious_tokens = ("label", "class", "target", "source", "filename", "hash", "md5", "sha")
suspicious_columns = None
print("Exact duplicate rows:", duplicate_count)
print("Infinite numeric values:", infinite_count)
print("Constant candidate features:", len(constant_features))
print("Suspicious feature names:", suspicious_columns[:20])
display(missing_summary.head(10).to_frame())In [ ]:
assert {"source", "label"}.issubset(df.columns)
assert len(feature_cols) > 0
assert set(df["label"].dropna().unique()) == {0, 1}
assert set(feature_cols).isdisjoint({"source", "label"})
assert class_counts.loc[1] > class_counts.loc[0]
assert len(missing_summary) == len(feature_cols)
assert infinite_count == 0
print("✓ Lab 1 completed")