Skill: 18262202398-star/toufang-data-analysis (version 1.0.1)

# 投放数据分析技能 ## 技能概述 基于《数据分析基础概念和逻辑v3.md》文档开发的标准化投放数据分析技能，用于处理超级直播、淘宝直播和财务报表数据。 ## 适用场景 - 万相台投放数据统计分析 - 直播数据多维度分析 - 财务数据与业务数据关联分析 - ROI优化和成本分析 ## ClawHub使用 通过环境变量配置： ```bash # 设置环境变量 TOUFANG_DATE_RANGE="2026-01-01:2026-01-31" # 运行技能 python3 clawhub_main.py # 或者一次性设置 TOUFANG_DATE_RANGE="2026-01-01:2026-01-31" python3 clawhub_main.py ``` ## 输入要求 - 时间范围：YYYY-MM-DD格式的日期范围 - 数据文件：自动识别三类数据文件 - 超级直播数据（包含"超级直播"关键词） - 淘宝直播数据（包含"淘宝直播"关键词） - 财务数据（包含"财务"关键词） ## 输出内容 1. HTML汇总报表（桌面保存） 2. 数据质量检查报告 3. 关键指标计算 4. 优化建议 ## 核心功能 ### 1. 数据自动识别 ```python # 自动识别数据文件 def auto_detect_files(data_dir): """自动识别三类数据文件""" super_files = find_files(data_dir, "超级直播") taobao_files = find_files(data_dir, "淘宝直播") financial_files = find_files(data_dir, "财务") return super_files, taobao_files, financial_files ``` ### 2. 编码自动处理 ```python # 自动检测和处理编码 def auto_detect_encoding(file_path): """自动检测文件编码格式""" # 支持GBK、UTF-8等常见编码 # 自动转换和统一处理 ``` ### 3. 字段映射计算 基于文档中的字段定义和计算公式： **超级直播关键计算：** - ROI = 总成交金额 / 花费 - 观看成本 = 花费 / 观看次数 - 订单成本 = 花费 / 总成交笔数 - 加购成本 = 花费 / (总收藏数 + 总购物车数) **淘宝直播关键计算：** - 成交转化率 = 成交人数 / 商品点击人数 - 客单价 = 成交金额 / 成交人数 - 笔单价 = 成交金额 / 成交笔数 **财务报表关键计算：** - 业务口径收入 = 品牌费 + 切片 + 保量佣金 + 预估结算机构佣金 + 预估结算线下佣金 - 财务口径收入 = 业务口径收入 / 1.06 - 毛利率 = 毛利 / 财务口径收入 ### 4. 跨报表关联分析 ```python # 跨报表数据关联 def cross_report_analysis(super_df, taobao_df, financial_df): """基于文档的跨报表关联分析""" # 超级直播去退ROI参考值 roi_adjusted = (super_df['总成交金额'] * (1 - taobao_df['退货率'])) / super_df['花费'] # 推广投入回报率 promotion_roi = (financial_df[['保量佣金','预估结算线下佣金','预估结算机构佣金']].sum() * (super_df['总成交笔数'] / taobao_df['成交笔数'])) / super_df['花费'] return roi_adjusted, promotion_roi ``` ## 使用示例 ### 基本使用 ```bash # 调用投放数据分析技能 投放数据分析 --date-range "2026-01-01:2026-01-31" --data-dir "/Users/zhouhao/Documents/投放数据" ``` ### 高级使用 ```bash # 包含特定指标计算 投放数据分析 --date-range "2026-01-01:2026-01-31" \ --metrics "ROI,观看成本,订单成本" \ --output-format "html,csv" ``` ## 文件结构 ``` 投放数据分析技能/ ├── SKILL.md # 技能说明文档 ├── requirements.txt # Python依赖 ├── main.py # 主程序 ├── data_processor.py # 数据处理模块 ├── calculator.py # 指标计算模块 ├── reporter.py # 报表生成模块 └── config.py # 配置文件 ``` ## 依赖要求 - pandas >= 1.5.0 - numpy >= 1.21.0 - chardet >= 5.0.0 ## 输出示例 技能执行后会生成： 1. `YYYY-MM-DD_投放数据分析报告.html` - 完整HTML报表 2. `YYYY-MM-DD_数据质量检查.csv` - 数据质量报告 3. `YYYY-MM-DD_关键指标汇总.csv` - 指标计算结果 ## 错误处理 - 自动处理文件编码问题 - 字段缺失时的智能处理 - 数据质量异常预警 ## 版本历史 - v1.0.0: 初始版本，基于数据分析基础概念和逻辑v3.md ## 作者 江风 - 交个朋友直播间

