pandas - 数据集 API 'flat_map' 方法对与 'map' 方法一起使用的相同代码产生错误

标签 pandas tensorflow tensorflow-datasets

我正在尝试创建一个管道,以使用 TensorFlow Dataset API 和 Pandas 读取多个 CSV 文件。但是,使用 flat_map 方法会产生错误。但是,如果我使用 map 方法,我可以构建代码并在 session 中运行它。这是我正在使用的代码。我已经打开了#17415 TensorFlow Github 存储库中的问题。但显然,这不是错误,他们让我在这里发帖。

folder_name = './data/power_data/'
file_names = os.listdir(folder_name)
def _get_data_for_dataset(file_name,rows=100):#
    print(file_name.decode())

    df_input=pd.read_csv(os.path.join(folder_name, file_name.decode()),
                         usecols =['Wind_MWh','Actual_Load_MWh'],nrows = rows)
    X_data = df_input.as_matrix()
    X_data.astype('float32', copy=False)

    return X_data
dataset = tf.data.Dataset.from_tensor_slices(file_names)
dataset = dataset.flat_map(lambda file_name: tf.py_func(_get_data_for_dataset, 
[file_name], tf.float64))
dataset= dataset.batch(2)
fiter = dataset.make_one_shot_iterator()
get_batch = iter.get_next()

我收到以下错误:map_func 必须返回一个 Dataset 对象。当我使用 map 时,管道可以正常工作,但它没有提供我想要的输出。例如,如果 Pandas 从我的每个 CSV 文件中读取 N 行,我希望管道连接 B 个文件中的数据并给我一个形状为 (N*B, 2) 的数组。相反,它给我 (B, N,2),其中 B 是批量大小。 map 正在添加另一个轴,而不是在现有轴上串联。根据我在文档中的理解,flat_map 应该提供扁平化输出。在文档中,mapflat_map 都返回数据集类型。那么我的代码如何使用 map 而不是 flat_map?

如果您能向我指出数据集 API 已与 Pandas 模块一起使用的代码,那就太好了。

最佳答案

mikkola points out in the comments 一样,Dataset.map()Dataset.flat_map() 需要具有不同签名的函数:Dataset.map() 采用将输入数据集的单个元素映射到单个新元素的函数,而 Dataset.flat_map() 采用将输入数据集的单个元素映射到元素的 Dataset 的函数。

如果你想让 _get_data_for_dataset() 返回的数组的每一行 成为一个单独的元素,您应该使用 Dataset.flat_map() 并将 tf.py_func() 的输出转换为 Dataset,使用 Dataset.from_tensor_slices() :

folder_name = './data/power_data/'
file_names = os.listdir(folder_name)

def _get_data_for_dataset(file_name, rows=100):
    df_input=pd.read_csv(os.path.join(folder_name, file_name.decode()),
                         usecols=['Wind_MWh', 'Actual_Load_MWh'], nrows=rows)
    X_data = df_input.as_matrix()
    return X_data.astype('float32', copy=False)

dataset = tf.data.Dataset.from_tensor_slices(file_names)

# Use `Dataset.from_tensor_slices()` to make a `Dataset` from the output of 
# the `tf.py_func()` op.
dataset = dataset.flat_map(lambda file_name: tf.data.Dataset.from_tensor_slices(
    tf.py_func(_get_data_for_dataset, [file_name], tf.float32)))

dataset = dataset.batch(2)

iter = dataset.make_one_shot_iterator()
get_batch = iter.get_next()

关于pandas - 数据集 API 'flat_map' 方法对与 'map' 方法一起使用的相同代码产生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49116343/

相关文章:

tensorflow - 当我激活tensorflow env时,Anaconda提示崩溃

tensorflow2.0 - 使用 tf.data 与联合核心 API 和远程执行客户端上的数据进行线性回归

python - 在 Pandas 系列中扩展列表

python - Pandas:使用 groupby 重建数据透视表

python - LSTM 神经网络输入/输出维度错误

python - 使用 TensorFlow 出现奇怪的转换问题

python - Pandas 分割数据框并获取数据行的剩余部分

Python Pandas 非零 cumsum

python - TensorFlow:如何使用 'tf.data' 而不是 'load_csv_without_header'?

python - 如何使用新的数据集 API 在 tensorflow 中仅循环使用占位符提供的数据一次