| name | line-chart-visualization |
| description | 提取结构化数据并进行特征清洗与聚类分析,生成包含趋势对比、分布特征与参数敏感性的多维度综合可视化图表,适用于各类趋势预测与多维对比场景。 |
Step1 数据加载与预处理(支持大文件Parquet转换与动态表头识别)。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import os
import re
plt.rcParams['font.sans-serif'] = ['SimHei', 'WenQuanYi Zen Hei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False
file_path = 'input_data.xlsx'
xls = pd.ExcelFile(file_path)
total_rows = sum(pd.read_excel(xls, sheet_name=s, header=None).shape[0] for s in xls.sheet_names)
if total_rows >= 10000:
parquet_path = "temp_converted_file.parquet"
with pd.ExcelWriter(parquet_path, engine='pyarrow') as writer:
for sheet in xls.sheet_names:
df_sheet = pd.read_excel(xls, sheet_name=sheet, header=None)
df_sheet.to_excel(writer, sheet_name=sheet, index=False, header=False)
df = pd.read_excel(parquet_path, sheet_name='Sheet1', header=None)
else:
df = pd.read_excel(file_path, sheet_name='Sheet1', header=None)
header_row_idx = None
target_cols = ['group_col', 'value_col1', 'value_col2']
for idx, row in df.iterrows():
row_vals = row.astype(str).tolist()
if all(col in row_vals for col in target_cols):
header_row_idx = idx
break
if header_row_idx is not None:
df.columns = df.iloc[header_row_idx].tolist()
df_clean = df.iloc[header_row_idx + 1:].reset_index(drop=True)
else:
df_clean = df.copy()
Step2 数据清洗与特征工程(包含正则提取、缺失值处理与合并单元格还原)。
if 'group_col' in df_clean.columns:
df_clean['group_col'] = df_clean['group_col'].ffill()
if 'value_col1' in df_clean.columns:
df_clean['value_col1'] = df_clean['value_col1'].astype(str).str.replace(r'[^\d.]', '', regex=True)
df_clean['value_col1'] = pd.to_numeric(df_clean['value_col1'], errors='coerce')
df_clean = df_clean.dropna(subset=['value_col1']).reset_index(drop=True)
def map_category(val):
if pd.isna(val): return 'Unknown'
if val > 100: return 'High'
elif val > 50: return 'Medium'
return 'Low'
if 'value_col1' in df_clean.columns:
df_clean['level'] = df_clean['value_col1'].apply(map_category)
def calculate_score(row):
score = 0
pd.notna(row.get()) (row[]) > :
score +=
pd.notna(row.get()) (row[]) < :
score +=
score
df_clean[] = df_clean.apply(calculate_score, axis=)
Step3 聚类分析与交叉统计(包含标准化、KMeans与多维度交叉分析)。
numeric_cols = ['value_col1', 'comprehensive_score']
existing_num_cols = [c for c in numeric_cols if c in df_clean.columns]
if existing_num_cols:
scaler = StandardScaler()
numeric_scaled = scaler.fit_transform(df_clean[existing_num_cols].fillna(0))
kmeans = KMeans(n_clusters=3, random_state=42)
df_clean['cluster_label'] = kmeans.fit_predict(numeric_scaled)
if 'level' in df_clean.columns:
level_counts = df_clean['level'].value_counts()
level_ratio = df_clean['level'].value_counts(normalize=True) * 100
summary_df = pd.DataFrame({'频次': level_counts, '占比(%)': level_ratio.round(2)})
summary_df.loc['总计'] = summary_df.sum()
print("分类统计汇总:\n", summary_df)
if 'cluster_label' in df_clean.columns and 'level' in df_clean.columns:
cross_tb = pd.crosstab(df_clean['cluster_label'], df_clean['level'], margins=True, margins_name='总计')
print("\n聚类与等级交叉分析:\n", cross_tb)
Step4 多维度可视化与结果输出(包含趋势、分布、占比与敏感性分析图表)。
fig, axes = plt.subplots(2, 2, figsize=(16, 12), dpi=150)
fig.suptitle('综合数据分析图表', fontsize=16)
group_col = 'group_col' if 'group_col' in df_clean.columns else df_clean.columns[0]
if 'value_col1' in df_clean.columns:
axes[0, 0].plot(df_clean[group_col].astype(str).str[:10], df_clean['value_col1'], marker='o', label='指标1', color='#1f77b4')
if 'comprehensive_score' in df_clean.columns:
axes[0, 0].plot(df_clean[group_col].astype(str).str[:10], df_clean['comprehensive_score'], marker='s', label='综合评分', color='#ff7f0e')
axes[0, 0].set_title('多指标趋势对比')
axes[0, 0].set_xlabel('分组维度')
axes[0, 0].set_ylabel('数值')
axes[0, 0].legend(loc='upper right')
axes[0, ].grid(, alpha=)
axes[, ].tick_params(axis=, rotation=)
df_clean.columns:
axes[, ].hist(df_clean[].dropna(), bins=, alpha=, color=, edgecolor=)
axes[, ].set_title()
axes[, ].set_xlabel()
axes[, ].set_ylabel()
axes[, ].grid(, alpha=)
df_clean.columns:
level_counts = df_clean[].value_counts()
colors_pie = plt.cm.Set3(np.linspace(, , (level_counts)))
axes[, ].pie(level_counts, labels=level_counts.index, autopct=, colors=colors_pie, startangle=)
axes[, ].set_title()
df_clean.columns df_clean.columns:
sns.scatterplot(data=df_clean, x=group_col, y=, hue=, ax=axes[, ], palette=, s=)
axes[, ].set_title()
axes[, ].tick_params(axis=, rotation=)
axes[, ].grid(, alpha=)
plt.tight_layout(rect=[, , , ])
chart_path =
output_path =
plt.savefig(chart_path, dpi=, bbox_inches=)
plt.close()
df_clean.to_excel(output_path, index=)
()
()
()