You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Julia中调用Python脚本完成数据预处理并加载CSV数据?

问题描述

我已经在Julia中实现了一个依赖输入数据missed_bags的Gurobi确定性模型,代码结构如下:

function deterministic_model_test(Path_to_data)
    include(Path_to_data)
    model = Model(Gurobi.Optimizer);

    # 约束条件...
end

我希望基于该确定性模型运行一个随机模型,流程结构大致如下:

best_missed_bags = missed_bags
for h=1:H # 迭代次数
    x = deterministic_model_test(best_missed_bags)
    missed_bags_pr_flight[s,fa] = []
    missed_bags_day[s] = []
    for s=1:S
        # 生成随机到达时间

        # 运行Python脚本做数据预处理 → 更新CSV文件
        Missed_bags = 将新CSV文件加载到Julia中

        # 根据分配结果计算模拟的漏装行李数量
    end

    # 如果当前分配的漏装行李更少,则更新最优解
    if best_missed_bag > missed_bags_day[h]
        best_missed_bag = missed_bags_day[h]
        
        # 更新漏装行李矩阵
        for fa in Fa 
            best_missed_bags = mean(old_miss_{f,i}, new_miss_{f,i})
        end
    end
end

我的疑问是:数据预处理和添加随机性的工作需要用Python完成(借助numpy的向量化操作更便捷),能不能在上述Julia代码的循环中调用Python脚本完成预处理并保存为CSV,再将新数据加载回Julia?


解决方案

完全可以实现,下面提供两种常用的实现方式:

方法一:调用外部Python脚本(文件IO方式)

这种方式适合已经写好独立Python预处理脚本的场景:

  1. 准备Python脚本
    写一个接收输入参数、处理数据并输出CSV的脚本,比如preprocess_stochastic.py,示例代码如下:

    import numpy as np
    import pandas as pd
    import sys
    
    # 从命令行获取输入输出路径
    input_path = sys.argv[1]
    output_path = sys.argv[2]
    
    # 加载原始数据
    df = pd.read_csv(input_path)
    # 添加随机性处理(示例:给到达时间加正态分布噪声)
    df["arrival_time"] += np.random.normal(0, 5, size=len(df))
    # 保存处理后的数据
    df.to_csv(output_path, index=False)
    
  2. 在Julia中调用脚本
    在Julia的循环中,用run()函数执行Python脚本,再用CSV.jl加载结果:

    using CSV, DataFrames
    
    # 循环内的代码
    for s=1:S
        # 定义输入输出文件路径
        input_csv = "original_data.csv"
        output_csv = "stochastic_data_$s.csv" # 用序号避免文件冲突
        
        # 调用Python脚本
        run(`python preprocess_stochastic.py $input_csv $output_csv`)
        
        # 加载处理后的CSV到Julia
        Missed_bags = CSV.read(output_csv, DataFrame)
        
        # 后续计算逻辑...
    end
    

方法二:用PyCall直接集成Python代码(无文件IO)

如果想避免频繁读写CSV的性能开销,推荐用PyCall.jl直接在Julia中调用Python库或代码:

  1. 安装并配置PyCall
    先在Julia中安装PyCall:

    using Pkg
    Pkg.add("PyCall")
    

    可以配置使用系统已有的Python环境,或者让PyCall自动安装Conda环境。

  2. 在Julia中调用Python逻辑
    直接导入numpy、pandas等库,或者导入自己的Python预处理模块:

    using PyCall, DataFrames
    
    # 导入Python库
    np = pyimport("numpy")
    pd = pyimport("pandas")
    
    # 循环内的代码
    for s=1:S
        # 直接在Julia中调用Python做随机性处理
        # 假设best_missed_bags是Julia的DataFrame,先转成Python的DataFrame
        py_df = pd.DataFrame(best_missed_bags)
        # 添加随机性(示例逻辑)
        py_df["missed_bags"] += np.random.poisson(2, size=len(py_df))
        # 转回Julia的DataFrame
        Missed_bags = DataFrame(py_df)
        
        # 后续计算逻辑...
    end
    

    也可以把预处理逻辑写成独立的Python模块(比如my_preprocess.py),然后在Julia中导入调用:

    preprocess = pyimport("my_preprocess")
    Missed_bags = DataFrame(preprocess.add_stochastic_noise(best_missed_bags))
    

注意事项

  • 确保Python环境安装了所需依赖(比如numpy、pandas),Julia环境安装了CSV.jl、DataFrames.jl、PyCall.jl等包。
  • 如果用外部脚本,注意文件路径的正确性,多循环时建议用带序号的文件名避免覆盖。
  • 频繁迭代的场景下,优先用PyCall方法,避免文件IO带来的性能损耗。

内容的提问来源于stack exchange,提问作者Nora Seinfield

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:35:21