Python EXCEL 小技巧:总结和比较表格的差异(输出差异和数值相减)

【Py 工具】3 分钟搞定 Excel 数据匹配!多表交集分析可视化工具一键上手 本文介绍了一个基于Python开发的Excel交集处理GUI工具,支持多文件多表交集分析。该工具提供了可视化界面,允许用户选择两个Excel文件及其工作表,设置交集匹配字段,并支持四种交集类型:内交、左交、右交和全交。开发环境需要Python 3.6+,依赖pandas、tkinter和openpyxl库。核心代码构建了图形界面,包含文件浏览、工作表加载和交集操作等功能。该工具简化了Excel数据交集分析流程,适合非技术人员使用,可显著提高数据处理效率。 阅读详情

思路

假设第一行是标题行,且两个文件的标题行内容一致(可能顺序不同)。

  1. 读取两个文件,获取DataFrame

    • 假设csv或xlsx
  2. 检查两个DataFrame的形状(行数和列数)是否一致,如果不一致,则直接返回错误

  3. 检查两个DataFrame的列名是否包含相同的列(不考虑顺序)

    • 如果列名集合不同,则返回错误。
    • 如果列名相同但顺序不同,调整第二个DataFrame的列顺序与第一个相同。
  4. 比较两个DataFrame的内容

    • 如果完全相同,则输出相同提示。
    • 如果存在差异,则生成一个差异报告Excel文件,包含两个sheet:
      • 第一个sheet:统计每个列中差异的数量。
      • 第二个sheet:将两个表中存在差异的行整合到一起(显示两个表中对应的行,并标记出差异的单元格)。

V 1.0

import pandas as pd
import numpy as np
from openpyxl import Workbook
from openpyxl.styles import PatternFill

def compare_dataframes(df1, df2):
    """
    比较两个DataFrame,返回差异报告
    
    参数:
    df1: 第一个DataFrame
    df2: 第二个DataFrame
    
    返回:
    如果相同返回True,否则返回差异报告DataFrame和列差异统计
    """
    # 检查形状是否一致
    if df1.shape != df2.shape:
        return False, None, None
    
    # 检查列名是否一致(不考虑顺序)
    if set(df1.columns) != set(df2.columns):
        return False, None, None
    
    # 调整列顺序使其一致
    df2 = df2[df1.columns]
    
    # 比较内容
    if df1.equals(df2):
        return True, None, None
    
    # 找出差异位置
    diff_mask = df1 != df2
    
    # 处理NaN情况 (NaN != NaN 会返回True)
    both_nan = df1.isna() & df2.isna()
    diff_mask = diff_mask & ~both_nan
    
    # 创建差异统计
    diff_stats = pd.DataFrame({
        '列名': df1.columns,
        '差异数量': diff_mask.sum(axis=0).values
    })
    
    # 创建详细差异报告
    diff_rows = []
    for row_idx in range(df1.shape[0]):
        row_diffs = diff_mask.iloc[row_idx]
        if row_diffs.any():  # 如果这一行有差异
            for col_idx, col_name in enumerate(df1.columns):
                if row_diffs.iloc[col_idx]:
                    diff_rows.append({
                        '行号': row_idx + 2,  # +2是因为Excel行号从1开始,且第一行是标题
                        '列名': col_name,
                        '文件1值': df1.iloc[row_idx, col_idx],
                        '文件2值': df2.iloc[row_idx, col_idx]
                    })
    
    diff_details = pd.DataFrame(diff_rows)
    
    return False, diff_stats, diff_details

def create_difference_report(diff_stats, diff_details, output_file):
    """
    创建差异报告Excel文件
    """
    with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
        # 写入统计信息
        diff_stats.to_excel(writer, sheet_name='差异统计', index=False)
        
        # 写入详细信息
        diff_details.to_excel(writer, sheet_name='详细差异', index=False)
        
        # 获取工作簿和工作表对象
        workbook = writer.book
        stats_sheet = writer.sheets['差异统计']
        details_sheet = writer.sheets['详细差异']
        
        # 设置样式
        red_fill = PatternFill(start_color="FFFF0000", end_color="FFFF0000", fill_type="solid")
        
        # 在详细差异表中高亮差异值
        for idx, row in diff_details.iterrows():
            # 文件1值单元格 (C列)
            details_sheet.cell(row=idx+2, column=3).fill = red_fill
            # 文件2值单元格 (D列)
            details_sheet.cell(row=idx+2, column=4).fill = red_fill
        
        # 调整列宽
        for sheet in [stats_sheet, details_sheet]:
            for column in sheet.columns:
                max_length = 0
                column_letter = column[0].column_letter
                for cell in column:
                    try:
                        if len(str(cell.value)) > max_length:
                            max_length = len(str(cell.value))
                    except:
                        pass
                adjusted_width = min(max_length + 2, 50)
                sheet.column_dimensions[column_letter].width = adjusted_width

def compare_files(file1, file2, file1_sheet=None, file2_sheet=None, output_file='difference_report.xlsx'):
    """
    比较两个文件的主函数
    """
    # 读取文件
    if file1.endswith('.csv'):
        df1 = pd.read_csv(file1)
    else:
        df1 = pd.read_excel(file1, sheet_name=file1_sheet)
    
    if file2.endswith('.csv'):
        df2 = pd.read_csv(file2)
    else:
        df2 = pd.read_excel(file2, sheet_name=file2_sheet)
    
    # 比较DataFrame
    is_same, diff_stats, diff_details = compare_dataframes(df1, df2)
    
    if is_same is None:
        print("文件结构不一致,无法比较")
        return False
    elif is_same:
        print("两个表格内容完全相同!")
        return True
    else:
        print("表格内容存在差异,生成差异报告中...")
        create_difference_report(diff_stats, diff_details, output_file)
        print(f"差异报告已保存至: {output_file}")
        return False

