/line-chart-visualization
提取结构化数据并进行特征清洗与聚类分析,生成包含趋势对比、分布特征与参数敏感性的多维度综合可视化图表,适用于各类趋势预测与多维对比场景。
$ npx -y skills add OpenSenseNova/SenseNova-Skills --skill line-chart-visualization --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/line-chart-visualization
Context preview
The summary Claude sees to decide when to auto-load this skill.
提取结构化数据并进行特征清洗与聚类分析,生成包含趋势对比、分布特征与参数敏感性的多维度综合可视化图表,适用于各类趋势预测与多维对比场景。
SKILL.md
line-chart-visualization.SKILL.mdname: 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'
# 处理大型Excel文件:统计总行数,若≥1万则转换为Parquet格式提升效率
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 数据清洗与特征工程(包含正则提取、缺失值处理与合并单元格还原)。
# 合并单元格处理 (ffill + 遍历还原)
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
if pd.notna(row.get('value_col1')) and float(row['value_col1']) > 50: # 占位示例
score += 50
if pd.notna(row.get('value_col2')) and float(row['value_col2']) < 10: # 占位示例
score += 50
return score
df_clean['comprehensive_score'] = df_clean.apply(calculate_score, axis=1)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)
# value_counts + 占比计算
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)
# 交叉分析 crosstab/pivot
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]
# 1. 趋势对比折线图
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, 0].grid(True, alpha=0.3)
axes[0, 0].tick_params(axis='x', rotation=45)
# 2. 分布特征直方图
if 'value_col1' in df_clean.columns:
axes[0, 1].hist(df_clean['value_col1'].dropna(), bins=15, alpha=0.7, color='skyblue', edgecolor='black')
axes[0, 1].set_title('数值分布特征')
axes[0, 1].set_xlabel('数值区间')
axes[0, 1].set_ylabel('频次')
axes[0, 1].grid(True, alpha=0.3)
# 3. 市场份额/占比饼图
if 'level' in df_clean.columns:
level_counts = df_clean['level'].value_counts()
colors_pie = plt.cm.Set3(np.linspace(0, 1, len(level_counts)))
axes[1, 0].pie(level_counts, labels=level_counts.index, autopct='%1.1f%%', colors=colors_pie, startangle=90)
axes[1, 0].set_title('分类占比分布')
# 4. 参数敏感性分析/聚类结果散点图
if 'cluster_label' in df_clean.columns and 'value_col1' in df_clean.columns:
sns.scatterplot(data=df_clean, x=group_col, y='value_col1', hue='cluster_label', ax=axes[1, 1], palette='Set1', s=80)
axes[1, 1].set_title('聚类分组散点图')
axes[1, 1].tick_params(axis='x', rotation=45)
axes[1, 1].grid(True, alpha=0.3)
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
# 保存图表与清洗后的数据
chart_path = "output_chart.png"
output_path = "output_table.xlsx"
plt.savefig(chart_path, dpi=300, bbox_inches='tight')
plt.close()
df_clean.to_excel(output_path, index=False)
# 生成下载链接
print(f"分析完成。")
print(f"图表下载链接: file:///{os.path.abspath(chart_path)}")
print(f"数据下载链接: file:///{os.path.abspath(output_path)}")Read more
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'
# 处理大型Excel文件:统计总行数,若≥1万则转换为Parquet格式提升效率
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 数据清洗与特征工程(包含正则提取、缺失值处理与合并单元格还原)。
# 合并单元格处理 (ffill + 遍历还原)
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
if pd.notna(row.get('value_col1')) and float(row['value_col1']) > 50: # 占位示例
score += 50
if pd.notna(row.get('value_col2')) and float(row['value_col2']) < 10: # 占位示例
score += 50
return score
df_clean['comprehensive_score'] = df_clean.apply(calculate_score, axis=1)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)
# value_counts + 占比计算
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)
# 交叉分析 crosstab/pivot
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]
# 1. 趋势对比折线图
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, 0].grid(True, alpha=0.3)
axes[0, 0].tick_params(axis='x', rotation=45)
# 2. 分布特征直方图
if 'value_col1' in df_clean.columns:
axes[0, 1].hist(df_clean['value_col1'].dropna(), bins=15, alpha=0.7, color='skyblue', edgecolor='black')
axes[0, 1].set_title('数值分布特征')
axes[0, 1].set_xlabel('数值区间')
axes[0, 1].set_ylabel('频次')
axes[0, 1].grid(True, alpha=0.3)
# 3. 市场份额/占比饼图
if 'level' in df_clean.columns:
level_counts = df_clean['level'].value_counts()
colors_pie = plt.cm.Set3(np.linspace(0, 1, len(level_counts)))
axes[1, 0].pie(level_counts, labels=level_counts.index, autopct='%1.1f%%', colors=colors_pie, startangle=90)
axes[1, 0].set_title('分类占比分布')
# 4. 参数敏感性分析/聚类结果散点图
if 'cluster_label' in df_clean.columns and 'value_col1' in df_clean.columns:
sns.scatterplot(data=df_clean, x=group_col, y='value_col1', hue='cluster_label', ax=axes[1, 1], palette='Set1', s=80)
axes[1, 1].set_title('聚类分组散点图')
axes[1, 1].tick_params(axis='x', rotation=45)
axes[1, 1].grid(True, alpha=0.3)
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
# 保存图表与清洗后的数据
chart_path = "output_chart.png"
output_path = "output_table.xlsx"
plt.savefig(chart_path, dpi=300, bbox_inches='tight')
plt.close()
df_clean.to_excel(output_path, index=False)
# 生成下载链接
print(f"分析完成。")
print(f"图表下载链接: file:///{os.path.abspath(chart_path)}")
print(f"数据下载链接: file:///{os.path.abspath(output_path)}")The SenseNova model family plugs directly into agent runtimes such as OpenClaw and hermes-agent, with the skills in this repository extending the models with concrete, end-to-end office capabilities.
Repo: OpenSenseNova/SenseNova-Skills
Other skills on sensenova-skills.
- /sn-da-excel-workflow
Excel 数据分析多步编排器。覆盖:(1) 读取多 Sheet Excel 文件并统计行数,(2) 大文件检测(≥10k 行自动 Parquet 优化),(3) 数据清洗(缺失值、文本标准化、无效字符),(4) 条件筛选与分类提取,(5) 跨 Sheet 统计聚合,(6) 导出 Excel/CSV 并提供下载链接。覆盖从数据读取到报告生成全流程,按步骤编排 capability 子 skill。**遇到以下任一情况就主动使用本 skill,不要自行写几行 pandas 就回答**:①用户出现触发词:Excel 分析 / 表格分析 / 数据分析 /
Open skill - /category-coloring
当Excel文件总行数超过1万行时,通过转换为Parquet格式提升读取性能,提取目标指标并计算最大值,最后将结果输出为Excel并对特定行进行高亮标注。
Open skill - /duplicate-value-coloring
对比Excel多表中的特定系数并对异常值进行颜色标记。
Open skill - /outlier-coloring
识别 Excel 中的超限数值与错误单元格并进行高亮标注。
Open skill - /threshold-cell-coloring
根据Excel总行数自动切换Parquet加速读取,计算特定维度的时间序列平均值,并使用openpyxl输出带有条件格式(如低于均值标绿)和自定义样式的分析报告。
Open skill - /top-value-coloring
根据数据规模动态选择处理策略,对多表数据进行合并、统计筛选,并利用 openpyxl 实现关键指标的自动化样式高亮与格式化导出。
Open skill

