Repository: alteryx/featuretools (python)

Issue:
PercentTrue calculation can fail on BooleanNullable inputs when there are no values to aggregate
PercentTrue calculation can fail on BooleanNullable inputs when there are no values to aggregate

#### Code Sample, a copy-pastable example to reproduce your bug.

```python
import featuretools as ft
import pandas as pd
from woodwork.logical_types import BooleanNullable

es = ft.EntitySet(id="customer_data")

customers_df = pd.DataFrame(data={"customer_id": [1, 2]})

es = es.add_dataframe(
    dataframe_name="customers_df",
    dataframe=customers_df,
    index="customer_id",
)

transactions_df = pd.DataFrame(data={"tx_id": [1], "customer_id": [1], "is_foo": [True]})

es = es.add_dataframe(
    dataframe_name="transactions_df",
    dataframe=transactions_df,
    index="tx_id",
    logical_types={"is_foo": BooleanNullable}
)

es = es.add_relationship("customers_df", "customer_id", "transactions_df", "customer_id")

feature_matrix, features_definitions = ft.dfs(
    entityset=es,
    target_dataframe_name="customers_df",
    agg_primitives=["percent_true"],
)

```

A potential solution to this is to change the primitive default value from 0 to `pd.NA`

Pull request description:
Fix bug in PercentTrue primitive
### Pull Request Description
Fix bug with default value in PercentTrue primitive

Closes #2625 


Patch:
diff --git a/docs/source/release_notes.rst b/docs/source/release_notes.rst
index 92229543..8d0b1686 100644
--- a/docs/source/release_notes.rst
+++ b/docs/source/release_notes.rst
@@ -7,6 +7,7 @@ Future Release
 ==============
     * Enhancements
     * Fixes
+        * Fix bug with default value in ``PercentTrue`` primitive (:pr:`2627`)
     * Changes
         * Refactor ``featuretools/tests/primitive_tests/utils.py`` to leverage list comprehensions for improved Pythonic quality (:pr:`2607`)
         * Refactor ``can_stack_primitive_on_inputs`` (:pr:`2522`)
diff --git a/featuretools/primitives/standard/aggregation/percent_true.py b/featuretools/primitives/standard/aggregation/percent_true.py
index 32ce39a1..a24acc3f 100644
--- a/featuretools/primitives/standard/aggregation/percent_true.py
+++ b/featuretools/primitives/standard/aggregation/percent_true.py
@@ -1,3 +1,4 @@
+import pandas as pd
 from woodwork.column_schema import ColumnSchema
 from woodwork.logical_types import Boolean, BooleanNullable, Double
 
@@ -30,7 +31,7 @@ class PercentTrue(AggregationPrimitive):
     return_type = ColumnSchema(logical_type=Double, semantic_tags={"numeric"})
     stack_on = []
     stack_on_exclude = []
-    default_value = 0
+    default_value = pd.NA
     compatibility = [Library.PANDAS, Library.DASK]
     description_template = "the percentage of true values in {}"
 


Test patch:
diff --git a/.github/workflows/tests_with_latest_deps.yaml b/.github/workflows/tests_with_latest_deps.yaml
index f95e7818..0a6866b2 100644
--- a/.github/workflows/tests_with_latest_deps.yaml
+++ b/.github/workflows/tests_with_latest_deps.yaml
@@ -109,7 +109,7 @@ jobs:
           $ProgressPreference = "silentlyContinue"
           Invoke-WebRequest -Uri $Uri -Outfile "$env:USERPROFILE/$File"
           $hashFromFile = Get-FileHash "$env:USERPROFILE/$File" -Algorithm SHA256
-          $hashFromUrl = "00e8370542836862d4c790aa8966f1d7344a8addd4b766004febcb23f40e2914"
+          $hashFromUrl = "29e008bcaa3970bdf4f21362e545533d55a0f04c7ae99b93f20cb2b42f9250b1"
           if ($hashFromFile.Hash -ne "$hashFromUrl") {
             Throw "$File hashes do not match"
           }
diff --git a/featuretools/tests/primitive_tests/aggregation_primitive_tests/test_percent_true.py b/featuretools/tests/primitive_tests/aggregation_primitive_tests/test_percent_true.py
new file mode 100644
index 00000000..86ff728b
--- /dev/null
+++ b/featuretools/tests/primitive_tests/aggregation_primitive_tests/test_percent_true.py
@@ -0,0 +1,40 @@
+import pandas as pd
+from woodwork.logical_types import BooleanNullable
+
+import featuretools as ft
+
+
+def test_percent_true_default_value_with_dfs():
+    es = ft.EntitySet(id="customer_data")
+
+    customers_df = pd.DataFrame(data={"customer_id": [1, 2]})
+    transactions_df = pd.DataFrame(
+        data={"tx_id": [1], "customer_id": [1], "is_foo": [True]},
+    )
+
+    es.add_dataframe(
+        dataframe_name="customers_df",
+        dataframe=customers_df,
+        index="customer_id",
+    )
+    es.add_dataframe(
+        dataframe_name="transactions_df",
+        dataframe=transactions_df,
+        index="tx_id",
+        logical_types={"is_foo": BooleanNullable},
+    )
+
+    es = es.add_relationship(
+        "customers_df",
+        "customer_id",
+        "transactions_df",
+        "customer_id",
+    )
+
+    feature_matrix, _ = ft.dfs(
+        entityset=es,
+        target_dataframe_name="customers_df",
+        agg_primitives=["percent_true"],
+    )
+
+    assert pd.isna(feature_matrix["PERCENT_TRUE(transactions_df.is_foo)"][2])