У меня есть набор данных, для которого я пытаюсь разработать несколько функций, включающих проверку наличия элементов в столбце или массиве в другом массиве. Я пытаюсь сделать это в Tensorflow Extended, чтобы эта операция была частью графика в обслуживании, но я все еще плохо знаком с TF и TFX и не смог успокоиться. В качестве примера представим, что у нас есть следующий набор данных:
>>> data = {"p_id": [100, 200, 300],
...: "topic": [('python', 'numpy'), ('pandas',), ('cpp',)],
...: "preferred_ids": [(200, 300, 400), (200, 300, 400), ()],
...: "trending_topics": [('pandas', 'tensorflow', 'python'), ('pandas', 'tensorflow', 'python'), ('c', 'cpp')]
...: }
>>> df = pd.DataFrame(data)
>>> df
p_id topic preferred_ids trending_topics
0 100 (python, numpy) (200, 300, 400) (pandas, tensorflow, python)
1 200 (pandas,) (200, 300, 400) (flask, tensorflow, nump)
2 300 (cpp, c) () (c, cpp)
Я пытаюсь определить функции in_preferred_ids
и matches_trending
так, чтобы в результате преобразований были созданы столбцы объектов, которые выглядят так:
p_id topic preferred_ids trending_topics in_preferred_ids matches_trending
0 100 (python, numpy) (200, 300, 400) (pandas, tensorflow, python) 0 1
1 200 (pandas,) (200, 300, 400) (flask, tensorflow, nump) 1 0
2 300 (cpp, c) () (c, cpp) 0 2
Я пытался использовать reduce_any
, чтобы добраться до in_preferred_ids
, но я получаю следующую ошибку
TypeError: Expected int32, got <tensorflow.python.framework.sparse_tensor.SparseTensor object at 0x7f22d8731b70> of type 'SparseTensor' instead.
Я подозреваю, что это потому, что p_id
- это столбец сэлемент, и reduce_any
, вероятно, требует, чтобы оба столбца были массивами, но я не уверен, как это исправить. Моя полная попытка ниже. Любая помощь с благодарностью
def element_is_in(x, y):
return tf.reduce_any(tf.convert_to_tensor(x.values) == tf.convert_to_tensor(y.values))
def preprocessing_fn(inputs):
outputs = {
"in_preferred_ids": (
tf.where(
element_is_in(inputs["p_id"], inputs["preferred_ids"]),
tf.cast(tf.zeros(inputs["p_id"]), tf.int64),
tf.cast(tf.ones(inputs["p_id"]), tf.int64),
)
)
}
return outputs