| Aggregation |
count |
count |
✅ |
test_values_match_featuretools |
|
| Aggregation |
max |
max |
✅ |
test_values_match_featuretools |
|
| Aggregation |
mean |
mean |
✅ |
test_values_match_featuretools |
|
| Aggregation |
median |
median |
✅ |
test_median_matches_featuretools_on_every_parent_row |
|
| Aggregation |
min |
min |
✅ |
test_values_match_featuretools |
|
| Aggregation |
n_unique |
num_unique |
⚠️ |
test_n_unique_of_an_empty_group_diverges_from_featuretools / test_n_unique_counts_a_null_where_num_unique_ignores_it |
An empty group is 0 in tusk and NaN in featuretools. A null counts as a value in tusk. featuretools ignores it. |
| Aggregation |
percent_true |
percent_true |
✅ |
test_percent_true_matches_featuretools_on_every_parent_row |
|
| Aggregation |
quantiles |
— |
➕ |
test_quantiles_defaults_to_the_quartiles |
featuretools has no quantiles counterpart. |
| Aggregation |
std |
std |
✅ |
test_stacked_values_match_featuretools |
|
| Aggregation |
sum |
sum |
✅ |
test_values_match_featuretools |
|
| Aggregation |
all_true |
all |
✅ |
test_standalone_aggregations_match_featuretools_on_every_parent_row |
Named all_true so the class does not shadow typing.Any. |
| Aggregation |
any_true |
any |
⚠️ |
test_any_true_of_an_empty_group_is_false_rather_than_null |
An empty group is False in tusk and null in featuretools. Nulls are skipped on both sides. Named any_true so the class does not shadow typing.Any. |
| Aggregation |
— |
average_count_per_unique |
❌ |
|
|
| Aggregation |
— |
avg_time_between |
❌ |
|
|
| Aggregation |
count_above_mean |
count_above_mean |
⚠️ |
test_a_count_against_the_mean_without_a_known_value_is_zero_rather_than_null |
A group without a non-null value is 0 in tusk and null in featuretools. |
| Aggregation |
count_below_mean |
count_below_mean |
⚠️ |
test_a_count_against_the_mean_without_a_known_value_is_zero_rather_than_null |
A group without a non-null value is 0 in tusk and null in featuretools. |
| Aggregation |
— |
count_greater_than |
⛔ |
|
Threshold argument. A useful threshold depends on the data. |
| Aggregation |
count_inside_nth_std |
count_inside_nth_std |
✅ |
test_std_band_counts_match_featuretools_on_every_parent_row |
|
| Aggregation |
— |
count_inside_range |
⛔ |
|
Threshold argument. A useful threshold depends on the data. |
| Aggregation |
— |
count_less_than |
⛔ |
|
Threshold argument. A useful threshold depends on the data. |
| Aggregation |
count_outside_nth_std |
count_outside_nth_std |
✅ |
test_std_band_counts_match_featuretools_on_every_parent_row |
|
| Aggregation |
— |
count_outside_range |
⛔ |
|
Threshold argument. A useful threshold depends on the data. |
| Aggregation |
— |
date_first_event |
✅ |
test_date_first_event_is_first_over_the_row_creation_time |
Not a separate tusk primitive. first over the child's row_creation_time answers it. |
| Aggregation |
entropy |
entropy |
✅ |
test_standalone_aggregations_match_featuretools_on_every_parent_row |
|
| Aggregation |
first |
first |
✅ |
test_first_and_last_match_featuretools_in_row_creation_order |
Needs a row_creation_time on the child table. Ties are broken by primary key. |
| Aggregation |
first_last_time_delta |
first_last_time_delta |
⚠️ |
test_a_delta_without_a_known_value_is_null_rather_than_zero |
Takes any datetime column and returns a Duration. featuretools takes only the time index and returns float seconds. A group without a non-null datetime is null, not zero. For a time-zone-aware column, a gap across a daylight-saving change can vary by backend. |
| Aggregation |
— |
has_no_duplicates |
⚠️ |
test_is_unique_counts_repeated_nulls_where_has_no_duplicates_drops_them |
Not a separate tusk primitive. is_unique answers it, counting nulls as values where featuretools drops them. |
| Aggregation |
— |
is_monotonically_decreasing |
❌ |
|
Needs an ordered pairwise scan. |
| Aggregation |
— |
is_monotonically_increasing |
❌ |
|
Needs an ordered pairwise scan. |
| Aggregation |
is_unique |
is_unique |
⚠️ |
test_is_unique_of_an_empty_group_is_null_rather_than_false |
Nulls are values on both sides. An empty group is null in tusk and False in featuretools. |
| Aggregation |
kurtosis |
kurtosis |
⚠️ |
test_kurtosis_matches_featuretools_only_on_a_fully_known_group |
tusk skips nulls. featuretools answers 0 for a group holding a null. A constant or empty group is null in tusk and 0 in featuretools. |
| Aggregation |
last |
last |
✅ |
test_first_and_last_match_featuretools_in_row_creation_order |
Needs a row_creation_time on the child table. Ties are broken by primary key. |
| Aggregation |
— |
max_consecutive_false |
❌ |
|
Needs a run-length scan. |
| Aggregation |
— |
max_consecutive_negatives |
❌ |
|
Needs a run-length scan. |
| Aggregation |
— |
max_consecutive_positives |
❌ |
|
Needs a run-length scan. |
| Aggregation |
— |
max_consecutive_true |
❌ |
|
Needs a run-length scan. |
| Aggregation |
— |
max_consecutive_zeros |
❌ |
|
Needs a run-length scan. |
| Aggregation |
— |
max_count |
❌ |
|
Needs per-group value counts. |
| Aggregation |
max_min_delta |
max_min_delta |
⚠️ |
test_a_delta_without_a_known_value_is_null_rather_than_zero |
A group without a non-null value is null in tusk and 0 in featuretools. |
| Aggregation |
— |
median_count |
❌ |
|
Needs per-group value counts. |
| Aggregation |
— |
min_count |
❌ |
|
Needs per-group value counts. |
| Aggregation |
mode |
mode |
✅ |
test_standalone_aggregations_match_featuretools_on_every_parent_row |
|
| Aggregation |
— |
n_most_common |
⛔ |
|
Length-changing inside a lazy group_by().agg(). |
| Aggregation |
— |
n_most_common_frequency |
⛔ |
|
Length-changing inside a lazy group_by().agg(). |
| Aggregation |
n_unique_days |
n_unique_days |
⚠️ |
test_distinct_date_counts_count_a_null_as_a_value |
A null date counts as one value in tusk. featuretools ignores it. |
| Aggregation |
n_unique_days_of_calendar_year |
n_unique_days_of_calendar_year |
⚠️ |
test_distinct_date_counts_count_a_null_as_a_value |
A null date counts as one value in tusk. featuretools ignores it. |
| Aggregation |
n_unique_days_of_month |
n_unique_days_of_month |
⚠️ |
test_distinct_date_counts_count_a_null_as_a_value |
A null date counts as one value in tusk. featuretools ignores it. |
| Aggregation |
n_unique_months |
n_unique_months |
⚠️ |
test_distinct_date_counts_count_a_null_as_a_value |
A null date counts as one value in tusk. featuretools ignores it. |
| Aggregation |
— |
n_unique_weeks |
❌ |
|
|
| Aggregation |
— |
num_consecutive_greater_mean |
❌ |
|
Needs a run-length scan. |
| Aggregation |
— |
num_consecutive_less_mean |
❌ |
|
Needs a run-length scan. |
| Aggregation |
— |
num_false_since_last_true |
❌ |
|
Needs a run-length scan. |
| Aggregation |
— |
num_peaks |
❌ |
|
Needs a windowed scan. |
| Aggregation |
n_true |
num_true |
✅ |
test_standalone_aggregations_match_featuretools_on_every_parent_row |
|
| Aggregation |
— |
num_true_since_last_false |
❌ |
|
Needs a run-length scan. |
| Aggregation |
— |
num_zero_crossings |
❌ |
|
Needs a windowed scan. |
| Aggregation |
percent_unique |
percent_unique |
⚠️ |
test_percent_unique_of_an_empty_group_is_null_rather_than_zero |
A null counts as a distinct value in tusk, and featuretools ignores it. An empty group is null in tusk and 0 in featuretools. |
| Aggregation |
skew |
skew |
⚠️ |
test_skew_differs_from_featuretools_only_by_its_bias_correction |
Without bias correction, as narwhals computes it. featuretools applies pandas' sample correction. A constant group is null on both sides. |
| Aggregation |
time_since_first |
time_since_first |
⚠️ |
test_time_since_first_and_last_match_featuretools_on_every_parent_row |
Returns a Duration. featuretools returns float seconds. |
| Aggregation |
time_since_last |
time_since_last |
⚠️ |
test_time_since_first_and_last_match_featuretools_on_every_parent_row |
Returns a Duration. featuretools returns float seconds. |
| Aggregation |
time_since_last_false |
time_since_last_false |
⚠️ |
test_time_since_last_flag_matches_featuretools_where_a_flagged_row_exists |
Returns a Duration. featuretools returns float seconds. A group with no such row is null, not zero. |
| Aggregation |
— |
time_since_last_max |
❌ |
|
Needs an argmax. SQL backends reject an aggregate nested in an aggregate. |
| Aggregation |
— |
time_since_last_min |
❌ |
|
Needs an argmax. SQL backends reject an aggregate nested in an aggregate. |
| Aggregation |
time_since_last_true |
time_since_last_true |
⚠️ |
test_time_since_last_flag_matches_featuretools_where_a_flagged_row_exists |
Returns a Duration. featuretools returns float seconds. A group with no such row is null, not zero. |
| Aggregation |
— |
trend |
❌ |
|
Needs a least-squares fit. |
| Aggregation |
variance |
variance |
✅ |
test_standalone_aggregations_match_featuretools_on_every_parent_row |
|
| Binary transform |
add_numeric |
add_numeric |
✅ |
test_arithmetic_transforms_match_featuretools |
|
| Binary transform |
divide_numeric |
divide_numeric |
✅ |
test_arithmetic_transforms_match_featuretools |
|
| Binary transform |
multiply_numeric |
multiply_numeric |
✅ |
test_arithmetic_transforms_match_featuretools |
|
| Binary transform |
subtract_numeric |
subtract_numeric |
✅ |
test_arithmetic_transforms_match_featuretools |
|
| Binary transform |
— |
add_numeric_scalar |
⛔ |
|
Scalar argument. tusk primitives take columns only. |
| Binary transform |
— |
divide_by_feature |
⛔ |
|
Scalar argument. tusk primitives take columns only. |
| Binary transform |
— |
divide_numeric_scalar |
⛔ |
|
Scalar argument. tusk primitives take columns only. |
| Binary transform |
equal |
equal |
⚠️ |
test_*comparisons_match_featuretools_where_nothing_is_null, comparisons_agree_where_an_input_is_null, datetime_comparisons_match_featuretools_where_nothing_is_null, datetime_comparisons_diverge_where_an_operand_is_null, boolean_equality_matches_featuretools_where_nothing_is_null, boolean_equality_agrees_with_featuretools_where_an_operand_is_null, string_equality_matches_featuretools_where_nothing_is_null, string_equality_agrees_with_featuretools_where_an_operand_is_null, string_equality_diverges_where_a_low_cardinality_operand_is_null |
Compares numbers, datetimes, booleans and strings, but not enums and categoricals. Equal results for numeric, boolean and high cardinality strings. A low-cardinality string pair diverges the same way as equal_categorical. Over Datetime operands tusk gives a null, featuretools answers False. |
| Binary transform |
equal_categorical |
equal (generic — featuretools has no categorical-specific primitive) |
⚠️ |
test_categorical_equality_matches_featuretools_where_nothing_is_null / test_categorical_equality_diverges_where_a_label_is_null |
Compares labels, not encodings. It agrees with featuretools' generic equal wherever both labels are non-null. Diverges on a null label: tusk gives null (a null label cannot be shown equal to anything), featuretools False. |
| Binary transform |
— |
equal_scalar |
⛔ |
|
Scalar argument. tusk primitives take columns only. |
| Binary transform |
greater_than |
greater_than |
⚠️ |
test_comparisons_match_featuretools_where_nothing_is_null / test_comparisons_agree_where_an_input_is_null / test_datetime_comparisons_match_featuretools_where_nothing_is_null / test_datetime_comparisons_diverge_where_an_operand_is_null |
featuretools also accepts Ordinal columns. tusk has no logical types. Over numeric operands, a null gives a null on both sides. Over Datetime operands, a null diverges: tusk still gives a null, featuretools compares NaT with plain datetime64[ns] semantics and answers False. |
| Binary transform |
greater_than_equal_to |
greater_than_equal_to |
⚠️ |
test_comparisons_match_featuretools_where_nothing_is_null / test_comparisons_agree_where_an_input_is_null / test_datetime_comparisons_match_featuretools_where_nothing_is_null / test_datetime_comparisons_diverge_where_an_operand_is_null |
featuretools also accepts Ordinal columns. tusk has no logical types. Over numeric operands, a null gives a null on both sides. Over Datetime operands, a null diverges: tusk still gives a null, featuretools compares NaT with plain datetime64[ns] semantics and answers False. |
| Binary transform |
— |
greater_than_equal_to_scalar |
⛔ |
|
Scalar argument. tusk primitives take columns only. |
| Binary transform |
— |
greater_than_scalar |
⛔ |
|
Scalar argument. tusk primitives take columns only. |
| Binary transform |
less_than |
less_than |
⚠️ |
test_comparisons_match_featuretools_where_nothing_is_null / test_comparisons_agree_where_an_input_is_null / test_datetime_comparisons_match_featuretools_where_nothing_is_null / test_datetime_comparisons_diverge_where_an_operand_is_null |
featuretools also accepts Ordinal columns. tusk has no logical types. Over numeric operands, a null gives a null on both sides. Over Datetime operands, a null diverges: tusk still gives a null, featuretools compares NaT with plain datetime64[ns] semantics and answers False. |
| Binary transform |
less_than_equal_to |
less_than_equal_to |
⚠️ |
test_comparisons_match_featuretools_where_nothing_is_null / test_comparisons_agree_where_an_input_is_null / test_datetime_comparisons_match_featuretools_where_nothing_is_null / test_datetime_comparisons_diverge_where_an_operand_is_null |
featuretools also accepts Ordinal columns. tusk has no logical types. Over numeric operands, a null gives a null on both sides. Over Datetime operands, a null diverges: tusk still gives a null, featuretools compares NaT with plain datetime64[ns] semantics and answers False. |
| Binary transform |
— |
less_than_equal_to_scalar |
⛔ |
|
Scalar argument. tusk primitives take columns only. |
| Binary transform |
— |
less_than_scalar |
⛔ |
|
Scalar argument. tusk primitives take columns only. |
| Binary transform |
— |
modulo_by_feature |
⛔ |
|
Scalar argument. tusk primitives take columns only. |
| Binary transform |
modulo_numeric |
modulo_numeric |
⚠️ |
test_modulo_matches_featuretools_on_negative_operands / test_modulo_diverges_on_a_zero_divisor |
Floored, so the sign follows the divisor on every backend. A zero divisor is backend-defined. On this fixture's float64 columns, tusk gives NaN, while featuretools gives 0. woodwork infers the whole-number columns as Int64, where pandas' % by zero is 0. |
| Binary transform |
— |
modulo_numeric_scalar |
⛔ |
|
Scalar argument. tusk primitives take columns only. |
| Binary transform |
and |
multiply_boolean |
⚠️ |
test_and_matches_featuretools_multiply_boolean |
Against this multiply_boolean, and's values match exactly on every input, including false & null. tusk ships one conjunction where featuretools ships two names, because pandas gave it two functions (bitwise_and, logical_and) that disagree on a null operand. SQL has one conjunction, so and is deliberately the only primitive here. See the and row under Boolean transform for the (different) divergence against featuretools' own and. |
| Binary transform |
multiply_numeric_boolean |
multiply_numeric_boolean |
✅ |
test_multiply_numeric_boolean_matches_featuretools |
|
| Binary transform |
— |
multiply_numeric_scalar |
⛔ |
|
Scalar argument. tusk primitives take columns only. |
| Binary transform |
not_equal |
not_equal |
⚠️ |
test_comparisons_match_featuretools_where_nothing_is_null / test_comparisons_agree_where_an_input_is_null / test_datetime_comparisons_match_featuretools_where_nothing_is_null / test_datetime_comparisons_diverge_where_an_operand_is_null / test_boolean_equality_matches_featuretools_where_nothing_is_null / test_boolean_equality_agrees_with_featuretools_where_an_operand_is_null / test_string_equality_matches_featuretools_where_nothing_is_null / test_string_equality_agrees_with_featuretools_where_an_operand_is_null / test_string_equality_diverges_where_a_low_cardinality_operand_is_null |
Compares numbers, datetimes, booleans and strings. Labels have their own primitives. A null gives a null on both sides over numeric, boolean and string operands. This holds for the string operand only while featuretools infers it as a plain string (woodwork Unknown, pandas nullable string), not a low-cardinality label. A low-cardinality string pair diverges the same way not_equal_categorical's row describes. Over Datetime operands, a null diverges: tusk still gives a null, featuretools compares NaT with plain datetime64[ns] semantics and answers True. |
| Binary transform |
not_equal_categorical |
not_equal (generic — featuretools has no categorical-specific primitive) |
⚠️ |
test_categorical_equality_matches_featuretools_where_nothing_is_null / test_categorical_equality_diverges_where_a_label_is_null |
Compares labels, not encodings. It agrees with featuretools' generic not_equal wherever both labels are non-null. Diverges on a null label: tusk gives null (a null label cannot be shown unequal to anything), featuretools True. |
| Binary transform |
— |
not_equal_scalar |
⛔ |
|
|
| Binary transform |
— |
scalar_subtract_numeric_feature |
⛔ |
|
Scalar argument. tusk primitives take columns only. |
| Binary transform |
— |
subtract_numeric_scalar |
⛔ |
|
Scalar argument. tusk primitives take columns only. |
| Boolean transform |
and |
and |
⚠️ |
test_binary_boolean_transforms_diverge_where_one_input_is_null |
Against this and, false AND null diverges: false in tusk's three-valued logic, but featuretools' and (logical_and) propagates the null instead. See the multiply_boolean row under Binary transform for the (different, matching) comparison. |
| Boolean transform |
— |
isin |
⛔ |
|
Literal list argument. tusk primitives take columns only. |
| Boolean transform |
not |
not |
✅ |
test_not_matches_featuretools_on_every_row |
|
| Boolean transform |
or |
or |
⚠️ |
test_binary_boolean_transforms_diverge_where_one_input_is_null |
true OR null is true in tusk's three-valued logic. featuretools propagates the null. |
| Cumulative transform |
cum_count |
cum_count |
⚠️ |
test_cum_count_counts_known_values_where_featuretools_counts_rows |
featuretools counts every row. tusk counts only non-null values. Runs only within foreign-key groups. featuretools also computes it across the whole table. |
| Cumulative transform |
cum_max |
cum_max |
⚠️ |
test_cumulative_transforms_match_featuretools |
Runs only within foreign-key groups. featuretools also computes it across the whole table. |
| Cumulative transform |
cum_min |
cum_min |
⚠️ |
test_cumulative_transforms_match_featuretools |
Runs only within foreign-key groups. featuretools also computes it across the whole table. |
| Cumulative transform |
cum_sum |
cum_sum |
⚠️ |
test_cumulative_transforms_match_featuretools |
Runs only within foreign-key groups. featuretools also computes it across the whole table. |
| Cumulative transform |
diff |
diff |
⚠️ |
test_cumulative_transforms_match_featuretools |
Runs only within foreign-key groups. featuretools also computes it across the whole table. |
| Cumulative transform |
time_since_previous |
time_since_previous |
⚠️ |
test_time_since_previous_is_a_timedelta |
Returns a Duration. featuretools returns float seconds. Runs only within foreign-key groups. featuretools also computes it across the whole table. |
| Cumulative transform |
cum_mean |
cum_mean |
⚠️ |
test_cum_mean_divides_by_known_values_where_featuretools_divides_by_rows |
A null is left out of the divisor. featuretools divides by the number of rows. Runs only within foreign-key groups. featuretools also computes it across the whole table. |
| Cumulative transform |
cumulative_time_since_last_false |
cumulative_time_since_last_false |
⚠️ |
test_cumulative_time_since_matches_featuretools_in_seconds |
Returns a Duration. featuretools returns float seconds. Takes any datetime column. featuretools takes only the time index. For a time-zone-aware column, a gap across a daylight-saving change can vary by backend. Runs only within foreign-key groups. featuretools also computes it across the whole table. |
| Cumulative transform |
cumulative_time_since_last_true |
cumulative_time_since_last_true |
⚠️ |
test_cumulative_time_since_matches_featuretools_in_seconds |
Returns a Duration. featuretools returns float seconds. Takes any datetime column. featuretools takes only the time index. For a time-zone-aware column, a gap across a daylight-saving change can vary by backend. Runs only within foreign-key groups. featuretools also computes it across the whole table. |
| Cumulative transform |
— |
diff_datetime |
⚠️ |
test_diff_datetime_is_time_since_previous |
Not a separate tusk primitive. time_since_previous computes it. |
| Datetime transform |
day |
day |
✅ |
test_datetime_parts_match_featuretools |
|
| Datetime transform |
hour |
hour |
✅ |
test_datetime_parts_match_featuretools |
|
| Datetime transform |
is_weekend |
is_weekend |
⚠️ |
|
Agrees on real dates. A null datetime is null in tusk and False in featuretools. |
| Datetime transform |
month |
month |
✅ |
test_datetime_parts_match_featuretools |
|
| Datetime transform |
time_since |
time_since |
⚠️ |
test_time_since_matches_featuretools_on_every_row |
Returns a Duration. featuretools returns float seconds. |
| Datetime transform |
weekday |
weekday |
⚠️ |
test_row_wise_transforms |
tusk is ISO 1-7 (Monday = 1). featuretools is 0-6 (Monday = 0). |
| Datetime transform |
year |
year |
✅ |
test_datetime_parts_match_featuretools |
|
| Datetime transform |
— |
age |
⛔ |
|
Covered by time_since. Without semantic tags, a birth date is just a datetime. |
| Datetime transform |
— |
date_to_holiday |
⛔ |
|
This needs rule-based calendars, not explicit dates, which would expire in a persisted feature list. |
| Datetime transform |
— |
date_to_time_zone |
⛔ |
|
duckdb keeps the time zone on the connection, not on the column. |
| Datetime transform |
day_of_year |
day_of_year |
✅ |
test_datetime_parts_match_featuretools |
|
| Datetime transform |
— |
days_in_month |
❌ |
|
|
| Datetime transform |
— |
distance_to_holiday |
⛔ |
|
This needs rule-based calendars, not explicit dates, which would expire in a persisted feature list. |
| Datetime transform |
— |
is_federal_holiday |
⛔ |
|
This needs rule-based calendars, not explicit dates, which would expire in a persisted feature list. |
| Datetime transform |
— |
is_first_week_of_month |
⛔ |
|
|
| Datetime transform |
is_leap_year |
is_leap_year |
⚠️ |
test_is_leap_year_of_a_null_date_is_null_rather_than_false |
A null date is null in tusk and False in featuretools. |
| Datetime transform |
— |
is_lunch_time |
⛔ |
|
|
| Datetime transform |
— |
is_month_end |
❌ |
|
|
| Datetime transform |
— |
is_month_start |
❌ |
|
|
| Datetime transform |
— |
is_quarter_end |
❌ |
|
|
| Datetime transform |
— |
is_quarter_start |
❌ |
|
|
| Datetime transform |
— |
is_working_hours |
⛔ |
|
|
| Datetime transform |
— |
is_year_end |
❌ |
|
|
| Datetime transform |
— |
is_year_start |
❌ |
|
|
| Datetime transform |
minute |
minute |
✅ |
test_datetime_parts_match_featuretools |
|
| Datetime transform |
— |
nth_week_of_month |
⛔ |
|
narwhals exposes no ISO week number. |
| Datetime transform |
— |
part_of_day |
⛔ |
|
|
| Datetime transform |
— |
quarter |
❌ |
|
|
| Datetime transform |
— |
season |
⛔ |
|
|
| Datetime transform |
second |
second |
✅ |
test_datetime_parts_match_featuretools |
|
| Datetime transform |
— |
week |
❌ |
|
narwhals exposes no ISO week number. |
| Email and URL transform |
domain |
email_address_to_domain |
⚠️ |
test_domain_matches_email_address_to_domain_on_well_formed_addresses / test_domain_diverges_from_email_address_to_domain_on_malformed_addresses |
One primitive handles URLs and emails. Without an @ the value is the domain, the last of several @ counts, and a trailing @ is null. |
| Email and URL transform |
— |
is_free_email_domain |
⛔ |
|
|
| Email and URL transform |
domain |
url_to_domain |
⚠️ |
test_domain_matches_url_to_domain_on_http_urls / test_domain_diverges_from_url_to_domain_on_other_schemes_and_empty_hosts |
One primitive handles URLs and emails. It removes any scheme, not only http and https. An empty host is null. |
| Email and URL transform |
url_to_protocol |
url_to_protocol |
✅ |
test_url_to_protocol_matches_featuretools |
|
| Email and URL transform |
top_level_domain |
url_to_tld |
⚠️ |
test_top_level_domain_matches_url_to_tld_where_the_last_label_is_a_listed_tld / test_top_level_domain_keeps_the_whole_last_label |
Takes the last label of domain, so it also reads emails. featuretools prefix-matches a fixed list of common TLDs, so mysite.company is com there. |
| Exponential transform |
— |
exponential_weighted_average |
⛔ |
|
duckdb has no exponentially weighted window. |
| Exponential transform |
— |
exponential_weighted_std |
⛔ |
|
duckdb has no exponentially weighted window. |
| Exponential transform |
— |
exponential_weighted_variance |
⛔ |
|
duckdb has no exponentially weighted window. |
| General transform |
absolute |
absolute |
✅ |
test_general_transforms_match_featuretools |
|
| General transform |
natural_log |
natural_logarithm |
⚠️ |
test_square_root_and_natural_log_give_null_where_featuretools_gives_nan |
A negative input is null in tusk and NaN in featuretools. |
| General transform |
absolute_diff |
absolute_diff |
⚠️ |
test_absolute_diff_does_not_forward_fill |
A null and the row after it are null in tusk. featuretools fills in the previous non-null value first. Always returns a float, so integer columns cannot overflow. Runs only within foreign-key groups. featuretools also computes it across the whole table. |
| General transform |
cosine |
cosine |
✅ |
test_general_transforms_match_featuretools |
|
| General transform |
is_null |
is_null |
✅ |
test_general_transforms_match_featuretools |
|
| General transform |
negate |
negate |
✅ |
test_general_transforms_match_featuretools |
Always returns a float, so an integer column's smallest value can be negated. |
| General transform |
percent_change |
percent_change |
⚠️ |
test_percent_change_does_not_forward_fill |
A null and the row after it are null in tusk. featuretools fills in the previous non-null value first. Runs only within foreign-key groups. featuretools also computes it across the whole table. |
| General transform |
percentile |
percentile |
⚠️ |
test_percentile_matches_featuretools_within_the_group |
Ranks the value within its foreign-key group. Runs only within foreign-key groups. featuretools also computes it across the whole table. |
| General transform |
— |
rate_of_change |
⛔ |
|
|
| General transform |
same_as_previous |
same_as_previous |
⚠️ |
test_same_as_previous_does_not_forward_fill |
The first row, a null and the row after it are null in tusk. featuretools fills in the previous non-null value first and answers False on the first row. Runs only within foreign-key groups. featuretools also computes it across the whole table. |
| General transform |
— |
savgol_filter |
⛔ |
|
|
| General transform |
sine |
sine |
✅ |
test_general_transforms_match_featuretools |
|
| General transform |
square_root |
square_root |
⚠️ |
test_square_root_and_natural_log_give_null_where_featuretools_gives_nan |
A negative input is null in tusk and NaN in featuretools. |
| General transform |
— |
tangent |
⛔ |
|
narwhals exposes no tan. |
| Location transform |
— |
cityblock_distance |
⛔ |
|
|
| Location transform |
— |
geomidpoint |
⛔ |
|
|
| Location transform |
— |
haversine |
⛔ |
|
|
| Location transform |
— |
is_in_geobox |
⛔ |
|
|
| Location transform |
— |
latitude |
⛔ |
|
|
| Location transform |
— |
longitude |
⛔ |
|
|
| Natural-language transform |
— |
count_string |
⛔ |
|
|
| Natural-language transform |
— |
file_extension |
⛔ |
|
|
| Natural-language transform |
— |
full_name_to_first_name |
⛔ |
|
|
| Natural-language transform |
— |
full_name_to_last_name |
⛔ |
|
|
| Natural-language transform |
— |
full_name_to_title |
⛔ |
|
|
| Natural-language transform |
— |
mean_characters_per_word |
⛔ |
|
|
| Natural-language transform |
— |
median_word_length |
⛔ |
|
Needs a per-row list reduction. |
| Natural-language transform |
n_characters |
num_characters |
✅ |
test_n_characters_matches_featuretools |
|
| Natural-language transform |
— |
num_unique_separators |
⛔ |
|
Needs a regex count. narwhals has none. |
| Natural-language transform |
n_words |
num_words |
✅ |
test_n_words_matches_featuretools |
|
| Natural-language transform |
— |
number_of_common_words |
⛔ |
|
Needs tokenisation against a word list. |
| Natural-language transform |
— |
number_of_hashtags |
⛔ |
|
Needs a regex count. narwhals has none. |
| Natural-language transform |
— |
number_of_mentions |
⛔ |
|
Needs a regex count. narwhals has none. |
| Natural-language transform |
n_unique_words |
number_of_unique_words |
✅ |
test_n_unique_words_matches_case_insensitive_featuretools / test_n_unique_words_folds_case_where_featuretools_defaults_not_to |
Equal to featuretools NumberOfUniqueWords(case_insensitive=True) |
| Natural-language transform |
— |
number_of_words_in_quotes |
⛔ |
|
Needs a regex count. narwhals has none. |
| Natural-language transform |
— |
punctuation_count |
⛔ |
|
Needs a regex count. narwhals has none. |
| Natural-language transform |
— |
title_word_count |
⛔ |
|
Needs a regex count. narwhals has none. |
| Natural-language transform |
— |
total_word_length |
⛔ |
|
|
| Natural-language transform |
— |
upper_case_count |
⛔ |
|
Needs a regex count. narwhals has none. |
| Natural-language transform |
— |
upper_case_word_count |
⛔ |
|
Needs a regex count. narwhals has none. |
| Natural-language transform |
— |
whitespace_count |
⛔ |
|
Needs a regex count. narwhals has none. |
| Postal-code transform |
— |
one_digit_postal_code |
⛔ |
|
|
| Postal-code transform |
— |
two_digit_postal_code |
⛔ |
|
|