# 使用示例
if __name__ == "__main__":
    compare_files('file1.csv', 'file2.csv')

V2.0

主要改进点包括:

  1. 使用向量化操作替代循环提高性能
  2. 优化NaN值处理
  3. 改进列宽调整逻辑
  4. 增强错误处理
  5. 优化内存使用
import pandas as pd
import numpy as np
from openpyxl import Workbook
from openpyxl.styles import PatternFill
from openpyxl.utils import get_column_letter

def compare_dataframes(df1, df2):
    """
    比较两个DataFrame,返回差异报告
    
    参数:
    df1: 第一个DataFrame
    df2: 第二个DataFrame
    
    返回:
    如果相同返回True,否则返回差异报告DataFrame和列差异统计
    """
    # 检查形状是否一致
    if df1.shape != df2.shape:
        return False, None, None
    
    # 检查列名是否一致(不考虑顺序)
    if set(df1.columns) != set(df2.columns):
        return False, None, None
    
    # 调整列顺序使其一致
    df2 = df2[df1.columns]
    
    # 比较内容 - 使用更高效的方法
    if df1.equals(df2):
        return True, None, None
    
    # 找出差异位置 - 使用向量化操作
    # 处理NaN情况: 使用pd.NA安全的比较方法
    diff_mask = ~(df1.fillna('NA').astype(str) == df2.fillna('NA').astype(str))
    
    # 创建差异统计 - 使用向量化操作
    diff_counts = diff_mask.sum()
    diff_stats = pd.DataFrame({
        '列名': df1.columns,
        '差异数量': diff_counts.values
    })
    
    # 如果没有差异,直接返回
    if diff_counts.sum() == 0:
        return True, None, None
    
    # 创建详细差异报告 - 使用更高效的方法
    # 获取差异位置的行列索引
    diff_indices = np.argwhere(diff_mask.values)
    
    # 构建差异详情DataFrame
    diff_rows = []
    for row_idx, col_idx in diff_indices:
        col_name = df1.columns[col_idx]
        diff_rows.append({
            '行号': row_idx + 2,  # +2是因为Excel行号从1开始,且第一行是标题
            '列名': col_name,
            '文件1值': df1.iloc[row_idx, col_idx],
            '文件2值': df2.iloc[row_idx, col_idx]
        })
    
    diff_details = pd.DataFrame(diff_rows)
    
    return False, diff_stats, diff_details

def create_difference_report(diff_stats, diff_details, output_file):
    """
    创建差异报告Excel文件
    """
    with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
        # 写入统计信息
        diff_stats.to_excel(writer, sheet_name='差异统计', index=False)
        
        # 写入详细信息
        diff_details.to_excel(writer, sheet_name='详细差异', index=False)
        
        # 获取工作簿和工作表对象
        workbook = writer.book
        stats_sheet = writer.sheets['差异统计']
        details_sheet = writer.sheets['详细差异']
        
        # 设置样式
        red_fill = PatternFill(start_color="FFFF0000", end_color="FFFF0000", fill_type="solid")
        
        # 在详细差异表中高亮差异值 - 使用更高效的方法
        for row_idx in range(2, len(diff_details) + 2):  # 从第2行开始(标题在第1行)
            details_sheet.cell(row=row_idx, column=3).fill = red_fill
            details_sheet.cell(row=row_idx, column=4).fill = red_fill
        
        # 优化列宽调整 - 使用更高效的方法
        for sheet in [stats_sheet, details_sheet]:
            for col_idx, column in enumerate(sheet.columns, 1):
                max_length = 0
                col_letter = get_column_letter(col_idx)
                
                # 检查标题和内容
                header_length = len(str(column[0].value))
                max_length = max(max_length, header_length)
                
                # 只检查前100行以避免性能问题
                for cell in column[1:101]:
                    try:
                        cell_length = len(str(cell.value))
                        if cell_length > max_length:
                            max_length = cell_length
                    except:
                        pass
                
                adjusted_width = min(max_length + 2, 50)
                sheet.column_dimensions[col_letter].width = adjusted_width

def compare_files(file1, file2, file1_sheet=None, file2_sheet=None, output_file='difference_report.xlsx'):
    """
    比较两个文件的主函数
    """
    try:
        # 读取文件 - 添加更多错误处理
        if file1.endswith('.csv'):
            df1 = pd.read_csv(file1)
        else:
            df1 = pd.read_excel(file1, sheet_name=file1_sheet or 0, engine='openpyxl')
        
        if file2.endswith('.csv'):
            df2 = pd.read_csv(file2)
        else:
            df2 = pd.read_excel(file2, sheet_name=file2_sheet or 0, engine='openpyxl')
        
        # 比较DataFrame
        is_same, diff_stats, diff_details = compare_dataframes(df1, df2)
        
        if is_same is None:
            print("文件结构不一致,无法比较")
            return False
        elif is_same:
            print("两个表格内容完全相同!")
            return True
        else:
            print("表格内容存在差异,生成差异报告中...")
            create_difference_report(diff_stats, diff_details, output_file)
            print(f"差异报告已保存至: {output_file}")
            return False
    except Exception as e:
        print(f"比较过程中发生错误: {str(e)}")
        return False

# 使用示例
if __name__ == "__main__":
    compare_files('file1.csv', 'file2.csv')