path: simple_run.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
简化版投放数据分析 - 专注于核心功能
"""

import pandas as pd
import numpy as np
import os
import glob
from datetime import datetime

def simple_analysis():
    """简化分析"""
    print("🎯 简化版投放数据分析")
    print("=" * 50)
    
    data_dir = "/Users/zhouhao/Documents/投放数据"
    
    # 只分析2026年1月数据
    super_file = "/Users/zhouhao/Documents/投放数据/26年/超级直播/2026-01超级直播.csv"
    
    if os.path.exists(super_file):
        print(f"✅ 分析文件: {super_file}")
        
        # 读取数据
        df = pd.read_csv(super_file, encoding='utf-8')
        print(f"✅ 数据读取成功，形状: {df.shape}")
        
        # 核心指标计算
        results = {}
        
        if '花费' in df.columns:
            df['花费'] = pd.to_numeric(df['花费'], errors='coerce')
            results['总花费'] = df['花费'].sum()
            results['平均花费'] = df['花费'].mean()
        
        if '总成交金额' in df.columns:
            df['总成交金额'] = pd.to_numeric(df['总成交金额'], errors='coerce')
            results['总成交金额'] = df['总成交金额'].sum()
        
        if '花费' in df.columns and '总成交金额' in df.columns:
            results['ROI'] = df['总成交金额'].sum() / df['花费'].sum()
        
        if '观看次数' in df.columns:
            df['观看次数'] = pd.to_numeric(df['观看次数'], errors='coerce')
            results['总观看次数'] = df['观看次数'].sum()
            if '花费' in df.columns:
                results['观看成本'] = df['花费'].sum() / df['观看次数'].sum()
        
        if '总成交笔数' in df.columns:
            df['总成交笔数'] = pd.to_numeric(df['总成交笔数'], errors='coerce')
            results['总成交笔数'] = df['总成交笔数'].sum()
            if '花费' in df.columns:
                results['订单成本'] = df['花费'].sum() / df['总成交笔数'].sum()
        
        # 显示结果
        print("\n📊 分析结果:")
        print("=" * 30)
        for key, value in results.items():
            if isinstance(value, float):
                print(f"{key}: {value:,.2f}")
            else:
                print(f"{key}: {value:,}")
        
        # 保存简要报告
        output_file = os.path.expanduser("~/Desktop/投放数据分析简要报告.txt")
        with open(output_file, 'w', encoding='utf-8') as f:
            f.write("投放数据分析简要报告\n")
            f.write("=" * 50 + "\n")
            f.write(f"分析时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
            f.write(f"数据文件: {super_file}\n")
            f.write(f"数据行数: {len(df):,}\n\n")
            
            f.write("核心指标:\n")
            f.write("-" * 20 + "\n")
            for key, value in results.items():
                if isinstance(value, float):
                    f.write(f"{key}: {value:,.2f}\n")
                else:
                    f.write(f"{key}: {value:,}\n")
        
        print(f"\n✅ 报告已保存到: {output_file}")
        return True
    else:
        print("❌ 文件不存在")
        return False

if __name__ == "__main__":
    simple_analysis()

path: _meta.json
content: ownerId: kn73wpzhga2zxs9v6ha8rabqp9833094
slug: toufang-data-analysis
version: 1.0.0
publishedAt: 1773782648447

path: config.py
content: """
配置文件 - 投放数据分析技能的配置参数
"""

CONFIG = {
    # 默认数据目录
    "DEFAULT_DATA_DIR": "/Users/zhouhao/Documents/投放数据",
    
    # 默认输出目录
    "DEFAULT_OUTPUT_DIR": "/Users/zhouhao/Desktop/投放分析报告",
    
    # 支持的文件类型
    "SUPPORTED_FILE_TYPES": [".csv", ".xlsx"],
    
    # 文件识别关键词
    "FILE_KEYWORDS": {
        "super": ["超级直播"],
        "taobao": ["淘宝直播"],
        "financial": ["财务", "财务报表"]
    },
    
    # 字段映射配置
    "FIELD_MAPPING": {
        "super": {
            "date": ["日期"],
            "cost": ["花费"],
            "revenue": ["总成交金额", "直接成交金额"],
            "orders": ["总成交笔数", "直接成交笔数"],
            "views": ["观看次数", "有效观看次数"],
            "impressions": ["展现量"]
        },
        "taobao": {
            "date": ["日期"],
            "revenue": ["成交金额"],
            "orders": ["成交笔数"],
            "users": ["成交人数", "观看人数"],
            "conversion": ["成交转化率"]
        },
        "financial": {
            "date": ["直播日期", "日期"],
            "revenue": ["业务口径收入", "财务口径收入"],
            "commission": ["保量佣金", "预估结算线下佣金", "预估结算机构佣金"],
            "profit": ["毛利"],
            "margin": ["毛利率"]
        }
    },
    
    # 编码检测配置
    "ENCODING_DETECTION": {
        "sample_size": 10000,  # 检测编码时读取的字节数
        "encodings_to_try": ["utf-8", "gbk", "gb2312", "latin1"]
    },
    
    # 数值字段识别模式
    "NUMERIC_FIELD_PATTERNS": [
        "花费", "金额", "成本", "笔数", "次数", "量", "率", "价", "数", "费"
    ],
    
    # 日期字段识别模式
    "DATE_FIELD_PATTERNS": [
        "日期", "时间", "date", "time"
    ],
    
    # 报告配置
    "REPORT_CONFIG": {
        "html": {
            "table_max_rows": 100,  # HTML表格最大显示行数
            "preview_rows": 5       # 数据预览行数
        },
        "csv": {
            "encoding": "utf-8-sig"  # CSV文件编码
        }
    },
    
    # 指标计算配置
    "METRICS_CONFIG": {
        "super": {
            "required_fields": ["花费", "总成交金额"],
            "optional_fields": ["观看次数", "总成交笔数", "总收藏数", "总购物车数"]
        },
        "taobao": {
            "required_fields": ["成交金额", "成交人数"],
            "optional_fields": ["商品点击人数", "加购人数", "退款金额"]
        },
        "financial": {
            "required_fields": [],
            "optional_fields": ["品牌费", "切片", "保量佣金", "预估结算机构佣金", "预估结算线下佣金"]
        }
    },
    
    # 数据质量检查配置
    "DATA_QUALITY_CONFIG": {
        "missing_threshold": 0.3,  # 缺失值阈值（30%）
        "date_consistency_check": True,
        "numeric_range_check": True
    },
    
    # 性能配置
    "PERFORMANCE_CONFIG": {
        "max_file_size_mb": 100,  # 最大文件大小（MB）
        "chunk_size": 10000,      # 分块处理大小
        "timeout_seconds": 300    # 处理超时时间（秒）
    }
}

path: data_processor.py
content: """
数据处理模块 - 负责数据读取、清洗和预处理
"""

import pandas as pd
import numpy as np
import os
import glob
import chardet
from datetime import datetime

class DataProcessor:
    def __init__(self, data_dir):
        self.data_dir = data_dir
    
    def detect_encoding(self, file_path):
        """自动检测文件编码"""
        with open(file_path, 'rb') as f:
            raw_data = f.read(10000)  # 只读取前10000字节来检测编码
            result = chardet.detect(raw_data)
            return result['encoding']
    
    def read_csv_with_encoding(self, file_path):
        """自动检测编码并读取CSV文件"""
        encoding = self.detect_encoding(file_path)
        encodings_to_try = [encoding, 'utf-8', 'gbk', 'gb2312', 'latin1']
        
        for enc in encodings_to_try:
            if enc:
                try:
                    df = pd.read_csv(file_path, encoding=enc)
                    print(f"✅ 成功读取文件: {file_path}, 编码: {enc}")
                    return df
                except UnicodeDecodeError:
                    continue
                except Exception as e:
                    print(f"⚠️  读取文件 {file_path} 时出错: {e}")
                    continue
        
        raise Exception(f"无法读取文件 {file_path}，尝试了编码: {encodings_to_try}")
    
    def auto_detect_files(self):
        """自动识别三类数据文件"""
        super_files = []
        taobao_files = []
        financial_files = []
        
        # 查找所有CSV文件
        csv_files = glob.glob(os.path.join(self.data_dir, "**/*.csv"), recursive=True)
        csv_files.extend(glob.glob(os.path.join(self.data_dir, "**/*.xlsx"), recursive=True))
        
        for file_path in csv_files:
            filename = os.path.basename(file_path).lower()
            
            if "超级直播" in filename:
                super_files.append(file_path)
            elif "淘宝直播" in filename:
                taobao_files.append(file_path)
            elif "财务" in filename:
                financial_files.append(file_path)
        
        return super_files, taobao_files, financial_files
    
    def read_data(self, file_paths, data_type):
        """读取指定类型的数据"""
        if not file_paths:
            print(f"⚠️  未找到{data_type}数据文件")
            return pd.DataFrame()
        
        dfs = []
        for file_path in file_paths:
            try:
                df = self.read_csv_with_encoding(file_path)
                dfs.append(df)
            except Exception as e:
                print(f"❌ 读取{data_type}文件 {file_path} 失败: {e}")
        
        if dfs:
            # 合并多个文件
            combined_df = pd.concat(dfs, ignore_index=True)
            print(f"✅ 成功读取{data_type}数据，形状: {combined_df.shape}")
            return combined_df
        else:
            return pd.DataFrame()
    
    def preprocess_data(self, df, data_type):
        """数据预处理"""
        if df.empty:
            return df
        
        # 标准化日期字段
        df = self.standardize_dates(df, data_type)
        
        # 处理数值字段
        df = self.process_numeric_fields(df, data_type)
        
        # 去除重复数据
        df = df.drop_duplicates()
        
        print(f"✅ {data_type}数据预处理完成，形状: {df.shape}")
        return df
    
    def standardize_dates(self, df, data_type):
        """标准化日期字段"""
        date_columns = []
        
        # 识别日期字段
        for col in df.columns:
            col_lower = str(col).lower()
            if '日期' in col_lower or 'date' in col_lower:
                date_columns.append(col)
        
        # 标准化日期格式
        for col in date_columns:
            try:
                df[col] = pd.to_datetime(df[col], errors='coerce')
                # 转换为YYYY-MM-DD格式
                df[col] = df[col].dt.strftime('%Y-%m-%d')
            except Exception as e:
                print(f"⚠️  标准化日期字段 {col} 时出错: {e}")
        
        return df
    
    def process_numeric_fields(self, df, data_type):
        """处理数值字段"""
        # 识别数值字段（排除日期字段）
        numeric_patterns = ['花费', '金额', '成本', '笔数', '次数', '量', '率', '价']
        
        for col in df.columns:
            col_str = str(col)
            
            # 检查是否是数值字段
            is_numeric = any(pattern in col_str for pattern in numeric_patterns)
            
            if is_numeric and df[col].dtype == 'object':
                try:
                    # 尝试转换为数值
                    df[col] = pd.to_numeric(df[col], errors='coerce')
                except Exception as e:
                    print(f"⚠️  转换数值字段 {col} 时出错: {e}")
        
        return df
    
    def validate_data_quality(self, df, data_type):
        """数据质量验证"""
        if df.empty:
            return {"status": "empty", "message": "数据为空"}
        
        quality_report = {
            "total_rows": len(df),
            "total_columns": len(df.columns),
            "missing_values": {},
            "data_types": {},
            "date_range": {}
        }
        
        # 检查缺失值
        for col in df.columns:
            missing_count = df[col].isnull().sum()
            missing_percentage = missing_count / len(df) * 100
            quality_report["missing_values"][col] = {
                "count": missing_count,
                "percentage": f"{missing_percentage:.2f}%"
            }
        
        # 记录数据类型
        for col in df.columns:
            quality_report["data_types"][col] = str(df[col].dtype)
        
        # 检查日期范围（如果有日期字段）
        date_cols = [col for col in df.columns if '日期' in str(col)]
        if date_cols:
            for col in date_cols:
                try:
                    dates = pd.to_datetime(df[col], errors='coerce')
                    valid_dates = dates.dropna()
                    if not valid_dates.empty:
                        quality_report["date_range"][col] = {
                            "min": valid_dates.min().strftime('%Y-%m-%d'),
                            "max": valid_dates.max().strftime('%Y-%m-%d'),
                            "days": (valid_dates.max() - valid_dates.min()).days
                        }
                except:
                    pass
        
        return quality_report

path: requirements.txt
content: # 投放数据分析技能依赖
# 基于《数据分析基础概念和逻辑v3.md》开发

pandas>=1.5.0
numpy>=1.21.0
chardet>=5.0.0
openpyxl>=3.0.0  # 用于Excel文件支持
python-dateutil>=2.8.0
tqdm>=4.60.0  # 进度条显示

# 可选依赖（用于高级功能）
# matplotlib>=3.3.0  # 数据可视化
# seaborn>=0.11.0    # 统计可视化
# scikit-learn>=1.0.0  # 机器学习分析

path: clawhub_main.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
投放数据分析技能 - ClawHub优化版
简化接口，便于通过ClawHub运行
"""

