Azure ML: pandas格式文件,多文件上传至Azure Datastore,并且注册至Azure Datasets
解释(1)如何将pandas格式文件上传至Azure Datastore,并且注册至Azure Datasets中;(2)如何将一个文件夹下所有文件,或者特定的几个文件上传至Azure Datastore,并且注册至Azure Datasets中。
文章目录
1 Azure Datasets 和 Azure Datastore 概念
回忆一下,当我们新建一个Azure Machine Learning Workspace的时候,需要链接或者新建一个Azure Storage账户(用以保存数据),一个Azure Key Vault账户(用以保存密码),一个Azure Application insights账户(一些monitoring功能),以及一个Azure Container Registry账户(保存Container及其相关)。
1.1 Azure Datastore
在Azure Machine Learning中,Azure Datastore
是对Azure Storage的引用。每个Azure ML Workspace都有一个默认的数据存储区域,就是我们刚创建Workspace的时候链接的Azure Storage账户。
下面是我们通过workspace.get_default_datastore()
返回的datastore
实例:
{
"name": "XXX",
"container_name": "XXX",
"account_name": "XXX",
"protocol": "XXX",
"endpoint": "XXX"
}
注意,这里container_name
指的是Azure Storage Container Name。
所以说,我们可以通俗意义上把Azure Datastore
和Azure Storage划约等号。
1.2 Azure Datasets
上面提到的Azure Datastore
是我们这个Azure ML Workspace存储数据的引用,那么Azure Datasets
就是具体的数据集的引用了。需要注意的是,Azure Datasets
并不是指一个数据集,实际上它有两种类型:FileDataset
和 TabularDataset
,具体取决于用户在训练中使用它们的方式。 这两种类型均可用于涉及估算器、AutoML、hyperDrive 和管道的 Azure 机器学习训练工作流。
下面是我们通过Dataset.get_by_name
返回的dataset
实例:
TabularDataset
{
"source": [
"('workspaceblobstore', 'XXX')"
],
"definition": [
"GetDatastoreFiles",
"ReadParquetFile",
"DropColumns"
],
"registration": {
"id": "XXX",
"name": "XXX",
"version": 2,
"workspace": "XXX"
}
}
当我们进入Azure Machine Learning Studio,打开Datasets
这栏,我们就能看到注册成功的Azure Datasets
,比如下图:
3 将pandas格式文件上传与注册
在数据处理的项目中,我们经常会遇见,一个csv文件输入,并希望注册到Azure数据集以进行进一步处理。如下代码解释了如何通过Dataset.Tabular.register_pandas_dataframe
一次性对pandas格式文件进行上传与注册:
import pandas as pd
from azureml.core import Dataset
from azureml.core.datastore import Datastore
from azureml.core import Workspace
# Pandas dataframe from a local CSV file
pandas_df = pd.read_csv("./data/titanic.csv")
# Getting workspace default Azure Datastore
workspace = Workspace.from_config()
datastore = workspace.get_default_datastore()
# Uploading Pandas dataframe and registering it as a dataset
# dataset=Dataset.Tabular.register_pandas_dataframe(
# <pandas dataframe>, <datastore>, "<name of registered dataset>", show_progress=True)
dataset = Dataset.Tabular.register_pandas_dataframe(
pandas_df, datastore, "ds_from_pandas_df", show_progress=True)
当我们运行上述代码后,terminal会出现如下日志(由于我们在register_pandas_dataframe
函数设置了show_progress
):
Validating arguments.
Arguments validated.
Successfully obtained datastore reference and path.
Uploading file to managed-dataset/add1d6c4-efa5-4e27-ac4a-2a338b99662a/
Successfully uploaded file to datastore.
Creating and registering a new dataset.
Successfully created and registered a new dataset.
当我们打开Azure Storage账号,并且找到managed-dataset/add1d6c4-efa5-4e27-ac4a-2a338b99662a/
这个路径下的文件,
我们发现part-00000.parquet
文件。根据微软关于.parquet
文件描述,在使用Dataset.Tabular.register_pandas_dataframe
的时候,系统对数据进行了压缩:
“如果数据已压缩,则可进一步让其扩展;以压缩 parquet 格式存储的 20 GB 相对稀疏的数据可以在内存中扩展到大约 800 GB。 由于 Parquet 文件以纵栏格式存储数据,因此,如果只需要一半的列,则只需在内存中加载大约 400 GB。”
我们也可以通过如下的方式从Azure Datasets
中获得pandas数据,并重新转化成dataframe形式:
from azureml.core import Workspace, Dataset
workspace = Workspace.from_config()
dataset = Dataset.get_by_name(workspace, name='ds_from_pandas_df')
dataset.to_pandas_dataframe()
4 将一个文件夹下所有文件,或者特定的几个文件上传并注册
我们也可以将一个文件夹下的所有文件,或者特定的几个文件上传到Azure Datastore
,并注册到Azure Datasets
。
from azureml.core import Dataset
from azureml.data.datapath import DataPath
from azureml.core import Workspace
# Getting workspace default datastore
workspace = Workspace.from_config()
datastore = workspace.get_default_datastore()
# Uploading local directory and creating a FileDataset to Azure Storage
dataset = Dataset.File.upload_directory(
src_dir="./data/", target=DataPath(datastore, "/data/"), show_progress=True
)
# You can register the datastore created by uploading the directory. Then you will see a dataset called 'ds_from_directory' in Azure ML Studio Datasets
dataset.register(
workspace=workspace,
name="ds_from_directory",
description="This dataset was creating by uploading a directory",
)
我们在运行了上面的代码后,系统将本地路径下data
文件夹下的所有文件,上传到了Azure Storage账号/data/
文件夹内。并且,系统将这几个文件注册进了名为ds_from_directory
的Azure Datasets
。
我们也可以通过如下的方式从Azure Datasets
中获得上述的这几个文件,并且重新下载到本地:
from azureml.core import Workspace, Dataset
workspace = Workspace.from_config()
dataset = Dataset.get_by_name(workspace, name='ds_from_directory')
dataset.download(target_path='.', overwrite=False)
我们也可以在某个文件夹下选择特定的一类文件,然后进行上传和注册:
# Upload source files based on their path name using Pattern
# In this example, we are going to use only .csv files
dataset_pattern = Dataset.File.upload_directory(
src_dir="./data/",
target=DataPath(datastore, "/data_pattern/"),
pattern="*.csv",
show_progress=True,
)
这里,我们将data
文件夹下的所有.csv
文件上传到Azure Storage账号/data_pattern/
文件夹内。