怎样用脚本批量计算数据方差?

wen 实用脚本 3

本文目录导读:

怎样用脚本批量计算数据方差?

  1. Python(最常用)
  2. R脚本(统计专用)
  3. Julia脚本(高性能计算)
  4. Bash脚本(命令行批量处理)
  5. MATLAB脚本(工程应用)
  6. Python多线程批量处理(大规模数据)
  7. 使用建议

我来介绍几种批量计算数据方差的脚本方法,针对不同场景和编程语言。

Python(最常用)

基础批量计算

import numpy as np
import pandas as pd
from scipy import stats
# 方法1:使用numpy处理数组
data = np.array([
    [1, 2, 3, 4, 5],
    [2, 4, 6, 8, 10],
    [3, 6, 9, 12, 15]
])
# 计算每行的方差
row_variances = np.var(data, axis=1)
print("每行方差:", row_variances)
# 计算每列的方差
col_variances = np.var(data, axis=0)
print("每列方差:", col_variances)
# 方法2:使用pandas处理DataFrame
df = pd.DataFrame({
    'A': [1, 2, 3, 4, 5],
    'B': [2, 4, 5, 7, 8],
    'C': [3, 5, 7, 9, 11]
})
# 计算每列的方差
col_vars = df.var()
print("DataFrame每列方差:\n", col_vars)

批量处理文件

import pandas as pd
import numpy as np
import os
def batch_calculate_variance(folder_path, output_file='variances.csv'):
    """批量计算文件夹中所有CSV文件的方差"""
    results = []
    for filename in os.listdir(folder_path):
        if filename.endswith('.csv'):
            file_path = os.path.join(folder_path, filename)
            df = pd.read_csv(file_path)
            # 计算每列的方差
            variances = df.var().to_dict()
            variances['source_file'] = filename
            results.append(variances)
    # 保存结果
    result_df = pd.DataFrame(results)
    result_df.to_csv(output_file, index=False)
    print(f"结果已保存到 {output_file}")
    return result_df

使用SciPy进行统计分析

from scipy import stats
import numpy as np
# 生成批量数据
datasets = [
    np.random.normal(0, 1, 100),  # 正态分布
    np.random.uniform(0, 10, 100),  # 均匀分布
    np.random.exponential(2, 100)  # 指数分布
]
# 计算每个数据集的方差和统计信息
for i, data in enumerate(datasets):
    variance = np.var(data)
    std = np.std(data)
    skewness = stats.skew(data)
    kurtosis = stats.kurtosis(data)
    print(f"数据集 {i+1}:")
    print(f"  方差: {variance:.4f}")
    print(f"  标准差: {std:.4f}")
    print(f"  偏度: {skewness:.4f}")
    print(f"  峰度: {kurtosis:.4f}")
    print("---")

R脚本(统计专用)

# 批量计算多个数据框的方差
library(dplyr)
# 创建示例数据
data1 <- data.frame(x = rnorm(100), y = rnorm(100))
data2 <- data.frame(x = rnorm(100), y = rnorm(100))
data3 <- data.frame(x = rnorm(100), y = rnorm(100))
# 存储到列表
data_list <- list(dataset1 = data1, dataset2 = data2, dataset3 = data3)
# 批量计算方差
variances <- lapply(data_list, function(df) {
  apply(df, 2, var)  # 计算每列的方差
})
# 转换为数据框
var_df <- do.call(rbind, variances)
print(var_df)
# 批量处理CSV文件
batch_calc_variance <- function(folder_path) {
  files <- list.files(folder_path, pattern = "\\.csv$")
  results <- data.frame()
  for (file in files) {
    df <- read.csv(file.path(folder_path, file))
    vars <- apply(df, 2, var, na.rm = TRUE)  # 忽略NA值
    results <- rbind(results, c(file, vars))
  }
  colnames(results) <- c("file", names(vars))
  return(results)
}

Julia脚本(高性能计算)