详细优化点:

  1. NaN值处理优化:
  • 使用 fillna(‘NA’) 和 astype(str) 安全地比较包含NaN的值

  • 避免了双重NaN检查逻辑

  1. 性能优化:
  • 使用向量化操作替代循环(特别是 diff_mask 计算)

  • 使用 np.argwhere 高效获取差异位置

  • 限制列宽计算只检查前100行以避免性能问题

  1. 内存优化:
  • 避免创建不必要的中间DataFrame

  • 使用更高效的数据结构存储差异位置

  1. 错误处理增强:
  • 添加了全局异常处理

  • 明确了Excel读取引擎

  • 处理了sheet_name为None的情况

  1. 列宽调整优化:
  • 使用 get_column_letter 简化列索引转换

  • 同时考虑标题长度

  1. 高亮逻辑优化:
  • 直接根据行索引高亮,避免DataFrame迭代

V2.1

导入必要的库:

import pandas as pd
import numpy as np
from pathlib import Path
from openpyxl import Workbook
from openpyxl.styles import PatternFill
import warnings
warnings.filterwarnings('ignore')

1. 文件读取函数

def read_files(file1_path, file2_path, sheet1_name=None, sheet2_name=None):
    """
    读取两个文件并返回DataFrame
    
    参数:
    file1_path: 第一个文件路径
    file2_path: 第二个文件路径
    sheet1_name: 第一个Excel文件的sheet名(如果是Excel文件)
    sheet2_name: 第二个Excel文件的sheet名(如果是Excel文件)
    
    返回:
    两个DataFrame
    """
    # 处理第一个文件
    file1_ext = Path(file1_path).suffix.lower()
    if file1_ext == '.csv':
        df1 = pd.read_csv(file1_path, header=0)
    elif file1_ext in ['.xlsx', '.xls']:
        if sheet1_name:
            df1 = pd.read_excel(file1_path, sheet_name=sheet1_name, header=0)
        else:
            df1 = pd.read_excel(file1_path, header=0)
    else:
        raise ValueError("不支持的文件格式")
    
    # 处理第二个文件
    file2_ext = Path(file2_path).suffix.lower()
    if file2_ext == '.csv':
        df2 = pd.read_csv(file2_path, header=0)
    elif file2_ext in ['.xlsx', '.xls']:
        if sheet2_name:
            df2 = pd.read_excel(file2_path, sheet_name=sheet2_name, header=0)
        else:
            df2 = pd.read_excel(file2_path, header=0)
    else:
        raise ValueError("不支持的文件格式")
    
    return df1, df2

2. DataFrame比较函数

def compare_dataframes(df1, df2, output_file):
    """
    比较两个DataFrame并生成差异报告
    
    参数:
    df1: 第一个DataFrame
    df2: 第二个DataFrame
    output_file: 输出文件路径
    """
    # 创建原始数据的副本,避免修改原始数据
    df1_clean = df1.copy()
    df2_clean = df2.copy()
    
    # 第一步:删除全为空值的行和列
    df1_clean = df1_clean.dropna(how='all').dropna(axis=1, how='all')
    df2_clean = df2_clean.dropna(how='all').dropna(axis=1, how='all')
    
    # 检查行列数是否一致
    if df1_clean.shape != df2_clean.shape:
        print(f"清理后数据形状不一致: df1 {df1_clean.shape}, df2 {df2_clean.shape}")
        return False
    
    # 第二步:检查列名是否一致
    if not df1_clean.columns.equals(df2_clean.columns):
        print("列名不一致,尝试按df1的顺序重排df2的列")
        # 检查是否包含相同的列
        if set(df1_clean.columns) != set(df2_clean.columns):
            print("列名不完全相同,无法比较")
            missing_in_df2 = set(df1_clean.columns) - set(df2_clean.columns)
            missing_in_df1 = set(df2_clean.columns) - set(df1_clean.columns)
            print(f"df2中缺少的列: {missing_in_df2}")
            print(f"df1中缺少的列: {missing_in_df1}")
            return False
        
        # 按df1的顺序重排df2的列
        df2_clean = df2_clean[df1_clean.columns]
        print("已按df1的顺序重排df2的列")
    
    # 第三步:比较数据内容
    # 创建比较矩阵
    comparison = df1_clean.values == df2_clean.values
    
    # 检查是否所有数据都相同
    if comparison.all():
        print("两个表格内容完全相同")
        return True
    
    # 如果有差异,创建差异报告
    print("发现差异,正在生成报告...")
    
    # 创建Excel写入器
    with pd.ExcelWriter(output_file, engine='openpyxl') as writer:
        # Sheet1: 差异统计
        diff_counts = []
        for col in df1_clean.columns:
            col_idx = df1_clean.columns.get_loc(col)
            diff_count = np.sum(~comparison[:, col_idx])
            diff_counts.append(diff_count)
        
        summary_df = pd.DataFrame({
            '列名': df1_clean.columns,
            '差异数量': diff_counts
        })
        summary_df = summary_df[summary_df['差异数量'] > 0]  # 只显示有差异的列
        summary_df.to_excel(writer, sheet_name='差异统计', index=False)
        
        # Sheet2: df1的差异行
        # 找出有差异的行
        diff_rows = np.any(~comparison, axis=1)
        df1_diff = df1_clean[diff_rows].copy()
        df1_diff.to_excel(writer, sheet_name='文件1差异', index=False)
        
        # Sheet3: df2的差异行
        df2_diff = df2_clean[diff_rows].copy()
        df2_diff.to_excel(writer, sheet_name='文件2差异', index=False)
    
    # 高亮显示差异单元格
    highlight_differences(output_file, df1_clean, df2_clean, comparison, diff_rows)
    
    print(f"差异报告已生成: {output_file}")
    return False

