import pandas as pdfrom sklearn.preprocessing import StandardScalerfrom sklearn.cluster import KMeansfrom sklearn.metrics import silhouette_scoreDATA_FILE = "data/flu_processed.csv"OUTPUT_FILE = "output/flu_risk_cluster.csv"df = pd.read_csv(DATA_FILE, encoding="utf-8")for column in feature_columns: df[column] = pd.to_numeric(df[column], errors="coerce")df = df.dropna(subset=feature_columns).copy()df["severity_level"] = df["severity_level"].clip(lower=1, upper=5)df["hospital_days"] = df["hospital_days"].clip(lower=0)df["treatment_cost"] = df["treatment_cost"].clip(lower=0)df["air_quality_index"] = df["air_quality_index"].clip(lower=0)feature_data = df[feature_columns]scaler = StandardScaler()scaled_features = scaler.fit_transform(feature_data)kmeans = KMeans( n_clusters=4, random_state=42, n_init=10, max_iter=300)df["cluster_id"] = kmeans.fit_predict(scaled_features)silhouette = silhouette_score(scaled_features, df["cluster_id"])print("KMeans聚类轮廓系数:", round(silhouette, 4))cluster_summary = df.groupby("cluster_id").agg( case_count=("case_id", "count"), avg_age=("age", "mean"), avg_temperature=("temperature", "mean"), avg_hospital_days=("hospital_days", "mean"), avg_treatment_cost=("treatment_cost", "mean"), avg_aqi=("air_quality_index", "mean"), avg_severity=("severity_level", "mean")).round(2)cluster_summary["risk_level"] = pd.qcut( cluster_summary["avg_severity"], q=4, labels=["低风险", "一般风险", "较高风险", "高风险"])
import pandas as pdfrom mlxtend.preprocessing import TransactionEncoderfrom mlxtend.frequent_patterns import apriori, association_rulesDATA_FILE = "data/flu_processed.csv"RULE_FILE = "output/symptom_association_rules.csv"df = pd.read_csv(DATA_FILE, encoding="utf-8")df["symptoms"] = df["symptoms"].fillna("").astype(str)df["case_type"] = df["case_type"].fillna("未知").astype(str)df["severity"] = df["severity"].fillna("未知").astype(str)def split_symptoms(symptom_text): symptom_text = symptom_text.replace(",", ",") symptom_text = symptom_text.replace("、", ",") symptom_text = symptom_text.replace(";", ",") symptom_list = [item.strip() for item in symptom_text.split(",")] return [item for item in symptom_list if item]transactions = df["symptoms"].apply(split_symptoms).tolist()transactions = [ symptom_list for symptom_list in transactions if len(symptom_list) >= 2]encoder = TransactionEncoder()encoded_array = encoder.fit(transactions).transform(transactions)symptom_matrix = pd.DataFrame( encoded_array, columns=encoder.columns_)frequent_itemsets = apriori( symptom_matrix, min_support=0.03, use_colnames=True, max_len=3)rules = association_rules( frequent_itemsets, metric="confidence", min_threshold=0.35)rules = rules[ (rules["lift"] > 1.1) & (rules["support"] >= 0.03)].copy()rules["antecedents"] = rules["antecedents"].apply( lambda item: "、".join(list(item)))rules["consequents"] = rules["consequents"].apply( lambda item: "、".join(list(item)))