using DataFrames, CSV, Statistics
# 批量计算数据方差
function batch_variance(folder_path)
    files = readdir(folder_path)
    results = DataFrame(file = String[], variance = Float64[])
    for file in files
        if endswith(file, ".csv")
            df = CSV.read(joinpath(folder_path, file), DataFrame)
            # 计算所有数值列的方差
            numeric_cols = [name for name in names(df) if eltype(df[:, name]) <: Number]
            for col in numeric_cols
                push!(results, (file * "_" * col, var(skipmissing(df[:, col]))))
            end
        end
    end
    return results
end
# 使用示例
result = batch_variance("./data")
println(result)

Bash脚本(命令行批量处理)

#!/bin/bash
# 批量计算CSV文件中每列的方差
calculate_csv_variance() {
    local folder="$1"
    local output="variances.csv"
    echo "file,column,variance" > "$output"
    for file in "$folder"/*.csv; do
        filename=$(basename "$file")
        # 使用awk计算方差(每列)
        awk -F',' -v fname="$filename" '
        NR==1 {
            for(i=1; i<=NF; i++) col_names[i]=$i
            next
        }
        {
            for(i=1; i<=NF; i++) {
                sum[i] += $i
                sumsq[i] += $i * $i
                count[i]++
            }
        }
        END {
            for(i=1; i<=length(sum); i++) {
                mean = sum[i] / count[i]
                var = sumsq[i] / count[i] - mean * mean
                printf "%s,%s,%.4f\n", fname, col_names[i], var
            }
        }' "$file" >> "$output"
    done
    echo "结果已保存到 $output"
}
# 调用函数
calculate_csv_variance "./data"

MATLAB脚本(工程应用)

function batch_variances = batch_calculate_variance(folder_path)
    % 批量计算文件夹中所有MAT文件的方差
    files = dir(fullfile(folder_path, '*.mat'));
    batch_variances = struct();
    for i = 1:length(files)
        filename = fullfile(folder_path, files(i).name);
        data = load(filename);
        % 假设数据存储在名为'data'的变量中
        field_name = fieldnames(data);
        matrix = data.(field_name{1});
        % 计算每列的方差
        variances = var(matrix, 0, 1);
        % 存储结果
        batch_variances.(files(i).name(1:end-4)) = variances;
    end
    % 显示结果
    disp(batch_variances);
end
% 使用示例
variance_results = batch_calculate_variance('./data');

Python多线程批量处理(大规模数据)

import concurrent.futures
import pandas as pd
import numpy as np
import os
def process_single_file(file_path):
    """处理单个文件"""
    df = pd.read_csv(file_path)
    variances = df.var(numeric_only=True)
    return {
        'file': os.path.basename(file_path),
        **variances.to_dict()
    }
def parallel_batch_variance(folder_path, max_workers=4):
    """并行批量计算方差"""
    csv_files = [f for f in os.listdir(folder_path) if f.endswith('.csv')]
    file_paths = [os.path.join(folder_path, f) for f in csv_files]
    results = []
    with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:
        future_to_file = {executor.submit(process_single_file, f): f for f in file_paths}
        for future in concurrent.futures.as_completed(future_to_file):
            file_path = future_to_file[future]
            try:
                result = future.result()
                results.append(result)
                print(f"完成: {os.path.basename(file_path)}")
            except Exception as exc:
                print(f"错误: {file_path} - {exc}")
    return pd.DataFrame(results)
# 使用示例
result_df = parallel_batch_variance('./data', max_workers=4)
result_df.to_csv('all_variances.csv', index=False)

使用建议

  1. 数据量小:使用Python的pandas或numpy
  2. 统计专业:使用R语言
  3. 大规模数据:使用Julia或Python并行处理
  4. 简单任务:使用Bash脚本快速处理
  5. 工程应用:使用MATLAB

根据你的具体需求选择最适合的方法,需要我详细解释某个特定场景的实现吗?

抱歉,评论功能暂时关闭!