def highlight_differences(output_file, df1, df2, comparison, diff_rows):
    """
    高亮显示差异单元格
    
    参数:
    output_file: 输出文件路径
    df1: 第一个DataFrame
    df2: 第二个DataFrame
    comparison: 比较矩阵
    diff_rows: 有差异的行索引
    """
    # 加载工作簿
    wb = Workbook()
    wb = pd.ExcelWriter(output_file, engine='openpyxl').book
    
    # 黄色填充
    yellow_fill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid')
    
    # 处理文件1差异sheet
    ws1 = wb['文件1差异']
    for row_idx in range(2, len(diff_rows) + 2):  # Excel行从1开始,且第一行是标题
        if diff_rows[row_idx - 2]:  # 调整索引
            for col_idx in range(1, len(df1.columns) + 1):
                if not comparison[row_idx - 2, col_idx - 1]:
                    ws1.cell(row=row_idx, column=col_idx).fill = yellow_fill
    
    # 处理文件2差异sheet
    ws2 = wb['文件2差异']
    for row_idx in range(2, len(diff_rows) + 2):
        if diff_rows[row_idx - 2]:
            for col_idx in range(1, len(df2.columns) + 1):
                if not comparison[row_idx - 2, col_idx - 1]:
                    ws2.cell(row=row_idx, column=col_idx).fill = yellow_fill
    
    # 保存工作簿
    wb.save(output_file)

3. 主函数

def compare_tables(file1_path, file2_path, sheet1_name=None, sheet2_name=None, output_file=None):
    """
    主函数:比较两个表格文件
    
    参数:
    file1_path: 第一个文件路径
    file2_path: 第二个文件路径
    sheet1_name: 第一个Excel文件的sheet名(可选)
    sheet2_name: 第二个Excel文件的sheet名(可选)
    output_file: 输出文件路径(可选)
    """
    # 设置默认输出文件名
    if output_file is None:
        output_file = "比较结果.xlsx"
    
    # 读取文件
    df1, df2 = read_files(file1_path, file2_path, sheet1_name, sheet2_name)
    
    # 比较DataFrame
    result = compare_dataframes(df1, df2, output_file)
    
    return result

4. 使用示例

# 示例1: 比较两个CSV文件
compare_tables('file1.csv', 'file2.csv', output_file='comparison_result.xlsx')

# 示例2: 比较Excel文件中的不同sheet
compare_tables('data.xlsx', 'data.xlsx', sheet1_name='Sheet1', sheet2_name='Sheet2', output_file='sheet_comparison.xlsx')

# 示例3: 比较CSV和Excel文件
compare_tables('data.csv', 'data.xlsx', sheet2_name='Sheet1', output_file='cross_format_comparison.xlsx')

代码说明

  1. 文件读取函数:支持CSV和Excel格式,可以指定sheet名称
  2. 数据清理:删除全为空值的行和列
  3. 列名检查:确保两个DataFrame的列名一致,如果不一致但包含相同的列,会按第一个文件的列顺序重排第二个文件
  4. 差异检测:使用NumPy进行高效比较,找出所有差异单元格
  5. 报告生成:
    • 第一个sheet显示每列的差异数量
    • 第二个和第三个sheet分别显示两个文件中存在差异的行,并高亮显示差异单元格

V2.2

思路检查:

  1. 文件读取:支持CSV/Excel(含多Sheet),使用pathlib处理路径更健壮
  2. 预处理逻辑:增加全空行列删除功能,避免空白数据干扰比较
  3. 列名检查:严格检查列名集合一致性,自动标准化列顺序(按字母排序)
  4. 差异检测:使用向量化操作高效比较,正确处理NaN值(视为相等)
  5. 报告生成:
    • 总结页:列名+差异数量统计
    • 差异行页:高亮显示具体差异单元格(黄色背景)
    • 支持无差异行时空Sheet处理
  6. 异常处理:关键步骤添加异常捕获,提供明确错误提示
import pandas as pd
from pathlib import Path
from typing import Optional, Tuple
import openpyxl
from openpyxl.styles import PatternFill
from openpyxl.utils.dataframe import dataframe_to_rows

def convert_to_dataframe(file_path: Path, sheet_name: Optional[str] = None) -> pd.DataFrame:
    """
    将CSV/Excel文件转换为DataFrame(首行为列名)
    :param file_path: 文件路径(Path对象)
    :param sheet_name: Excel工作表名(仅Excel需要)
    :return: DataFrame对象
    """
    try:
        if file_path.suffix.lower() == '.csv':
            return pd.read_csv(file_path, header=0)
        elif file_path.suffix.lower() in ('.xlsx', '.xls'):
            return pd.read_excel(file_path, sheet_name=sheet_name, header=0)
        else:
            raise ValueError(f"不支持的文件格式: {file_path.suffix}")
    except Exception as e:
        raise RuntimeError(f"文件读取失败: {str(e)}") from e

def preprocess_dataframe(df: pd.DataFrame) -> pd.DataFrame:
    """
    预处理DataFrame:删除全空行和全空列
    :param df: 原始DataFrame
    :return: 清洗后DataFrame
    """
    # 删除所有值为空的行(how='all'表示整行全空才删除)
    cleaned = df.dropna(axis=0, how='all')
    # 删除所有值为空的列(how='all'表示整列全空才删除)
    cleaned = cleaned.dropna(axis=1, how='all')
    return cleaned

def validate_dataframe_shapes(df1: pd.DataFrame, df2: pd.DataFrame) -> None:
    """
    验证两个DataFrame清洗后的形状是否一致
    :param df1: 清洗后DataFrame1
    :param df2: 清洗后DataFrame2
    :raises ValueError: 形状不一致时抛出异常
    """
    if df1.shape != df2.shape:
        raise ValueError(
            f"数据维度不一致(清洗后):
"
            f"文件1: {df1.shape[0]}行 x {df1.shape[1]}列
"
            f"文件2: {df2.shape[0]}行 x {df2.shape[1]}列"
        )

