docs/adr/ADR-0003-on-demand-transformations.md
Accepted
For many ML use cases, it is not possible or feasible to precompute and persist feature values for serving:
user_account_age = current_time - account_creation_time.Additionally, Feast did not provide a means for post-processing features, forcing all feature development to upstream systems.
Introduce On-Demand Feature Views as a feature transformation layer with the following properties:
RequestSource.Uses the @on_demand_feature_view decorator (Option 3 from the RFC was chosen):
from feast import on_demand_feature_view, Field, RequestSource
from feast.types import Float64, String
input_request = RequestSource(
name="transaction",
schema=[Field(name="input_lat", dtype=Float64), Field(name="input_lon", dtype=Float64)],
)
@on_demand_feature_view(
sources=[driver_fv, input_request],
schema=[Field(name="distance", dtype=Float64)],
)
def driver_distance(inputs: pd.DataFrame) -> pd.DataFrame:
from haversine import haversine
df = pd.DataFrame()
df["distance"] = inputs.apply(
lambda r: haversine((r["lat"], r["lon"]), (r["input_lat"], r["input_lon"])),
axis=1,
)
return df
# Online - request data passed as entity rows
features = store.get_online_features(
features=["driver_distance:distance"],
entity_rows=[{"driver_id": 1001, "input_lat": 1.234, "input_lon": 5.678}],
).to_dict()
# Offline - request data columns included in entity_df
df = store.get_historical_features(
entity_df=entity_df_with_request_columns,
features=["driver_distance:distance"],
).to_df()
apply time.sdk/python/feast/on_demand_feature_view.py