如何在Azure ML中同时将Pandas DataFrame注册为容器文件与数据集
问题分析与修复方案
原函数无法运行的核心问题包括:
- 依赖未传入函数的全局变量(
X_train、X_test、X_val、results),函数内部无法访问这些变量 - 全局变量滥用导致作用域混乱
- 拼接DataFrame时可能存在列名不匹配的问题
- 未显式指定文件存储路径,可能导致存储位置不符合预期
修正后的函数代码
def register_future_predictions(forecast_val, ws, X_train, X_test, X_val, results): # 生成未来日期和预测数据 last_date = forecast_val['ds'].iloc[-1] future_dates = pd.date_range(start=last_date, periods=182, freq='W') future_df = pd.DataFrame({'ds': future_dates}) # 填充未来数据的其他特征列 for col in X_val.columns: if col != 'ds': future_df[col] = 0 future_predictions = results.predict(future_df) # 统一拼接用的列名,避免列不匹配 future_predictions_formatted = future_predictions[['ds', 'yhat']].rename( columns={'ds': 'Created on day', 'yhat': 'target_col'} ) # 调整历史数据的列名,和预测数据对齐 X_train_formatted = X_train.rename(columns={'ds': 'Created on day', 'y': 'target_col'}) X_test_formatted = X_test.rename(columns={'ds': 'Created on day', 'y': 'target_col'}) X_val_formatted = X_val.rename(columns={'ds': 'Created on day', 'y': 'target_col'}) # 拼接所有数据 reg_data_future = pd.concat( [X_train_formatted, X_test_formatted, X_val_formatted, future_predictions_formatted], ignore_index=True ) # 获取目标存储容器 target_datastore = Datastore.get(ws, 'container-where-i-keep-datasets') # 显式指定存储路径,确保文件存到预期位置 target_path = 'full_data/full_data-TEST.parquet' # 保存DataFrame到存储容器(Parquet格式) reg_data_future.to_parquet(target_datastore.path(target_path).as_mount()) # 注册为表格数据集 ds = Dataset.Tabular.from_parquet_files(path=[(target_datastore, target_path)]) ds.register(workspace=ws, name='full_data-TEST', create_new_version=True) return future_predictions, future_df
关键改动说明
- 移除全局变量:将
X_train、X_test、X_val、results作为参数传入函数,避免作用域问题 - 统一列名:在拼接前将所有DataFrame的列名对齐,防止因列名不一致导致拼接失败
- 显式存储路径:手动指定文件在容器中的存储路径,便于管理和查找
- 分步操作:先将DataFrame保存为Parquet文件,再基于该文件注册数据集,比直接用
register_pandas_dataframe更可控 - 版本控制:注册数据集时添加
create_new_version=True,支持版本迭代
额外注意事项
- 确保所有输入的DataFrame(
X_train、X_test、X_val)都包含ds和y列,否则需要调整rename逻辑 - 如果需要保存为CSV格式,将
to_parquet替换为to_csv,注册时用Dataset.Tabular.from_delimited_files - 确认工作区对象
ws已正确初始化,存储容器名称container-where-i-keep-datasets存在且有权限
内容的提问来源于stack exchange,提问作者Egorsky
相关产品推荐
相关产品推荐