def validate_and_align_columns(df1: pd.DataFrame, df2: pd.DataFrame) -> Tuple[pd.DataFrame, pd.DataFrame]:
    """
    验证列名一致性并对齐列顺序
    :param df1: 清洗后DataFrame1
    :param df2: 清洗后DataFrame2
    :return: 列顺序对齐后的两个DataFrame
    :raises ValueError: 列名集合不一致时抛出异常
    """
    cols1 = set(df1.columns)
    cols2 = set(df2.columns)
    
    if cols1 != cols2:
        raise ValueError(
            f"列名不一致:
"
            f"文件1特有列: {cols1 - cols2}
"
            f"文件2特有列: {cols2 - cols1}"
        )
    
    # 按字母顺序对齐列(保证比较顺序一致)
    sorted_cols = sorted(cols1)
    return df1[sorted_cols], df2[sorted_cols]

def detect_differences(df1: pd.DataFrame, df2: pd.DataFrame) -> Tuple[bool, pd.DataFrame, pd.Series]:
    """
    检测两个DataFrame的差异
    :param df1: 对齐后的DataFrame1
    :param df2: 对齐后的DataFrame2
    :return: (是否完全相同, 差异掩码, 列差异数量统计)
    """
    # 快速检查是否完全相同(优化性能)
    if df1.equals(df2):
        return True, None, None
    
    # 生成差异掩码(True表示对应位置不同)
    # 注意:pandas中NaN != NaN,这里需要特殊处理(视为相同)
    diff_mask = df1.fillna('__NULL__').ne(df2.fillna('__NULL__'))
    
    # 统计每列的差异数量
    col_diff_counts = diff_mask.sum()
    
    return False, diff_mask, col_diff_counts

def apply_highlight_style(diff_mask: pd.DataFrame) -> callable:
    """
    生成差异高亮样式函数
    :param diff_mask: 差异掩码DataFrame
    :return: 样式应用函数
    """
    def style_func(row):
        styles = []
        for idx, value in enumerate(row):
            # 检查当前位置是否是差异点
            if diff_mask.iloc[row.name, idx]:
                styles.append('background-color: #FFFF00')  # 黄色背景
            else:
                styles.append('')
        return styles
    return style_func

def generate_comparison_report(
    df1: pd.DataFrame,
    df2: pd.DataFrame,
    diff_mask: pd.DataFrame,
    col_diff_counts: pd.Series,
    output_path: Path
) -> None:
    """
    生成完整的比较报告Excel文件
    :param df1: 对齐后的DataFrame1(用于展示差异行)
    :param df2: 对齐后的DataFrame2(用于展示差异行)
    :param diff_mask: 差异掩码DataFrame
    :param col_diff_counts: 列差异数量统计Series
    :param output_path: 报告输出路径(Path对象)
    """
    with pd.ExcelWriter(output_path, engine='openpyxl') as writer:
        # ------------------------- 总结说明页 -------------------------
        summary_data = col_diff_counts.reset_index()
        summary_data.columns = ['列名称', '差异数量']
        summary_data.to_excel(writer, sheet_name='总结说明', index=False)
        
        # 设置总结页列宽(可选优化)
        worksheet = writer.sheets['总结说明']
        worksheet.column_dimensions['A'].width = 20
        worksheet.column_dimensions['B'].width = 15
        
        # ------------------------- 文件1差异行页 -------------------------
        diff_rows = diff_mask.any(axis=1)  # 找到有差异的行
        df1_diff = df1[diff_rows].reset_index(drop=True)
        
        if not df1_diff.empty:
            # 应用高亮样式
            styled_df1 = df1_diff.style.apply(
                apply_highlight_style(diff_mask.loc[diff_rows]),
                axis=1
            )
            # 写入Excel(保留标题)
            styled_df1.to_excel(
                writer,
                sheet_name='文件1差异行',
                index=False,
                header=True,
                startrow=0
            )
        else:
            # 无差异时创建空页
            pd.DataFrame(columns=df1.columns).to_excel(
                writer,
                sheet_name='文件1差异行',
                index=False
            )
        
        # ------------------------- 文件2差异行页 -------------------------
        df2_diff = df2[diff_rows].reset_index(drop=True)
        
        if not df2_diff.empty:
            styled_df2 = df2_diff.style.apply(
                apply_highlight_style(diff_mask.loc[diff_rows]),
                axis=1
            )
            styled_df2.to_excel(
                writer,
                sheet_name='文件2差异行',
                index=False,
                header=True,
                startrow=0
            )
        else:
            pd.DataFrame(columns=df2.columns).to_excel(
                writer,
                sheet_name='文件2差异行',
                index=False
            )
        
        # 自动调整列宽(可选优化)
        for sheet_name in writer.sheets:
            worksheet = writer.sheets[sheet_name]
            for idx, col in enumerate(worksheet.columns):
                max_length = max(len(str(cell.value)) for cell in col if cell.value)
                adjusted_width = (max_length + 2) * 1.2
                worksheet.column_dimensions[chr(65 + idx)].width = min(adjusted_width, 50)

