From 47965bc7718d03ed3180ea9d3160ac6302121325 Mon Sep 17 00:00:00 2001 From: HowToSD Date: Tue, 25 Feb 2025 11:50:45 -0800 Subject: [PATCH] Added Pandas Crosstab and Pandas Value Counts nodes. --- __init__.py | 6 ++ docs/images/frequency_table.png | Bin 0 -> 90488 bytes docs/reference/node_reference.md | 5 ++ docs/reference/pandas_crosstab.md | 19 +++++ docs/reference/pandas_value_counts.md | 20 +++++ examples/workflows/frequency_table.json | 1 + modules/pandas_wrapper/pandas_crosstab.py | 57 +++++++++++++ modules/pandas_wrapper/pandas_value_counts.py | 80 ++++++++++++++++++ pyproject.toml | 2 +- tests/pandas_wrapper/pandas_crosstab_test.py | 59 +++++++++++++ .../pandas_value_counts_test.py | 56 ++++++++++++ 11 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 docs/images/frequency_table.png create mode 100644 docs/reference/pandas_crosstab.md create mode 100644 docs/reference/pandas_value_counts.md create mode 100644 examples/workflows/frequency_table.json create mode 100644 modules/pandas_wrapper/pandas_crosstab.py create mode 100644 modules/pandas_wrapper/pandas_value_counts.py create mode 100644 tests/pandas_wrapper/pandas_crosstab_test.py create mode 100644 tests/pandas_wrapper/pandas_value_counts_test.py diff --git a/__init__.py b/__init__.py index 9495c18..3a8bc5a 100644 --- a/__init__.py +++ b/__init__.py @@ -33,6 +33,7 @@ from .modules.pandas_wrapper.pandas_create_from_multiple_dict import PandasCreat from .modules.pandas_wrapper.pandas_create_from_numpy import PandasCreateFromNumpy from .modules.pandas_wrapper.pandas_create_series_from_dict import PandasCreateSeriesFromDict from .modules.pandas_wrapper.pandas_create_with_index import PandasCreateWithIndex +from .modules.pandas_wrapper.pandas_crosstab import PandasCrosstab from .modules.pandas_wrapper.pandas_cummax import PandasCummax from .modules.pandas_wrapper.pandas_cummin import PandasCummin from .modules.pandas_wrapper.pandas_cumprod import PandasCumprod @@ -111,6 +112,7 @@ from .modules.pandas_wrapper.pandas_to_datetime import PandasToDatetime from .modules.pandas_wrapper.pandas_to_numpy import PandasToNumpy from .modules.pandas_wrapper.pandas_to_string import PandasToString from .modules.pandas_wrapper.pandas_transpose import PandasTranspose +from .modules.pandas_wrapper.pandas_value_counts import PandasValueCounts from .modules.pandas_wrapper.pandas_var import PandasVar from .modules.pandas_wrapper.pandas_vertical_concat import PandasVerticalConcat from .modules.pandas_wrapper.pandas_vertical_split import PandasVerticalSplit @@ -172,6 +174,7 @@ NODE_CLASS_MAPPINGS: Dict[str, Type[T]] = { "PandasCreateFromNumpy": PandasCreateFromNumpy, "PandasCreateSeriesFromDict": PandasCreateSeriesFromDict, "PandasCreateWithIndex": PandasCreateWithIndex, + "PandasCrosstab": PandasCrosstab, "PandasCummax": PandasCummax, "PandasCummin": PandasCummin, "PandasCumprod": PandasCumprod, @@ -250,6 +253,7 @@ NODE_CLASS_MAPPINGS: Dict[str, Type[T]] = { "PandasToNumpy": PandasToNumpy, "PandasToString": PandasToString, "PandasTranspose": PandasTranspose, + "PandasValueCounts": PandasValueCounts, "PandasVar": PandasVar, "PandasVerticalConcat": PandasVerticalConcat, "PandasVerticalSplit": PandasVerticalSplit, @@ -314,6 +318,7 @@ NODE_DISPLAY_NAME_MAPPINGS: Dict[str, str] = { "PandasCreateFromNumpy": "Pandas Create From Numpy", "PandasCreateSeriesFromDict": "Pandas Create Series From Dict", "PandasCreateWithIndex": "Pandas Create With Index", + "PandasCrosstab": "Pandas Crosstab", "PandasCummax": "Pandas Cummax", "PandasCummin": "Pandas Cummin", "PandasCumprod": "Pandas Cumprod", @@ -392,6 +397,7 @@ NODE_DISPLAY_NAME_MAPPINGS: Dict[str, str] = { "PandasToNumpy": "Pandas To Numpy", "PandasToString": "Pandas To String", "PandasTranspose": "Pandas Transpose", + "PandasValueCounts": "Pandas Value Counts", "PandasVar": "Pandas Var", "PandasVerticalConcat": "Pandas Vertical Concat", "PandasVerticalSplit": "Pandas Vertical Split", diff --git a/docs/images/frequency_table.png b/docs/images/frequency_table.png new file mode 100644 index 0000000000000000000000000000000000000000..64e43800d50a5f7a402e41e47f226306527b6e10 GIT binary patch literal 90488 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 literal 0 HcmV?d00001 diff --git a/docs/reference/node_reference.md b/docs/reference/node_reference.md index 4812790..0d41364 100644 --- a/docs/reference/node_reference.md +++ b/docs/reference/node_reference.md @@ -26,6 +26,11 @@ | [Pandas Sub Scalar Float](pandas_sub_scalar_float.md) | Subtracts a floating-point number from a Pandas DataFrame. | | [Pandas Sub Scalar Int](pandas_sub_scalar_int.md) | Subtracts an integer from a Pandas DataFrame. | | [Pandas Sub Series](pandas_sub_series.md) | Subtracts a Pandas Series from a Pandas DataFrame. | +## Categorical summary +| Node | Description | +| --- | --- | +| [Pandas Crosstab](pandas_crosstab.md) | Creates a contingency table (crosstab, or cross-tabulation) from two or more columns in a DataFrame. | +| [Pandas Value Counts](pandas_value_counts.md) | Creates a frequency table from one or more columns in a DataFrame. | ## Cumulative calculations | Node | Description | | --- | --- | diff --git a/docs/reference/pandas_crosstab.md b/docs/reference/pandas_crosstab.md new file mode 100644 index 0000000..721bd15 --- /dev/null +++ b/docs/reference/pandas_crosstab.md @@ -0,0 +1,19 @@ +# Pandas Crosstab +Creates a contingency table (crosstab, or cross-tabulation) from two or more columns in a DataFrame. + +## Input +| Name | Data type | +|---|---| +| dataframe | DataFrame | +| index | String | +| column_names | String | + +## Output +| Data type | +|---| +| DataFrame | + +
+Category: Categorical summary + +ComfyUI Data Analysis Node Reference. © 2025 Hide Inada (HowToSD.com). All rights reserved. diff --git a/docs/reference/pandas_value_counts.md b/docs/reference/pandas_value_counts.md new file mode 100644 index 0000000..42cc382 --- /dev/null +++ b/docs/reference/pandas_value_counts.md @@ -0,0 +1,20 @@ +# Pandas Value Counts +Creates a frequency table from one or more columns in a DataFrame. + +![Frequency table](../images/frequency_table.png) + +## Input +| Name | Data type | +|---|---| +| dataframe | DataFrame | +| column_names | String | + +## Output +| Data type | +|---| +| DataFrame | + +
+Category: Categorical summary + +ComfyUI Data Analysis Node Reference. © 2025 Hide Inada (HowToSD.com). All rights reserved. diff --git a/examples/workflows/frequency_table.json b/examples/workflows/frequency_table.json new file mode 100644 index 0000000..57aba0e --- /dev/null +++ b/examples/workflows/frequency_table.json @@ -0,0 +1 @@ +{"last_node_id":6,"last_link_id":4,"nodes":[{"id":2,"type":"PandasCreate","pos":[2785.739990234375,687.7178344726562],"size":[210,155.83331298828125],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[1],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreate"},"widgets_values":["Fruits\napple\napple\napple\nbanana\nbanana\ncoconut"]},{"id":1,"type":"PandasValueCounts","pos":[3036.5732421875,688.5511474609375],"size":[315,58],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":1}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[2],"slot_index":0}],"properties":{"Node name for S&R":"PandasValueCounts"},"widgets_values":["Fruits"]},{"id":4,"type":"PandasCreate","pos":[2783.60302734375,927.6964111328125],"size":[210,156.66668701171875],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[3],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreate"},"widgets_values":["Fruits,Color\napple,red\napple,red\napple,yellow\nbanana,yellow\nbanana,green\ncoconut,brown"]},{"id":3,"type":"PandasShowDataFrame","pos":[3390.740234375,689.3844604492188],"size":[210,116.83334350585938],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":2}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Fruits count\n0 apple 3\n1 banana 2\n2 coconut 1"]},{"id":5,"type":"PandasValueCounts","pos":[3034.4365234375,930.1962280273438],"size":[315,58],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":3}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[4],"slot_index":0}],"properties":{"Node name for S&R":"PandasValueCounts"},"widgets_values":["Fruits,Color"]},{"id":6,"type":"PandasShowDataFrame","pos":[3391.93603515625,930.1962890625],"size":[237.0999755859375,134.33334350585938],"flags":{},"order":5,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":4}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Fruits Color count\n0 apple red 2\n1 apple yellow 1\n2 banana green 1\n3 banana yellow 1\n4 coconut brown 1"]}],"links":[[1,2,0,1,0,"DATAFRAME"],[2,1,0,3,0,"DATAFRAME"],[3,4,0,5,0,"DATAFRAME"],[4,5,0,6,0,"DATAFRAME"]],"groups":[],"config":{},"extra":{"ds":{"scale":1,"offset":[-2487.817049646748,-548.6010443750537]},"node_versions":{"data-analysis":"e6beae73ef53e21d561aaf8ca714e350de59ec7d"},"ue_links":[]},"version":0.4} \ No newline at end of file diff --git a/modules/pandas_wrapper/pandas_crosstab.py b/modules/pandas_wrapper/pandas_crosstab.py new file mode 100644 index 0000000..4e96313 --- /dev/null +++ b/modules/pandas_wrapper/pandas_crosstab.py @@ -0,0 +1,57 @@ +from typing import Any, Dict +import pandas as pd +from .utils import column_labels_string_to_list + + +class PandasCrosstab: + """ + Creates a contingency table (crosstab, or cross-tabulation) from two or more columns in a DataFrame. + + category: Categorical summary + """ + + @classmethod + def INPUT_TYPES(cls) -> Dict[str, Any]: + """ + Defines the input types for the function. + + Returns: + Dict[str, Any]: A dictionary specifying required input types. + """ + return { + "required": { + "dataframe": ("DATAFRAME", {}), + "index": ("STRING", {"default": ""}), + "column_names": ("STRING", {"default": ""}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, dataframe: pd.DataFrame, index: str, column_names: str) -> tuple: + """ + Creates a contingency table (crosstab, or cross-tabulation) from two or more columns in a DataFrame. + + Args: + dataframe (DataFrame): The DataFrame. + index (str): A comma-separated list of index (row labels) containing categorical data. + column_names (str): A comma-separated list of column names containing categorical data. + + Returns: + tuple: A tuple containing the DataFrame. + """ + rows = column_labels_string_to_list(dataframe, index) + cols = column_labels_string_to_list(dataframe, column_names) + + if len(rows) == 1: + rows = dataframe[rows[0]] + else: + rows = [dataframe[e] for e in rows] + if len(cols) == 1: + cols = dataframe[cols[0]] + else: + cols = [dataframe[e] for e in cols] + df2 = pd.crosstab(index=rows, columns=cols) + return (df2,) diff --git a/modules/pandas_wrapper/pandas_value_counts.py b/modules/pandas_wrapper/pandas_value_counts.py new file mode 100644 index 0000000..effc485 --- /dev/null +++ b/modules/pandas_wrapper/pandas_value_counts.py @@ -0,0 +1,80 @@ +from typing import Any, Dict +import pandas as pd +from .utils import column_labels_string_to_list + + +class PandasValueCounts: + """ + Creates a frequency table from one or more columns in a DataFrame. + + ![Frequency table](../images/frequency_table.png) + + category: Categorical summary + """ + + @classmethod + def INPUT_TYPES(cls) -> Dict[str, Any]: + """ + Defines the input types for the function. + + Returns: + Dict[str, Any]: A dictionary specifying required input types. + """ + return { + "required": { + "dataframe": ("DATAFRAME", {}), + "column_names": ("STRING", {"default": ""}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, dataframe: pd.DataFrame, column_names: str) -> tuple: + """ + Creates a frequency tableConverts one or more columns in a DataFrame. + + Args: + dataframe (DataFrame): The DataFrame. + column_names (str): A comma-separated list of column names containing categorical data. + + Returns: + tuple: A tuple containing the DataFrame with selected columns. + """ + + # Note + # If the original DataFrame contains a single column with categorical variables: + # + # Category + # -------- + # A + # A + # A + # B + # B + # C + # C + # + # and you want to compute the count of each variable and call value_counts(). + # After value_counts(), the column entries are became the index in a generated Series: + # df["Category"].value_counts().to_frame() + # Category + # A 3 + # B 2 + # C 2 + # + # After you call reset_index, A, B, C are converted back to a column, but the column label + # is set to "index". + # Therefore, you need to do the following: + # * Convert a Series to a DataFrame (to_frame) + # * Rename the count column to Count (rename) + # * Convert the original column from index to a column (reset_index) + # * Restore the original column label (rename) + cols = column_labels_string_to_list(dataframe, column_names) + if len(cols) == 1: + col_label = cols[0] + df2 = dataframe[col_label].value_counts().to_frame().rename(columns={col_label:"Count"}).reset_index().rename(columns={"index":col_label}) + else: + df2 = dataframe[cols].value_counts().to_frame().rename(columns={0:"Count"}).reset_index() + return (df2,) diff --git a/pyproject.toml b/pyproject.toml index 5bbb3dd..02e7b42 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "data-analysis" description = "Data analysis custom modules for ComfyUI - Use Pandas & Matplotlib within ComfyUI" -version = "1.3.3" +version = "1.3.4" license = {file = "LICENSE"} [project.urls] diff --git a/tests/pandas_wrapper/pandas_crosstab_test.py b/tests/pandas_wrapper/pandas_crosstab_test.py new file mode 100644 index 0000000..da5c77a --- /dev/null +++ b/tests/pandas_wrapper/pandas_crosstab_test.py @@ -0,0 +1,59 @@ +import os +import sys +import unittest +import pandas as pd + +PROJECT_ROOT = os.path.realpath(os.path.join(os.path.dirname(__file__), "..", "..")) +MODULE_ROOT = os.path.join(PROJECT_ROOT, "modules") +sys.path.append(MODULE_ROOT) + +from pandas_wrapper.pandas_crosstab import PandasCrosstab + +class TestPandasCrosstab(unittest.TestCase): + def setUp(self): + """Set up test data""" + self.node = PandasCrosstab() + + self.df = pd.DataFrame({ + "A": ["X", "X", "Y", "Y", "Z", "Z"], + "B": ["M", "N", "M", "N", "M", "N"], + "C": [1, 2, 3, 4, 5, 6], + "D": [10, 20, 30, 40, 50, 60] + }) + + def test_crosstab_single_index_single_column(self): + """Test crosstab with a single index and a single column""" + result = self.node.f(self.df, index="A", column_names="B")[0] + expected = pd.crosstab(index=self.df["A"], columns=self.df["B"]) + pd.testing.assert_frame_equal(result, expected) + + def test_crosstab_multi_index_single_column(self): + """Test crosstab with multiple indices and a single column""" + result = self.node.f(self.df, index="A,B", column_names="C")[0] + expected = pd.crosstab(index=[self.df["A"], self.df["B"]], columns=self.df["C"]) + pd.testing.assert_frame_equal(result, expected) + + def test_crosstab_single_index_multi_column(self): + """Test crosstab with a single index and multiple columns""" + result = self.node.f(self.df, index="A", column_names="B,C")[0] + expected = pd.crosstab(index=self.df["A"], columns=[self.df["B"], self.df["C"]]) + pd.testing.assert_frame_equal(result, expected) + + def test_crosstab_multi_index_multi_column(self): + """Test crosstab with multiple indices and multiple columns""" + result = self.node.f(self.df, index="A,B", column_names="C,D")[0] + expected = pd.crosstab(index=[self.df["A"], self.df["B"]], columns=[self.df["C"], self.df["D"]]) + pd.testing.assert_frame_equal(result, expected) + + def test_crosstab_index_not_in_dataframe(self): + """Test crosstab when the given index is not in the DataFrame""" + with self.assertRaises(ValueError): + self.node.f(self.df, index="Z", column_names="B")[0] + + def test_crosstab_columns_not_in_dataframe(self): + """Test crosstab when the given column is not in the DataFrame""" + with self.assertRaises(ValueError): + self.node.f(self.df, index="A", column_names="Z")[0] + +if __name__ == "__main__": + unittest.main() diff --git a/tests/pandas_wrapper/pandas_value_counts_test.py b/tests/pandas_wrapper/pandas_value_counts_test.py new file mode 100644 index 0000000..50d5dec --- /dev/null +++ b/tests/pandas_wrapper/pandas_value_counts_test.py @@ -0,0 +1,56 @@ +import os +import sys +import unittest +import pandas as pd + +PROJECT_ROOT = os.path.realpath(os.path.join(os.path.dirname(__file__), "..", "..")) +MODULE_ROOT = os.path.join(PROJECT_ROOT, "modules") +sys.path.append(MODULE_ROOT) + +from pandas_wrapper.pandas_value_counts import PandasValueCounts + +class TestPandasValueCounts(unittest.TestCase): + def setUp(self): + """Set up test data""" + self.node = PandasValueCounts() + + self.df = pd.DataFrame({ + "Category": ["A", "B", "A", "C", "B", "A", "C"], + "Numbers": [1, 2, 1, 3, 2, 1, 3], + "Letter": ["X", "Y", "X", "Z", "Y", "X", "Z"], + 100: ["M", "N", "M", "O", "N", "M", "O"], # Integer-labeled column + 200: [10, 20, 10, 30, 20, 10, 30] # Another integer-labeled column + }) + + def test_single_string_column_label(self): + """Test value_counts on a single string column label""" + result = self.node.f(self.df, "Category") + expected = self.df["Category"].value_counts().to_frame().rename(columns={"Category": "Count"}).reset_index().rename(columns={"index": "Category"}) + pd.testing.assert_frame_equal(result[0], expected) + + def test_single_integer_column_label(self): + """Test value_counts on a single integer column label""" + result = self.node.f(self.df, "100") + expected = self.df[100].value_counts().to_frame().rename(columns={100: "Count"}).reset_index().rename(columns={"index": 100}) + pd.testing.assert_frame_equal(result[0], expected) + + def test_multiple_string_column_labels(self): + """Test value_counts on multiple string column labels""" + result = self.node.f(self.df, "Category,Letter") + expected = self.df[["Category", "Letter"]].value_counts().to_frame().rename(columns={0:"Count"}).reset_index() + pd.testing.assert_frame_equal(result[0], expected) + + def test_multiple_integer_column_labels(self): + """Test value_counts on multiple integer column labels""" + result = self.node.f(self.df, "100,200") + expected = self.df[[100, 200]].value_counts().to_frame().rename(columns={0:"Count"}).reset_index() + pd.testing.assert_frame_equal(result[0], expected) + + def test_mixed_string_integer_column_labels(self): + """Test value_counts on a mix of string and integer column labels""" + result = self.node.f(self.df, "Category,100") + expected = self.df[["Category", 100]].value_counts().to_frame().rename(columns={0:"Count"}).reset_index() + pd.testing.assert_frame_equal(result[0], expected) + +if __name__ == "__main__": + unittest.main()