import pandas as pd
import numpy as np
import os
import sys
from datetime import datetime

# 导入自定义模块
from data_processor import DataProcessor
from calculator import MetricCalculator
from reporter import ReportGenerator
from config import CONFIG

def main():
    """主函数 - ClawHub优化版"""
    print("🎯 ClawHub版投放数据分析技能")
    print("=" * 50)
    
    # 使用环境变量或默认配置
    date_range = os.environ.get('TOUFANG_DATE_RANGE', '2026-01-01:2026-01-31')
    data_dir = os.environ.get('TOUFANG_DATA_DIR', CONFIG['DEFAULT_DATA_DIR'])
    output_dir = os.environ.get('TOUFANG_OUTPUT_DIR', CONFIG['DEFAULT_OUTPUT_DIR'])
    
    print(f"📅 日期范围: {date_range}")
    print(f"📁 数据目录: {data_dir}")
    print(f"💾 输出目录: {output_dir}")
    
    try:
        # 初始化处理器
        processor = DataProcessor(data_dir)
        
        # 自动识别数据文件
        print("\n📁 正在识别数据文件...")
        super_files, taobao_files, financial_files = processor.auto_detect_files()
        
        print(f"✅ 找到 {len(super_files)} 个超级直播文件")
        print(f"✅ 找到 {len(taobao_files)} 个淘宝直播文件")
        print(f"✅ 找到 {len(financial_files)} 个财务文件")
        
        # 读取数据
        print("\n📊 正在读取数据...")
        super_df = processor.read_data(super_files, "超级直播")
        taobao_df = processor.read_data(taobao_files, "淘宝直播")
        financial_df = processor.read_data(financial_files, "财务")
        
        print(f"✅ 成功读取super数据，形状: {super_df.shape}")
        print(f"✅ 成功读取taobao数据，形状: {taobao_df.shape}")
        print(f"✅ 成功读取financial数据，形状: {financial_df.shape}")
        
        # 数据预处理
        print("\n🔄 正在进行数据预处理...")
        super_df = processor.preprocess_data(super_df, "super")
        taobao_df = processor.preprocess_data(taobao_df, "taobao")
        financial_df = processor.preprocess_data(financial_df, "financial")
        
        print(f"✅ super数据预处理完成，形状: {super_df.shape}")
        print(f"✅ taobao数据预处理完成，形状: {taobao_df.shape}")
        print(f"✅ financial数据预处理完成，形状: {financial_df.shape}")
        
        # 计算指标
        print("\n🧮 正在计算指标...")
        calculator = MetricCalculator()
        metrics_result = {}
        
        if not super_df.empty:
            metrics_result['super'] = calculator.calculate_super_metrics(super_df)
        if not taobao_df.empty:
            metrics_result['taobao'] = calculator.calculate_taobao_metrics(taobao_df)
        if not financial_df.empty:
            metrics_result['financial'] = calculator.calculate_financial_metrics(financial_df)
        
        # 生成报告
        print("\n📝 正在生成报告...")
        reporter = ReportGenerator(output_dir)
        html_report = reporter.generate_html_report(
            super_df, taobao_df, financial_df, metrics_result, date_range
        )
        
        print(f"✅ HTML报告已生成: {html_report}")
        
        # 生成CSV报告
        csv_files = reporter.generate_csv_reports(metrics_result, date_range)
        for csv_file in csv_files:
            print(f"✅ CSV报告已生成: {csv_file}")
        
        print("\n🎉 投放数据分析完成!")
        return True
        
    except Exception as e:
        print(f"❌ 处理过程中出错: {e}")
        return False