def compare_files(
    file1_path: Path,
    file2_path: Path,
    sheet1_name: Optional[str] = None,
    sheet2_name: Optional[str] = None,
    output_path: Path = Path('表格比较结果.xlsx')
) -> None:
    """
    主函数:执行完整的文件比较流程
    :param file1_path: 文件1路径(CSV/Excel)
    :param file2_path: 文件2路径(CSV/Excel)
    :param sheet1_name: 文件1的Sheet名(仅Excel需要)
    :param sheet2_name: 文件2的Sheet名(仅Excel需要)
    :param output_path: 报告输出路径(默认当前目录)
    """
    try:
        # -------------------- 步骤1:读取文件 --------------------
        print("正在读取文件...")
        df1 = convert_to_dataframe(file1_path, sheet_name=sheet1_name)
        df2 = convert_to_dataframe(file2_path, sheet_name=sheet2_name)
        print("文件读取完成")

        # -------------------- 步骤2:数据清洗 --------------------
        print("正在清洗数据(删除全空行列)...")
        df1_clean = preprocess_dataframe(df1)
        df2_clean = preprocess_dataframe(df2)
        print("数据清洗完成")

        # -------------------- 步骤3:维度验证 --------------------
        print("正在验证数据维度...")
        validate_dataframe_shapes(df1_clean, df2_clean)
        print("数据维度验证通过")

        # -------------------- 步骤4:列名对齐 --------------------
        print("正在对齐列名...")
        df1_aligned, df2_aligned = validate_and_align_columns(df1_clean, df2_clean)
        print("列名对齐完成")

        # -------------------- 步骤5:差异检测 --------------------
        print("正在检测数据差异...")
        is_identical, diff_mask, col_diff_counts = detect_differences(df1_aligned, df2_aligned)
        
        if is_identical:
            print("结论:两个表格内容完全相同")
            return

        # -------------------- 步骤6:生成报告 --------------------
        print("正在生成差异报告...")
        generate_comparison_report(
            df1_aligned,
            df2_aligned,
            diff_mask,
            col_diff_counts,
            output_path
        )
        print(f"结论:发现数据差异,报告已生成至:{output_path.absolute()}")

    except Exception as e:
        print(f"比较过程中发生错误: {str(e)}")
        # 可选:添加调试断点(取消注释以下行)
        # import pdb; pdb.set_trace()

# ------------------------- 使用示例 -------------------------
if __name__ == "__main__":
    # 示例1:比较两个CSV文件
    # compare_files(
    #     file1_path=Path("文件1.csv"),
    #     file2_path=Path("文件2.csv"),
    #     output_path=Path("CSV比较结果.xlsx")
    # )

    # 示例2:比较Excel的两个Sheet
    compare_files(
        file1_path=Path("文件1.xlsx"),
        file2_path=Path("文件2.xlsx"),
        sheet1_name="销售数据",  # 文件1的Sheet名
        sheet2_name="2025年销售",  # 文件2的Sheet名
        output_path=Path("ExcelSheet比较结果.xlsx")
    )
Excel中精准计算CAGR的三种方法与避坑指南 CAGR(复合年均增长率)是衡量长期增长质量的核心指标,其本质是复利模型下的等效年化速率,而非简单算术平均。理解其数学原理——即求解Vₙ = V₀×(1+r)ⁿ中的r——是避免误用的前提。在工程实践中,CAGR的价值体现在财务建模、竞品对标和业务健康度诊断中,尤其适用于需要跨周期、跨主体比较的场景。本文聚焦Excel原生实现,重点解析RATE()函数的鲁棒性优势、幂运算公式的适用边界,以及XIRR()在非规则时点下的灵活应用,并融入‘期初期末口径校验’‘零负值处理’‘动态年份计算’等高频实操热词,帮助从业者 阅读详情

相关推荐

Excel函数生成的数据如何对比?详解VLOOKUP与SUMIFS的坑与解法

数据处理中,数据对比是最常见的操作之一,但很多用户在Excel中对比由函数生成的数据时,常常遇到看似相同却判断不一致的问题。其根本原因在于函数结果受单元格格式、数据精度、空值类型等底层属性影响,与普通常量存在差异。理解这些原理,掌握数据清洗的基本方法,才能准确使用VLOOKUP、SUMIFS等函数进行跨表核对、汇总对比。本文从数据处理的基础概念出发,结合实际对账场景,介绍如何通过TRIM、ROUND等函数预处理数据,并利用COUNTIF、XLOOKUP等工具实现可靠的数据比对,帮助读者构建高效、稳妥的Exc

weixin_30564785的博客 486

Python对比两个Excel数据内容并标出不同(收藏备用)

在处理excel文件时,往往需要双比表格哪些被修改过了,今天就给大家分享一段代码,代码中运用到的模块,请自行用pip命令安装

xyh2004的博客 2311

协方差实战指南:从Excel手算到业务决策的量化关系分析

协方差是衡量两个变量线性联动强度的基础统计量,其核心原理在于计算‘偏离均值的乘积’的平均值,从而消除量纲差异、锚定业务常态、区分同向与反向变化。作为相关性分析的底层基石,它不依赖复杂数学推导,却能直接支撑指标筛选、风险对冲和异常检测等关键工程任务。相比抽象公式,协方差的价值体现在真实场景中——如用COVARIANCE.S快速识别冗余特征,或通过协方差矩阵热力图发现用户行为间的隐性挤占。它虽不能替代因果推断,却是数据驱动决策不可绕过的‘第一把标尺’。

weixin_33761747的博客 277

Python实现简单的excel对比工具

最近有小伙伴说需要一个工具,用来对比2个excel表的差异,直接标记出来有差异的行。 代码倒还挺简单的,为了方便小白使用,我给它打包成exe文件,点击执行即可输出结果。 1、先说一下怎么用,后面上代码 链接:https://pan.baidu.com/s/1oNEeIDOnw1Grw2MOdJrwUQ 提取码:w29l 先到网盘链接,下载文件: 如果不需要源代码,直接下载xlsx_compare.rar即可。 解压后打开: 这里面2个xlsx文件是我用来测试的文件,可以直接换成你自己的,必须是2个,不要放

Jacky_kplin的博客 7883

