ВОПРОС
Очень часто требуется обогатить необработанный набор данных производными функциями. Т.е. новые столбцы нужно создавать из уже существующих. Как это сделать эффективным (и предпочтительно на месте ) способом с tf.Dataset
?
PS: я попытался поиграться с tf.data.Dataset.map()
, tf.data.Dataset.apply()
и tf.map()
, но не могу найти правильный синтаксис, который соответствует тому, что я иллюстрирую ниже.
МИНИМАЛЬНЫЙ РАБОЧИЙ ПРИМЕР
Чтобы показать, что я хочу сделать, я буду использовать pandas 'apply()
. Например, я пытаюсь добавить функцию длиной embark_town
в набор данных Titani c.
import pandas as pd
import tensorflow as tf # v. 2.0+
# Load the Titanic dataset
source = tf.keras.utils.get_file(
"train.csv",
"https://storage.googleapis.com/tf-datasets/titanic/train.csv")
# Only select two features and one target for this example.
dataset = tf.data.experimental.make_csv_dataset(
source, batch_size=5, label_name="survived",
select_columns=["embark_town", "age", "survived"],
num_epochs=1, ignore_errors=True, shuffle=False)
# Add the derived feature `embark_town_len` via pandas.
batch, _ = next(iter(dataset))
batch = pd.DataFrame(batch)
print("Raw data:")
print(batch)
batch['embark_town_len'] = batch.apply(lambda x: len(x["embark_town"]), axis=1)
print("\nEnriched data:")
print(batch)
, которая создает
Raw data:
age embark_town
0 22.0 b'Southampton'
1 38.0 b'Cherbourg'
2 26.0 b'Southampton'
3 35.0 b'Southampton'
4 28.0 b'Queenstown'
Enriched data:
age embark_town embark_town_len
0 22.0 b'Southampton' 11
1 38.0 b'Cherbourg' 9
2 26.0 b'Southampton' 11
3 35.0 b'Southampton' 11
4 28.0 b'Queenstown' 10
Примечание. что хотя я использую pandas 'apply()
здесь, то, что я действительно ищу, это то, что работает непосредственно на весь tf.Dataset
, а не просто пакет в нем.