Функции не создаются для моей установки Entityset в featuretools - PullRequest
0 голосов
/ 30 октября 2018

Я столкнулся с проблемой, когда попытался создать отношения между наборами прав (используя мои собственные данные). Там нет ошибки, но он просто не создает функции для одной из моих сущностей (сущности "prods"), хотя все должно быть просто подключено.

Я не могу поделиться своими данными, но я создал минимальный пример с некоторыми фиктивными данными:

import pandas as pd
import featuretools as ft

Создание фиктивных данных

cust = pd.DataFrame([[1,50],[2,60]], 
                    columns=['CUST_ID','AGE'])#

orders = pd.DataFrame([[1,1,50,33.0],[2,1,60,20],[3,2,66,999.9]], 
                      columns=['ORD_ID','CUST_ID','QTY','PRICE'])

order_items = pd.DataFrame([[1,1,1,2,3.0],[2,2,2,8,5.0],[3,2,1,2,3.0],[4,3,3,2,3.0]], 
                           columns=['ORD_ITM_ID','ORD_ID','PROD_ID','QTY','PRICE'])

prods = pd.DataFrame([[1,3.0],[2,5.0],[3,3.0]], 
                     columns=['PROD_ID','PRICE'])

Определение набора сущностей

es = ft.EntitySet('test')

## Adding Customers Entity

es.entity_from_dataframe(dataframe=cust,
                         entity_id='cust',
                         index='CUST_ID')

## Adding Orders Entity
es.entity_from_dataframe(dataframe=orders,
                         entity_id='orders',
                         index='ORD_ID')

## Adding Order Items Entity
es.entity_from_dataframe(dataframe=order_items,
                         entity_id='order_items',
                         index='ORD_ITM_ID')

## Adding Products Entity
es.entity_from_dataframe(dataframe=prods,
                         entity_id='prods',
                         index='PROD_ID')

Создание отношений

customer_relationship = ft.Relationship(es["cust"]["CUST_ID"],
                                   es["orders"]["CUST_ID"])


orderitems_relationship = ft.Relationship(es["orders"]["ORD_ID"], 
                                          es["order_items"]["ORD_ID"])


products_relationship = ft.Relationship(es["prods"]["PROD_ID"],
                                        es["order_items"]["PROD_ID"])

### Add Relationships
es = es.add_relationship(customer_relationship)
es = es.add_relationship(orderitems_relationship)
es = es.add_relationship(products_relationship)

Создание функций

feature_defs = ft.dfs(entityset=es,
                                target_entity="cust",
                                agg_primitives=["count", "sum"],
                                verbose = True, 
                                features_only = True)
## Show features
feature_defs

Выход:

Built 7 features
[<Feature: AGE>,
 <Feature: COUNT(order_items)>,
 <Feature: SUM(orders.QTY)>,
 <Feature: SUM(orders.PRICE)>,
 <Feature: SUM(order_items.QTY)>,
 <Feature: COUNT(orders)>,
 <Feature: SUM(order_items.PRICE)>]

Это должно показать мне функции для переменных продукта тоже, но это не так.

Так что я ожидаю, что SUM суммирует цену продукта на одного покупателя. Вместо этого ничего нет.

В конечном итоге я хотел создать функции для интересных значений. Но поскольку переменные продукта не отображаются, добавление интересных значений также не работает.

## Get All Product IDs
interesting_products = es["prods"].df.PROD_ID.unique()

es["prods"]["PROD_ID"].interesting_values=interesting_products


feature_defs = ft.dfs(entityset=es,
                                target_entity="cust",
                                agg_primitives=["count", "sum"],
                                where_primitives=["count", "sum"],
                                verbose = True, 
                                features_only = True)
## Show features
feature_defs

Выход:

Built 7 features
[<Feature: AGE>,
 <Feature: COUNT(order_items)>,
 <Feature: SUM(orders.QTY)>,
 <Feature: SUM(orders.PRICE)>,
 <Feature: SUM(order_items.QTY)>,
 <Feature: COUNT(orders)>,
 <Feature: SUM(order_items.PRICE)>]

Надеюсь, кто-то может помочь:)

1 Ответ

0 голосов
/ 30 октября 2018

Причина в том, что продукт не отображается, потому что любые объекты, созданные из него, будут иметь глубину 3. Вы можете управлять глубиной в ft.dfs, используя параметр max_depth, например,

feature_defs = ft.dfs(entityset=es,
                      target_entity="cust",
                      agg_primitives=["count", "sum"],
                      verbose = True, 
                      max_depth=3, # add max_depth
                      features_only = True)

Теперь возвращаемые функции:

[<Feature: AGE>,
 <Feature: SUM(order_items.QTY)>,
 <Feature: SUM(order_items.PRICE)>,
 <Feature: SUM(orders.PRICE)>,
 <Feature: SUM(orders.QTY)>,
 <Feature: COUNT(order_items)>,
 <Feature: COUNT(orders)>,
 <Feature: SUM(order_items.prods.PRICE)>]

Вы можете увидеть SUM(order_items.prods.PRICE) в конце, используя цену продуктов.

Чтобы сработали предложения where, добавьте интересные значения к сущности order_items.

interesting_products = es["prods"].df.PROD_ID.unique()
es["order_items"]["PROD_ID"].interesting_values=interesting_products
feature_defs = ft.dfs(entityset=es,
                      target_entity="cust",
                      agg_primitives=["count", "sum"],
                      where_primitives=["count", "sum"],
                      verbose=True, 
                      max_depth=3, 
                      features_only=True)

это создает 20 функций, которые вы можете увидеть ниже

[<Feature: AGE>,
 <Feature: SUM(order_items.QTY)>,
 <Feature: SUM(order_items.PRICE)>,
 <Feature: SUM(orders.PRICE)>,
 <Feature: SUM(orders.QTY)>,
 <Feature: COUNT(order_items)>,
 <Feature: COUNT(orders)>,
 <Feature: SUM(order_items.prods.PRICE WHERE PROD_ID = 2)>,
 <Feature: SUM(order_items.QTY WHERE PROD_ID = 2)>,
 <Feature: SUM(order_items.QTY WHERE PROD_ID = 3)>,
 <Feature: SUM(order_items.prods.PRICE)>,
 <Feature: COUNT(order_items WHERE PROD_ID = 2)>,
 <Feature: SUM(order_items.prods.PRICE WHERE PROD_ID = 1)>,
 <Feature: SUM(order_items.PRICE WHERE PROD_ID = 3)>,
 <Feature: COUNT(order_items WHERE PROD_ID = 1)>,
 <Feature: COUNT(order_items WHERE PROD_ID = 3)>,
 <Feature: SUM(order_items.prods.PRICE WHERE PROD_ID = 3)>,
 <Feature: SUM(order_items.QTY WHERE PROD_ID = 1)>,
 <Feature: SUM(order_items.PRICE WHERE PROD_ID = 2)>,
 <Feature: SUM(order_items.PRICE WHERE PROD_ID = 1)>]
...