不用微积分的PID:用Excel搭建可视化闭环控制实验台

PID控制器是工业自动化和嵌入式控制中最基础的算法之一,但初学者常被积分、微分公式困扰。实际上,在数字系统中PID通过离散化处理,本质上只涉及误差的累加与差值,并不需要深厚的微积分基础。借助常见的电子表格软件,即可搭建一个可交互的闭环控制仿真实验台,清晰观察比例、积分、微分项对响应曲线的影响。通过直观的参数整定实验,可以理解稳态误差、超调、振荡等现象,并掌握从位置式PID到嵌入式代码迁移的方法。本文适合初学者快速建立PID直觉,也适合开发者用Excel进行控制算法的快速验证与教学演示,并平滑过渡到STM32

weixin_30443731的博客 375

Excel卡方检验实战:从原理到业务归因的完整链路

卡方检验是分析分类变量间关联性的基础统计方法,其核心在于通过观察频数与期望频数的偏差量化‘偶然性’程度。理解χ²=(O−E)²/E的计算逻辑,有助于规避自由度误设、期望频数<5等常见失效风险。该检验在业务场景中广泛应用于渠道效果评估、缺陷根因分析、用户分群验证等任务,尤其适合缺乏编程环境的Excel工作流。结合标准化残差与Cramér's V效应量,可将p值结论转化为可行动的业务洞察——这正是Chi-square Test in Spreadsheets区别于纯理论教学的关键价值。

weixin_33701564的博客 347

多个excel表数据比对操作

这里面,先把主列数据拿出来存做列表,通过两张表比对,找出存在A表但是不存在B表的数据,还有共同数据中不同的净值,然后新建一张sheet表存入数据,PS:这里这能通过找到A表中存在但是B表不存在的数据和共同数据,如果需要找到B表存在但是A表不存在的数据,需要把两张表顺序颠倒再运行一次。这里,逻辑和上方一样:也是获取相关列,然后数据进行比对,,但是做了一些为空的处理,而且可以找出两张表中分别不存在的数据依次存入新表中,优点:主要是处理xlsx的文件,里面方法简单,易懂。推荐使用第二种pandas方法。

saber_sss的博客 1996

Mistral-7B + GRPO微调实战:低门槛提升指令遵循与结构化输出

大语言模型的指令遵循能力,本质是模型对人类意图的理解与响应一致性问题。其技术原理依赖偏好学习——通过对比不同响应的质量差异,构建隐式奖励信号,从而校准生成行为。GRPO(广义偏好优化)作为DPO的泛化形式,以更低的数据构造门槛、更强的多候选排序支持和更稳定的训练动态,在消费级硬件上展现出突出工程价值。尤其适配Mistral-7B等具备滑动窗口注意力与GQA架构的模型,可在单卡3090上实现高效微调。典型应用场景包括结构化输出(Markdown表格/分点说明)、安全拒绝、代码注释生成等需强格式约束与行为边界的

weixin_33847182的博客 373

Python 计算两个 Excel 文件的差异

