""" User feature views for recommendation system. """ from datetime import timedelta from feast import FeatureView, Field from feast.infra.offline_stores.snowflake_source import SnowflakeSource from feast.types import Float32 from .entities import creator from .config import get_snowflake_database, get_snowflake_schema # Snowflake data source for creator features creator_features_source = SnowflakeSource( name="creator_features_snowflake", database=get_snowflake_database(), schema=get_snowflake_schema(), table="RECS_HOOKS_RANKER_CREATOR_FEATURE_STORE", timestamp_field="EVENT_TIMESTAMP", created_timestamp_column="CREATED_TIMESTAMP", ) # User features creator_features = FeatureView( name="creator_features", description="Creator features metrics including average watch time", entities=[creator], ttl=timedelta(days=30), # Keep features for 30 days schema=[ # Note: Don't include user_id here - it's specified via entities=[user] Field( name="AVERAGE_WATCH_TIME_30D", dtype=Float32, description="Average watch time in seconds across all hooks created", ), Field( name="MEDIAN_WATCH_TIME_30D", dtype=Float32, description="Median watch time in seconds across all hooks created", ), Field( name="P95_WATCH_TIME_30D", dtype=Float32, description="95th percentile watch time in seconds across all hooks created", ), Field( name="AVERAGE_WATCH_TIME_7D", dtype=Float32, description="Average watch time in seconds across all hooks created in the last 7 days", ), Field( name="MEDIAN_WATCH_TIME_7D", dtype=Float32, description="Median watch time in seconds across all hooks created in the last 7 days", ), Field( name="P95_WATCH_TIME_7D", dtype=Float32, description="95th percentile watch time in seconds across all hooks created in the last 7 days", ), ], source=creator_features_source, online=True, # Available for online serving tags={"team": "recs"}, )