if __name__ == "__main__":
    success = main()
    sys.exit(0 if success else 1)

path: usage_example.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
投放数据分析技能使用示例
"""

import pandas as pd
import numpy as np
import os
import glob
from datetime import datetime

def usage_example():
    """使用示例"""
    print("🎯 投放数据分析技能使用示例")
    print("=" * 50)
    
    # 1. 基本使用
    print("\n📋 基本使用:")
    print("python main.py --date-range \"2026-01-01:2026-01-31\" --data-dir \"/Users/zhouhao/Documents/投放数据\"")
    
    # 2. 指定指标
    print("\n📊 指定特定指标:")
    print("python main.py --date-range \"2026-01-01:2026-01-31\" \\")
    print("               --metrics \"ROI,观看成本,订单成本,加购成本\" \\")
    print("               --output-format \"html,csv\"")
    
    # 3. 自定义输出
    print("\n📁 自定义输出目录:")
    print("python main.py --date-range \"2026-01-01:2026-01-31\" \\")
    print("               --output-dir \"/Users/zhouhao/Desktop/自定义报告\"")
    
    # 4. 技能特性
    print("\n✨ 技能特性:")
    print("✅ 自动文件识别 - 识别超级直播、淘宝直播、财务三类文件")
    print("✅ 编码自动处理 - 支持GBK、UTF-8等多种编码")
    print("✅ 字段智能映射 - 基于《数据分析基础概念和逻辑v3.md》")
    print("✅ 跨报表分析 - 支持多数据源关联计算")
    print("✅ 数据质量检查 - 自动检测数据问题")
    
    # 5. 输出内容
    print("\n📈 输出内容:")
    print("📊 HTML可视化报告 - 包含数据概览、指标分析、优化建议")
    print("📋 CSV数据汇总 - 各指标的详细计算结果")
    print("🔍 数据质量报告 - 数据完整性检查")
    print("💡 优化建议 - 基于分析结果的业务建议")
    
    # 6. 支持的指标
    print("\n📊 支持的指标:")
    print("• ROI (投入产出比)")
    print("• 观看成本、订单成本、加购成本")
    print("• 转化率、互动率、有效观看率")
    print("• 客单价、笔单价、件单价")
    print("• 业务口径收入、财务口径收入、毛利率")
    
    print("\n🚀 开始使用:")
    print("1. 安装依赖: pip install -r requirements.txt")
    print("2. 运行示例: python main.py --date-range \"2026-01-01:2026-01-31\"")
    print("3. 查看报告: 打开生成的HTML文件")
    
    print("\n✅ 示例完成!")

if __name__ == "__main__":
    usage_example()

path: reporter.py
content: """
报表生成模块 - 生成HTML和CSV格式的报告
"""

import pandas as pd
import numpy as np
import os
from datetime import datetime

class ReportGenerator:
    def __init__(self, output_dir):
        self.output_dir = output_dir
        os.makedirs(output_dir, exist_ok=True)
    
    def generate_html_report(self, super_df, taobao_df, financial_df, metrics_result, date_range):
        """生成完整的HTML报告"""
        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
        filename = f"投放数据分析报告_{date_range.replace(':', '_')}_{timestamp}.html"
        filepath = os.path.join(self.output_dir, filename)
        
        html_content = self._build_html_content(super_df, taobao_df, financial_df, metrics_result, date_range)
        
        with open(filepath, 'w', encoding='utf-8') as f:
            f.write(html_content)
        
        return filepath
    
    def _build_html_content(self, super_df, taobao_df, financial_df, metrics_result, date_range):
        """构建HTML内容"""
        return f"""
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>投放数据分析报告 - {date_range}</title>
    <style>
        body {{ font-family: Arial, sans-serif; margin: 20px; line-height: 1.6; }}
        h1 {{ color: #1a73e8; text-align: center; margin-bottom: 10px; }}
        h2 {{ color: #333; border-bottom: 2px solid #1a73e8; padding-bottom: 10px; margin-top: 30px; }}
        h3 {{ color: #555; margin-top: 20px; }}
        table {{ border-collapse: collapse; width: 100%; margin-bottom: 30px; font-size: 14px; }}
        th, td {{ border: 1px solid #ddd; padding: 12px; text-align: right; }}
        th {{ background-color: #1a73e8; color: white; font-weight: bold; text-align: center; }}
        tr:nth-child(even) {{ background-color: #f9f9f9; }}
        tr:hover {{ background-color: #f0f7ff; }}
        .summary {{ background-color: #e7f3ff; font-weight: bold; }}
        .section {{ margin-bottom: 40px; }}
        .note {{ background-color: #fff3cd; padding: 15px; border-radius: 5px; margin: 20px 0; border-left: 4px solid #ffc107; }}
        .success {{ background-color: #d4edda; padding: 15px; border-radius: 5px; margin: 20px 0; border-left: 4px solid #28a745; }}
        .info-box {{ background-color: #d1ecf1; padding: 15px; border-radius: 5px; margin: 20px 0; border-left: 4px solid #17a2b8; }}
        .timestamp {{ text-align: center; color: #666; font-style: italic; margin-bottom: 30px; }}
        .metric-card {{ background: white; border: 1px solid #e0e0e0; border-radius: 8px; padding: 15px; margin: 10px 0; }}
        .metric-value {{ font-size: 24px; font-weight: bold; color: #1a73e8; }}
        .metric-label {{ color: #666; margin-bottom: 5px; }}
    </style>
</head>
<body>
    <h1>📊 投放数据分析报告</h1>
    <div class="timestamp">日期范围: {date_range} | 生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}</div>
    
    <div class="success">
        <h3>✅ 分析完成</h3>
        <p>已成功分析三个数据源，共处理 {self._get_total_rows(super_df, taobao_df, financial_df):,} 行数据</p>
    </div>
    
    <div class="section">
        <h2>📈 数据概览</h2>
        <table>
            <tr><th>数据源</th><th>数据行数</th><th>字段数量</th><th>日期范围</th></tr>
            <tr><td>超级直播</td><td>{len(super_df):,}</td><td>{len(super_df.columns) if not super_df.empty else 0}</td><td>{self._get_date_range(super_df)}</td></tr>
            <tr><td>淘宝直播</td><td>{len(taobao_df):,}</td><td>{len(taobao_df.columns) if not taobao_df.empty else 0}</td><td>{self._get_date_range(taobao_df)}</td></tr>
            <tr><td>财务报表</td><td>{len(financial_df):,}</td><td>{len(financial_df.columns) if not financial_df.empty else 0}</td><td>{self._get_date_range(financial_df)}</td></tr>
        </table>
    </div>
    
    <div class="section">
        <h2>📊 关键指标</h2>
        {self._generate_metrics_html(metrics_result)}
    </div>
    
    <div class="section">
        <h2>🔍 数据样本</h2>
        <h3>超级直播数据（前5行）</h3>
        <pre>{super_df.head().to_string() if not super_df.empty else '无数据'}</pre>
        
        <h3>淘宝直播数据（前5行）</h3>
        <pre>{taobao_df.head().to_string() if not taobao_df.empty else '无数据'}</pre>
        
        <h3>财务报表数据（前5行）</h3>
        <pre>{financial_df.head().to_string() if not financial_df.empty else '无数据'}</pre>
    </div>
    
    <div class="section">
        <h2>💡 优化建议</h2>
        <div class="info-box">
            <h3>基于分析结果的建议</h3>
            {self._generate_recommendations(metrics_result)}
        </div>
    </div>
    
    <div class="section">
        <h2>📋 技术详情</h2>
        <div class="note">
            <p><strong>分析依据:</strong> 基于《数据分析基础概念和逻辑v3.md》文档</p>
            <p><strong>数据处理:</strong> 自动编码检测、字段标准化、数据清洗</p>
            <p><strong>计算公式:</strong> 严格按照文档中的业务规则计算</p>
        </div>
    </div>
</body>
</html>
"""
    
    def _get_total_rows(self, *dataframes):
        """获取总数据行数"""
        return sum(len(df) for df in dataframes if not df.empty)
    
    def _get_date_range(self, df):
        """获取数据的日期范围"""
        if df.empty:
            return "无数据"
        
        date_cols = [col for col in df.columns if '日期' in str(col)]
        if not date_cols:
            return "无日期字段"
        
        date_col = date_cols[0]
        try:
            dates = pd.to_datetime(df[date_col], errors='coerce')
            valid_dates = dates.dropna()
            if not valid_dates.empty:
                return f"{valid_dates.min().strftime('%Y-%m-%d')} 至 {valid_dates.max().strftime('%Y-%m-%d')}"
        except:
            pass
        
        return "日期格式异常"
    
    def _generate_metrics_html(self, metrics_result):
        """生成指标HTML"""
        html = ""
        
        for metric_type, metrics in metrics_result.items():
            html += f"<h3>{metric_type.upper()} 指标</h3>"
            html += "<div style='display: flex; flex-wrap: wrap; gap: 15px;'>"
            
            for metric_name, values in metrics.items():
                if isinstance(values, dict) and 'mean' in values:
                    # 汇总统计
                    value_html = f"""
                    <div class="metric-card">
                        <div class="metric-label">{metric_name}</div>
                        <div class="metric-value">{values['mean']:,.2f}</div>
                        <div style="font-size: 12px; color: #666;">
                            范围: {values['min']:,.2f} - {values['max']:,.2f}
                        </div>
                    </div>
                    """
                else:
                    # 单个值，确保是标量值
                    if hasattr(values, 'iloc'):
                        # 如果是Series，取第一个值
                        scalar_value = values.iloc[0] if len(values) > 0 else 0
                    else:
                        scalar_value = values
                    
                    value_html = f"""
                    <div class="metric-card">
                        <div class="metric-label">{metric_name}</div>
                        <div class="metric-value">{scalar_value:,.2f}</div>
                    </div>
                    """
                
                html += value_html
            
            html += "</div>"
        
        return html
    
    def _generate_recommendations(self, metrics_result):
        """生成优化建议"""
        recommendations = []
        
        # 基于ROI的建议
        if 'super' in metrics_result and 'ROI' in metrics_result['super']:
            roi = metrics_result['super']['ROI'].get('mean', 0)
            if roi < 2:
                recommendations.append("⚠️ ROI偏低，建议优化投放策略或提高转化率")
            elif roi > 5:
                recommendations.append("✅ ROI表现优秀，可考虑增加投放预算")
        
        # 基于成本的建议
        if 'super' in metrics_result and '观看成本' in metrics_result['super']:
            cost = metrics_result['super']['观看成本'].get('mean', 0)
            if cost > 10:
                recommendations.append("⚠️ 观看成本较高，建议优化创意质量")
        
        # 基于转化率的建议
        if 'taobao' in metrics_result and '成交转化率' in metrics_result['taobao']:
            conversion_rate = metrics_result['taobao']['成交转化率'].get('mean', 0)
            if conversion_rate < 0.02:
                recommendations.append("⚠️ 转化率偏低，建议优化商品选择和话术")
        
        if not recommendations:
            recommendations.append("📊 数据分析完成，建议根据具体业务情况制定优化策略")
        
        return "<ul>" + "".join(f"<li>{rec}</li>" for rec in recommendations) + "</ul>"
    
    def generate_csv_reports(self, metrics_result, date_range):
        """生成CSV格式的报告"""
        timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
        files_created = {}
        
        for metric_type, metrics in metrics_result.items():
            filename = f"{metric_type}_指标汇总_{date_range.replace(':', '_')}_{timestamp}.csv"
            filepath = os.path.join(self.output_dir, filename)
            
            # 转换指标数据为DataFrame
            report_data = []
            for metric_name, values in metrics.items():
                if isinstance(values, dict):
                    # 汇总统计
                    row = {'指标': metric_name, **values}
                else:
                    # 单个值
                    row = {'指标': metric_name, '值': values}
                report_data.append(row)
            
            if report_data:
                df = pd.DataFrame(report_data)
                df.to_csv(filepath, index=False, encoding='utf-8-sig')
                files_created[metric_type] = filepath
        
        return files_created

path: test_simple.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
简化测试版本
"""

import pandas as pd
import numpy as np
import os
import glob
import chardet
from datetime import datetime

def simple_test():
    """简单测试函数"""
    data_dir = "/Users/zhouhao/Documents/投放数据"
    
    print("🚀 开始简单测试...")
    
    # 只测试2026年1月的数据
    super_file = "/Users/zhouhao/Documents/投放数据/26年/超级直播/2026-01超级直播.csv"
    
    if os.path.exists(super_file):
        print(f"✅ 找到文件: {super_file}")
        
        # 读取文件
        df = pd.read_csv(super_file, encoding='utf-8')
        print(f"✅ 读取成功，形状: {df.shape}")
        print(f"字段: {list(df.columns)[:10]}...")  # 只显示前10个字段
        
        # 简单的数值转换测试
        if '花费' in df.columns:
            df['花费'] = pd.to_numeric(df['花费'], errors='coerce')
            print(f"花费字段类型: {df['花费'].dtype}")
            print(f"花费统计: 总和={df['花费'].sum():.2f}, 均值={df['花费'].mean():.2f}")
        
        if '总成交金额' in df.columns:
            df['总成交金额'] = pd.to_numeric(df['总成交金额'], errors='coerce')
            print(f"总成交金额字段类型: {df['总成交金额'].dtype}")
        
        # 简单计算ROI
        if '花费' in df.columns and '总成交金额' in df.columns:
            roi = df['总成交金额'] / df['花费'].replace(0, np.nan)
            print(f"ROI计算成功，均值: {roi.mean():.2f}")
        
        print("✅ 简单测试完成!")
        return True
    else:
        print("❌ 文件不存在")
        return False

if __name__ == "__main__":
    simple_test()

path: README.md
content: # 投放数据分析技能

基于《数据分析基础概念和逻辑v3.md》文档开发的标准化投放数据分析技能。

## 🚀 快速开始

### 安装依赖
```bash
pip install -r requirements.txt
```

### 基本使用
```bash
python main.py --date-range "2026-01-01:2026-01-31" --data-dir "/Users/zhouhao/Documents/投放数据"
```

### 高级使用
```bash
# 指定特定指标
python main.py --date-range "2026-01-01:2026-01-31" \
               --metrics "ROI,观看成本,订单成本,加购成本" \
               --output-format "html,csv"

# 自定义输出目录
python main.py --date-range "2026-01-01:2026-01-31" \
               --output-dir "/Users/zhouhao/Desktop/自定义报告"
```

## 📊 功能特性

### 核心功能
- ✅ **自动文件识别** - 自动识别超级直播、淘宝直播、财务三类数据文件
- ✅ **编码自动处理** - 支持GBK、UTF-8等多种编码格式
- ✅ **字段智能映射** - 基于文档的字段定义和计算公式
- ✅ **跨报表关联分析** - 支持多数据源关联计算
- ✅ **数据质量检查** - 自动检测数据质量问题

### 输出内容
- 📈 HTML可视化报告
- 📊 CSV格式数据汇总
- 🔍 数据质量报告
- 💡 优化建议

## 📁 文件结构

```
投放数据分析技能/
├── SKILL.md          # 技能说明文档
├── main.py           # 主程序
├── data_processor.py # 数据处理模块
├── calculator.py     # 指标计算模块
├── reporter.py       # 报表生成模块
├── config.py         # 配置文件
├── requirements.txt  # Python依赖
└── README.md        # 使用说明
```

## 🔧 配置说明

### 数据目录配置
默认数据目录：`/Users/zhouhao/Documents/投放数据`

### 文件识别规则
- **超级直播文件**: 包含"超级直播"关键词
- **淘宝直播文件**: 包含"淘宝直播"关键词  
- **财务文件**: 包含"财务"或"财务报表"关键词

### 字段映射
基于《数据分析基础概念和逻辑v3.md》文档中的字段定义，支持自动字段识别和映射。

## 📋 支持的指标

### 超级直播指标
- ROI（投入产出比）
- 观看成本
- 订单成本
- 加购成本
- 点击率
- 互动率
- 有效观看率
- 千次展现成本

### 淘宝直播指标
- 成交转化率
- 加购转化率
- 客单价
- 笔单价
- 件单价
- 退款率
- 退单率

### 财务指标
- 业务口径收入
- 财务口径收入
- 毛利率

### 跨报表指标
- 超级直播去退ROI
- 推广投入回报率

## 🛠️ 开发说明

### 技能架构
```
主程序 (main.py)
    ├── 数据处理 (data_processor.py)
    ├── 指标计算 (calculator.py)
    └── 报告生成 (reporter.py)
```

### 扩展开发
1. 在 `config.py` 中添加新的字段映射
2. 在 `calculator.py` 中添加新的指标计算公式
3. 在 `reporter.py` 中添加新的报告格式

## 📝 版本历史

- **v1.0.0** (2026-03-18)
  - 初始版本发布
  - 基于《数据分析基础概念和逻辑v3.md》开发
  - 支持三大数据源自动处理
  - 生成HTML和CSV报告

## ❓ 常见问题

### Q: 文件编码识别错误怎么办？
A: 系统会自动尝试多种编码格式，如仍无法识别，请检查文件格式。

### Q: 字段名称不匹配怎么办？
A: 在 `config.py` 中的 `FIELD_MAPPING` 配置中添加字段映射。

### Q: 如何添加新的指标计算？
A: 在 `calculator.py` 中添加新的计算方法，并在 `config.py` 中配置相关字段。

## 📞 技术支持

如有问题请联系：江风

path: calculator.py
content: """
指标计算模块 - 基于《数据分析基础概念和逻辑v3.md》文档
"""

import pandas as pd
import numpy as np

class MetricCalculator:
    def __init__(self):
        pass
    
    def calculate_super_metrics(self, df):
        """计算超级直播指标"""
        metrics = {}
        
        # 基础效率指标
        if '花费' in df.columns and '总成交金额' in df.columns:
            metrics['ROI'] = pd.to_numeric(df['总成交金额'], errors='coerce') / pd.to_numeric(df['花费'], errors='coerce').replace(0, np.nan)
        
        if '花费' in df.columns and '直接成交金额' in df.columns:
            metrics['直接ROI'] = pd.to_numeric(df['直接成交金额'], errors='coerce') / pd.to_numeric(df['花费'], errors='coerce').replace(0, np.nan)
        
        # 成本指标
        if '花费' in df.columns and '观看次数' in df.columns:
            metrics['观看成本'] = pd.to_numeric(df['花费'], errors='coerce') / pd.to_numeric(df['观看次数'], errors='coerce').replace(0, np.nan)
        
        if '花费' in df.columns and '总成交笔数' in df.columns:
            metrics['订单成本'] = df['花费'] / df['总成交笔数'].replace(0, np.nan)
        
        if '花费' in df.columns and '直接成交笔数' in df.columns:
            metrics['直接订单成本'] = df['花费'] / df['直接成交笔数'].replace(0, np.nan)
        
        # 加购成本（根据文档公式）
        if '花费' in df.columns and '总收藏数' in df.columns and '总购物车数' in df.columns:
            total_collect_cart = df['总收藏数'] + df['总购物车数']
            metrics['加购成本'] = df['花费'] / total_collect_cart.replace(0, np.nan)
        
        # 转化率指标
        if '展现量' in df.columns and '观看次数' in df.columns:
            metrics['点击率'] = df['观看次数'] / df['展现量'].replace(0, np.nan)
        
        if '展现量' in df.columns and '互动量' in df.columns:
            metrics['互动率'] = df['互动量'] / df['展现量'].replace(0, np.nan)
        
        if '观看次数' in df.columns and '有效观看次数' in df.columns:
            metrics['有效观看率'] = df['有效观看次数'] / df['观看次数'].replace(0, np.nan) * 100
        
        # 千次展现成本
        if '花费' in df.columns and '展现量' in df.columns:
            metrics['千次展现成本'] = (df['花费'] / df['展现量'].replace(0, np.nan)) * 1000
        
        return metrics
    
    def calculate_taobao_metrics(self, df):
        """计算淘宝直播指标"""
        metrics = {}
        
        # 转化率指标
        if '商品点击人数' in df.columns and '成交人数' in df.columns:
            metrics['成交转化率'] = pd.to_numeric(df['成交人数'], errors='coerce') / pd.to_numeric(df['商品点击人数'], errors='coerce').replace(0, np.nan)
        
        if '商品点击人数' in df.columns and '加购人数' in df.columns:
            metrics['加购转化率'] = pd.to_numeric(df['加购人数'], errors='coerce') / pd.to_numeric(df['商品点击人数'], errors='coerce').replace(0, np.nan)
        
        # 价值指标
        if '成交金额' in df.columns and '成交人数' in df.columns:
            metrics['客单价'] = pd.to_numeric(df['成交金额'], errors='coerce') / pd.to_numeric(df['成交人数'], errors='coerce').replace(0, np.nan)
        
        if '成交金额' in df.columns and '成交笔数' in df.columns:
            metrics['笔单价'] = pd.to_numeric(df['成交金额'], errors='coerce') / pd.to_numeric(df['成交笔数'], errors='coerce').replace(0, np.nan)
        
        if '成交金额' in df.columns and '成交件数' in df.columns:
            metrics['件单价'] = pd.to_numeric(df['成交金额'], errors='coerce') / pd.to_numeric(df['成交件数'], errors='coerce').replace(0, np.nan)
        
        # 退款相关指标
        if '退款金额' in df.columns and '成交金额' in df.columns:
            metrics['退款率'] = pd.to_numeric(df['退款金额'], errors='coerce') / pd.to_numeric(df['成交金额'], errors='coerce').replace(0, np.nan)
        
        if '退款订单笔数' in df.columns and '成交订单笔数' in df.columns:
            metrics['退单率'] = pd.to_numeric(df['退款订单笔数'], errors='coerce') / pd.to_numeric(df['成交订单笔数'], errors='coerce').replace(0, np.nan)
        
        return metrics
    
    def calculate_financial_metrics(self, df):
        """计算财务指标"""
        metrics = {}
        
        # 业务口径收入（根据文档公式）
        revenue_components = ['品牌费', '切片', '保量佣金', '预估结算机构佣金', '预估结算线下佣金']
        existing_components = [col for col in revenue_components if col in df.columns]
        
        if existing_components:
            # 确保所有字段都是数值类型
            numeric_df = df[existing_components].apply(pd.to_numeric, errors='coerce')
            metrics['业务口径收入'] = numeric_df.sum(axis=1)
            
            # 财务口径收入
            metrics['财务口径收入'] = metrics['业务口径收入'] / 1.06
        
        # 毛利率
        if '毛利' in df.columns and '财务口径收入' in metrics:
            metrics['毛利率'] = pd.to_numeric(df['毛利'], errors='coerce') / metrics['财务口径收入'].replace(0, np.nan)
        elif '毛利' in df.columns and '业务口径收入' in metrics:
            # 如果没有财务口径收入，使用业务口径收入估算
            estimated_financial_revenue = metrics['业务口径收入'] / 1.06
            metrics['毛利率'] = pd.to_numeric(df['毛利'], errors='coerce') / estimated_financial_revenue.replace(0, np.nan)
        
        return metrics
    
    def cross_report_analysis(self, super_df, taobao_df, financial_df):
        """跨报表关联分析"""
        cross_metrics = {}
        
        # 确保有日期字段用于关联
        super_date_col = next((col for col in super_df.columns if '日期' in str(col)), None)
        taobao_date_col = next((col for col in taobao_df.columns if '日期' in str(col)), None)
        financial_date_col = next((col for col in financial_df.columns if '日期' in str(col)), None)
        
        if super_date_col and taobao_date_col:
            # 合并超级直播和淘宝直播数据
            merged_df = pd.merge(
                super_df, 
                taobao_df, 
                left_on=super_date_col, 
                right_on=taobao_date_col, 
                how='inner',
                suffixes=('_super', '_taobao')
            )
            
            # 超级直播去退ROI参考值（根据文档公式）
            if '总成交金额_super' in merged_df.columns and '退货率_taobao' in merged_df.columns:
                adjusted_revenue = merged_df['总成交金额_super'] * (1 - merged_df['退货率_taobao'])
                cross_metrics['超级直播去退ROI'] = adjusted_revenue / merged_df['花费_super'].replace(0, np.nan)
                cross_metrics['超级直播去退成交金额'] = adjusted_revenue
            
            # 推广投入回报率
            if all(col in merged_df.columns for col in ['花费_super', '总成交笔数_super', '成交笔数_taobao']):
                financial_cols = ['保量佣金', '预估结算线下佣金', '预估结算机构佣金']
                existing_financial_cols = [col for col in financial_cols if col in financial_df.columns]
                
                if existing_financial_cols:
                    # 计算广告成交占比
                    ad_conversion_ratio = merged_df['总成交笔数_super'] / merged_df['成交笔数_taobao'].replace(0, np.nan)
                    
                    # 计算推广投入回报率
                    financial_income = financial_df[existing_financial_cols].sum(axis=1)
                    cross_metrics['推广投入回报率'] = (financial_income * ad_conversion_ratio) / merged_df['花费_super'].replace(0, np.nan)
        
        return cross_metrics
    
    def generate_summary_report(self, metrics_dict):
        """生成指标汇总报告"""
        summary = {}
        
        for metric_type, metrics in metrics_dict.items():
            summary[metric_type] = {}
            for metric_name, values in metrics.items():
                if hasattr(values, 'mean'):  # 如果是Series
                    summary[metric_type][metric_name] = {
                        'mean': values.mean(),
                        'median': values.median(),
                        'min': values.min(),
                        'max': values.max(),
                        'std': values.std()
                    }
                else:
                    summary[metric_type][metric_name] = values
        
        return summary

path: main.py
content: #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
投放数据分析技能 - 主程序
基于《数据分析基础概念和逻辑v3.md》开发
"""

import pandas as pd
import numpy as np
import os
import glob
import chardet
from datetime import datetime
import argparse
import sys

# 导入自定义模块
from data_processor import DataProcessor
from calculator import MetricCalculator
from reporter import ReportGenerator
from config import CONFIG

def main():
    """主函数"""
    # 支持ClawHub运行：优先使用环境变量，其次使用命令行参数
    date_range = os.environ.get('TOUFANG_DATE_RANGE')
    data_dir = os.environ.get('TOUFANG_DATA_DIR', CONFIG['DEFAULT_DATA_DIR'])
    metrics = os.environ.get('TOUFANG_METRICS', 'all')
    output_dir = os.environ.get('TOUFANG_OUTPUT_DIR', CONFIG['DEFAULT_OUTPUT_DIR'])
    output_format = os.environ.get('TOUFANG_OUTPUT_FORMAT', 'html')
    
    # 如果没有环境变量，使用命令行参数
    if not date_range:
        parser = argparse.ArgumentParser(description='投放数据分析技能')
        parser.add_argument('--date-range', required=True, help='日期范围，格式: YYYY-MM-DD:YYYY-MM-DD')
        parser.add_argument('--data-dir', default=CONFIG['DEFAULT_DATA_DIR'], help='数据目录路径')
        parser.add_argument('--metrics', default='all', help='需要计算的指标，逗号分隔')
        parser.add_argument('--output-dir', default=CONFIG['DEFAULT_OUTPUT_DIR'], help='输出目录')
        parser.add_argument('--output-format', default='html', help='输出格式: html,csv')
        
        args = parser.parse_args()
        date_range = args.date_range
        data_dir = args.data_dir
        metrics = args.metrics
        output_dir = args.output_dir
        output_format = args.output_format
    
    print("🚀 开始执行投放数据分析技能...")
    print(f"日期范围: {date_range}")
    print(f"数据目录: {data_dir}")
    
    try:
        # 初始化处理器
        processor = DataProcessor(data_dir)
        
        # 自动识别数据文件
        print("📁 正在识别数据文件...")
        super_files, taobao_files, financial_files = processor.auto_detect_files()
        
        if not super_files and not taobao_files and not financial_files:
            print("❌ 未找到任何数据文件")
            return 1
            
        print(f"✅ 找到 {len(super_files)} 个超级直播文件")
        print(f"✅ 找到 {len(taobao_files)} 个淘宝直播文件") 
        print(f"✅ 找到 {len(financial_files)} 个财务文件")
        
        # 读取数据
        print("📊 正在读取数据...")
        super_df = processor.read_data(super_files, 'super')
        taobao_df = processor.read_data(taobao_files, 'taobao')
        financial_df = processor.read_data(financial_files, 'financial')
        
        # 数据预处理
        print("🔄 正在进行数据预处理...")
        super_df = processor.preprocess_data(super_df, 'super')
        taobao_df = processor.preprocess_data(taobao_df, 'taobao')
        financial_df = processor.preprocess_data(financial_df, 'financial')
        
        # 初始化计算器
        calculator = MetricCalculator()
        
        # 计算指标
        print("🧮 正在计算指标...")
        metrics_result = {}
        
        if not super_df.empty:
            metrics_result['super'] = calculator.calculate_super_metrics(super_df)
        if not taobao_df.empty:
            metrics_result['taobao'] = calculator.calculate_taobao_metrics(taobao_df)
        if not financial_df.empty:
            metrics_result['financial'] = calculator.calculate_financial_metrics(financial_df)
        
        # 跨报表关联分析
        if not super_df.empty and not taobao_df.empty and not financial_df.empty:
            cross_metrics = calculator.cross_report_analysis(super_df, taobao_df, financial_df)
            metrics_result['cross'] = cross_metrics
        
        # 生成报告
        print("📝 正在生成报告...")
        reporter = ReportGenerator(output_dir)
        
        # 生成HTML报告
        if 'html' in output_format:
            html_report = reporter.generate_html_report(
                super_df, taobao_df, financial_df, metrics_result, date_range
            )
            print(f"✅ HTML报告已生成: {html_report}")
        
        # 生成CSV报告
        if 'csv' in output_format:
            csv_files = reporter.generate_csv_reports(metrics_result, date_range)
            for file_type, file_path in csv_files.items():
                print(f"✅ {file_type} CSV报告已生成: {file_path}")
        
        print("🎉 投放数据分析完成!")
        return 0
        
    except Exception as e:
        print(f"❌ 处理过程中出错: {e}")
        import traceback
        traceback.print_exc()
        return 1

if __name__ == "__main__":
    sys.exit(main())

path: .clawhub/origin.json
content: version: 1
registry: https://clawhub.ai
slug: toufang-data-analysis
installedVersion: 1.0.0
installedAt: 1773783437001

Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)