通过以上步骤,我们可以使用Python计算两个Excel文件的差异。这在数据分析和处理中非常有用,可以帮助我们快速找出数据的变化和问题。```

2501_91229846的博客 339

python进行两个表格对比的方法

今天小编就为大家分享一篇python进行两个表格对比的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Win11内核隔离无法打开的解决方案详解

内核隔离问题的解决需遵循"先硬件后软件"的排查原则,90%以上的案例可通过驱动清理或外设断开解决。对于必须禁用该功能的用户,建议定期使用Windows Defender进行全盘扫描,并保持系统更新至最新版本。技术决策需在安全性和兼容性之间取得平衡,本文提供的多维解决方案可帮助用户构建更稳定的Windows 11使用环境。

mmoo_python的博客 4831

Python Pandas实现导出两个Excel数据集的对应值的差异值分析

【代码】Python Pandas实现导出两个Excel数据集的对应值的差异值分析。

weixin_30777913的博客 713

C#实战:如何用TSCLIB.dll实现TSC打印机的状态监控与异常处理(附完整代码)

本文详细介绍了如何利用C#和TSCLIB.dll构建企业级TSC打印机状态监控与智能异常处理系统。通过解析十六进制状态码、设计高可靠性的轮询引擎以及实现事件驱动的报警机制,开发者可以打造一个稳定、可观测的打印服务,有效保障物流仓储、生产制造等高频打印场景的业务连续性。

weixin_29227585的博客 64

python处理excel的时间格式_Python处理Excel使用pandas处理时间格式数据

“通常我们拿到数据,首先要确认的就是数据完整性和可用性,比如数据范围、数据项缺失情况、数据格式是否统一、脏数据等。同样,面对时间格式数据,我们根据所使用的工具和环境,同样要确立是否可统一进行处理、分析等”本篇介绍主要为以下几项内容:星期判别年月日等周期提取时间增加或减少时间差计算数据示例如下:01返回星期几我们做趋势分析,通过会拉一段时间出来,这时,某些场景加...

weixin_39693437的博客 1087

对比学习损失函数避坑指南:为什么你的自监督模型不收敛?

本文深入剖析对比学习损失函数中的关键陷阱,揭示自监督模型不收敛的根本原因。通过分析温度系数选择、负样本采样策略和特征归一化等核心因素,提供实用解决方案。实验数据表明,正确设置温度系数τ(建议0.07起)可提升30%性能,而MoCo风格的负样本队列比SimCLR方案在小批量时准确率高6-8%。

nokia的博客 923

嵌入式开发新思路:用QP框架5步搞定状态机设计(附STM32移植指南)

本文介绍了在嵌入式开发中使用QP框架进行状态机设计的新思路。通过对比传统RTOS与事件驱动模型的差异,详细解析了QP框架的核心组件与优势,并提供了基于STM32的5步实战指南,包括环境搭建、状态机实现与性能优化技巧,帮助开发者从顺序阻塞思维转向高效的事件驱动架构。

milk5的博客 900

jquery 时间相减获取天数_Python处理Excel使用pandas处理时间格式数据

“通常我们拿到数据,首先要确认的就是数据完整性和可用性,比如数据范围、数据项缺失情况、数据格式是否统一、脏数据等。同样,面对时间格式数据,我们根据所使用的工具和环境,同样要确立是否可统一进行处理、分析等”本篇介绍主要为以下几项内容:星期判别年月日等周期提取时间增加或减少时间差计算数据示例如下:01返回星期几我们做趋势分析,通过会拉一段时间出来,这时,某些场景加...

weixin_31550647的博客 146

手把手教你学Simulink--基于未来出行解决方案的场景实例:电动飞行汽车(eVTOL)的动力系统建模与仿真

电动垂直起降飞行器零道路拥堵:三维空间飞行绿色低碳:全电驱动,零排放快速响应:城市内15分钟直达低噪音:相比直升机↓20dB📊 预测:2030年全球eVTOL市场规模将超300亿美元,中国、美国、欧洲加速适航认证。本文通过,构建了电动飞行汽车(eVTOL)动力系统高压电池系统建模电力电子(DC-DC、逆变器)实现PMSM电机+螺旋桨推进系统搭建完整飞行任务动态仿真性能KPI评估与优化。

MHD0815的博客 444

oracle时间相减得到天数_Python处理Excel使用pandas处理时间格式数据

“通常我们拿到数据,首先要确认的就是数据完整性和可用性,比如数据范围、数据项缺失情况、数据格式是否统一、脏数据等。同样,面对时间格式数据,我们根据所使用的工具和环境,同样要确立是否可统一进行处理、分析等”本篇介绍主要为以下几项内容:星期判别年月日等周期提取时间增加或减少时间差计算数据示例如下:01返回星期几我们做趋势分析,通过会拉一段时间出来,这时,某些场景加...

weixin_39641334的博客 174

【ARM Trace32(劳特巴赫) 使用介绍 13 -- Trace32 Var 变量篇】

例如我们已经知道一个符号(可能是变量或者函数)的地址,怎么确定这个地址是一个变量还是一个函数呢?如果是变量的话,变量名是啥?变量定义的位置在哪?如果是函数,函数名是啥?函数定义的位置又在哪呢?查看结构体变量 str_t32 的值。例如我们已经知道了一个符号的地址为。在map文件中的地址为。

CodingCos的博客 2350

问答式AI vs 智能体(Agent):它们有什么不同?

你肯定用过 ChatGPT 或文心一言——问它一个问题,它给你一个答案。AI Agent(AI智能体)。很多人搞不清楚:它们不都是"AI"吗?有什么区别?这篇文章用一个最简单的类比,彻底讲清楚这两者的本质差异。框架特点适合人群AutoGPT完全自主执行任务,链式思考开发者MetaGPT模拟团队协作,多角色分工开发者LangChain最流行的Agent开发框架开发者Dify可视化无代码搭建Agent非技术用户Coze(扣子)字节跳动出品,国内最易用普通用户WorkBuddy。

Johnny2004的专栏 449

比对EXCEL中的两列数据之间的差值

工作中经常会比对EXCEL中的两列数据之间的差值 import pandas as pd #导入pandas #读取第一个表格数据 打印 df=pd.read_excel("F:\\temp\\4293.xls",usecols=[4],names=None) df_li=df.values.tolist() result1=[] for i in df_li: if i[0]=='/' or i[0]=='-' : #把那些没用的'/'...

weixin_43958079的博客 719

OpenClaw 保姆级 window部署

OpenClaw 保姆级 window部署 养龙虾

cs821984831的博客 299

Python处理Excel-使用pandas处理时间格式数据

欢迎关注微信公众号:excelwork “通常我们拿到数据,首先要确认的就是数据完整性和可用性,比如数据范围、数据项缺失情况、数据格式是否统一、脏数据等。同样,面对时间格式数据,我们根据所使用的工具和环境,同样要确立是否可统一进行处理、分析等” 本篇介绍主要为以下几项内容: 星期判别 年月日等周期提取 时间增加或减少 时间差计算 数据示例如下: 01返回星期几 我们做趋势分析,通过会拉一段时间出来,这时,某些场景加上星期判...

TheLittlePython的博客 4194

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

卡方检验:从原理到实战,区分数据差异是信号还是噪声

在数据分析与统计推断中,如何判断观察到的数据差异是真实效应还是随机波动,是一个基础且核心的问题。其原理在于比较观察频数与理论期望频数之间的差异,通过计算卡方统计量来量化这种偏离程度。这项技术的核心价值在于为分类数据的关联性分析提供了客观的量化标准,帮助从业者从数据中提取可靠的洞察,避免仅凭直觉做出决策。它广泛应用于A/B测试、市场调研、医学研究等场景,用于检验用户行为、产品偏好等分类变量间的关联性。例如,在评估不同广告渠道的转化率差异,或分析用户属性与产品选择是否独立时,卡方检验都是关键工具。理解其适用条件

weixin_34081595的博客 441

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

计算机的错误计算(十九)

两个等价大数相减,差不是正确值0,而是另一个大数:20^65 - exp(65*ln(20)) = 6e70 ???

zaim1的博客 891

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: Python EXCEL 小技巧:最快重新排列dataframe函数
下一篇: Python 小技巧:计时函数
偷心伊普西隆
博客等级 码龄7年 511粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值