From ec95289880c6d142975cd94cf0404ab8046801eb Mon Sep 17 00:00:00 2001 From: HowToSD Date: Mon, 17 Feb 2025 22:45:10 -0800 Subject: [PATCH] Major refactoring to pass DataFrame object without serializing. Almost all nodes were modified for this. Binary operator nodes were added as well. --- README.md | 3 + __init__.py | 45 +++++++++++++ docs/baseball_example1.md | 9 ++- docs/ug.md | 51 ++++++++++++-- examples/workflows/baseball_example1.json | 2 +- examples/workflows/binary_operations.json | 1 + examples/workflows/create.json | 2 +- examples/workflows/group_by.json | 2 +- examples/workflows/join.json | 2 +- examples/workflows/load_csv.json | 2 +- examples/workflows/loc_cell_str.json | 2 +- examples/workflows/loc_row_series.json | 2 +- examples/workflows/select_subset.json | 2 +- examples/workflows/sort.json | 2 +- examples/workflows/summary_statistics.json | 2 +- modules/cda/cda_json_create.py | 2 +- modules/matplotlib/common.py | 2 +- modules/matplotlib/mpl_bar.py | 8 +-- modules/matplotlib/mpl_line.py | 8 +-- modules/matplotlib/mpl_scatter.py | 8 +-- modules/pandas_wrapper/pandas_add.py | 44 +++++++++++++ modules/pandas_wrapper/pandas_add_series.py | 43 ++++++++++++ modules/pandas_wrapper/pandas_as_float.py | 42 ++++++++++++ modules/pandas_wrapper/pandas_as_int.py | 42 ++++++++++++ modules/pandas_wrapper/pandas_as_string.py | 41 ++++++++++++ modules/pandas_wrapper/pandas_columns.py | 21 +++--- modules/pandas_wrapper/pandas_count.py | 15 ++--- modules/pandas_wrapper/pandas_create.py | 8 +-- .../pandas_create_with_index.py | 8 +-- modules/pandas_wrapper/pandas_div.py | 43 ++++++++++++ modules/pandas_wrapper/pandas_div_series.py | 43 ++++++++++++ modules/pandas_wrapper/pandas_dropna.py | 16 ++--- modules/pandas_wrapper/pandas_group_by.py | 25 ++++--- modules/pandas_wrapper/pandas_head.py | 14 ++-- .../pandas_wrapper/pandas_iloc_row_series.py | 14 ++-- .../pandas_iloc_rows_dataframe.py | 14 ++-- modules/pandas_wrapper/pandas_index.py | 18 ++--- .../pandas_wrapper/pandas_index_to_string.py | 39 +++++++++++ modules/pandas_wrapper/pandas_isna.py | 17 ++--- modules/pandas_wrapper/pandas_join.py | 20 +++--- modules/pandas_wrapper/pandas_load_csv.py | 8 +-- .../pandas_load_csv_with_encoding.py | 8 +-- .../pandas_load_csv_with_index.py | 8 +-- modules/pandas_wrapper/pandas_load_json.py | 8 +-- modules/pandas_wrapper/pandas_loc_cell_str.py | 10 ++- .../pandas_wrapper/pandas_loc_row_series.py | 20 +++--- modules/pandas_wrapper/pandas_max.py | 14 ++-- modules/pandas_wrapper/pandas_mean.py | 14 ++-- modules/pandas_wrapper/pandas_median.py | 14 ++-- modules/pandas_wrapper/pandas_min.py | 14 ++-- modules/pandas_wrapper/pandas_mode.py | 14 ++-- modules/pandas_wrapper/pandas_mul.py | 43 ++++++++++++ modules/pandas_wrapper/pandas_mul_series.py | 43 ++++++++++++ modules/pandas_wrapper/pandas_pow.py | 46 +++++++++++++ modules/pandas_wrapper/pandas_pow_series.py | 43 ++++++++++++ modules/pandas_wrapper/pandas_save_csv.py | 7 +- modules/pandas_wrapper/pandas_save_json.py | 7 +- .../pandas_wrapper/pandas_select_columns.py | 19 ++---- modules/pandas_wrapper/pandas_select_rows.py | 16 ++--- .../pandas_wrapper/pandas_series_to_string.py | 8 +-- .../pandas_wrapper/pandas_show_dataframe.py | 15 +++-- modules/pandas_wrapper/pandas_show_index.py | 52 +++++++++++++++ modules/pandas_wrapper/pandas_show_series.py | 7 +- modules/pandas_wrapper/pandas_sort.py | 17 ++--- modules/pandas_wrapper/pandas_std.py | 14 ++-- modules/pandas_wrapper/pandas_sub.py | 43 ++++++++++++ modules/pandas_wrapper/pandas_sub_series.py | 43 ++++++++++++ modules/pandas_wrapper/pandas_sum.py | 14 ++-- modules/pandas_wrapper/pandas_summary.py | 15 ++--- modules/pandas_wrapper/pandas_to_string.py | 10 ++- modules/pandas_wrapper/pandas_var.py | 14 ++-- pyproject.toml | 2 +- web/js/ShowDataFrame.js | 10 +-- web/js/ShowIndex.js | 66 +++++++++++++++++++ web/js/ShowSeries.js | 10 +-- 75 files changed, 1046 insertions(+), 334 deletions(-) create mode 100644 examples/workflows/binary_operations.json create mode 100644 modules/pandas_wrapper/pandas_add.py create mode 100644 modules/pandas_wrapper/pandas_add_series.py create mode 100644 modules/pandas_wrapper/pandas_as_float.py create mode 100644 modules/pandas_wrapper/pandas_as_int.py create mode 100644 modules/pandas_wrapper/pandas_as_string.py create mode 100644 modules/pandas_wrapper/pandas_div.py create mode 100644 modules/pandas_wrapper/pandas_div_series.py create mode 100644 modules/pandas_wrapper/pandas_index_to_string.py create mode 100644 modules/pandas_wrapper/pandas_mul.py create mode 100644 modules/pandas_wrapper/pandas_mul_series.py create mode 100644 modules/pandas_wrapper/pandas_pow.py create mode 100644 modules/pandas_wrapper/pandas_pow_series.py create mode 100644 modules/pandas_wrapper/pandas_show_index.py create mode 100644 modules/pandas_wrapper/pandas_sub.py create mode 100644 modules/pandas_wrapper/pandas_sub_series.py create mode 100644 web/js/ShowIndex.js diff --git a/README.md b/README.md index d277136..bc894b1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ # ComfyUI-Data-Analysis +## Update +v1.1.0 was released which contains backward incompatible changes for worklows created using the prior version of ComfyUI Data Analysis custom nodes. Please read the Release Note. + ![Baseball tutorial](docs/images/baseball_question.jpg) ## How Can We Figure Out Which MLB Player Had the Most Hits Per Year? diff --git a/__init__.py b/__init__.py index d19274f..8f3ce5c 100644 --- a/__init__.py +++ b/__init__.py @@ -3,16 +3,24 @@ from .modules.cda.cda_json_create import CDAJSONCreate from .modules.matplotlib.mpl_bar import MPLBar from .modules.matplotlib.mpl_line import MPLLine from .modules.matplotlib.mpl_scatter import MPLScatter +from .modules.pandas_wrapper.pandas_add import PandasAdd +from .modules.pandas_wrapper.pandas_add_series import PandasAddSeries +from .modules.pandas_wrapper.pandas_as_float import PandasAsFloat +from .modules.pandas_wrapper.pandas_as_int import PandasAsInt +from .modules.pandas_wrapper.pandas_as_string import PandasAsString from .modules.pandas_wrapper.pandas_columns import PandasColumns from .modules.pandas_wrapper.pandas_count import PandasCount from .modules.pandas_wrapper.pandas_create import PandasCreate from .modules.pandas_wrapper.pandas_create_with_index import PandasCreateWithIndex +from .modules.pandas_wrapper.pandas_div import PandasDiv +from .modules.pandas_wrapper.pandas_div_series import PandasDivSeries from .modules.pandas_wrapper.pandas_dropna import PandasDropNA from .modules.pandas_wrapper.pandas_group_by import PandasGroupBy from .modules.pandas_wrapper.pandas_head import PandasHead from .modules.pandas_wrapper.pandas_iloc_row_series import PandasIlocRowSeries from .modules.pandas_wrapper.pandas_iloc_rows_dataframe import PandasIlocRowsDataFrame from .modules.pandas_wrapper.pandas_index import PandasIndex +from .modules.pandas_wrapper.pandas_index_to_string import PandasIndexToString from .modules.pandas_wrapper.pandas_isna import PandasIsNA from .modules.pandas_wrapper.pandas_join import PandasJoin from .modules.pandas_wrapper.pandas_load_csv import PandasLoadCSV @@ -26,16 +34,23 @@ from .modules.pandas_wrapper.pandas_mean import PandasMean from .modules.pandas_wrapper.pandas_median import PandasMedian from .modules.pandas_wrapper.pandas_min import PandasMin from .modules.pandas_wrapper.pandas_mode import PandasMode +from .modules.pandas_wrapper.pandas_mul import PandasMul +from .modules.pandas_wrapper.pandas_mul_series import PandasMulSeries +from .modules.pandas_wrapper.pandas_pow import PandasPow +from .modules.pandas_wrapper.pandas_pow_series import PandasPowSeries from .modules.pandas_wrapper.pandas_save_csv import PandasSaveCSV from .modules.pandas_wrapper.pandas_save_json import PandasSaveJSON from .modules.pandas_wrapper.pandas_select_columns import PandasSelectColumns from .modules.pandas_wrapper.pandas_select_rows import PandasSelectRows from .modules.pandas_wrapper.pandas_series_to_string import PandasSeriesToString from .modules.pandas_wrapper.pandas_show_dataframe import PandasShowDataFrame +from .modules.pandas_wrapper.pandas_show_index import PandasShowIndex from .modules.pandas_wrapper.pandas_show_series import PandasShowSeries from .modules.pandas_wrapper.pandas_show_text import PandasShowText from .modules.pandas_wrapper.pandas_sort import PandasSort from .modules.pandas_wrapper.pandas_std import PandasStd +from .modules.pandas_wrapper.pandas_sub import PandasSub +from .modules.pandas_wrapper.pandas_sub_series import PandasSubSeries from .modules.pandas_wrapper.pandas_sum import PandasSum from .modules.pandas_wrapper.pandas_summary import PandasSummary from .modules.pandas_wrapper.pandas_to_string import PandasToString @@ -49,16 +64,24 @@ NODE_CLASS_MAPPINGS: Dict[str, Type[T]] = { "MPLBar": MPLBar, "MPLLine": MPLLine, "MPLScatter": MPLScatter, + "PandasAdd": PandasAdd, + "PandasAddSeries": PandasAddSeries, + "PandasAsFloat": PandasAsFloat, + "PandasAsInt": PandasAsInt, + "PandasAsString": PandasAsString, "PandasColumns": PandasColumns, "PandasCount": PandasCount, "PandasCreate": PandasCreate, "PandasCreateWithIndex": PandasCreateWithIndex, + "PandasDiv": PandasDiv, + "PandasDivSeries": PandasDivSeries, "PandasDropNA": PandasDropNA, "PandasGroupBy": PandasGroupBy, "PandasHead": PandasHead, "PandasIlocRowSeries": PandasIlocRowSeries, "PandasIlocRowsDataFrame": PandasIlocRowsDataFrame, "PandasIndex": PandasIndex, + "PandasIndexToString": PandasIndexToString, "PandasIsNA": PandasIsNA, "PandasJoin": PandasJoin, "PandasLoadCSV": PandasLoadCSV, @@ -72,16 +95,23 @@ NODE_CLASS_MAPPINGS: Dict[str, Type[T]] = { "PandasMedian": PandasMedian, "PandasMin": PandasMin, "PandasMode": PandasMode, + "PandasMul": PandasMul, + "PandasMulSeries": PandasMulSeries, + "PandasPow": PandasPow, + "PandasPowSeries": PandasPowSeries, "PandasSaveCSV": PandasSaveCSV, "PandasSaveJSON": PandasSaveJSON, "PandasSelectColumns": PandasSelectColumns, "PandasSelectRows": PandasSelectRows, "PandasSeriesToString": PandasSeriesToString, "PandasShowDataFrame": PandasShowDataFrame, + "PandasShowIndex": PandasShowIndex, "PandasShowSeries": PandasShowSeries, "PandasShowText": PandasShowText, "PandasSort": PandasSort, "PandasStd": PandasStd, + "PandasSub": PandasSub, + "PandasSubSeries": PandasSubSeries, "PandasSum": PandasSum, "PandasSummary": PandasSummary, "PandasToString": PandasToString, @@ -97,16 +127,24 @@ NODE_DISPLAY_NAME_MAPPINGS: Dict[str, str] = { "MPLBar": "MPL Bar Chart", "MPLLine": "MPL Line Plot", "MPLScatter": "MPL Scatter Plot", + "PandasAdd": "Pandas Add", + "PandasAddSeries": "Pandas Add Series", + "PandasAsFloat": "Pandas As Float", + "PandasAsInt": "Pandas As Int", + "PandasAsString": "Pandas As String", "PandasColumns": "Pandas Columns", "PandasCount": "Pandas Count", "PandasCreate": "Pandas Create", "PandasCreateWithIndex": "Pandas Create With Index", + "PandasDiv": "Pandas Div", + "PandasDivSeries": "Pandas Div Series", "PandasDropNA": "Pandas Drop NA", "PandasGroupBy": "Pandas Group By", "PandasHead": "Pandas Head", "PandasIlocRowSeries": "Pandas Iloc Row Series", "PandasIlocRowsDataFrame": "Pandas Iloc Rows DataFrame", "PandasIndex": "Pandas Index", + "PandasIndexToString": "Pandas Index To String", "PandasIsNA": "Pandas Is NA", "PandasJoin": "Pandas Join", "PandasLoadCSV": "Pandas Load CSV", @@ -120,16 +158,23 @@ NODE_DISPLAY_NAME_MAPPINGS: Dict[str, str] = { "PandasMedian": "Pandas Median", "PandasMin": "Pandas Min", "PandasMode": "Pandas Mode", + "PandasMul": "Pandas Mul", + "PandasMulSeries": "Pandas Mul Series", + "PandasPow": "Pandas Pow", + "PandasPowSeries": "Pandas Pow Series", "PandasSaveCSV": "Pandas Save CSV", "PandasSaveJSON": "Pandas Save JSON", "PandasSelectColumns": "Pandas Select Columns", "PandasSelectRows": "Pandas Select Rows", "PandasSeriesToString": "Pandas Series To String", "PandasShowDataFrame": "Pandas Show DataFrame", + "PandasShowIndex": "Pandas Show Index", "PandasShowSeries": "Pandas Show Series", "PandasShowText": "Pandas Show Text", "PandasSort": "Pandas Sort", "PandasStd": "Pandas Std", + "PandasSub": "Pandas Sub", + "PandasSubSeries": "Pandas Sub Series", "PandasSum": "Pandas Sum", "PandasSummary": "Pandas Summary", "PandasToString": "Pandas To String", diff --git a/docs/baseball_example1.md b/docs/baseball_example1.md index a10287d..4fa5254 100644 --- a/docs/baseball_example1.md +++ b/docs/baseball_example1.md @@ -5,6 +5,9 @@ The objective is to determine which Major League Baseball player has the most hi Fortunately, the [Lahman Baseball Database](http://seanlahman.com/) contains the necessary data, and CDA simplifies the extraction process. Let's dive in. +**Note** +This tutorial was created using an older version of ComfyUI Data Analysis, so screenshots contain the names of deprecated nodes. Use the node name in text if there is any mismatch between text and screenshots. + # Obtaining data Our first step is to obtain data. 1. Access http://seanlahman.com/. @@ -62,7 +65,7 @@ If you see the screenshots, you can see that People data has more than 21000 row First we want to extract the names from People data. The reason for this is that Batting table contains the ID of the player and not the full name. So we need names defined in the People table. But how do we do this? If we take a look at the screenshot, you do not see full name columns. It looks like the column names are hidden. So we need to first figure out what columns are avaialbe in the People table. To do so, add a new node **Pandas Columns** and connect it to Load CSV for People. - Then add another node **Pandas Show Text** and connect it to the Pandas Columns node. Press Queue, you should see below. + Then add another node **Pandas Show Index** and connect it to the Pandas Columns node. Press Queue, you should see below. ![Pandas Columns](images/people_columns.png) @@ -131,12 +134,12 @@ In this final section, we will be fixing the name issue where the names are IDs ![Pandas Join](images/baseball_join1.png) Drag it next to the **Select Colums** node of the Batting table. - Connect the output of the Head node to the "left_dataframe_json" input of the join node. + Connect the output of the Head node to the "left_dataframe" input of the join node. 2. Connect to the People table Now drag the join node so that it sits next to the **Select Colums** node of the People table. - Connect the output of the Select Columns node to the "right_dataframe_json" input of the join node. Note that you may need to hover your mouse around the top-left corner of the blank area that contains "right_dataframe_json" to find the connection point. + Connect the output of the Select Columns node to the "right_dataframe" input of the join node. Note that you may need to hover your mouse around the top-left corner of the blank area that contains "right_dataframe" to find the connection point. ![Pandas Join](images/baseball_join2.png) diff --git a/docs/ug.md b/docs/ug.md index f2647cc..3d04f17 100644 --- a/docs/ug.md +++ b/docs/ug.md @@ -1,16 +1,14 @@ # User's Guide ## Basic Concepts -### How DataFrames is passed between nodes -DataFrames are transmitted as JSON strings. When a DataFrame enters a node, it is reconstructed by deserializing the JSON string. Upon exiting, it is serialized back into a JSON string. - -Pandas's Index object is also processed the same way. For example, Pandas Columns and Pandas Index node return labels in a serialized Index format. - -### How to connect nodes for DataFrame JSON strings -To connect the DataFrame JSON string output from one Pandas node to another, move the wire toward the top-left of the text field. You may need to hover around the corner to find the correct connection point. +### How to connect nodes for DataFrame +To connect the DataFrame output from one Pandas node to another, move the wire toward the top-left of the text field. You may need to hover around the corner to find the correct connection point. ### How to add a node You can right-click, select **Add Node**, go to **Data Analysis**, and look for the following nodes: +**Note** +This page was initially created using an older version of ComfyUI Data Analysis, so some of screenshots contain the names of deprecated nodes. Use the node name in text if there is any mismatch between text and screenshots. + ### List of nodes **Data loading, creation, saving** | Node Name | Functionality | @@ -50,6 +48,7 @@ You can right-click, select **Add Node**, go to **Data Analysis**, and look for |-------------------------|-------------------------------------| | **Pandas Show DataFrame** | Display DataFrame contents | | **Pandas Show Series** | Display Series contents | +| **Pandas Show Index** | Display Index contents | | **Pandas Show Text** | Display Text | | **Pandas Summary** | Extract DataFrame statistics | @@ -72,9 +71,28 @@ You can right-click, select **Add Node**, go to **Data Analysis**, and look for | **Pandas Sum** | Sum of row values | | **Pandas Var** | Variance of row values | +**Binary operators for two DataFrames** +| Node Name | Functionality | +|-------------------------|-------------------------------------| +| **Pandas Add** | Add two DataFrames | +| **Pandas Div** | Divide a DataFrame by another DataFrame | +| **Pandas Mul** | Multiply two DataFrames | +| **Pandas Pow** | Raise a DataFrame to the power of another DataFrame | +| **Pandas Sub** | Subtract a DataFrame from another DataFrame | + +**Binary operators for a DataFrame and a Series** +| Node Name | Functionality | +|-------------------------|-------------------------------------| +| **Pandas Add Series** | Add a DataFrame and a Series | +| **Pandas Div Series** | Divide a DataFrame by a Series | +| **Pandas Mul Series** | Multiply a DataFrame by a Series | +| **Pandas Pow Series** | Raise a DataFrame to the power of a Series | +| **Pandas Sub Series** | Subtract a Series from another DataFrame | + **Converting to displayable string** | Node Name | Functionality | |-------------------------|-------------------------------------| +| **Pandas Index To String** | Convert Index to a displayable string | | **Pandas Series To String** | Convert Series to a displayable string | | **Pandas To String** | Convert DataFrame to a displayable string | @@ -245,6 +263,25 @@ coconut ``` In this case, both apple and coconut are the mode. +## Binary operators for DataFrames and Series +For binary operation for two DataFrames, you can use below operators: +| Node Name | Functionality | +|-------------------------|-------------------------------------| +| **Pandas Add** | Add two DataFrames | +| **Pandas Div** | Divide a DataFrame by another DataFrame | +| **Pandas Mul** | Multiply two DataFrames | +| **Pandas Pow** | Raise a DataFrame to the power of another DataFrame | +| **Pandas Sub** | Subtract a DataFrame from another DataFrame | + +For binary operation for a DataFrame and a Series, you can use below operators: +| Node Name | Functionality | +|-------------------------|-------------------------------------| +| **Pandas Add Series** | Add a DataFrame and a Series | +| **Pandas Div Series** | Divide a DataFrame by a Series | +| **Pandas Mul Series** | Multiply a DataFrame by a Series | +| **Pandas Pow Series** | Raise a DataFrame to the power of a Series | +| **Pandas Sub Series** | Subtract a Series from another DataFrame | + ## Convert DataFrame to a string Use **Pandas To String**. This node is to convert the DataFrame to a displayable string, and this truncates the data when the data is large. This can be used to display the data content in a text display node (e.g. Show Text node). However, you can use Show DataFrame nodes to display the DataFrame content, so you do not normally need to use this. diff --git a/examples/workflows/baseball_example1.json b/examples/workflows/baseball_example1.json index a6aa0e6..e195c6b 100644 --- a/examples/workflows/baseball_example1.json +++ b/examples/workflows/baseball_example1.json @@ -1 +1 @@ -{"last_node_id":23,"last_link_id":26,"nodes":[{"id":13,"type":"PandasSort","pos":[-697.0367431640625,2077.00244140625],"size":[210,102.36038208007812],"flags":{},"order":8,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":15,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[16],"slot_index":0,"localized_name":"STRING"}],"title":"Sorted by Hits","properties":{"Node name for S&R":"PandasSort"},"widgets_values":["","H",false]},{"id":14,"type":"PandasHead","pos":[-458.82769775390625,2076.2470703125],"size":[210,103.08767700195312],"flags":{},"order":9,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":16,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[22],"slot_index":0,"localized_name":"STRING"}],"title":"Top 10","properties":{"Node name for S&R":"PandasHead"},"widgets_values":["",10]},{"id":11,"type":"PandasSelectColumns","pos":[-977.7611694335938,2076.32666015625],"size":[254.65753173828125,105.0052261352539],"flags":{},"order":6,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":13,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[15],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasSelectColumns"},"widgets_values":["","playerID, H, yearID"]},{"id":3,"type":"PandasLoadCSVWithEncoding","pos":[-1275.5347900390625,2075.072509765625],"size":[276.5979919433594,104.5961685180664],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[13],"slot_index":0,"localized_name":"STRING"}],"title":"Batting","properties":{"Node name for S&R":"PandasLoadCSVWithEncoding"},"widgets_values":["/container/transfer/baseball/Batting.csv","latin_1"]},{"id":17,"type":"PandasJoin","pos":[-726.7216796875,2349.052978515625],"size":[228.39999389648438,119.60139465332031],"flags":{},"order":10,"mode":0,"inputs":[{"name":"left_dataframe_json","type":"STRING","link":22,"widget":{"name":"left_dataframe_json"}},{"name":"right_dataframe_json","type":"STRING","link":23,"widget":{"name":"right_dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[25],"slot_index":0,"localized_name":"STRING"}],"title":"Join","properties":{"Node name for S&R":"PandasJoin"},"widgets_values":["","","playerID","inner"]},{"id":1,"type":"PandasLoadCSVWithEncoding","pos":[-1269.844482421875,2632.13623046875],"size":[264.9081115722656,99.47996520996094],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[8],"slot_index":0,"localized_name":"STRING"}],"title":"People","properties":{"Node name for S&R":"PandasLoadCSVWithEncoding"},"widgets_values":["/container/transfer/baseball/People.csv","latin_1"]},{"id":9,"type":"PandasSelectColumns","pos":[-977.8447265625,2631.48974609375],"size":[323.7959289550781,102.03617858886719],"flags":{},"order":7,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":8,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[23],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasSelectColumns"},"widgets_values":["","playerID, nameFirst, nameLast"]},{"id":19,"type":"PandasSelectColumns","pos":[-462.1707763671875,2350.3076171875],"size":[329.41015625,103.14431762695312],"flags":{},"order":11,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":25,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[26],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasSelectColumns"},"widgets_values":["","nameFirst, nameLast, H, yearID"]},{"id":18,"type":"PandasShowDataFrame","pos":[-94.80552673339844,2347.154541015625],"size":[237.59750366210938,194.11358642578125],"flags":{},"order":12,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":26,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"title":"Final result","properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," nameFirst nameLast H yearID\n0 Ichiro Suzuki 262 2004\n1 George Sisler 257 1920\n2 Bill Terry 254 1930\n3 Lefty O'Doul 254 1929\n4 Al Simmons 253 1925\n5 Chuck Klein 250 1930\n6 Rogers Hornsby 250 1922\n7 Ty Cobb 248 1911\n8 George Sisler 246 1922\n9 Ichiro Suzuki 242 2001"]},{"id":23,"type":"MarkdownNote","pos":[-1281.7476806640625,1589.507568359375],"size":[685.038330078125,158.95028686523438],"flags":{},"order":5,"mode":0,"inputs":[],"outputs":[],"title":"License & copyright for Baseball Data","properties":{},"widgets_values":["Data from Lahman Baseball Database (http://seanlahman.com/) is used in this workflow.\n\nReprint of the copyright notice and license for data:\n```\nThis database is copyright 1996-2024 by Sean Lahman.\n\nThis work is licensed under a Creative Commons Attribution-ShareAlike 3.0\nUnported License. For details see: http://creativecommons.org/licenses/by-sa/3.0/\n```"],"color":"#432","bgcolor":"#653"},{"id":21,"type":"MarkdownNote","pos":[-1269.544677734375,2228.800048828125],"size":[225.02003479003906,58],"flags":{},"order":3,"mode":0,"inputs":[],"outputs":[],"title":"Action required","properties":{},"widgets_values":["Update this file path"],"color":"#322","bgcolor":"#533"},{"id":22,"type":"MarkdownNote","pos":[-1261.88623046875,2784.217041015625],"size":[225.02003479003906,58],"flags":{},"order":4,"mode":0,"inputs":[],"outputs":[],"title":"Action required","properties":{},"widgets_values":["Update this file path"],"color":"#322","bgcolor":"#533"},{"id":20,"type":"MarkdownNote","pos":[-1284.1763916015625,1800.983154296875],"size":[697.4251098632812,201.68402099609375],"flags":{},"order":2,"mode":0,"inputs":[],"outputs":[],"title":"Preparation Steps","properties":{},"widgets_values":["To run this workflow, follow below steps:\n1. Access http://seanlahman.com/.\n2. Select Comma-delimited version of the baseball data link.\n3. Download the data file. File name should be lahman_1871-2023_csv.7z.\n4. Using 7zip, extract the content.\n5. We need two files:\n * Batting.csv\n * People.csv\n6. Update the file paths in Pandas Load CSV nodes to point to those files. Specify the absolute file path unless you put those files under the ComfyUI installation directory."],"color":"#322","bgcolor":"#533"}],"links":[[8,1,0,9,0,"STRING"],[13,3,0,11,0,"STRING"],[15,11,0,13,0,"STRING"],[16,13,0,14,0,"STRING"],[22,14,0,17,0,"STRING"],[23,9,0,17,1,"STRING"],[25,17,0,19,0,"STRING"],[26,19,0,18,0,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":1.1167815779424817,"offset":[1805.745824499292,-1634.6434008236533]},"node_versions":{"data-analysis":"5de97393deb84e0696a0974209b53f07cda80ac7"},"ue_links":[]},"version":0.4} \ No newline at end of file +{"last_node_id":23,"last_link_id":34,"nodes":[{"id":23,"type":"MarkdownNote","pos":[-1281.7476806640625,1589.507568359375],"size":[685.038330078125,158.95028686523438],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[],"title":"License & copyright for Baseball Data","properties":{},"widgets_values":["Data from Lahman Baseball Database (http://seanlahman.com/) is used in this workflow.\n\nReprint of the copyright notice and license for data:\n```\nThis database is copyright 1996-2024 by Sean Lahman.\n\nThis work is licensed under a Creative Commons Attribution-ShareAlike 3.0\nUnported License. For details see: http://creativecommons.org/licenses/by-sa/3.0/\n```"],"color":"#432","bgcolor":"#653"},{"id":21,"type":"MarkdownNote","pos":[-1269.544677734375,2228.800048828125],"size":[225.02003479003906,58],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[],"title":"Action required","properties":{},"widgets_values":["Update this file path"],"color":"#322","bgcolor":"#533"},{"id":22,"type":"MarkdownNote","pos":[-1261.88623046875,2784.217041015625],"size":[225.02003479003906,58],"flags":{},"order":2,"mode":0,"inputs":[],"outputs":[],"title":"Action required","properties":{},"widgets_values":["Update this file path"],"color":"#322","bgcolor":"#533"},{"id":20,"type":"MarkdownNote","pos":[-1284.1763916015625,1800.983154296875],"size":[697.4251098632812,201.68402099609375],"flags":{},"order":3,"mode":0,"inputs":[],"outputs":[],"title":"Preparation Steps","properties":{},"widgets_values":["To run this workflow, follow below steps:\n1. Access http://seanlahman.com/.\n2. Select Comma-delimited version of the baseball data link.\n3. Download the data file. File name should be lahman_1871-2023_csv.7z.\n4. Using 7zip, extract the content.\n5. We need two files:\n * Batting.csv\n * People.csv\n6. Update the file paths in Pandas Load CSV nodes to point to those files. Specify the absolute file path unless you put those files under the ComfyUI installation directory."],"color":"#322","bgcolor":"#533"},{"id":3,"type":"PandasLoadCSVWithEncoding","pos":[-1275.5347900390625,2075.072509765625],"size":[276.5979919433594,104.5961685180664],"flags":{},"order":4,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[27],"slot_index":0}],"title":"Batting","properties":{"Node name for S&R":"PandasLoadCSVWithEncoding"},"widgets_values":["/container/transfer/baseball/Batting.csv","latin_1"]},{"id":1,"type":"PandasLoadCSVWithEncoding","pos":[-1269.844482421875,2632.13623046875],"size":[264.9081115722656,99.47996520996094],"flags":{},"order":5,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[32],"slot_index":0}],"title":"People","properties":{"Node name for S&R":"PandasLoadCSVWithEncoding"},"widgets_values":["/container/transfer/baseball/People.csv","latin_1"]},{"id":11,"type":"PandasSelectColumns","pos":[-977.7611694335938,2076.32666015625],"size":[254.65753173828125,105.0052261352539],"flags":{},"order":6,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":27}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[28],"slot_index":0}],"properties":{"Node name for S&R":"PandasSelectColumns"},"widgets_values":["playerID, H, yearID"]},{"id":19,"type":"PandasSelectColumns","pos":[-462.1707763671875,2350.3076171875],"size":[329.41015625,103.14431762695312],"flags":{},"order":11,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":30}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[31],"slot_index":0}],"properties":{"Node name for S&R":"PandasSelectColumns"},"widgets_values":["nameFirst, nameLast, H, yearID"]},{"id":17,"type":"PandasJoin","pos":[-800.79296875,2350.04052734375],"size":[228.39999389648438,122],"flags":{},"order":10,"mode":0,"inputs":[{"name":"right_dataframe","type":"DATAFRAME","link":34},{"name":"left_dataframe","type":"DATAFRAME","link":33}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[30],"slot_index":0}],"title":"Join","properties":{"Node name for S&R":"PandasJoin"},"widgets_values":["playerID","inner"]},{"id":9,"type":"PandasSelectColumns","pos":[-974.8819580078125,2618.64892578125],"size":[323.7959289550781,102.03617858886719],"flags":{},"order":7,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":32}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[34],"slot_index":0}],"properties":{"Node name for S&R":"PandasSelectColumns"},"widgets_values":["nameFirst, nameLast, playerID"]},{"id":13,"type":"PandasSort","pos":[-697.0367431640625,2077.00244140625],"size":[210,102.36038208007812],"flags":{},"order":8,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":28}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[29],"slot_index":0}],"title":"Sorted by Hits","properties":{"Node name for S&R":"PandasSort"},"widgets_values":["H",false]},{"id":14,"type":"PandasHead","pos":[-458.82769775390625,2076.2470703125],"size":[210,103.08767700195312],"flags":{},"order":9,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":29}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[33],"slot_index":0}],"title":"Top 10","properties":{"Node name for S&R":"PandasHead"},"widgets_values":[10]},{"id":18,"type":"PandasShowDataFrame","pos":[-94.80552673339844,2347.154541015625],"size":[254.3278350830078,212.038818359375],"flags":{},"order":12,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":31}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"title":"Final result","properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" nameFirst nameLast H yearID\n0 Ichiro Suzuki 262 2004\n1 George Sisler 257 1920\n2 Bill Terry 254 1930\n3 Lefty O'Doul 254 1929\n4 Al Simmons 253 1925\n5 Chuck Klein 250 1930\n6 Rogers Hornsby 250 1922\n7 Ty Cobb 248 1911\n8 George Sisler 246 1922\n9 Ichiro Suzuki 242 2001"]}],"links":[[27,3,0,11,0,"DATAFRAME"],[28,11,0,13,0,"DATAFRAME"],[29,13,0,14,0,"DATAFRAME"],[30,17,0,19,0,"DATAFRAME"],[31,19,0,18,0,"DATAFRAME"],[32,1,0,9,0,"DATAFRAME"],[33,14,0,17,1,"DATAFRAME"],[34,9,0,17,0,"DATAFRAME"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6973408901972848,"offset":[1745.0254261879224,-1747.4270223891715]},"node_versions":{"data-analysis":"d1135d404ccf4f6d523db77b95dff3934f62a384"},"ue_links":[]},"version":0.4} \ No newline at end of file diff --git a/examples/workflows/binary_operations.json b/examples/workflows/binary_operations.json new file mode 100644 index 0000000..1eac16d --- /dev/null +++ b/examples/workflows/binary_operations.json @@ -0,0 +1 @@ +{"last_node_id":45,"last_link_id":83,"nodes":[{"id":27,"type":"PandasShowDataFrame","pos":[921.1896362304688,1700.806884765625],"size":[210,100.29080200195312],"flags":{},"order":30,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":78,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 9.0 15.0\n1 29.0 35.0"]},{"id":20,"type":"PandasShowDataFrame","pos":[924.3705444335938,1541.0987548828125],"size":[210,100.29080200195312],"flags":{},"order":29,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":77,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 11.0 25.0\n1 31.0 45.0"]},{"id":40,"type":"PandasShowDataFrame","pos":[-259.9299621582031,118.2482681274414],"size":[212.97314453125,107.40496063232422],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":51,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 10 20\n1 30 40"]},{"id":3,"type":"PandasAdd","pos":[50.772769927978516,83.60255432128906],"size":[220,66],"flags":{},"order":6,"mode":0,"inputs":[{"name":"a_dataframe","type":"DATAFRAME","link":48,"localized_name":"a_dataframe"},{"name":"b_dataframe","type":"DATAFRAME","link":47,"localized_name":"b_dataframe"}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[49],"slot_index":0,"localized_name":"DATAFRAME"}],"properties":{"Node name for S&R":"PandasAdd"},"widgets_values":[]},{"id":9,"type":"PandasSub","pos":[58.47537612915039,336.638671875],"size":[220,66],"flags":{},"order":8,"mode":0,"inputs":[{"name":"a_dataframe","type":"DATAFRAME","link":52,"localized_name":"a_dataframe"},{"name":"b_dataframe","type":"DATAFRAME","link":59,"localized_name":"b_dataframe"}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[56],"slot_index":0,"localized_name":"DATAFRAME"}],"properties":{"Node name for S&R":"PandasSub"},"widgets_values":[]},{"id":4,"type":"PandasShowDataFrame","pos":[315.92779541015625,83.33573913574219],"size":[210,98.66664123535156],"flags":{},"order":14,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":49,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 9 22\n1 33 48"]},{"id":14,"type":"PandasShowDataFrame","pos":[321.5601806640625,332.56951904296875],"size":[210,96.35908508300781],"flags":{},"order":15,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":56,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 11 18\n1 27 32"]},{"id":10,"type":"PandasMul","pos":[67.3205795288086,523.6181640625],"size":[220,68.91669464111328],"flags":{},"order":9,"mode":0,"inputs":[{"name":"a_dataframe","type":"DATAFRAME","link":53,"localized_name":"a_dataframe"},{"name":"b_dataframe","type":"DATAFRAME","link":60,"localized_name":"b_dataframe"}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[57],"slot_index":0,"localized_name":"DATAFRAME"}],"properties":{"Node name for S&R":"PandasMul"},"widgets_values":[]},{"id":15,"type":"PandasShowDataFrame","pos":[329.5042724609375,521.1827392578125],"size":[210,87.46739196777344],"flags":{},"order":16,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":57,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 -10 40\n1 90 320"]},{"id":13,"type":"PandasDiv","pos":[69.27230834960938,698.6485595703125],"size":[219.08328247070312,57.81219482421875],"flags":{},"order":10,"mode":0,"inputs":[{"name":"a_dataframe","type":"DATAFRAME","link":54,"localized_name":"a_dataframe"},{"name":"b_dataframe","type":"DATAFRAME","link":61,"localized_name":"b_dataframe"}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[58],"slot_index":0,"localized_name":"DATAFRAME"}],"properties":{"Node name for S&R":"PandasDiv"},"widgets_values":[]},{"id":16,"type":"PandasShowDataFrame","pos":[335.6275329589844,696.4310302734375],"size":[210,97.55075073242188],"flags":{},"order":17,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":58,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 -10.0 10.0\n1 10.0 5.0"]},{"id":1,"type":"PandasCreate","pos":[-333.56805419921875,-37.38979721069336],"size":[210,90.7760238647461],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[48,51,52,53,54,62],"slot_index":0,"localized_name":"DATAFRAME"}],"title":"A DataFrame","properties":{"Node name for S&R":"PandasCreate"},"widgets_values":["A,B\n10,20\n30,40"]},{"id":2,"type":"PandasCreate","pos":[-341.86248779296875,297.8547668457031],"size":[210,101.55632781982422],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[47,50,59,60,61,63],"slot_index":0,"localized_name":"DATAFRAME"}],"title":"B DataFrame","properties":{"Node name for S&R":"PandasCreate"},"widgets_values":["A,B\n-1,2\n3,8"]},{"id":39,"type":"PandasShowDataFrame","pos":[-254.62774658203125,466.6484375],"size":[210,105.7447509765625],"flags":{},"order":7,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":50,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 -1 2\n1 3 8"]},{"id":12,"type":"PandasPow","pos":[62.506622314453125,1142.3583984375],"size":[220,90.19249725341797],"flags":{},"order":18,"mode":0,"inputs":[{"name":"a_dataframe","type":"DATAFRAME","link":42,"localized_name":"a_dataframe"},{"name":"b_dataframe","type":"DATAFRAME","link":43,"localized_name":"b_dataframe"}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[44],"slot_index":0,"localized_name":"DATAFRAME"}],"properties":{"Node name for S&R":"PandasPow"},"widgets_values":[]},{"id":37,"type":"PandasToString","pos":[324.9322204589844,1149.6937255859375],"size":[267,26],"flags":{},"order":21,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":44,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":[45],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasToString"},"widgets_values":[]},{"id":34,"type":"PandasAsFloat","pos":[-610.2648315429688,1145.2430419921875],"size":[213.6599578857422,65.79094696044922],"flags":{},"order":11,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":63,"localized_name":"dataframe"}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[43,65,66],"slot_index":0,"localized_name":"DATAFRAME"}],"properties":{"Node name for S&R":"PandasAsFloat"},"widgets_values":[]},{"id":19,"type":"PandasAddSeries","pos":[644.3687744140625,1542.49462890625],"size":[219.4276123046875,68.23100280761719],"flags":{},"order":22,"mode":0,"inputs":[{"name":"a_dataframe","type":"DATAFRAME","link":67,"localized_name":"a_dataframe"},{"name":"b_series","type":"PDSERIES","link":72,"localized_name":"b_series"}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[77],"slot_index":0,"localized_name":"DATAFRAME"}],"properties":{"Node name for S&R":"PandasAddSeries"},"widgets_values":[]},{"id":41,"type":"PandasShowDataFrame","pos":[-289.6907043457031,1261.38427734375],"size":[210,105.7447509765625],"flags":{},"order":19,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":65,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 -1.0 2.0\n1 3.0 8.0"]},{"id":42,"type":"PandasShowDataFrame","pos":[-291.59625244140625,1003.9765625],"size":[210,105.7447509765625],"flags":{},"order":12,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":64,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 10.0 20.0\n1 30.0 40.0"]},{"id":32,"type":"PandasAsFloat","pos":[-565.2611694335938,888.2376098632812],"size":[227.96817016601562,61.57611846923828],"flags":{},"order":5,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":62,"localized_name":"dataframe"}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[42,64,67,68,69,70,71,83],"slot_index":0,"localized_name":"DATAFRAME"}],"properties":{"Node name for S&R":"PandasAsFloat"},"widgets_values":[]},{"id":24,"type":"PandasDivSeries","pos":[648.5646362304688,2027.6978759765625],"size":[210.83331298828125,66],"flags":{},"order":25,"mode":0,"inputs":[{"name":"a_dataframe","type":"DATAFRAME","link":70,"localized_name":"a_dataframe"},{"name":"b_series","type":"PDSERIES","link":75,"localized_name":"b_series"}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[80],"slot_index":0,"localized_name":"DATAFRAME"}],"properties":{"Node name for S&R":"PandasDivSeries"},"widgets_values":[]},{"id":28,"type":"PandasShowDataFrame","pos":[923.629638671875,1866.73828125],"size":[210,100.29080200195312],"flags":{},"order":31,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":79,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 10.0 100.0\n1 30.0 200.0"]},{"id":30,"type":"PandasShowDataFrame","pos":[922.4097290039062,2182.119140625],"size":[210,100.29080200195312],"flags":{},"order":33,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":81,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 10.0 3200000.0\n1 30.0 102400000.0"]},{"id":29,"type":"PandasShowDataFrame","pos":[923.6298828125,2025.348876953125],"size":[210,100.29080200195312],"flags":{},"order":32,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":80,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 10.0 4.0\n1 30.0 8.0"]},{"id":38,"type":"PandasShowText","pos":[649.5333862304688,1144.2918701171875],"size":[231.82394409179688,113.5497817993164],"flags":{},"order":28,"mode":0,"inputs":[{"name":"text","type":"STRING","link":45,"widget":{"name":"text"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowText"},"widgets_values":[""," A B\n0 0.1 4.000000e+02\n1 27000.0 6.553600e+12"]},{"id":22,"type":"PandasSubSeries","pos":[641.779541015625,1719.2926025390625],"size":[222.0376434326172,71.01221466064453],"flags":{},"order":23,"mode":0,"inputs":[{"name":"a_dataframe","type":"DATAFRAME","link":68,"localized_name":"a_dataframe"},{"name":"b_series","type":"PDSERIES","link":73,"localized_name":"b_series"}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[78],"slot_index":0,"localized_name":"DATAFRAME"}],"properties":{"Node name for S&R":"PandasSubSeries"},"widgets_values":[]},{"id":23,"type":"PandasMulSeries","pos":[644.279541015625,1878.4591064453125],"size":[216.4574432373047,64.49390411376953],"flags":{},"order":24,"mode":0,"inputs":[{"name":"a_dataframe","type":"DATAFRAME","link":69,"localized_name":"a_dataframe"},{"name":"b_series","type":"PDSERIES","link":74,"localized_name":"b_series"}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[79],"slot_index":0,"localized_name":"DATAFRAME"}],"properties":{"Node name for S&R":"PandasMulSeries"},"widgets_values":[]},{"id":26,"type":"PandasPowSeries","pos":[646.0639038085938,2180.18408203125],"size":[220.4059295654297,69.2591323852539],"flags":{},"order":26,"mode":0,"inputs":[{"name":"a_dataframe","type":"DATAFRAME","link":71,"localized_name":"a_dataframe"},{"name":"b_series","type":"PDSERIES","link":76,"localized_name":"b_series"}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[81],"slot_index":0,"localized_name":"DATAFRAME"}],"properties":{"Node name for S&R":"PandasPowSeries"},"widgets_values":[]},{"id":43,"type":"PandasShowDataFrame","pos":[273.5381774902344,1618.6280517578125],"size":[210,99.64430236816406],"flags":{},"order":13,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":83,"localized_name":"dataframe"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 10.0 20.0\n1 30.0 40.0"]},{"id":18,"type":"PandasMean","pos":[25.133180618286133,1918.447998046875],"size":[210,81.6454849243164],"flags":{},"order":20,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":66,"localized_name":"dataframe"}],"outputs":[{"name":"PDSERIES","type":"PDSERIES","links":[72,73,74,75,76,82],"slot_index":0,"localized_name":"PDSERIES"}],"properties":{"Node name for S&R":"PandasMean"},"widgets_values":[]},{"id":21,"type":"PandasShowSeries","pos":[267.4705505371094,2028.307373046875],"size":[235.03912353515625,92.13330841064453],"flags":{},"order":27,"mode":0,"inputs":[{"name":"series_list","type":"PDSERIES","link":82,"localized_name":"series_list"}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["{\"array\": [1.0, 5.0], \"index\": [\"A\", \"B\"], \"name\": null}"]},{"id":45,"type":"MarkdownNote","pos":[57.90943145751953,-62.53681564331055],"size":[428.2297058105469,58.09564208984375],"flags":{},"order":2,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["## Operation for a two DataFrames"],"color":"#432","bgcolor":"#653"},{"id":44,"type":"MarkdownNote","pos":[608.2740478515625,1401.746337890625],"size":[428.2297058105469,58.09564208984375],"flags":{},"order":3,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["## Operation for a DataFrame and a Series"],"color":"#432","bgcolor":"#653"}],"links":[[42,32,0,12,0,"DATAFRAME"],[43,34,0,12,1,"DATAFRAME"],[44,12,0,37,0,"DATAFRAME"],[45,37,0,38,0,"STRING"],[47,2,0,3,1,"DATAFRAME"],[48,1,0,3,0,"DATAFRAME"],[49,3,0,4,0,"DATAFRAME"],[50,2,0,39,0,"DATAFRAME"],[51,1,0,40,0,"DATAFRAME"],[52,1,0,9,0,"DATAFRAME"],[53,1,0,10,0,"DATAFRAME"],[54,1,0,13,0,"DATAFRAME"],[56,9,0,14,0,"DATAFRAME"],[57,10,0,15,0,"DATAFRAME"],[58,13,0,16,0,"DATAFRAME"],[59,2,0,9,1,"DATAFRAME"],[60,2,0,10,1,"DATAFRAME"],[61,2,0,13,1,"DATAFRAME"],[62,1,0,32,0,"DATAFRAME"],[63,2,0,34,0,"DATAFRAME"],[64,32,0,42,0,"DATAFRAME"],[65,34,0,41,0,"DATAFRAME"],[66,34,0,18,0,"DATAFRAME"],[67,32,0,19,0,"DATAFRAME"],[68,32,0,22,0,"DATAFRAME"],[69,32,0,23,0,"DATAFRAME"],[70,32,0,24,0,"DATAFRAME"],[71,32,0,26,0,"DATAFRAME"],[72,18,0,19,1,"PDSERIES"],[73,18,0,22,1,"PDSERIES"],[74,18,0,23,1,"PDSERIES"],[75,18,0,24,1,"PDSERIES"],[76,18,0,26,1,"PDSERIES"],[77,19,0,20,0,"DATAFRAME"],[78,22,0,27,0,"DATAFRAME"],[79,23,0,28,0,"DATAFRAME"],[80,24,0,29,0,"DATAFRAME"],[81,26,0,30,0,"DATAFRAME"],[82,18,0,21,0,"PDSERIES"],[83,32,0,43,0,"DATAFRAME"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6973408901972836,"offset":[308.0628870384837,-682.7949302250506]},"node_versions":{"data-analysis":"d1135d404ccf4f6d523db77b95dff3934f62a384"},"ue_links":[]},"version":0.4} \ No newline at end of file diff --git a/examples/workflows/create.json b/examples/workflows/create.json index f04ad21..109f569 100644 --- a/examples/workflows/create.json +++ b/examples/workflows/create.json @@ -1 +1 @@ -{"last_node_id":4,"last_link_id":2,"nodes":[{"id":1,"type":"PandasCreate","pos":[-326.9039306640625,1636.5106201171875],"size":[210,138.73008728027344],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[1],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreate"},"widgets_values":["A,B\n1,10\n2,20\n3,30"]},{"id":4,"type":"PandasShowDataFrame","pos":[-64.19639587402344,1834.85595703125],"size":[217.840576171875,134.7733612060547],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":2,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," A B\nUS 1 10\nFrance 2 20\nGermany 3 30"]},{"id":3,"type":"PandasCreateWithIndex","pos":[-324.8951416015625,1834.365478515625],"size":[210,134.33523559570312],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[2],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreateWithIndex"},"widgets_values":["index,A,B\nUS,1,10\nFrance,2,20\nGermany,3,30",0]},{"id":2,"type":"PandasShowDataFrame","pos":[-64.8188705444336,1635.102783203125],"size":[216.83184814453125,135.75343322753906],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":1,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," A B\n0 1 10\n1 2 20\n2 3 30"]}],"links":[[1,1,0,2,0,"STRING"],[2,3,0,4,0,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":1.5305009021021516,"offset":[477.1330786503176,-1565.7063254190393]},"node_versions":{"data-analysis":"3e5a6d6efce2f08933edccaf9e1c1e38896df00b"},"ue_links":[]},"version":0.4} \ No newline at end of file +{"last_node_id":4,"last_link_id":4,"nodes":[{"id":4,"type":"PandasShowDataFrame","pos":[-64.19639587402344,1834.85595703125],"size":[217.840576171875,134.7733612060547],"flags":{},"order":2,"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":[" A B\nindex \nUS 1 10\nFrance 2 20\nGermany 3 30"]},{"id":2,"type":"PandasShowDataFrame","pos":[-64.8188705444336,1635.102783203125],"size":[216.83184814453125,135.75343322753906],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":3}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 1 10\n1 2 20\n2 3 30"]},{"id":3,"type":"PandasCreateWithIndex","pos":[-324.8951416015625,1834.365478515625],"size":[210,134.33523559570312],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[4],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreateWithIndex"},"widgets_values":["index,A,B\nUS,1,10\nFrance,2,20\nGermany,3,30",0]},{"id":1,"type":"PandasCreate","pos":[-326.9039306640625,1636.5106201171875],"size":[210,138.73008728027344],"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":["A,B\n1,10\n2,20\n3,30"]}],"links":[[3,1,0,2,0,"DATAFRAME"],[4,3,0,4,0,"DATAFRAME"]],"groups":[],"config":{},"extra":{"ds":{"scale":1.662759310116916,"offset":[538.1885155497253,-1531.0150349934897]},"node_versions":{"data-analysis":"d1135d404ccf4f6d523db77b95dff3934f62a384"},"ue_links":[]},"version":0.4} \ No newline at end of file diff --git a/examples/workflows/group_by.json b/examples/workflows/group_by.json index 59dfed9..41a7b8b 100644 --- a/examples/workflows/group_by.json +++ b/examples/workflows/group_by.json @@ -1 +1 @@ -{"last_node_id":25,"last_link_id":21,"nodes":[{"id":15,"type":"PandasShowDataFrame","pos":[-163.7736358642578,1620.09814453125],"size":[210,108.7156753540039],"flags":{},"order":8,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":11,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Qty\napple 1110\nbanana 220\ncoconut 330"]},{"id":17,"type":"PandasShowDataFrame","pos":[-161.14952087402344,1778.2269287109375],"size":[210,100.74386596679688],"flags":{},"order":9,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":12,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Qty\napple 370\nbanana 110\ncoconut 165"]},{"id":14,"type":"PandasGroupBy","pos":[-421.0318908691406,1622.4898681640625],"size":[232.6582489013672,94],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":10,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[11],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasGroupBy"},"widgets_values":["","Fruit","sum"]},{"id":16,"type":"PandasGroupBy","pos":[-420.16949462890625,1777.597412109375],"size":[232.6582489013672,94],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":14,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[12],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasGroupBy"},"widgets_values":["","Fruit","mean"]},{"id":18,"type":"PandasGroupBy","pos":[-423.3183288574219,1935.9014892578125],"size":[232.6582489013672,94],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":15,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[13],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasGroupBy"},"widgets_values":["","Fruit","count"]},{"id":19,"type":"PandasShowDataFrame","pos":[-162.36917114257812,1936.36328125],"size":[210,106.08497619628906],"flags":{},"order":10,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":13,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Qty\napple 3\nbanana 2\ncoconut 2"]},{"id":20,"type":"PandasShowDataFrame","pos":[-166.30099487304688,2114.517578125],"size":[210,108.7156753540039],"flags":{},"order":11,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":16,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Qty\napple 547.448628\nbanana 127.279221\ncoconut 190.918831"]},{"id":21,"type":"PandasShowDataFrame","pos":[-163.6768798828125,2272.646240234375],"size":[210,100.74386596679688],"flags":{},"order":12,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":17,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Qty\napple 10\nbanana 20\ncoconut 30"]},{"id":25,"type":"PandasShowDataFrame","pos":[-164.8965301513672,2430.78271484375],"size":[210,106.08497619628906],"flags":{},"order":13,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":18,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Qty\napple 1000\nbanana 200\ncoconut 300"]},{"id":22,"type":"PandasGroupBy","pos":[-423.5592956542969,2116.9091796875],"size":[232.6582489013672,94],"flags":{},"order":5,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":19,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[16],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasGroupBy"},"widgets_values":["","Fruit","std"]},{"id":23,"type":"PandasGroupBy","pos":[-422.6968994140625,2272.016845703125],"size":[232.6582489013672,94],"flags":{},"order":6,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":20,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[17],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasGroupBy"},"widgets_values":["","Fruit","min"]},{"id":24,"type":"PandasGroupBy","pos":[-425.8457336425781,2430.32080078125],"size":[232.6582489013672,94],"flags":{},"order":7,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":21,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[18],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasGroupBy"},"widgets_values":["","Fruit","max"]},{"id":4,"type":"PandasShowDataFrame","pos":[-417.6891784667969,1422.78369140625],"size":[210,137.6671142578125],"flags":{},"order":1,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":9,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Fruit Qty\n0 apple 10\n1 banana 20\n2 coconut 30\n3 apple 100\n4 banana 200\n5 coconut 300\n6 apple 1000"]},{"id":13,"type":"PandasCreate","pos":[-728.1686401367188,2251.291748046875],"size":[210,153.88217163085938],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[9,10,14,15,19,20,21],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasCreate"},"widgets_values":["Fruit,Qty\napple,10\nbanana,20\ncoconut,30\napple,100\nbanana,200\ncoconut,300\napple,1000"]}],"links":[[9,13,0,4,0,"STRING"],[10,13,0,14,0,"STRING"],[11,14,0,15,0,"STRING"],[12,16,0,17,0,"STRING"],[13,18,0,19,0,"STRING"],[14,13,0,16,0,"STRING"],[15,13,0,18,0,"STRING"],[16,22,0,20,0,"STRING"],[17,23,0,21,0,"STRING"],[18,24,0,25,0,"STRING"],[19,13,0,22,0,"STRING"],[20,13,0,23,0,"STRING"],[21,13,0,24,0,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.9503206450765007,"offset":[1005.2604655032138,-1650.2229158553694]},"node_versions":{"data-analysis":"8ba49404664bc59bfd3918cc61f91f891732d48d"},"ue_links":[]},"version":0.4} \ No newline at end of file +{"last_node_id":25,"last_link_id":34,"nodes":[{"id":14,"type":"PandasGroupBy","pos":[-421.0318908691406,1622.4898681640625],"size":[232.6582489013672,94],"flags":{},"order":1,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":22}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[28],"slot_index":0}],"properties":{"Node name for S&R":"PandasGroupBy"},"widgets_values":["Fruit","sum"]},{"id":16,"type":"PandasGroupBy","pos":[-420.16949462890625,1777.597412109375],"size":[232.6582489013672,94],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":23}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[29],"slot_index":0}],"properties":{"Node name for S&R":"PandasGroupBy"},"widgets_values":["Fruit","mean"]},{"id":18,"type":"PandasGroupBy","pos":[-423.3183288574219,1935.9014892578125],"size":[232.6582489013672,94],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":24}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[30],"slot_index":0}],"properties":{"Node name for S&R":"PandasGroupBy"},"widgets_values":["Fruit","count"]},{"id":22,"type":"PandasGroupBy","pos":[-423.5592956542969,2116.9091796875],"size":[232.6582489013672,94],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":25}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[31],"slot_index":0}],"properties":{"Node name for S&R":"PandasGroupBy"},"widgets_values":["Fruit","std"]},{"id":23,"type":"PandasGroupBy","pos":[-422.6968994140625,2272.016845703125],"size":[232.6582489013672,94],"flags":{},"order":5,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":26}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[32],"slot_index":0}],"properties":{"Node name for S&R":"PandasGroupBy"},"widgets_values":["Fruit","min"]},{"id":24,"type":"PandasGroupBy","pos":[-425.8457336425781,2430.32080078125],"size":[232.6582489013672,94],"flags":{},"order":6,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":27}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[33],"slot_index":0}],"properties":{"Node name for S&R":"PandasGroupBy"},"widgets_values":["Fruit","max"]},{"id":13,"type":"PandasCreate","pos":[-760.8506469726562,2099.478271484375],"size":[210,153.88217163085938],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[22,23,24,25,26,27,34],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreate"},"widgets_values":["Fruit,Qty\napple,10\nbanana,20\ncoconut,30\napple,100\nbanana,200\ncoconut,300\napple,1000"]},{"id":4,"type":"PandasShowDataFrame","pos":[-409.12481689453125,1311.4483642578125],"size":[210,168.0314178466797],"flags":{},"order":7,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":34}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Fruit Qty\n0 apple 10\n1 banana 20\n2 coconut 30\n3 apple 100\n4 banana 200\n5 coconut 300\n6 apple 1000"]},{"id":15,"type":"PandasShowDataFrame","pos":[-163.7736358642578,1620.09814453125],"size":[210,108.7156753540039],"flags":{},"order":8,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":28}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Qty\nFruit \napple 1110\nbanana 220\ncoconut 330"]},{"id":17,"type":"PandasShowDataFrame","pos":[-161.14952087402344,1778.2269287109375],"size":[210,117.0159912109375],"flags":{},"order":9,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":29}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Qty\nFruit \napple 370.0\nbanana 110.0\ncoconut 165.0"]},{"id":19,"type":"PandasShowDataFrame","pos":[-162.36917114257812,1936.36328125],"size":[210,118.93141174316406],"flags":{},"order":10,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":30}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Qty\nFruit \napple 3\nbanana 2\ncoconut 2"]},{"id":20,"type":"PandasShowDataFrame","pos":[-166.30099487304688,2114.517578125],"size":[210.85647583007812,118.13640594482422],"flags":{},"order":11,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":31}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Qty\nFruit \napple 547.448628\nbanana 127.279221\ncoconut 190.918831"]},{"id":21,"type":"PandasShowDataFrame","pos":[-163.6768798828125,2272.646240234375],"size":[210.85647583007812,117.87246704101562],"flags":{},"order":12,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":32}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Qty\nFruit \napple 10\nbanana 20\ncoconut 30"]},{"id":25,"type":"PandasShowDataFrame","pos":[-164.8965301513672,2430.78271484375],"size":[215.13858032226562,118.07493591308594],"flags":{},"order":13,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":33}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Qty\nFruit \napple 1000\nbanana 200\ncoconut 300"]}],"links":[[22,13,0,14,0,"DATAFRAME"],[23,13,0,16,0,"DATAFRAME"],[24,13,0,18,0,"DATAFRAME"],[25,13,0,22,0,"DATAFRAME"],[26,13,0,23,0,"DATAFRAME"],[27,13,0,24,0,"DATAFRAME"],[28,14,0,15,0,"DATAFRAME"],[29,16,0,17,0,"DATAFRAME"],[30,18,0,19,0,"DATAFRAME"],[31,22,0,20,0,"DATAFRAME"],[32,23,0,21,0,"DATAFRAME"],[33,24,0,25,0,"DATAFRAME"],[34,13,0,4,0,"DATAFRAME"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.9730327275167746,"offset":[817.3035161806949,-1892.253944303686]},"node_versions":{"data-analysis":"d1135d404ccf4f6d523db77b95dff3934f62a384"},"ue_links":[]},"version":0.4} \ No newline at end of file diff --git a/examples/workflows/join.json b/examples/workflows/join.json index e034a35..544e9e5 100644 --- a/examples/workflows/join.json +++ b/examples/workflows/join.json @@ -1 +1 @@ -{"last_node_id":34,"last_link_id":30,"nodes":[{"id":24,"type":"MarkdownNote","pos":[824.4011840820312,3057.402587890625],"size":[405.45428466796875,61.54335021972656],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Left join"],"color":"#432","bgcolor":"#653"},{"id":34,"type":"MarkdownNote","pos":[830.350341796875,4215.66162109375],"size":[405.45428466796875,61.54335021972656],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Outer join"],"color":"#432","bgcolor":"#653"},{"id":27,"type":"PandasJoin","pos":[817.4930419921875,3736.85791015625],"size":[400,200],"flags":{},"order":12,"mode":0,"inputs":[{"name":"left_dataframe_json","type":"STRING","link":27,"widget":{"name":"left_dataframe_json"}},{"name":"right_dataframe_json","type":"STRING","link":28,"widget":{"name":"right_dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[23],"slot_index":0}],"properties":{"Node name for S&R":"PandasJoin"},"widgets_values":["","","ActorID","right"]},{"id":1,"type":"PandasLoadCSV","pos":[-607.8720092773438,2361.45849609375],"size":[410.5992736816406,95.68482208251953],"flags":{},"order":5,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[13,20,25,27,30],"slot_index":0}],"properties":{"Node name for S&R":"PandasLoadCSV"},"widgets_values":["custom_nodes/data-analysis/examples/datasets/movie.csv"]},{"id":13,"type":"PandasLoadCSV","pos":[-608.0108032226562,2733.447265625],"size":[410.5992736816406,95.68482208251953],"flags":{},"order":7,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[14,21,26,28,29],"slot_index":0}],"properties":{"Node name for S&R":"PandasLoadCSV"},"widgets_values":["custom_nodes/data-analysis/examples/datasets/actor.csv"]},{"id":10,"type":"PandasShowDataFrame","pos":[-66.52587890625,2354.16455078125],"size":[427.6637878417969,314.1942443847656],"flags":{},"order":8,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":13,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[],"slot_index":0,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Title MovieID ActorID\n0 Shadow Circuit 1 5.0\n1 The Last Ember 2 4.0\n2 Echoes of Orion 3 3.0\n3 Neon Revenant 4 2.0\n4 Fractured Horizon 5 1.0\n5 Blood and Chrome 6 10.0\n6 The Silent Epoch 7 9.0\n7 Ashes of Tomorrow 8 8.0\n8 Hyperion’s Wake 9 7.0\n9 Obsidian Mirage 10 6.0\n10 The Hollow Accord 11 5.0\n11 Lunar Divide 12 3.0\n12 Redshift Paradox 13 1.0\n13 Phantom Genesis 14 4.0\n14 Vanishing Point Protocol 15 2.0\n15 Nocturne Zero 16 NaN\n16 Polaris Run 17 NaN\n17 The Gilded Warden 18 NaN\n18 Aetherfall 19 NaN\n19 Terminal Sanctum 20 NaN"]},{"id":14,"type":"PandasShowDataFrame","pos":[-64.7003173828125,2732.39013671875],"size":[427.6637878417969,314.1942443847656],"flags":{},"order":9,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":14,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[],"slot_index":0,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Name ActorID\n0 Barron Sawyer 1\n1 Elara Whitmore 2\n2 Jaxon Vance 3\n3 Seraphina Lowell 4\n4 Dorian Kessler 5\n5 Valeria Knox 6\n6 Orin Mercer 7\n7 Celeste Draven 8\n8 Lucian Hartwell 9\n9 Marisol Quinn 10\n10 Felix Holloway 11\n11 Rowan Sinclair 12\n12 Sienna Wren 13\n13 Cassius Vale 14\n14 Livia Monroe 15\n15 Gideon Thorne 16\n16 Zara Fontaine 17\n17 Maverick Calloway 18\n18 Isolde Mercer 19\n19 Ronan Delacroix 20"]},{"id":16,"type":"PandasJoin","pos":[828.50830078125,2583.21875],"size":[400,200],"flags":{},"order":10,"mode":0,"inputs":[{"name":"left_dataframe_json","type":"STRING","link":20,"widget":{"name":"left_dataframe_json"}},{"name":"right_dataframe_json","type":"STRING","link":21,"widget":{"name":"right_dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[19],"slot_index":0}],"properties":{"Node name for S&R":"PandasJoin"},"widgets_values":["","","ActorID","inner"]},{"id":22,"type":"PandasJoin","pos":[824.6515502929688,3171.81298828125],"size":[400,200],"flags":{},"order":11,"mode":0,"inputs":[{"name":"left_dataframe_json","type":"STRING","link":25,"widget":{"name":"left_dataframe_json"}},{"name":"right_dataframe_json","type":"STRING","link":26,"widget":{"name":"right_dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[22],"slot_index":0}],"properties":{"Node name for S&R":"PandasJoin"},"widgets_values":["","","ActorID","left"]},{"id":23,"type":"PandasShowDataFrame","pos":[1298.7039794921875,3169.053466796875],"size":[437.3924865722656,328.610595703125],"flags":{},"order":15,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":22,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Title MovieID ActorID Name\n0 Shadow Circuit 1 5.0 Dorian Kessler\n1 The Last Ember 2 4.0 Seraphina Lowell\n2 Echoes of Orion 3 3.0 Jaxon Vance\n3 Neon Revenant 4 2.0 Elara Whitmore\n4 Fractured Horizon 5 1.0 Barron Sawyer\n5 Blood and Chrome 6 10.0 Marisol Quinn\n6 The Silent Epoch 7 9.0 Lucian Hartwell\n7 Ashes of Tomorrow 8 8.0 Celeste Draven\n8 Hyperion’s Wake 9 7.0 Orin Mercer\n9 Obsidian Mirage 10 6.0 Valeria Knox\n10 The Hollow Accord 11 5.0 Dorian Kessler\n11 Lunar Divide 12 3.0 Jaxon Vance\n12 Redshift Paradox 13 1.0 Barron Sawyer\n13 Phantom Genesis 14 4.0 Seraphina Lowell\n14 Vanishing Point Protocol 15 2.0 Elara Whitmore\n15 Nocturne Zero 16 NaN None\n16 Polaris Run 17 NaN None\n17 The Gilded Warden 18 NaN None\n18 Aetherfall 19 NaN None\n19 Terminal Sanctum 20 NaN None"]},{"id":28,"type":"PandasShowDataFrame","pos":[1302.0699462890625,3739.05859375],"size":[443.3382263183594,375.1855773925781],"flags":{},"order":16,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":23,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Title MovieID ActorID Name\n0 Fractured Horizon 5.0 1 Barron Sawyer\n1 Redshift Paradox 13.0 1 Barron Sawyer\n2 Neon Revenant 4.0 2 Elara Whitmore\n3 Vanishing Point Protocol 15.0 2 Elara Whitmore\n4 Echoes of Orion 3.0 3 Jaxon Vance\n5 Lunar Divide 12.0 3 Jaxon Vance\n6 The Last Ember 2.0 4 Seraphina Lowell\n7 Phantom Genesis 14.0 4 Seraphina Lowell\n8 Shadow Circuit 1.0 5 Dorian Kessler\n9 The Hollow Accord 11.0 5 Dorian Kessler\n10 Obsidian Mirage 10.0 6 Valeria Knox\n11 Hyperion’s Wake 9.0 7 Orin Mercer\n12 Ashes of Tomorrow 8.0 8 Celeste Draven\n13 The Silent Epoch 7.0 9 Lucian Hartwell\n14 Blood and Chrome 6.0 10 Marisol Quinn\n15 None NaN 11 Felix Holloway\n16 None NaN 12 Rowan Sinclair\n17 None NaN 13 Sienna Wren\n18 None NaN 14 Cassius Vale\n19 None NaN 15 Livia Monroe\n20 None NaN 16 Gideon Thorne\n21 None NaN 17 Zara Fontaine\n22 None NaN 18 Maverick Calloway\n23 None NaN 19 Isolde Mercer\n24 None NaN 20 Ronan Delacroix"]},{"id":29,"type":"MarkdownNote","pos":[814.576416015625,3617.432373046875],"size":[405.45428466796875,61.54335021972656],"flags":{},"order":2,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Right join"],"color":"#432","bgcolor":"#653"},{"id":32,"type":"PandasJoin","pos":[833.5746459960938,4331.5478515625],"size":[400,200],"flags":{},"order":13,"mode":0,"inputs":[{"name":"left_dataframe_json","type":"STRING","link":30,"widget":{"name":"left_dataframe_json"}},{"name":"right_dataframe_json","type":"STRING","link":29,"widget":{"name":"right_dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[24],"slot_index":0}],"properties":{"Node name for S&R":"PandasJoin"},"widgets_values":["","","ActorID","outer"]},{"id":33,"type":"PandasShowDataFrame","pos":[1309.1181640625,4335.92041015625],"size":[465.1393127441406,435.6340026855469],"flags":{},"order":17,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":24,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Title MovieID ActorID Name\n0 Fractured Horizon 5.0 1.0 Barron Sawyer\n1 Redshift Paradox 13.0 1.0 Barron Sawyer\n2 Neon Revenant 4.0 2.0 Elara Whitmore\n3 Vanishing Point Protocol 15.0 2.0 Elara Whitmore\n4 Echoes of Orion 3.0 3.0 Jaxon Vance\n5 Lunar Divide 12.0 3.0 Jaxon Vance\n6 The Last Ember 2.0 4.0 Seraphina Lowell\n7 Phantom Genesis 14.0 4.0 Seraphina Lowell\n8 Shadow Circuit 1.0 5.0 Dorian Kessler\n9 The Hollow Accord 11.0 5.0 Dorian Kessler\n10 Obsidian Mirage 10.0 6.0 Valeria Knox\n11 Hyperion’s Wake 9.0 7.0 Orin Mercer\n12 Ashes of Tomorrow 8.0 8.0 Celeste Draven\n13 The Silent Epoch 7.0 9.0 Lucian Hartwell\n14 Blood and Chrome 6.0 10.0 Marisol Quinn\n15 None NaN 11.0 Felix Holloway\n16 None NaN 12.0 Rowan Sinclair\n17 None NaN 13.0 Sienna Wren\n18 None NaN 14.0 Cassius Vale\n19 None NaN 15.0 Livia Monroe\n20 None NaN 16.0 Gideon Thorne\n21 None NaN 17.0 Zara Fontaine\n22 None NaN 18.0 Maverick Calloway\n23 None NaN 19.0 Isolde Mercer\n24 None NaN 20.0 Ronan Delacroix\n25 Nocturne Zero 16.0 NaN None\n26 Polaris Run 17.0 NaN None\n27 The Gilded Warden 18.0 NaN None\n28 Aetherfall 19.0 NaN None\n29 Terminal Sanctum 20.0 NaN None"]},{"id":11,"type":"MarkdownNote","pos":[-602.6942138671875,2221.46630859375],"size":[405.45428466796875,61.54335021972656],"flags":{},"order":4,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Load Movie table (LEFT DataFrame)"],"color":"#432","bgcolor":"#653"},{"id":12,"type":"MarkdownNote","pos":[-605.7132568359375,2591.47021484375],"size":[405.45428466796875,61.54335021972656],"flags":{},"order":6,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Load Actor table (RIGHT DataFrame)"],"color":"#432","bgcolor":"#653"},{"id":18,"type":"MarkdownNote","pos":[828.9031982421875,2464.126953125],"size":[405.45428466796875,61.54335021972656],"flags":{},"order":3,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Inner join"],"color":"#432","bgcolor":"#653"},{"id":17,"type":"PandasShowDataFrame","pos":[1305.4864501953125,2582.239501953125],"size":[451.2658386230469,270.14410400390625],"flags":{},"order":14,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":19,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Title MovieID ActorID Name\n0 Shadow Circuit 1 5 Dorian Kessler\n1 The Last Ember 2 4 Seraphina Lowell\n2 Echoes of Orion 3 3 Jaxon Vance\n3 Neon Revenant 4 2 Elara Whitmore\n4 Fractured Horizon 5 1 Barron Sawyer\n5 Blood and Chrome 6 10 Marisol Quinn\n6 The Silent Epoch 7 9 Lucian Hartwell\n7 Ashes of Tomorrow 8 8 Celeste Draven\n8 Hyperion’s Wake 9 7 Orin Mercer\n9 Obsidian Mirage 10 6 Valeria Knox\n10 The Hollow Accord 11 5 Dorian Kessler\n11 Lunar Divide 12 3 Jaxon Vance\n12 Redshift Paradox 13 1 Barron Sawyer\n13 Phantom Genesis 14 4 Seraphina Lowell\n14 Vanishing Point Protocol 15 2 Elara Whitmore"]}],"links":[[13,1,0,10,0,"STRING"],[14,13,0,14,0,"STRING"],[19,16,0,17,0,"STRING"],[20,1,0,16,0,"STRING"],[21,13,0,16,1,"STRING"],[22,22,0,23,0,"STRING"],[23,27,0,28,0,"STRING"],[24,32,0,33,0,"STRING"],[25,1,0,22,0,"STRING"],[26,13,0,22,1,"STRING"],[27,1,0,27,0,"STRING"],[28,13,0,27,1,"STRING"],[29,13,0,32,1,"STRING"],[30,1,0,32,0,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6727499949325617,"offset":[-509.5429991188312,-2376.8493782649657]},"node_versions":{"data-analysis":"3fbe2d3d0d9fcc3d3358eb6cc8ac844d12d56049"},"ue_links":[]},"version":0.4} \ No newline at end of file +{"last_node_id":34,"last_link_id":45,"nodes":[{"id":24,"type":"MarkdownNote","pos":[824.4011840820312,3057.402587890625],"size":[405.45428466796875,61.54335021972656],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Left join"],"color":"#432","bgcolor":"#653"},{"id":34,"type":"MarkdownNote","pos":[830.350341796875,4215.66162109375],"size":[405.45428466796875,61.54335021972656],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Outer join"],"color":"#432","bgcolor":"#653"},{"id":14,"type":"PandasShowDataFrame","pos":[-64.7003173828125,2732.39013671875],"size":[427.6637878417969,314.1942443847656],"flags":{},"order":9,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":33}],"outputs":[{"name":"STRING","type":"STRING","links":[],"slot_index":0,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Name ActorID\n0 Barron Sawyer 1\n1 Elara Whitmore 2\n2 Jaxon Vance 3\n3 Seraphina Lowell 4\n4 Dorian Kessler 5\n5 Valeria Knox 6\n6 Orin Mercer 7\n7 Celeste Draven 8\n8 Lucian Hartwell 9\n9 Marisol Quinn 10\n10 Felix Holloway 11\n11 Rowan Sinclair 12\n12 Sienna Wren 13\n13 Cassius Vale 14\n14 Livia Monroe 15\n15 Gideon Thorne 16\n16 Zara Fontaine 17\n17 Maverick Calloway 18\n18 Isolde Mercer 19\n19 Ronan Delacroix 20"]},{"id":23,"type":"PandasShowDataFrame","pos":[1298.7039794921875,3169.053466796875],"size":[437.3924865722656,328.610595703125],"flags":{},"order":15,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":43}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Title MovieID ActorID Name\n0 Shadow Circuit 1 5.0 Dorian Kessler\n1 The Last Ember 2 4.0 Seraphina Lowell\n2 Echoes of Orion 3 3.0 Jaxon Vance\n3 Neon Revenant 4 2.0 Elara Whitmore\n4 Fractured Horizon 5 1.0 Barron Sawyer\n5 Blood and Chrome 6 10.0 Marisol Quinn\n6 The Silent Epoch 7 9.0 Lucian Hartwell\n7 Ashes of Tomorrow 8 8.0 Celeste Draven\n8 Hyperion’s Wake 9 7.0 Orin Mercer\n9 Obsidian Mirage 10 6.0 Valeria Knox\n10 The Hollow Accord 11 5.0 Dorian Kessler\n11 Lunar Divide 12 3.0 Jaxon Vance\n12 Redshift Paradox 13 1.0 Barron Sawyer\n13 Phantom Genesis 14 4.0 Seraphina Lowell\n14 Vanishing Point Protocol 15 2.0 Elara Whitmore\n15 Nocturne Zero 16 NaN NaN\n16 Polaris Run 17 NaN NaN\n17 The Gilded Warden 18 NaN NaN\n18 Aetherfall 19 NaN NaN\n19 Terminal Sanctum 20 NaN NaN"]},{"id":28,"type":"PandasShowDataFrame","pos":[1302.0699462890625,3739.05859375],"size":[443.3382263183594,375.1855773925781],"flags":{},"order":16,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":44}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Title MovieID ActorID Name\n0 Fractured Horizon 5.0 1.0 Barron Sawyer\n1 Redshift Paradox 13.0 1.0 Barron Sawyer\n2 Neon Revenant 4.0 2.0 Elara Whitmore\n3 Vanishing Point Protocol 15.0 2.0 Elara Whitmore\n4 Echoes of Orion 3.0 3.0 Jaxon Vance\n5 Lunar Divide 12.0 3.0 Jaxon Vance\n6 The Last Ember 2.0 4.0 Seraphina Lowell\n7 Phantom Genesis 14.0 4.0 Seraphina Lowell\n8 Shadow Circuit 1.0 5.0 Dorian Kessler\n9 The Hollow Accord 11.0 5.0 Dorian Kessler\n10 Obsidian Mirage 10.0 6.0 Valeria Knox\n11 Hyperion’s Wake 9.0 7.0 Orin Mercer\n12 Ashes of Tomorrow 8.0 8.0 Celeste Draven\n13 The Silent Epoch 7.0 9.0 Lucian Hartwell\n14 Blood and Chrome 6.0 10.0 Marisol Quinn\n15 NaN NaN 11.0 Felix Holloway\n16 NaN NaN 12.0 Rowan Sinclair\n17 NaN NaN 13.0 Sienna Wren\n18 NaN NaN 14.0 Cassius Vale\n19 NaN NaN 15.0 Livia Monroe\n20 NaN NaN 16.0 Gideon Thorne\n21 NaN NaN 17.0 Zara Fontaine\n22 NaN NaN 18.0 Maverick Calloway\n23 NaN NaN 19.0 Isolde Mercer\n24 NaN NaN 20.0 Ronan Delacroix"]},{"id":29,"type":"MarkdownNote","pos":[814.576416015625,3617.432373046875],"size":[405.45428466796875,61.54335021972656],"flags":{},"order":2,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Right join"],"color":"#432","bgcolor":"#653"},{"id":33,"type":"PandasShowDataFrame","pos":[1309.1181640625,4335.92041015625],"size":[465.1393127441406,435.6340026855469],"flags":{},"order":17,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":45}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Title MovieID ActorID Name\n0 Fractured Horizon 5.0 1.0 Barron Sawyer\n1 Redshift Paradox 13.0 1.0 Barron Sawyer\n2 Neon Revenant 4.0 2.0 Elara Whitmore\n3 Vanishing Point Protocol 15.0 2.0 Elara Whitmore\n4 Echoes of Orion 3.0 3.0 Jaxon Vance\n5 Lunar Divide 12.0 3.0 Jaxon Vance\n6 The Last Ember 2.0 4.0 Seraphina Lowell\n7 Phantom Genesis 14.0 4.0 Seraphina Lowell\n8 Shadow Circuit 1.0 5.0 Dorian Kessler\n9 The Hollow Accord 11.0 5.0 Dorian Kessler\n10 Obsidian Mirage 10.0 6.0 Valeria Knox\n11 Hyperion’s Wake 9.0 7.0 Orin Mercer\n12 Ashes of Tomorrow 8.0 8.0 Celeste Draven\n13 The Silent Epoch 7.0 9.0 Lucian Hartwell\n14 Blood and Chrome 6.0 10.0 Marisol Quinn\n15 NaN NaN 11.0 Felix Holloway\n16 NaN NaN 12.0 Rowan Sinclair\n17 NaN NaN 13.0 Sienna Wren\n18 NaN NaN 14.0 Cassius Vale\n19 NaN NaN 15.0 Livia Monroe\n20 NaN NaN 16.0 Gideon Thorne\n21 NaN NaN 17.0 Zara Fontaine\n22 NaN NaN 18.0 Maverick Calloway\n23 NaN NaN 19.0 Isolde Mercer\n24 NaN NaN 20.0 Ronan Delacroix\n25 Nocturne Zero 16.0 NaN NaN\n26 Polaris Run 17.0 NaN NaN\n27 The Gilded Warden 18.0 NaN NaN\n28 Aetherfall 19.0 NaN NaN\n29 Terminal Sanctum 20.0 NaN NaN"]},{"id":11,"type":"MarkdownNote","pos":[-602.6942138671875,2221.46630859375],"size":[405.45428466796875,61.54335021972656],"flags":{},"order":3,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Load Movie table (LEFT DataFrame)"],"color":"#432","bgcolor":"#653"},{"id":12,"type":"MarkdownNote","pos":[-605.7132568359375,2591.47021484375],"size":[405.45428466796875,61.54335021972656],"flags":{},"order":4,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Load Actor table (RIGHT DataFrame)"],"color":"#432","bgcolor":"#653"},{"id":18,"type":"MarkdownNote","pos":[828.9031982421875,2464.126953125],"size":[405.45428466796875,61.54335021972656],"flags":{},"order":5,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Inner join"],"color":"#432","bgcolor":"#653"},{"id":17,"type":"PandasShowDataFrame","pos":[1305.4864501953125,2582.239501953125],"size":[451.2658386230469,270.14410400390625],"flags":{},"order":14,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":42}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Title MovieID ActorID Name\n0 Shadow Circuit 1 5.0 Dorian Kessler\n1 The Last Ember 2 4.0 Seraphina Lowell\n2 Echoes of Orion 3 3.0 Jaxon Vance\n3 Neon Revenant 4 2.0 Elara Whitmore\n4 Fractured Horizon 5 1.0 Barron Sawyer\n5 Blood and Chrome 6 10.0 Marisol Quinn\n6 The Silent Epoch 7 9.0 Lucian Hartwell\n7 Ashes of Tomorrow 8 8.0 Celeste Draven\n8 Hyperion’s Wake 9 7.0 Orin Mercer\n9 Obsidian Mirage 10 6.0 Valeria Knox\n10 The Hollow Accord 11 5.0 Dorian Kessler\n11 Lunar Divide 12 3.0 Jaxon Vance\n12 Redshift Paradox 13 1.0 Barron Sawyer\n13 Phantom Genesis 14 4.0 Seraphina Lowell\n14 Vanishing Point Protocol 15 2.0 Elara Whitmore"]},{"id":10,"type":"PandasShowDataFrame","pos":[-65.54425811767578,2335.513671875],"size":[427.6637878417969,314.1942443847656],"flags":{},"order":8,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":31}],"outputs":[{"name":"STRING","type":"STRING","links":[],"slot_index":0,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Title MovieID ActorID\n0 Shadow Circuit 1 5.0\n1 The Last Ember 2 4.0\n2 Echoes of Orion 3 3.0\n3 Neon Revenant 4 2.0\n4 Fractured Horizon 5 1.0\n5 Blood and Chrome 6 10.0\n6 The Silent Epoch 7 9.0\n7 Ashes of Tomorrow 8 8.0\n8 Hyperion’s Wake 9 7.0\n9 Obsidian Mirage 10 6.0\n10 The Hollow Accord 11 5.0\n11 Lunar Divide 12 3.0\n12 Redshift Paradox 13 1.0\n13 Phantom Genesis 14 4.0\n14 Vanishing Point Protocol 15 2.0\n15 Nocturne Zero 16 NaN\n16 Polaris Run 17 NaN\n17 The Gilded Warden 18 NaN\n18 Aetherfall 19 NaN\n19 Terminal Sanctum 20 NaN"]},{"id":1,"type":"PandasLoadCSV","pos":[-606.9800415039062,2360.242919921875],"size":[410.5992736816406,95.68482208251953],"flags":{},"order":6,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[31,34,35,36,37],"slot_index":0}],"properties":{"Node name for S&R":"PandasLoadCSV"},"widgets_values":["custom_nodes/data-analysis/examples/datasets/movie.csv"]},{"id":13,"type":"PandasLoadCSV","pos":[-615.97998046875,2751.509765625],"size":[410.5992736816406,95.68482208251953],"flags":{},"order":7,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[33,38,39,40,41],"slot_index":0}],"properties":{"Node name for S&R":"PandasLoadCSV"},"widgets_values":["custom_nodes/data-analysis/examples/datasets/actor.csv"]},{"id":32,"type":"PandasJoin","pos":[833.5746459960938,4331.5478515625],"size":[400,200],"flags":{},"order":13,"mode":0,"inputs":[{"name":"left_dataframe","type":"DATAFRAME","link":37},{"name":"right_dataframe","type":"DATAFRAME","link":41}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[45],"slot_index":0}],"properties":{"Node name for S&R":"PandasJoin"},"widgets_values":["ActorID","outer"]},{"id":27,"type":"PandasJoin","pos":[817.4930419921875,3736.85791015625],"size":[400,200],"flags":{},"order":12,"mode":0,"inputs":[{"name":"left_dataframe","type":"DATAFRAME","link":36},{"name":"right_dataframe","type":"DATAFRAME","link":40}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[44],"slot_index":0}],"properties":{"Node name for S&R":"PandasJoin"},"widgets_values":["ActorID","right"]},{"id":22,"type":"PandasJoin","pos":[824.6515502929688,3171.81298828125],"size":[400,200],"flags":{},"order":11,"mode":0,"inputs":[{"name":"left_dataframe","type":"DATAFRAME","link":35},{"name":"right_dataframe","type":"DATAFRAME","link":39}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[43],"slot_index":0}],"properties":{"Node name for S&R":"PandasJoin"},"widgets_values":["ActorID","left"]},{"id":16,"type":"PandasJoin","pos":[827.949951171875,2639.006103515625],"size":[400,200],"flags":{},"order":10,"mode":0,"inputs":[{"name":"left_dataframe","type":"DATAFRAME","link":34},{"name":"right_dataframe","type":"DATAFRAME","link":38}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[42],"slot_index":0}],"properties":{"Node name for S&R":"PandasJoin"},"widgets_values":["ActorID","inner"]}],"links":[[31,1,0,10,0,"DATAFRAME"],[33,13,0,14,0,"DATAFRAME"],[34,1,0,16,0,"DATAFRAME"],[35,1,0,22,0,"DATAFRAME"],[36,1,0,27,0,"DATAFRAME"],[37,1,0,32,0,"DATAFRAME"],[38,13,0,16,1,"DATAFRAME"],[39,13,0,22,1,"DATAFRAME"],[40,13,0,27,1,"DATAFRAME"],[41,13,0,32,1,"DATAFRAME"],[42,16,0,17,0,"DATAFRAME"],[43,22,0,23,0,"DATAFRAME"],[44,27,0,28,0,"DATAFRAME"],[45,32,0,33,0,"DATAFRAME"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.5271195255881537,"offset":[255.61526767199382,-2056.4571333051986]},"node_versions":{"data-analysis":"a12de2f44c180d9136ec09572803a0fc525f7c9a"},"ue_links":[]},"version":0.4} \ No newline at end of file diff --git a/examples/workflows/load_csv.json b/examples/workflows/load_csv.json index b1493d9..f933de3 100644 --- a/examples/workflows/load_csv.json +++ b/examples/workflows/load_csv.json @@ -1 +1 @@ -{"last_node_id":2,"last_link_id":1,"nodes":[{"id":1,"type":"PandasLoadCSV","pos":[490.4385070800781,2068.794921875],"size":[410.5992736816406,95.68482208251953],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[1],"slot_index":0}],"properties":{"Node name for S&R":"PandasLoadCSV"},"widgets_values":["./custom_nodes/data-analysis/examples/datasets/fruit.csv"]},{"id":2,"type":"PandasShowDataFrame","pos":[1063.93798828125,2068.40283203125],"size":[323.9862976074219,238.33462524414062],"flags":{},"order":1,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":1,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Name Price InStock OnSale\n0 fig 4.11 1.0 1\n1 safou 1.24 1.0 0\n2 papaya 5.11 1.0 1\n3 plum 2.53 1.0 1\n4 guava 0.66 1.0 1\n.. ... ... ... ...\n95 black currant 8.15 0.0 1\n96 red currant 7.71 0.0 1\n97 black currant 4.41 1.0 0\n98 red currant 2.18 0.0 0\n99 black currant 0.80 1.0 1\n\n[100 rows x 4 columns]"]}],"links":[[1,1,0,2,0,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":1.1498879805425606,"offset":[-454.3122480950786,-1970.7113583389635]},"node_versions":{"ComfyUI-Data-Analysis":"235c84b7b8aafc3c4b904ba8f03c89aade96b640"},"ue_links":[]},"version":0.4} \ No newline at end of file +{"last_node_id":2,"last_link_id":2,"nodes":[{"id":2,"type":"PandasShowDataFrame","pos":[1063.93798828125,2068.40283203125],"size":[323.9862976074219,238.33462524414062],"flags":{},"order":1,"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":[" Name Price InStock OnSale\n0 fig 4.11 1 1\n1 safou 1.24 1 0\n2 papaya 5.11 1 1\n3 plum 2.53 1 1\n4 guava 0.66 1 1\n.. ... ... ... ...\n95 black currant 8.15 0 1\n96 red currant 7.71 0 1\n97 black currant 4.41 1 0\n98 red currant 2.18 0 0\n99 black currant 0.80 1 1\n\n[100 rows x 4 columns]"]},{"id":1,"type":"PandasLoadCSV","pos":[490.4385070800781,2068.794921875],"size":[410.5992736816406,95.68482208251953],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[2],"slot_index":0}],"properties":{"Node name for S&R":"PandasLoadCSV"},"widgets_values":["./custom_nodes/data-analysis/examples/datasets/fruit.csv"]}],"links":[[2,1,0,2,0,"DATAFRAME"]],"groups":[],"config":{},"extra":{"ds":{"scale":1.2429202682416007,"offset":[-395.062420203444,-1847.5073301150765]},"node_versions":{"data-analysis":"a12de2f44c180d9136ec09572803a0fc525f7c9a"},"ue_links":[]},"version":0.4} \ No newline at end of file diff --git a/examples/workflows/loc_cell_str.json b/examples/workflows/loc_cell_str.json index 44d0840..e06e2c7 100644 --- a/examples/workflows/loc_cell_str.json +++ b/examples/workflows/loc_cell_str.json @@ -1 +1 @@ -{"last_node_id":12,"last_link_id":8,"nodes":[{"id":8,"type":"PandasShowText","pos":[3.62848162651062,1602.7939453125],"size":[210,78.36762237548828],"flags":{},"order":6,"mode":0,"inputs":[{"name":"text","type":"STRING","link":5,"widget":{"name":"text"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowText"},"widgets_values":["","30"]},{"id":3,"type":"PandasCreateWithIndex","pos":[-607.1369018554688,1436.66015625],"size":[210,136.70285034179688],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[2,4],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreateWithIndex"},"widgets_values":["index,A,B\nUS,1,10\nFrance,2,20\nGermany,3,30",0]},{"id":4,"type":"PandasShowDataFrame","pos":[-288.99395751953125,1434.0804443359375],"size":[210,116.62158966064453],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":2,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," A B\nUS 1 10\nFrance 2 20\nGermany 3 30"]},{"id":10,"type":"PandasShowDataFrame","pos":[-293.0326232910156,1839.1920166015625],"size":[210,116.62158966064453],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":7,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," A B\n0 10 100\n1 20 200\n2 30 300"]},{"id":12,"type":"PandasShowText","pos":[8.03433609008789,2006.485107421875],"size":[210,78.36762237548828],"flags":{},"order":7,"mode":0,"inputs":[{"name":"text","type":"STRING","link":6,"widget":{"name":"text"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowText"},"widgets_values":["","30"]},{"id":11,"type":"PandasLocCellStr","pos":[-291.8468933105469,2007.802734375],"size":[267.4131774902344,156.59359741210938],"flags":{},"order":5,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":8,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[6],"slot_index":0}],"properties":{"Node name for S&R":"PandasLocCellStr"},"widgets_values":["","2","int","A","string"]},{"id":7,"type":"PandasLocCellStr","pos":[-294.200927734375,1601.82275390625],"size":[267.4131774902344,156.59359741210938],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":4,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[5],"slot_index":0}],"properties":{"Node name for S&R":"PandasLocCellStr"},"widgets_values":["","Germany","string","B","string"]},{"id":9,"type":"PandasCreate","pos":[-610.7672119140625,1838.9556884765625],"size":[210,113.97640228271484],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[7,8],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreate"},"widgets_values":["A,B\n10,100\n20,200\n30,300"]}],"links":[[2,3,0,4,0,"STRING"],[4,3,0,7,0,"STRING"],[5,7,0,8,0,"STRING"],[6,11,0,12,0,"STRING"],[7,9,0,10,0,"STRING"],[8,9,0,11,0,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.863927859160454,"offset":[1091.6818551119054,-1331.0653891577363]},"node_versions":{"data-analysis":"d484a368b2c6ce687911c30d1325c680758e7a24"},"ue_links":[]},"version":0.4} \ No newline at end of file +{"last_node_id":12,"last_link_id":12,"nodes":[{"id":4,"type":"PandasShowDataFrame","pos":[-288.99395751953125,1434.0804443359375],"size":[210,116.62158966064453],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":9}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\nindex \nUS 1 10\nFrance 2 20\nGermany 3 30"]},{"id":10,"type":"PandasShowDataFrame","pos":[-293.0326232910156,1839.1920166015625],"size":[210,116.62158966064453],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":11}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 10 100\n1 20 200\n2 30 300"]},{"id":12,"type":"PandasShowText","pos":[8.03433609008789,2006.485107421875],"size":[210,78.36762237548828],"flags":{},"order":7,"mode":0,"inputs":[{"name":"text","type":"STRING","link":6,"widget":{"name":"text"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowText"},"widgets_values":["","300"]},{"id":3,"type":"PandasCreateWithIndex","pos":[-607.1369018554688,1436.66015625],"size":[210,136.70285034179688],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[9,10],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreateWithIndex"},"widgets_values":["index,A,B\nUS,1,10\nFrance,2,20\nGermany,3,30",0]},{"id":9,"type":"PandasCreate","pos":[-610.7672119140625,1838.9556884765625],"size":[210,113.97640228271484],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[11,12],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreate"},"widgets_values":["A,B\n10,100\n20,200\n30,300"]},{"id":8,"type":"PandasShowText","pos":[31.128482818603516,1601.9605712890625],"size":[210,78.36762237548828],"flags":{},"order":6,"mode":0,"inputs":[{"name":"text","type":"STRING","link":5,"widget":{"name":"text"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowText"},"widgets_values":["","2"]},{"id":7,"type":"PandasLocCellStr","pos":[-294.200927734375,1601.82275390625],"size":[267.4131774902344,156.59359741210938],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":10}],"outputs":[{"name":"STRING","type":"STRING","links":[5],"slot_index":0}],"properties":{"Node name for S&R":"PandasLocCellStr"},"widgets_values":["France","string","A","string"]},{"id":11,"type":"PandasLocCellStr","pos":[-291.8468933105469,2007.802734375],"size":[267.4131774902344,156.59359741210938],"flags":{},"order":5,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":12}],"outputs":[{"name":"STRING","type":"STRING","links":[6],"slot_index":0}],"properties":{"Node name for S&R":"PandasLocCellStr"},"widgets_values":["2","int","B","string"]}],"links":[[5,7,0,8,0,"STRING"],[6,11,0,12,0,"STRING"],[9,3,0,4,0,"DATAFRAME"],[10,3,0,7,0,"DATAFRAME"],[11,9,0,10,0,"DATAFRAME"],[12,9,0,11,0,"DATAFRAME"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.7513148009015777,"offset":[1088.4491616447604,-1273.2553677671845]},"node_versions":{"data-analysis":"179365cb232c7f234cf9b9f0adcd7f63d2fd5f1d"},"ue_links":[]},"version":0.4} \ No newline at end of file diff --git a/examples/workflows/loc_row_series.json b/examples/workflows/loc_row_series.json index 8535167..cdebb4c 100644 --- a/examples/workflows/loc_row_series.json +++ b/examples/workflows/loc_row_series.json @@ -1 +1 @@ -{"last_node_id":18,"last_link_id":16,"nodes":[{"id":14,"type":"PandasSeriesToString","pos":[-75.9743423461914,1615.0836181640625],"size":[210,39.39631271362305],"flags":{},"order":6,"mode":0,"inputs":[{"name":"series_json","type":"STRING","link":12,"widget":{"name":"series_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[13],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasSeriesToString"},"widgets_values":[""]},{"id":10,"type":"PandasShowDataFrame","pos":[-332.0985412597656,1870.44482421875],"size":[210,116.62158966064453],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":7,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," A B\n0 1 10\n1 2 2345678\n2 3 30"]},{"id":8,"type":"PandasShowText","pos":[175.51785278320312,1615.8155517578125],"size":[210,101.80709075927734],"flags":{},"order":8,"mode":0,"inputs":[{"name":"text","type":"STRING","link":13,"widget":{"name":"text"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowText"},"widgets_values":["","A 2\nB 123456\nName: France, dtype: int64"]},{"id":16,"type":"PandasSeriesToString","pos":[-49.06276321411133,2046.5435791015625],"size":[210,39.39631271362305],"flags":{},"order":7,"mode":0,"inputs":[{"name":"series_json","type":"STRING","link":14,"widget":{"name":"series_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[16],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasSeriesToString"},"widgets_values":[""]},{"id":17,"type":"PandasShowText","pos":[201.8267822265625,2044.7362060546875],"size":[210,101.80709075927734],"flags":{},"order":9,"mode":0,"inputs":[{"name":"text","type":"STRING","link":16,"widget":{"name":"text"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowText"},"widgets_values":["","A 2\nB 2345678\nName: 1, dtype: int64"]},{"id":4,"type":"PandasShowDataFrame","pos":[-331.5325012207031,1436.6846923828125],"size":[210,116.62158966064453],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":2,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," A B\nUS 1 10\nFrance 2 123456\nGermany 3 30"]},{"id":3,"type":"PandasCreateWithIndex","pos":[-594.9833374023438,1436.66015625],"size":[210,136.70285034179688],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[2,11],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasCreateWithIndex"},"widgets_values":["index,A,B\nUS,1,10\nFrance,2,123456\nGermany,3,30",0]},{"id":9,"type":"PandasCreate","pos":[-609.8991088867188,1870.20849609375],"size":[210,113.97640228271484],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[7,15],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasCreate"},"widgets_values":["A,B\n1,10\n2,2345678\n3,30"]},{"id":13,"type":"PandasLocRowSeries","pos":[-337.280517578125,1615.083251953125],"size":[221.5128936767578,82.3223648071289],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":11,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[12],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasLocRowSeries"},"widgets_values":["","France","string"]},{"id":15,"type":"PandasLocRowSeries","pos":[-323.39080810546875,2047.4111328125],"size":[219.60301208496094,89.9618911743164],"flags":{},"order":5,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":15,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[14],"slot_index":0,"localized_name":"STRING"}],"properties":{"Node name for S&R":"PandasLocRowSeries"},"widgets_values":["","1","int"]}],"links":[[2,3,0,4,0,"STRING"],[7,9,0,10,0,"STRING"],[11,3,0,13,0,"STRING"],[12,13,0,14,0,"STRING"],[13,14,0,8,0,"STRING"],[14,15,0,16,0,"STRING"],[15,9,0,15,0,"STRING"],[16,16,0,17,0,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.7853889628731393,"offset":[968.8282590918203,-1332.2955501507915]},"node_versions":{"data-analysis":"29af129ba3913df6cabbb3b7536c61317426759e"},"ue_links":[]},"version":0.4} \ No newline at end of file +{"last_node_id":20,"last_link_id":22,"nodes":[{"id":4,"type":"PandasShowDataFrame","pos":[-331.5325012207031,1436.6846923828125],"size":[210,116.62158966064453],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":17}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\nindex \nUS 1 10\nFrance 2 123456\nGermany 3 30"]},{"id":3,"type":"PandasCreateWithIndex","pos":[-594.9833374023438,1436.66015625],"size":[210,136.70285034179688],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[17,18],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreateWithIndex"},"widgets_values":["index,A,B\nUS,1,10\nFrance,2,123456\nGermany,3,30",0]},{"id":9,"type":"PandasCreate","pos":[-609.8991088867188,1870.20849609375],"size":[210,113.97640228271484],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[21,22],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreate"},"widgets_values":["A,B\n1,10\n2,2345678\n3,30"]},{"id":13,"type":"PandasLocRowSeries","pos":[-337.280517578125,1615.083251953125],"size":[221.5128936767578,82.3223648071289],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":18}],"outputs":[{"name":"PDSERIES","type":"PDSERIES","links":[19],"slot_index":0}],"properties":{"Node name for S&R":"PandasLocRowSeries"},"widgets_values":["France","string"]},{"id":10,"type":"PandasShowDataFrame","pos":[-319.4935302734375,1858.7398681640625],"size":[210,116.62158966064453],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":21}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B\n0 1 10\n1 2 2345678\n2 3 30"]},{"id":15,"type":"PandasLocRowSeries","pos":[-323.39080810546875,2047.4111328125],"size":[219.60301208496094,89.9618911743164],"flags":{},"order":5,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":22}],"outputs":[{"name":"PDSERIES","type":"PDSERIES","links":[20],"slot_index":0}],"properties":{"Node name for S&R":"PandasLocRowSeries"},"widgets_values":["2","int"]},{"id":20,"type":"PandasShowSeries","pos":[29.481536865234375,2052.40966796875],"size":[381.8376159667969,80.89225769042969],"flags":{},"order":7,"mode":0,"inputs":[{"name":"series_list","type":"PDSERIES","link":20}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["{\"array\": [3, 30], \"index\": [\"A\", \"B\"], \"name\": 2}"]},{"id":19,"type":"PandasShowSeries","pos":[-17.823482513427734,1619.227294921875],"size":[432.7168884277344,80.89221954345703],"flags":{},"order":6,"mode":0,"inputs":[{"name":"series_list","type":"PDSERIES","link":19}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["{\"array\": [2, 123456], \"index\": [\"A\", \"B\"], \"name\": \"France\"}"]}],"links":[[17,3,0,4,0,"DATAFRAME"],[18,3,0,13,0,"DATAFRAME"],[19,13,0,19,0,"PDSERIES"],[20,15,0,20,0,"PDSERIES"],[21,9,0,10,0,"DATAFRAME"],[22,9,0,15,0,"DATAFRAME"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.8516904504832646,"offset":[1057.1888573958222,-1271.5413411458335]},"node_versions":{"data-analysis":"5a3046eb053b45f337768f0641e34bdb90450562"},"ue_links":[]},"version":0.4} \ No newline at end of file diff --git a/examples/workflows/select_subset.json b/examples/workflows/select_subset.json index 5e025ab..409f6ae 100644 --- a/examples/workflows/select_subset.json +++ b/examples/workflows/select_subset.json @@ -1 +1 @@ -{"last_node_id":5,"last_link_id":5,"nodes":[{"id":1,"type":"PandasLoadCSV","pos":[353.8526611328125,2105.062255859375],"size":[410.5992736816406,95.68482208251953],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[2,4],"slot_index":0}],"properties":{"Node name for S&R":"PandasLoadCSV"},"widgets_values":["./custom_nodes/data-analysis/examples/datasets/fruit.csv"]},{"id":3,"type":"PandasSelectColumns","pos":[792.3731079101562,1956.5699462890625],"size":[349.8414306640625,115.1163558959961],"flags":{},"order":1,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":2,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[3],"slot_index":0}],"properties":{"Node name for S&R":"PandasSelectColumns"},"widgets_values":["","Name, Price"]},{"id":2,"type":"PandasShowDataFrame","pos":[1223.672119140625,1952.651123046875],"size":[323.9862976074219,238.33462524414062],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":3,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Name Price\n0 fig 4.11\n1 safou 1.24\n2 papaya 5.11\n3 plum 2.53\n4 guava 0.66\n.. ... ...\n95 black currant 8.15\n96 red currant 7.71\n97 black currant 4.41\n98 red currant 2.18\n99 black currant 0.80\n\n[100 rows x 2 columns]"]},{"id":4,"type":"PandasSelectRows","pos":[780.7979125976562,2289.15966796875],"size":[390.7399597167969,111.2580337524414],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":4,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[5],"slot_index":0}],"properties":{"Node name for S&R":"PandasSelectRows"},"widgets_values":["","Price < 1"]},{"id":5,"type":"PandasShowDataFrame","pos":[1231.45263671875,2293.01708984375],"size":[301.1099548339844,161.65524291992188],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":5,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Name Price InStock OnSale\n4 guava 0.66 1 1\n8 pawpaw 0.66 1 1\n17 orange 0.54 0 1\n78 santol 0.79 1 1\n91 black currant 0.51 1 0\n99 black currant 0.80 1 1"]}],"links":[[2,1,0,3,0,"STRING"],[3,3,0,2,0,"STRING"],[4,1,0,4,0,"STRING"],[5,4,0,5,0,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.8639278591604511,"offset":[-331.6863902845917,-1872.4571513539743]},"node_versions":{"ComfyUI-Data-Analysis":"235c84b7b8aafc3c4b904ba8f03c89aade96b640"},"ue_links":[]},"version":0.4} \ No newline at end of file +{"last_node_id":9,"last_link_id":13,"nodes":[{"id":1,"type":"PandasLoadCSV","pos":[-86.53921508789062,1982.6943359375],"size":[410.5992736816406,95.68482208251953],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[6,7,12,13],"slot_index":0}],"properties":{"Node name for S&R":"PandasLoadCSV"},"widgets_values":["./custom_nodes/data-analysis/examples/datasets/fruit.csv"]},{"id":6,"type":"PandasColumns","pos":[109.43521118164062,1825.09326171875],"size":[216.59999084472656,26],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":12}],"outputs":[{"name":"PDINDEX","type":"PDINDEX","links":[10],"slot_index":0}],"properties":{"Node name for S&R":"PandasColumns"},"widgets_values":[]},{"id":3,"type":"PandasSelectColumns","pos":[792.3731079101562,1975.04443359375],"size":[349.8414306640625,115.1163558959961],"flags":{},"order":1,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":6}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[8],"slot_index":0}],"properties":{"Node name for S&R":"PandasSelectColumns"},"widgets_values":["Name, Price"]},{"id":2,"type":"PandasShowDataFrame","pos":[1224.7589111328125,1972.2122802734375],"size":[323.9862976074219,238.33462524414062],"flags":{},"order":5,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":8}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Name Price\n0 fig 4.11\n1 safou 1.24\n2 papaya 5.11\n3 plum 2.53\n4 guava 0.66\n.. ... ...\n95 black currant 8.15\n96 red currant 7.71\n97 black currant 4.41\n98 red currant 2.18\n99 black currant 0.80\n\n[100 rows x 2 columns]"]},{"id":7,"type":"PandasIndex","pos":[99.6207275390625,2186.529541015625],"size":[216.59999084472656,26],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":13}],"outputs":[{"name":"PDINDEX","type":"PDINDEX","links":[11],"slot_index":0}],"properties":{"Node name for S&R":"PandasIndex"},"widgets_values":[]},{"id":9,"type":"PandasShowIndex","pos":[383.8125915527344,2184.78271484375],"size":[262.8389892578125,76],"flags":{},"order":8,"mode":0,"inputs":[{"name":"index_list","type":"PDINDEX","link":11}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowIndex"},"widgets_values":["RangeIndex(start=0, stop=100, step=1)"]},{"id":4,"type":"PandasSelectRows","pos":[780.7979125976562,2289.15966796875],"size":[390.7399597167969,111.2580337524414],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":7}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[9],"slot_index":0}],"properties":{"Node name for S&R":"PandasSelectRows"},"widgets_values":["Price < 1"]},{"id":5,"type":"PandasShowDataFrame","pos":[1224.93212890625,2289.757080078125],"size":[311.3125305175781,171.71414184570312],"flags":{},"order":6,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":9}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Name Price InStock OnSale\n4 guava 0.66 1 1\n8 pawpaw 0.66 1 1\n17 orange 0.54 0 1\n78 santol 0.79 1 1\n91 black currant 0.51 1 0\n99 black currant 0.80 1 1"]},{"id":8,"type":"PandasShowIndex","pos":[361.7475280761719,1823.6331787109375],"size":[404.7411804199219,76],"flags":{},"order":7,"mode":0,"inputs":[{"name":"index_list","type":"PDINDEX","link":10}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowIndex"},"widgets_values":["Index(['Name', 'Price', 'InStock', 'OnSale'], dtype='object')"]}],"links":[[6,1,0,3,0,"DATAFRAME"],[7,1,0,4,0,"DATAFRAME"],[8,3,0,2,0,"DATAFRAME"],[9,4,0,5,0,"DATAFRAME"],[10,6,0,8,0,"PDINDEX"],[11,7,0,9,0,"PDINDEX"],[12,1,0,6,0,"DATAFRAME"],[13,1,0,7,0,"DATAFRAME"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.8435152048711749,"offset":[174.05797315870998,-1626.329224340914]},"node_versions":{"data-analysis":"1cefaf924bf9c92e0fbe79a9fd02aca04390ee57"},"ue_links":[]},"version":0.4} \ No newline at end of file diff --git a/examples/workflows/sort.json b/examples/workflows/sort.json index a605975..a006fb2 100644 --- a/examples/workflows/sort.json +++ b/examples/workflows/sort.json @@ -1 +1 @@ -{"last_node_id":8,"last_link_id":11,"nodes":[{"id":1,"type":"PandasLoadCSV","pos":[341.50604248046875,1996.256103515625],"size":[410.5992736816406,95.68482208251953],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[6],"slot_index":0}],"properties":{"Node name for S&R":"PandasLoadCSV"},"widgets_values":["./custom_nodes/data-analysis/examples/datasets/fruit.csv"]},{"id":6,"type":"PandasSort","pos":[797.7749633789062,1987.430908203125],"size":[210,132.86476135253906],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":6,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[8,10],"slot_index":0}],"properties":{"Node name for S&R":"PandasSort"},"widgets_values":["","Price",false]},{"id":7,"type":"PandasHead","pos":[794.6879272460938,2368.64111328125],"size":[210,91.96627807617188],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":10,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[11],"slot_index":0}],"properties":{"Node name for S&R":"PandasHead"},"widgets_values":["",3]},{"id":8,"type":"MarkdownNote","pos":[786.199462890625,2250.57421875],"size":[227.97030639648438,68.48837280273438],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Show top 3"],"color":"#432","bgcolor":"#653"},{"id":2,"type":"PandasShowDataFrame","pos":[1094.8031005859375,1988.14794921875],"size":[323.9862976074219,238.33462524414062],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":8,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Name Price InStock OnSale\n34 mulberry 12.91 0 1\n77 apple 12.85 0 0\n49 grumichama 12.64 1 0\n47 rambutan 12.39 1 1\n15 kiwi 12.25 0 0\n.. ... ... ... ...\n78 santol 0.79 1 1\n8 pawpaw 0.66 1 1\n4 guava 0.66 1 1\n17 orange 0.54 0 1\n91 black currant 0.51 1 0\n\n[100 rows x 4 columns]"]},{"id":5,"type":"PandasShowDataFrame","pos":[1105.6707763671875,2374.0419921875],"size":[288.7632141113281,130.78851318359375],"flags":{},"order":5,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":11,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," Name Price InStock OnSale\n34 mulberry 12.91 0 1\n77 apple 12.85 0 0\n49 grumichama 12.64 1 0"]}],"links":[[6,1,0,6,0,"STRING"],[8,6,0,2,0,"STRING"],[10,6,0,7,0,"STRING"],[11,7,0,5,0,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.8639278591604511,"offset":[-331.6863902845917,-1872.4571513539743]},"node_versions":{"ComfyUI-Data-Analysis":"235c84b7b8aafc3c4b904ba8f03c89aade96b640"},"ue_links":[]},"version":0.4} \ No newline at end of file +{"last_node_id":8,"last_link_id":16,"nodes":[{"id":8,"type":"MarkdownNote","pos":[786.199462890625,2250.57421875],"size":[227.97030639648438,68.48837280273438],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[],"properties":{},"widgets_values":["# Show top 3"],"color":"#432","bgcolor":"#653"},{"id":2,"type":"PandasShowDataFrame","pos":[1094.8031005859375,1988.14794921875],"size":[323.9862976074219,238.33462524414062],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":13}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Name Price InStock OnSale\n34 mulberry 12.91 0 1\n77 apple 12.85 0 0\n49 grumichama 12.64 1 0\n47 rambutan 12.39 1 1\n15 kiwi 12.25 0 0\n.. ... ... ... ...\n78 santol 0.79 1 1\n8 pawpaw 0.66 1 1\n4 guava 0.66 1 1\n17 orange 0.54 0 1\n91 black currant 0.51 1 0\n\n[100 rows x 4 columns]"]},{"id":5,"type":"PandasShowDataFrame","pos":[1105.6707763671875,2374.0419921875],"size":[288.7632141113281,130.78851318359375],"flags":{},"order":5,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":15}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" Name Price InStock OnSale\n34 mulberry 12.91 0 1\n77 apple 12.85 0 0\n49 grumichama 12.64 1 0"]},{"id":1,"type":"PandasLoadCSV","pos":[341.50604248046875,1996.256103515625],"size":[410.5992736816406,95.68482208251953],"flags":{},"order":1,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[12],"slot_index":0}],"properties":{"Node name for S&R":"PandasLoadCSV"},"widgets_values":["./custom_nodes/data-analysis/examples/datasets/fruit.csv"]},{"id":6,"type":"PandasSort","pos":[797.7749633789062,1987.430908203125],"size":[210,132.86476135253906],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":12}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[13,16],"slot_index":0}],"properties":{"Node name for S&R":"PandasSort"},"widgets_values":["Price",false]},{"id":7,"type":"PandasHead","pos":[794.6879272460938,2368.64111328125],"size":[210,91.96627807617188],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":16}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[15],"slot_index":0}],"properties":{"Node name for S&R":"PandasHead"},"widgets_values":[3]}],"links":[[12,1,0,6,0,"DATAFRAME"],[13,6,0,2,0,"DATAFRAME"],[15,7,0,5,0,"DATAFRAME"],[16,6,0,7,0,"DATAFRAME"]],"groups":[],"config":{},"extra":{"ds":{"scale":1,"offset":[-69.78740166232475,-1815.0490843278296]},"node_versions":{"data-analysis":"1cefaf924bf9c92e0fbe79a9fd02aca04390ee57"},"ue_links":[]},"version":0.4} \ No newline at end of file diff --git a/examples/workflows/summary_statistics.json b/examples/workflows/summary_statistics.json index e1b40e2..4576cb2 100644 --- a/examples/workflows/summary_statistics.json +++ b/examples/workflows/summary_statistics.json @@ -1 +1 @@ -{"last_node_id":31,"last_link_id":31,"nodes":[{"id":28,"type":"PandasShowSeries","pos":[-415.3694763183594,1932.43359375],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":13,"mode":0,"inputs":[{"name":"series_json","type":"STRING","link":25,"widget":{"name":"series_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["","{\"array\": [16.0, 101.1, 351.2], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":27,"type":"PandasShowSeries","pos":[-408.4590759277344,2071.62353515625],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":14,"mode":0,"inputs":[{"name":"series_json","type":"STRING","link":26,"widget":{"name":"series_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["","{\"array\": [6, 6, 6], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":26,"type":"PandasShowSeries","pos":[-403.81671142578125,2213.937255859375],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":15,"mode":0,"inputs":[{"name":"series_json","type":"STRING","link":27,"widget":{"name":"series_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["","{\"array\": [2.6666666666666665, 16.849999999999998, 58.53333333333333], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":25,"type":"PandasShowSeries","pos":[-399.9659423828125,2354.312255859375],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":16,"mode":0,"inputs":[{"name":"series_json","type":"STRING","link":28,"widget":{"name":"series_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["","{\"array\": [2.5, 17.5, 65.0], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":14,"type":"PandasShowSeries","pos":[-405.37396240234375,2862.830322265625],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":10,"mode":0,"inputs":[{"name":"series_json","type":"STRING","link":13,"widget":{"name":"series_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["","{\"array\": [1.632993161855452, 10.465896999302066, 31.446886438352948], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":23,"type":"PandasShowSeries","pos":[-405.5749816894531,2701.80517578125],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":18,"mode":0,"inputs":[{"name":"series_json","type":"STRING","link":30,"widget":{"name":"series_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["","{\"array\": [2.666666666666667, 109.535, 988.9066666666665], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":15,"type":"PandasMin","pos":[-720.0925903320312,1628.4970703125],"size":[210,46],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":15,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[23],"slot_index":0}],"properties":{"Node name for S&R":"PandasMin"},"widgets_values":[""]},{"id":29,"type":"PandasShowSeries","pos":[-422.8512268066406,1787.0130615234375],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":12,"mode":0,"inputs":[{"name":"series_json","type":"STRING","link":24,"widget":{"name":"series_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["","{\"array\": [5.0, 30.0, 90.0], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":22,"type":"PandasVar","pos":[-705.844482421875,2697.947265625],"size":[210,51.45679473876953],"flags":{},"order":9,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":22,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[30],"slot_index":0}],"properties":{"Node name for S&R":"PandasVar"},"widgets_values":[""]},{"id":11,"type":"PandasStd","pos":[-705.8277587890625,2862.27001953125],"size":[210,46],"flags":{},"order":1,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":10,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[13],"slot_index":0}],"properties":{"Node name for S&R":"PandasStd"},"widgets_values":[""]},{"id":21,"type":"PandasMode","pos":[-716.1126708984375,2489.3876953125],"size":[210,46],"flags":{},"order":8,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":21,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[31],"slot_index":0}],"properties":{"Node name for S&R":"PandasMode"},"widgets_values":[""]},{"id":19,"type":"PandasMedian","pos":[-711.084716796875,2352.453857421875],"size":[210,46],"flags":{},"order":7,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":20,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[28],"slot_index":0}],"properties":{"Node name for S&R":"PandasMedian"},"widgets_values":[""]},{"id":20,"type":"PandasMean","pos":[-708.3650512695312,2212.2548828125],"size":[210,46],"flags":{},"order":6,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":19,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[27],"slot_index":0}],"properties":{"Node name for S&R":"PandasMean"},"widgets_values":[""]},{"id":18,"type":"PandasCount","pos":[-713.810302734375,2074.4892578125],"size":[210,46],"flags":{},"order":5,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":18,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[26],"slot_index":0}],"properties":{"Node name for S&R":"PandasCount"},"widgets_values":[""]},{"id":17,"type":"PandasSum","pos":[-708.5211181640625,1936.2083740234375],"size":[210,46],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":17,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[25],"slot_index":0}],"properties":{"Node name for S&R":"PandasSum"},"widgets_values":[""]},{"id":16,"type":"PandasMax","pos":[-716.6470336914062,1790.6435546875],"size":[210,46],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":16,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":[24],"slot_index":0}],"properties":{"Node name for S&R":"PandasMax"},"widgets_values":[""]},{"id":30,"type":"PandasShowSeries","pos":[-419.97979736328125,1625.7716064453125],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":11,"mode":0,"inputs":[{"name":"series_json","type":"STRING","link":23,"widget":{"name":"series_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["","{\"array\": [1.0, 1.1, 1.2], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":31,"type":"PandasShowDataFrame","pos":[-402.2547912597656,2487.5908203125],"size":[458.6945495605469,155.69699096679688],"flags":{},"order":17,"mode":0,"inputs":[{"name":"dataframe_json","type":"STRING","link":31,"widget":{"name":"dataframe_json"}}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[""," A B C\n0 1.0 1.1 1.2\n1 NaN 10.0 50.0\n2 NaN 15.0 60.0\n3 NaN 20.0 70.0\n4 NaN 25.0 80.0\n5 NaN 30.0 90.0"]},{"id":10,"type":"PandasCreate","pos":[-1051.1636962890625,1629.7008056640625],"size":[210,152.64755249023438],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"STRING","type":"STRING","links":[10,15,16,17,18,19,20,21,22],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreate"},"widgets_values":["A,B,C\n1, 1.1, 1.2\n1, 10, 50\n2, 15, 60\n3, 20, 70\n4, 25, 80\n5, 30, 90"]}],"links":[[10,10,0,11,0,"STRING"],[13,11,0,14,0,"STRING"],[15,10,0,15,0,"STRING"],[16,10,0,16,0,"STRING"],[17,10,0,17,0,"STRING"],[18,10,0,18,0,"STRING"],[19,10,0,20,0,"STRING"],[20,10,0,19,0,"STRING"],[21,10,0,21,0,"STRING"],[22,10,0,22,0,"STRING"],[23,15,0,30,0,"STRING"],[24,16,0,29,0,"STRING"],[25,17,0,28,0,"STRING"],[26,18,0,27,0,"STRING"],[27,20,0,26,0,"STRING"],[28,19,0,25,0,"STRING"],[30,22,0,23,0,"STRING"],[31,21,0,31,0,"STRING"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.6830134553650705,"offset":[1528.0972449918231,-1148.155311578934]},"node_versions":{"data-analysis":"b3ed83925193071e4380e085056fb93bde54b2a0"},"ue_links":[]},"version":0.4} \ No newline at end of file +{"last_node_id":31,"last_link_id":49,"nodes":[{"id":28,"type":"PandasShowSeries","pos":[-415.3694763183594,1932.43359375],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":12,"mode":0,"inputs":[{"name":"series_list","type":"PDSERIES","link":43}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["{\"array\": [16.0, 101.00999999999999, 351.02], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":27,"type":"PandasShowSeries","pos":[-408.4590759277344,2071.62353515625],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":13,"mode":0,"inputs":[{"name":"series_list","type":"PDSERIES","link":44}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["{\"array\": [6, 6, 6], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":26,"type":"PandasShowSeries","pos":[-403.81671142578125,2213.937255859375],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":14,"mode":0,"inputs":[{"name":"series_list","type":"PDSERIES","link":45}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["{\"array\": [2.6666666666666665, 16.834999999999997, 58.50333333333333], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":25,"type":"PandasShowSeries","pos":[-399.9659423828125,2354.312255859375],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":15,"mode":0,"inputs":[{"name":"series_list","type":"PDSERIES","link":46}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["{\"array\": [2.5, 17.5, 65.0], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":14,"type":"PandasShowSeries","pos":[-405.37396240234375,2862.830322265625],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":18,"mode":0,"inputs":[{"name":"series_list","type":"PDSERIES","link":49}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["{\"array\": [1.632993161855452, 10.493014342885461, 31.51253824538205], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":23,"type":"PandasShowSeries","pos":[-405.5749816894531,2701.80517578125],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":17,"mode":0,"inputs":[{"name":"series_list","type":"PDSERIES","link":48}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["{\"array\": [2.666666666666667, 110.10335, 993.0400666666665], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":29,"type":"PandasShowSeries","pos":[-422.8512268066406,1787.0130615234375],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":11,"mode":0,"inputs":[{"name":"series_list","type":"PDSERIES","link":42}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["{\"array\": [5.0, 30.0, 90.0], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":30,"type":"PandasShowSeries","pos":[-419.97979736328125,1625.7716064453125],"size":[457.93426513671875,79.50759887695312],"flags":{},"order":10,"mode":0,"inputs":[{"name":"series_list","type":"PDSERIES","link":41}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowSeries"},"widgets_values":["{\"array\": [1.0, 1.01, 1.02], \"index\": [\"A\", \"B\", \"C\"], \"name\": null}"]},{"id":31,"type":"PandasShowDataFrame","pos":[-402.2547912597656,2487.5908203125],"size":[458.6945495605469,155.69699096679688],"flags":{},"order":16,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":47}],"outputs":[{"name":"STRING","type":"STRING","links":null,"shape":6}],"properties":{"Node name for S&R":"PandasShowDataFrame"},"widgets_values":[" A B C\n0 1.0 1.01 1.02\n1 NaN 10.00 50.00\n2 NaN 15.00 60.00\n3 NaN 20.00 70.00\n4 NaN 25.00 80.00\n5 NaN 30.00 90.00"]},{"id":15,"type":"PandasMin","pos":[-720.0925903320312,1628.4970703125],"size":[210,46],"flags":{},"order":1,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":32}],"outputs":[{"name":"PDSERIES","type":"PDSERIES","links":[41],"slot_index":0}],"properties":{"Node name for S&R":"PandasMin"},"widgets_values":[]},{"id":16,"type":"PandasMax","pos":[-716.6470336914062,1790.6435546875],"size":[210,46],"flags":{},"order":2,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":33}],"outputs":[{"name":"PDSERIES","type":"PDSERIES","links":[42],"slot_index":0}],"properties":{"Node name for S&R":"PandasMax"},"widgets_values":[]},{"id":17,"type":"PandasSum","pos":[-708.5211181640625,1936.2083740234375],"size":[210,46],"flags":{},"order":3,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":34}],"outputs":[{"name":"PDSERIES","type":"PDSERIES","links":[43],"slot_index":0}],"properties":{"Node name for S&R":"PandasSum"},"widgets_values":[]},{"id":18,"type":"PandasCount","pos":[-713.810302734375,2074.4892578125],"size":[210,46],"flags":{},"order":4,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":35}],"outputs":[{"name":"PDSERIES","type":"PDSERIES","links":[44],"slot_index":0}],"properties":{"Node name for S&R":"PandasCount"},"widgets_values":[]},{"id":20,"type":"PandasMean","pos":[-708.3650512695312,2212.2548828125],"size":[210,46],"flags":{},"order":5,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":36}],"outputs":[{"name":"PDSERIES","type":"PDSERIES","links":[45],"slot_index":0}],"properties":{"Node name for S&R":"PandasMean"},"widgets_values":[]},{"id":19,"type":"PandasMedian","pos":[-711.084716796875,2352.453857421875],"size":[210,46],"flags":{},"order":6,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":37}],"outputs":[{"name":"PDSERIES","type":"PDSERIES","links":[46],"slot_index":0}],"properties":{"Node name for S&R":"PandasMedian"},"widgets_values":[]},{"id":21,"type":"PandasMode","pos":[-716.1126708984375,2489.3876953125],"size":[210,46],"flags":{},"order":7,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":38}],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[47],"slot_index":0}],"properties":{"Node name for S&R":"PandasMode"},"widgets_values":[]},{"id":22,"type":"PandasVar","pos":[-705.844482421875,2697.947265625],"size":[210,51.45679473876953],"flags":{},"order":8,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":39}],"outputs":[{"name":"PDSERIES","type":"PDSERIES","links":[48],"slot_index":0}],"properties":{"Node name for S&R":"PandasVar"},"widgets_values":[]},{"id":10,"type":"PandasCreate","pos":[-1149.800048828125,2188.6865234375],"size":[210,152.64755249023438],"flags":{},"order":0,"mode":0,"inputs":[],"outputs":[{"name":"DATAFRAME","type":"DATAFRAME","links":[32,33,34,35,36,37,38,39,40],"slot_index":0}],"properties":{"Node name for S&R":"PandasCreate"},"widgets_values":["A,B,C\n1, 1.01, 1.02\n1, 10, 50\n2, 15, 60\n3, 20, 70\n4, 25, 80\n5, 30, 90"]},{"id":11,"type":"PandasStd","pos":[-705.8277587890625,2862.27001953125],"size":[210,46],"flags":{},"order":9,"mode":0,"inputs":[{"name":"dataframe","type":"DATAFRAME","link":40}],"outputs":[{"name":"PDSERIES","type":"PDSERIES","links":[49],"slot_index":0}],"properties":{"Node name for S&R":"PandasStd"},"widgets_values":[]}],"links":[[32,10,0,15,0,"DATAFRAME"],[33,10,0,16,0,"DATAFRAME"],[34,10,0,17,0,"DATAFRAME"],[35,10,0,18,0,"DATAFRAME"],[36,10,0,20,0,"DATAFRAME"],[37,10,0,19,0,"DATAFRAME"],[38,10,0,21,0,"DATAFRAME"],[39,10,0,22,0,"DATAFRAME"],[40,10,0,11,0,"DATAFRAME"],[41,15,0,30,0,"PDSERIES"],[42,16,0,29,0,"PDSERIES"],[43,17,0,28,0,"PDSERIES"],[44,18,0,27,0,"PDSERIES"],[45,20,0,26,0,"PDSERIES"],[46,19,0,25,0,"PDSERIES"],[47,21,0,31,0,"DATAFRAME"],[48,22,0,23,0,"PDSERIES"],[49,11,0,14,0,"PDSERIES"]],"groups":[],"config":{},"extra":{"ds":{"scale":0.5661223747111525,"offset":[1798.0049896638727,-1723.325991953437]},"node_versions":{"data-analysis":"5a3046eb053b45f337768f0641e34bdb90450562"},"ue_links":[]},"version":0.4} \ No newline at end of file diff --git a/modules/cda/cda_json_create.py b/modules/cda/cda_json_create.py index f0fb9bb..5cdbc76 100644 --- a/modules/cda/cda_json_create.py +++ b/modules/cda/cda_json_create.py @@ -21,7 +21,7 @@ class CDAJSONCreate: } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "create" CATEGORY: str = "Data Analysis" diff --git a/modules/matplotlib/common.py b/modules/matplotlib/common.py index 5c6121c..2100dd3 100644 --- a/modules/matplotlib/common.py +++ b/modules/matplotlib/common.py @@ -7,7 +7,7 @@ def common_input_types(): """ return { "required": { - "dataframe_json": ("STRING", {"multiscatter": True}), + "dataframe": ("STRING", {"multiscatter": True}), "x_column_name": ("STRING", {"default": ""}), "y_column_name": ("STRING", {"default": ""}), "title": ("STRING", {"default": ""}), diff --git a/modules/matplotlib/mpl_bar.py b/modules/matplotlib/mpl_bar.py index 607b2d7..c2f44e1 100644 --- a/modules/matplotlib/mpl_bar.py +++ b/modules/matplotlib/mpl_bar.py @@ -26,7 +26,7 @@ class MPLBar: CATEGORY: str = "Data Analysis" def bar_chart(self, - dataframe_json: str, + dataframe: pd.DataFrame, x_column_name: str, y_column_name: str, title: str, @@ -37,7 +37,7 @@ class MPLBar: Generates a bar chart from a pandas DataFrame. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. x_column_name (str): The column name for the x-axis. y_column_name (str): The column name for the y-axis. title (str): The title of the plot. @@ -49,8 +49,8 @@ class MPLBar: Returns: tuple: A tuple containing the image tensor representation of the plot. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) + + df = dataframe # Create the plot fig, ax = plt.subplots() diff --git a/modules/matplotlib/mpl_line.py b/modules/matplotlib/mpl_line.py index 8ea5c3a..fa74ee3 100644 --- a/modules/matplotlib/mpl_line.py +++ b/modules/matplotlib/mpl_line.py @@ -26,7 +26,7 @@ class MPLLine: CATEGORY: str = "Data Analysis" def line_plot(self, - dataframe_json: str, + dataframe: pd.DataFrame, x_column_name: str, y_column_name: str, title: str, @@ -37,7 +37,7 @@ class MPLLine: Generates a line plot from a pandas DataFrame. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. x_column_name (str): The column name for the x-axis. y_column_name (str): The column name for the y-axis. title (str): The title of the plot. @@ -49,8 +49,8 @@ class MPLLine: Returns: tuple: A tuple containing the image tensor representation of the plot. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) + + df = dataframe # Create the plot fig, ax = plt.subplots() diff --git a/modules/matplotlib/mpl_scatter.py b/modules/matplotlib/mpl_scatter.py index 6c9b3bf..61b6122 100644 --- a/modules/matplotlib/mpl_scatter.py +++ b/modules/matplotlib/mpl_scatter.py @@ -26,7 +26,7 @@ class MPLScatter: CATEGORY: str = "Data Analysis" def scatter_plot(self, - dataframe_json: str, + dataframe: pd.DataFrame, x_column_name: str, y_column_name: str, title: str, @@ -37,7 +37,7 @@ class MPLScatter: Generates a scatter plot from a pandas DataFrame. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. x_column_name (str): The column name for the x-axis. y_column_name (str): The column name for the y-axis. title (str): The title of the plot. @@ -49,8 +49,8 @@ class MPLScatter: Returns: tuple: A tuple containing the image tensor representation of the plot. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) + + df = dataframe # Create the plot fig, ax = plt.subplots() diff --git a/modules/pandas_wrapper/pandas_add.py b/modules/pandas_wrapper/pandas_add.py new file mode 100644 index 0000000..4b38152 --- /dev/null +++ b/modules/pandas_wrapper/pandas_add.py @@ -0,0 +1,44 @@ +from typing import Any, Dict +import pandas as pd + + +class PandasAdd: + """ + PandasAdd: + A class for adding two pandas DataFrames. + """ + + @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": { + "a_dataframe": ("DATAFRAME", {}), + "b_dataframe": ("DATAFRAME", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, a_dataframe: pd.DataFrame, b_dataframe: pd.DataFrame) -> tuple: + """ + Add two pandas DataFrames. + + Args: + a_dataframe (DataFrame): The left DataFrame. + b_dataframe (DataFrame): The right DataFrame. + on_column_name (str): The name of the column to join on. + join_method (str): The type of join to perform ("inner", "left", "right", "outer"). + + Returns: + tuple: A tuple containing the DataFrame containing the result of addition. + """ + df_out = a_dataframe.add(b_dataframe) + return (df_out,) diff --git a/modules/pandas_wrapper/pandas_add_series.py b/modules/pandas_wrapper/pandas_add_series.py new file mode 100644 index 0000000..ed286e7 --- /dev/null +++ b/modules/pandas_wrapper/pandas_add_series.py @@ -0,0 +1,43 @@ +from typing import Any, Dict +import pandas as pd + +class PandasAddSeries: + """ + PandasAdd: + A class for adding a Pandas Series to a pandas DataFrames. + """ + + @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": { + "a_dataframe": ("DATAFRAME", {}), + "b_series": ("PDSERIES", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, a_dataframe: pd.DataFrame, b_series: pd.Series) -> tuple: + """ + Add two pandas DataFrames. + + Args: + a_dataframe (DataFrame): The left DataFrame. + b_series (Series): The right Series. + on_column_name (str): The name of the column to join on. + join_method (str): The type of join to perform ("inner", "left", "right", "outer"). + + Returns: + tuple: A tuple containing the DataFrame containing the result of addition. + """ + df_out = a_dataframe.add(b_series) + return (df_out,) diff --git a/modules/pandas_wrapper/pandas_as_float.py b/modules/pandas_wrapper/pandas_as_float.py new file mode 100644 index 0000000..61a1d9a --- /dev/null +++ b/modules/pandas_wrapper/pandas_as_float.py @@ -0,0 +1,42 @@ +from typing import Any, Dict +from io import StringIO +import pandas as pd + + +class PandasAsFloat: + """ + PandasAsFloat: + A class for converting all cells in a pandas DataFrame to float type. + """ + + @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", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, dataframe: pd.DataFrame) -> tuple: + """ + Converts all cells in the DataFrame to float type. + + Args: + dataframe (DataFrame): The DataFrame. + + Returns: + tuple: A tuple containing the DataFrame with all values as floats. + """ + # Convert all values to float, non-numeric values become NaN + df = dataframe.apply(pd.to_numeric, errors='coerce').astype(float) + return (df,) diff --git a/modules/pandas_wrapper/pandas_as_int.py b/modules/pandas_wrapper/pandas_as_int.py new file mode 100644 index 0000000..db0f125 --- /dev/null +++ b/modules/pandas_wrapper/pandas_as_int.py @@ -0,0 +1,42 @@ +from typing import Any, Dict +from io import StringIO +import pandas as pd + + +class PandasAsInt: + """ + PandasAsInt: + A class for converting all cells in a pandas DataFrame to integer type. + """ + + @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", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, dataframe: pd.DataFrame) -> tuple: + """ + Converts all cells in the DataFrame to integer type. + + Args: + dataframe (DataFrame): The DataFrame. + + Returns: + tuple: A tuple containing the DataFrame with all values as integers. + """ + # Convert all values to integer, non-numeric values become NaN + df = dataframe.apply(pd.to_numeric, errors='coerce').astype('Int64') + return (df.to_json(),) diff --git a/modules/pandas_wrapper/pandas_as_string.py b/modules/pandas_wrapper/pandas_as_string.py new file mode 100644 index 0000000..76546cc --- /dev/null +++ b/modules/pandas_wrapper/pandas_as_string.py @@ -0,0 +1,41 @@ +from typing import Any, Dict +import pandas as pd + + +class PandasAsString: + """ + PandasAsString: + A class for converting all cells in a pandas DataFrame to string type. + """ + + @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", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "convert_to_string" + CATEGORY: str = "Data Analysis" + + def convert_to_string(self, dataframe: pd.DataFrame) -> tuple: + """ + Converts all cells in the DataFrame to string type. + + Args: + dataframe (DataFrame): The DataFrame. + + Returns: + tuple: A tuple containing the DataFrame with all values as strings. + """ + # Convert all values to string + df = dataframe.astype(str) + return (df,) diff --git a/modules/pandas_wrapper/pandas_columns.py b/modules/pandas_wrapper/pandas_columns.py index a8447be..b56fc04 100644 --- a/modules/pandas_wrapper/pandas_columns.py +++ b/modules/pandas_wrapper/pandas_columns.py @@ -1,14 +1,13 @@ from typing import Any, Dict -from io import StringIO import pandas as pd -from .utils import index_to_jsons + class PandasColumns: """ PandasColumns: A class for retrieving the column labels of a pandas DataFrame. """ - + @classmethod def INPUT_TYPES(cls) -> Dict[str, Any]: """ @@ -19,25 +18,23 @@ class PandasColumns: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}) + "dataframe": ("DATAFRAME", {}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("PDINDEX",) FUNCTION: str = "columns" CATEGORY: str = "Data Analysis" - def columns(self, dataframe_json: str) -> tuple: + def columns(self, dataframe: pd.DataFrame) -> tuple: """ Returns the column labels of a pandas DataFrame. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: - tuple: A tuple containing a JSON string for the serialized pandas.Index containing columns. + tuple: A tuple containing a pandas.Index for columns. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - columns = df.columns - return (index_to_jsons(columns),) + columns = dataframe.columns + return (columns,) diff --git a/modules/pandas_wrapper/pandas_count.py b/modules/pandas_wrapper/pandas_count.py index ee7464b..eac6a7a 100644 --- a/modules/pandas_wrapper/pandas_count.py +++ b/modules/pandas_wrapper/pandas_count.py @@ -19,24 +19,23 @@ class PandasCount: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}) + "dataframe": ("DATAFRAME", {}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("PDSERIES",) FUNCTION: str = "f" CATEGORY: str = "Data Analysis" - def f(self, dataframe_json: str) -> tuple: + def f(self, dataframe: pd.DataFrame) -> tuple: """ Returns a Series with count for each column. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: - tuple: A tuple containing a JSON string for the Series. + tuple: A tuple containing the Series. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - return (series_to_jsons(df.count()),) + df = dataframe + return (df.count(),) diff --git a/modules/pandas_wrapper/pandas_create.py b/modules/pandas_wrapper/pandas_create.py index 9299c84..610ea6c 100644 --- a/modules/pandas_wrapper/pandas_create.py +++ b/modules/pandas_wrapper/pandas_create.py @@ -23,7 +23,7 @@ class PandasCreate: } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "create" CATEGORY: str = "Data Analysis" @@ -39,8 +39,4 @@ class PandasCreate: """ # Read CSV file into DataFrame df = pd.read_csv(StringIO(data)) - - # Convert DataFrame to JSON - result_json = df.to_json() - - return (result_json,) + return (df,) diff --git a/modules/pandas_wrapper/pandas_create_with_index.py b/modules/pandas_wrapper/pandas_create_with_index.py index 777503f..c1ceb63 100644 --- a/modules/pandas_wrapper/pandas_create_with_index.py +++ b/modules/pandas_wrapper/pandas_create_with_index.py @@ -25,7 +25,7 @@ class PandasCreateWithIndex: } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "create" CATEGORY: str = "Data Analysis" @@ -43,8 +43,4 @@ class PandasCreateWithIndex: """ # Read CSV file into DataFrame df = pd.read_csv(StringIO(data), index_col=index_col) - - # Convert DataFrame to JSON - result_json = df.to_json() - - return (result_json,) + return (df,) diff --git a/modules/pandas_wrapper/pandas_div.py b/modules/pandas_wrapper/pandas_div.py new file mode 100644 index 0000000..a538bac --- /dev/null +++ b/modules/pandas_wrapper/pandas_div.py @@ -0,0 +1,43 @@ +from typing import Any, Dict +from io import StringIO +import pandas as pd + + +class PandasDiv: + """ + PandasDiv: + A class for dividing two pandas DataFrames. + """ + + @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": { + "a_dataframe": ("DATAFRAME", {}), + "b_dataframe": ("DATAFRAME", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, a_dataframe: pd.DataFrame, b_dataframe: pd.DataFrame) -> tuple: + """ + Divide two pandas DataFrames. + + Args: + a_dataframe (DataFrame): The left DataFrame. + b_dataframe (DataFrame): The right DataFrame. + + Returns: + tuple: A tuple containing the DataFrame containing the result of division. + """ + df_out = a_dataframe.div(b_dataframe) + return (df_out,) diff --git a/modules/pandas_wrapper/pandas_div_series.py b/modules/pandas_wrapper/pandas_div_series.py new file mode 100644 index 0000000..e870dfc --- /dev/null +++ b/modules/pandas_wrapper/pandas_div_series.py @@ -0,0 +1,43 @@ +from typing import Any, Dict +from io import StringIO +import pandas as pd +from .utils import jsons_to_series + +class PandasDivSeries: + """ + PandasDivSeries: + A class for dividing a Pandas DataFrame by a Pandas Series. + """ + + @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": { + "a_dataframe": ("DATAFRAME", {}), + "b_series": ("PDSERIES", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, a_dataframe: pd.DataFrame, b_series: pd.Series) -> tuple: + """ + Divide a pandas DataFrame by a pandas Series. + + Args: + a_dataframe (DataFrame): The numerator DataFrame. + b_series (Series): The denominator Series. + + Returns: + tuple: A tuple containing the DataFrame containing the result of division. + """ + df_out = a_dataframe.div(b_series) + return (df_out,) diff --git a/modules/pandas_wrapper/pandas_dropna.py b/modules/pandas_wrapper/pandas_dropna.py index 75bf1dd..10d0934 100644 --- a/modules/pandas_wrapper/pandas_dropna.py +++ b/modules/pandas_wrapper/pandas_dropna.py @@ -1,7 +1,5 @@ from typing import Any, Dict -from io import StringIO import pandas as pd -from .utils import index_to_jsons class PandasDropNA: """ @@ -19,24 +17,22 @@ class PandasDropNA: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}) + "dataframe": ("DATAFRAME", {}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "dropna" CATEGORY: str = "Data Analysis" - def dropna(self, dataframe_json: str) -> tuple: + def dropna(self, dataframe: pd.DataFrame) -> tuple: """ Returns a DataFrame with missing values removed. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: - tuple: A tuple containing a JSON string for the DataFrame. + tuple: A tuple containing the DataFrame. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - return (df.dropna().to_json(),) + return (dataframe.dropna().to_json(),) diff --git a/modules/pandas_wrapper/pandas_group_by.py b/modules/pandas_wrapper/pandas_group_by.py index 2cb4e58..ad72d44 100644 --- a/modules/pandas_wrapper/pandas_group_by.py +++ b/modules/pandas_wrapper/pandas_group_by.py @@ -20,46 +20,43 @@ class PandasGroupBy: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}), + "dataframe": ("DATAFRAME", {}), "column_name": ("STRING", {"default": ""}), "aggragate_function":(("sum", "mean", "count", "std", "min", "max"),) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "groupby_dataframes" CATEGORY: str = "Data Analysis" def groupby_dataframes(self, - dataframe_json: str, + dataframe: pd.DataFrame, column_name: str, aggragate_function: str) -> tuple: """ Compute aggregate values for groups in a DataFrame Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. column_name (str): The name of the column for use as groups. aggregate_function (str): The type of aggregate function to perform. Returns: tuple: A tuple containing a JSON string of the merged DataFrame. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - if aggragate_function == "max": - df_out = df.groupby(column_name).max() + df_out = dataframe.groupby(column_name).max() elif aggragate_function == "min": - df_out = df.groupby(column_name).min() + df_out = dataframe.groupby(column_name).min() elif aggragate_function == "std": - df_out = df.groupby(column_name).std() + df_out = dataframe.groupby(column_name).std() elif aggragate_function == "count": - df_out = df.groupby(column_name).count() + df_out = dataframe.groupby(column_name).count() elif aggragate_function == "sum": - df_out = df.groupby(column_name).sum() + df_out = dataframe.groupby(column_name).sum() elif aggragate_function == "mean": - df_out = df.groupby(column_name).mean() + df_out = dataframe.groupby(column_name).mean() else: raise ValueError("Unsupported aggregate function.") - return (df_out.to_json(),) + return (df_out,) diff --git a/modules/pandas_wrapper/pandas_head.py b/modules/pandas_wrapper/pandas_head.py index a2bf95a..bc6ce78 100644 --- a/modules/pandas_wrapper/pandas_head.py +++ b/modules/pandas_wrapper/pandas_head.py @@ -19,27 +19,25 @@ class PandasHead: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}), + "dataframe": ("DATAFRAME", {}), "rows": ("INT", {"default": 10, "min": 0, "max": 50}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "head" CATEGORY: str = "Data Analysis" - def head(self, dataframe_json: str, rows: int) -> tuple: + def head(self, dataframe: pd.DataFrame, rows: int) -> tuple: """ Returns the first `rows` rows of a pandas DataFrame. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. rows (int): The number of rows to retrieve. Returns: tuple: A tuple containing a JSON string of the resulting DataFrame. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - df2 = df.head(rows) - return (df2.to_json(),) + df2 = dataframe.head(rows) + return (df2,) diff --git a/modules/pandas_wrapper/pandas_iloc_row_series.py b/modules/pandas_wrapper/pandas_iloc_row_series.py index 0299b1b..f8336a4 100644 --- a/modules/pandas_wrapper/pandas_iloc_row_series.py +++ b/modules/pandas_wrapper/pandas_iloc_row_series.py @@ -21,30 +21,28 @@ class PandasIlocRowSeries: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}), + "dataframe": ("DATAFRAME", {}), "row_integer_position": ("INT", {"default": 0, "min": 0, "max": 2**31}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "select_row" CATEGORY: str = "Data Analysis" - def select_row(self, dataframe_json: str, + def select_row(self, dataframe: pd.DataFrame, row_integer_position: int) -> tuple: """ Selects a specific row using a row label (row index) from a pandas DataFrame, and returns the JSON serialized Series object. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. row_integer_position (int): The row integer position. Returns: tuple: A tuple containing the value of the row in string. The string is a JSON string containing the serialized Pandas Series object. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - value = df.iloc[row_integer_position] - return (series_to_jsons(value),) + value = dataframe.iloc[row_integer_position] + return (value,) diff --git a/modules/pandas_wrapper/pandas_iloc_rows_dataframe.py b/modules/pandas_wrapper/pandas_iloc_rows_dataframe.py index 2836c86..3fb5a8b 100644 --- a/modules/pandas_wrapper/pandas_iloc_rows_dataframe.py +++ b/modules/pandas_wrapper/pandas_iloc_rows_dataframe.py @@ -21,16 +21,16 @@ class PandasIlocRowsDataFrame: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}), + "dataframe": ("DATAFRAME", {}), "row_int_pos_list_json": ("STRING", {"multiline": False}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "select_rows" CATEGORY: str = "Data Analysis" - def select_rows(self, dataframe_json: str, + def select_rows(self, dataframe: pd.DataFrame, row_int_pos_list_json: str) -> tuple: """ Select rows from a pandas DataFrame and returning it as a DataFrame. @@ -38,15 +38,13 @@ class PandasIlocRowsDataFrame: the JSON serialized DataFrame object. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. row_int_pos_list_json (str): A list containing row integer positions. Returns: tuple: A tuple containing the value of the row in string. The string is a JSON string containing the serialized Pandas Series object. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) row_int_pos_list = json.loads(row_int_pos_list_json) - df2 = df.iloc[row_int_pos_list] - return (df2.to_json(),) + df2 = dataframe.iloc[row_int_pos_list] + return (df2,) diff --git a/modules/pandas_wrapper/pandas_index.py b/modules/pandas_wrapper/pandas_index.py index 68990f3..f9e2871 100644 --- a/modules/pandas_wrapper/pandas_index.py +++ b/modules/pandas_wrapper/pandas_index.py @@ -1,7 +1,5 @@ from typing import Any, Dict -from io import StringIO import pandas as pd -from .utils import index_to_jsons class PandasIndex: """ @@ -19,25 +17,23 @@ class PandasIndex: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}) + "dataframe": ("DATAFRAME", {}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("PDINDEX",) FUNCTION: str = "row_index" CATEGORY: str = "Data Analysis" - def row_index(self, dataframe_json: str) -> tuple: + def row_index(self, dataframe: pd.DataFrame) -> tuple: """ Returns the row labels (index) of a pandas DataFrame. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: - tuple: A tuple containing a JSON string for the serialized pandas.Index containing row labels. + tuple: A tuple containing a pandas.Index for row labels. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - row_index = df.index - return (index_to_jsons(row_index),) + row_index = dataframe.index + return (row_index,) diff --git a/modules/pandas_wrapper/pandas_index_to_string.py b/modules/pandas_wrapper/pandas_index_to_string.py new file mode 100644 index 0000000..e38653e --- /dev/null +++ b/modules/pandas_wrapper/pandas_index_to_string.py @@ -0,0 +1,39 @@ +from typing import Any, Dict +import pandas as pd + + +class PandasIndexToString: + """ + PandasIndexToString: + A class for converting a pandas Index to a string representation. + """ + + @classmethod + def INPUT_TYPES(cls) -> Dict[str, Any]: + """ + Defines the input types for the `to_string` function. + + Returns: + Dict[str, Any]: A dictionary specifying required input types. + """ + return { + "required": { + "index": ("PDINDEX", {}), + } + } + + RETURN_TYPES: tuple = ("STRING",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, ind: pd.Index) -> tuple: + """ + Converts a Pandas Index to a string representation. + + Args: + ind (pd.Index): The index. + + Returns: + tuple: A tuple containing the string representation of the Index. + """ + return (str(ind),) diff --git a/modules/pandas_wrapper/pandas_isna.py b/modules/pandas_wrapper/pandas_isna.py index bcf7b85..5c98edf 100644 --- a/modules/pandas_wrapper/pandas_isna.py +++ b/modules/pandas_wrapper/pandas_isna.py @@ -1,7 +1,6 @@ from typing import Any, Dict -from io import StringIO import pandas as pd -from .utils import index_to_jsons + class PandasIsNA: """ @@ -19,24 +18,22 @@ class PandasIsNA: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}) + "dataframe": ("DATAFRAME", {}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "isna" CATEGORY: str = "Data Analysis" - def isna(self, dataframe_json: str) -> tuple: + def isna(self, dataframe: pd.DataFrame) -> tuple: """ Returns a DataFrame with boolean values with True indicating a missing value. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: - tuple: A tuple containing a JSON string for the DataFrame. + tuple: A tuple containing the DataFrame. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - return (df.isna().to_json(),) + return (dataframe.isna(),) diff --git a/modules/pandas_wrapper/pandas_join.py b/modules/pandas_wrapper/pandas_join.py index 2c1da74..a6f95f9 100644 --- a/modules/pandas_wrapper/pandas_join.py +++ b/modules/pandas_wrapper/pandas_join.py @@ -19,33 +19,29 @@ class PandasJoin: """ return { "required": { - "left_dataframe_json": ("STRING", {"multiline": True}), - "right_dataframe_json": ("STRING", {"multiline": True}), + "left_dataframe": ("DATAFRAME", {}), + "right_dataframe": ("DATAFRAME", {}), "on_column_name": ("STRING", {"default": ""}), "join_method":(("inner", "left", "right", "outer"),) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "join_dataframes" CATEGORY: str = "Data Analysis" - def join_dataframes(self, left_dataframe_json: str, right_dataframe_json: str, on_column_name: str, join_method: str) -> tuple: + def join_dataframes(self, left_dataframe: pd.DataFrame, right_dataframe: pd.DataFrame, on_column_name: str, join_method: str) -> tuple: """ Merges two pandas DataFrames based on a common column using the specified join method. Args: - left_dataframe_json (str): A JSON string representation of the left DataFrame. - right_dataframe_json (str): A JSON string representation of the right DataFrame. + left_dataframe (DataFrame): The left DataFrame. + right_dataframe (DataFrame): The right DataFrame. on_column_name (str): The name of the column to join on. join_method (str): The type of join to perform ("inner", "left", "right", "outer"). Returns: tuple: A tuple containing a JSON string of the merged DataFrame. """ - # Deserialize JSON string to DataFrame - df_left = pd.read_json(StringIO(left_dataframe_json)) - df_right = pd.read_json(StringIO(right_dataframe_json)) - - df_out = pd.merge(df_left, df_right, on=on_column_name, how=join_method) - return (df_out.to_json(),) + df_out = pd.merge(left_dataframe, right_dataframe, on=on_column_name, how=join_method) + return (df_out,) diff --git a/modules/pandas_wrapper/pandas_load_csv.py b/modules/pandas_wrapper/pandas_load_csv.py index 969f28c..89aa83d 100644 --- a/modules/pandas_wrapper/pandas_load_csv.py +++ b/modules/pandas_wrapper/pandas_load_csv.py @@ -23,7 +23,7 @@ class PandasLoadCSV: } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "load_csv" CATEGORY: str = "Data Analysis" @@ -39,8 +39,4 @@ class PandasLoadCSV: """ # Read CSV file into DataFrame df = pd.read_csv(file_path) - - # Convert DataFrame to JSON - result_json = df.to_json() - - return (result_json,) + return (df,) diff --git a/modules/pandas_wrapper/pandas_load_csv_with_encoding.py b/modules/pandas_wrapper/pandas_load_csv_with_encoding.py index f81b522..66b4bab 100644 --- a/modules/pandas_wrapper/pandas_load_csv_with_encoding.py +++ b/modules/pandas_wrapper/pandas_load_csv_with_encoding.py @@ -24,7 +24,7 @@ class PandasLoadCSVWithEncoding: } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "load_csv" CATEGORY: str = "Data Analysis" @@ -44,8 +44,4 @@ class PandasLoadCSVWithEncoding: """ # Read CSV file into DataFrame df = pd.read_csv(file_path, encoding=encoding) - - # Convert DataFrame to JSON - result_json = df.to_json() - - return (result_json,) + return (df,) diff --git a/modules/pandas_wrapper/pandas_load_csv_with_index.py b/modules/pandas_wrapper/pandas_load_csv_with_index.py index 0041280..721b5b8 100644 --- a/modules/pandas_wrapper/pandas_load_csv_with_index.py +++ b/modules/pandas_wrapper/pandas_load_csv_with_index.py @@ -25,7 +25,7 @@ class PandasLoadCSVWithIndex: } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "load_csv" CATEGORY: str = "Data Analysis" @@ -42,8 +42,4 @@ class PandasLoadCSVWithIndex: """ # Read CSV file into DataFrame df = pd.read_csv(file_path, index_col=index_col) - - # Convert DataFrame to JSON - result_json = df.to_json() - - return (result_json,) + return (df,) diff --git a/modules/pandas_wrapper/pandas_load_json.py b/modules/pandas_wrapper/pandas_load_json.py index a96cc33..f41ba24 100644 --- a/modules/pandas_wrapper/pandas_load_json.py +++ b/modules/pandas_wrapper/pandas_load_json.py @@ -23,7 +23,7 @@ class PandasLoadJSON: } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "load_json" CATEGORY: str = "Data Analysis" @@ -39,8 +39,4 @@ class PandasLoadJSON: """ # Read JSON file into DataFrame df = pd.read_json(file_path) - - # Convert DataFrame to JSON - result_json = df.to_json() - - return (result_json,) + return (df,) diff --git a/modules/pandas_wrapper/pandas_loc_cell_str.py b/modules/pandas_wrapper/pandas_loc_cell_str.py index a35948e..559df40 100644 --- a/modules/pandas_wrapper/pandas_loc_cell_str.py +++ b/modules/pandas_wrapper/pandas_loc_cell_str.py @@ -18,7 +18,7 @@ class PandasLocCellStr: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}), + "dataframe": ("DATAFRAME", {}), "row_index": ("STRING", {"default": ""}), "row_index_type":(("string", "int"),), "column_label": ("STRING", {"default": ""}), @@ -30,7 +30,7 @@ class PandasLocCellStr: FUNCTION: str = "cell" CATEGORY: str = "Data Analysis" - def cell(self, dataframe_json: str, + def cell(self, dataframe: pd.DataFrame, row_index: str, row_index_type: str, column_label: str, @@ -39,7 +39,7 @@ class PandasLocCellStr: Selects specific cell from a pandas DataFrame. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. row_index (str): The row index (row label) for the cell. row_index_type (str): The data type of the row index. column_label (str): The column label for the cell. @@ -48,10 +48,8 @@ class PandasLocCellStr: Returns: tuple: A tuple containing the value of the cell in string. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) row_index = int(row_index) if row_index_type == "int" else row_index column_label = int(column_label) if column_label_type == "int" else column_label - value = df.loc[row_index, column_label] + value = dataframe.loc[row_index, column_label] return (str(value),) diff --git a/modules/pandas_wrapper/pandas_loc_row_series.py b/modules/pandas_wrapper/pandas_loc_row_series.py index d9d4fb2..d0c284c 100644 --- a/modules/pandas_wrapper/pandas_loc_row_series.py +++ b/modules/pandas_wrapper/pandas_loc_row_series.py @@ -19,35 +19,31 @@ class PandasLocRowSeries: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}), + "dataframe": ("DATAFRAME", {}), "row_index": ("STRING", {"default": ""}), "row_index_type":(("string", "int"),) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("PDSERIES",) FUNCTION: str = "select_row" CATEGORY: str = "Data Analysis" - def select_row(self, dataframe_json: str, + def select_row(self, dataframe: pd.DataFrame, row_index: str, row_index_type: str) -> tuple: """ Selects a specific row using a row label (row index) from a pandas DataFrame, - and returns the JSON serialized Series object. + and returns the Series object. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. row_index (str): The row index (row label) for the row. row_index_type (str): The data type of the row index. Returns: - tuple: A tuple containing the value of the row in string. The string is - a JSON string containing the serialized Pandas Series object. + tuple: A tuple containing the value of the row in the serialized Pandas Series object. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) row_index = int(row_index) if row_index_type == "int" else row_index - - value = df.loc[row_index] - return (series_to_jsons(value),) + value = dataframe.loc[row_index] + return (value,) diff --git a/modules/pandas_wrapper/pandas_max.py b/modules/pandas_wrapper/pandas_max.py index b780620..e3176e8 100644 --- a/modules/pandas_wrapper/pandas_max.py +++ b/modules/pandas_wrapper/pandas_max.py @@ -19,24 +19,22 @@ class PandasMax: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}) + "dataframe": ("DATAFRAME", {}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("PDSERIES",) FUNCTION: str = "f" CATEGORY: str = "Data Analysis" - def f(self, dataframe_json: str) -> tuple: + def f(self, dataframe: pd.DataFrame) -> tuple: """ Returns a Series with max for each column. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: - tuple: A tuple containing a JSON string for the Series. + tuple: A tuple containing the Series. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - return (series_to_jsons(df.max()),) + return (dataframe.max(),) diff --git a/modules/pandas_wrapper/pandas_mean.py b/modules/pandas_wrapper/pandas_mean.py index 453b348..4e180cd 100644 --- a/modules/pandas_wrapper/pandas_mean.py +++ b/modules/pandas_wrapper/pandas_mean.py @@ -19,24 +19,22 @@ class PandasMean: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}) + "dataframe": ("DATAFRAME", {}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("PDSERIES",) FUNCTION: str = "f" CATEGORY: str = "Data Analysis" - def f(self, dataframe_json: str) -> tuple: + def f(self, dataframe: pd.DataFrame) -> tuple: """ Returns a Series with mean for each column. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: - tuple: A tuple containing a JSON string for the Series. + tuple: A tuple containing the Series. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - return (series_to_jsons(df.mean()),) + return (dataframe.mean(),) \ No newline at end of file diff --git a/modules/pandas_wrapper/pandas_median.py b/modules/pandas_wrapper/pandas_median.py index 1b2d2f3..053dfa0 100644 --- a/modules/pandas_wrapper/pandas_median.py +++ b/modules/pandas_wrapper/pandas_median.py @@ -19,24 +19,22 @@ class PandasMedian: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}) + "dataframe": ("DATAFRAME", {}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("PDSERIES",) FUNCTION: str = "f" CATEGORY: str = "Data Analysis" - def f(self, dataframe_json: str) -> tuple: + def f(self, dataframe: pd.DataFrame) -> tuple: """ Returns a Series with median for each column. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: - tuple: A tuple containing a JSON string for the Series. + tuple: A tuple containing the Series. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - return (series_to_jsons(df.median()),) + return (dataframe.median(),) diff --git a/modules/pandas_wrapper/pandas_min.py b/modules/pandas_wrapper/pandas_min.py index cf9f308..f8bc68a 100644 --- a/modules/pandas_wrapper/pandas_min.py +++ b/modules/pandas_wrapper/pandas_min.py @@ -19,24 +19,22 @@ class PandasMin: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}) + "dataframe": ("DATAFRAME", {}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("PDSERIES",) FUNCTION: str = "f" CATEGORY: str = "Data Analysis" - def f(self, dataframe_json: str) -> tuple: + def f(self, dataframe: pd.DataFrame) -> tuple: """ Returns a Series with min for each column. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: - tuple: A tuple containing a JSON string for the Series. + tuple: A tuple containing the Series. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - return (series_to_jsons(df.min()),) + return (dataframe.min(),) diff --git a/modules/pandas_wrapper/pandas_mode.py b/modules/pandas_wrapper/pandas_mode.py index c12643d..d7560e1 100644 --- a/modules/pandas_wrapper/pandas_mode.py +++ b/modules/pandas_wrapper/pandas_mode.py @@ -18,24 +18,22 @@ class PandasMode: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}) + "dataframe": ("DATAFRAME", {}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "f" CATEGORY: str = "Data Analysis" - def f(self, dataframe_json: str) -> tuple: + def f(self, dataframe: pd.DataFrame) -> tuple: """ Returns a DataFrame with mode for each column. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: - tuple: A tuple containing a JSON string for the DataFrame. + tuple: A tuple containing the DataFrame. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - return (df.mode().to_json(),) + return (dataframe.mode(),) diff --git a/modules/pandas_wrapper/pandas_mul.py b/modules/pandas_wrapper/pandas_mul.py new file mode 100644 index 0000000..6e664c4 --- /dev/null +++ b/modules/pandas_wrapper/pandas_mul.py @@ -0,0 +1,43 @@ +from typing import Any, Dict +from io import StringIO +import pandas as pd + + +class PandasMul: + """ + PandasMul: + A class for multiplying two pandas DataFrames. + """ + + @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": { + "a_dataframe": ("DATAFRAME", {}), + "b_dataframe": ("DATAFRAME", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, a_dataframe: pd.DataFrame, b_dataframe: pd.DataFrame) -> tuple: + """ + Multiply two pandas DataFrames. + + Args: + a_dataframe (DataFrame): The left DataFrame. + b_dataframe (DataFrame): The right DataFrame. + + Returns: + tuple: A tuple containing the DataFrame containing the result of multiplication. + """ + df_out = a_dataframe.mul(b_dataframe) + return (df_out,) diff --git a/modules/pandas_wrapper/pandas_mul_series.py b/modules/pandas_wrapper/pandas_mul_series.py new file mode 100644 index 0000000..b81b306 --- /dev/null +++ b/modules/pandas_wrapper/pandas_mul_series.py @@ -0,0 +1,43 @@ +from typing import Any, Dict +from io import StringIO +import pandas as pd +from .utils import jsons_to_series + +class PandasMulSeries: + """ + PandasMulSeries: + A class for multiplying a Pandas DataFrame by a Pandas Series. + """ + + @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": { + "a_dataframe": ("DATAFRAME", {}), + "b_series": ("PDSERIES", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, a_dataframe: pd.DataFrame, b_series: pd.Series) -> tuple: + """ + Multiply a pandas DataFrame by a pandas Series. + + Args: + a_dataframe (DataFrame): The DataFrame. + b_series (Series): The Series. + + Returns: + tuple: A tuple containing the DataFrame containing the result of multiplication. + """ + df_out = a_dataframe.mul(b_series) + return (df_out,) diff --git a/modules/pandas_wrapper/pandas_pow.py b/modules/pandas_wrapper/pandas_pow.py new file mode 100644 index 0000000..1555b54 --- /dev/null +++ b/modules/pandas_wrapper/pandas_pow.py @@ -0,0 +1,46 @@ +from typing import Any, Dict +from io import StringIO +import pandas as pd + + +class PandasPow: + """ + PandasPow: + A class for exponentiating two pandas DataFrames. + """ + + @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": { + # "a_dataframe": ("DATAFRAME", {}), + # "b_dataframe": ("DATAFRAME", {}) + "a_dataframe": ("DATAFRAME", {}), + "b_dataframe": ("DATAFRAME", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + # def f(self, a_dataframe: pd.DataFrame, b_dataframe: pd.DataFrame) -> tuple: + def f(self, a_dataframe: pd.DataFrame, b_dataframe: pd.DataFrame) -> tuple: + """ + Raise one pandas DataFrame to the power of another. + + Args: + a_dataframe (DataFrame): The base DataFrame. + b_dataframe (DataFrame): The exponent DataFrame. + + Returns: + tuple: A tuple containing the DataFrame containing the result of exponentiation. + """ + df_out = a_dataframe.pow(b_dataframe) + return (df_out,) diff --git a/modules/pandas_wrapper/pandas_pow_series.py b/modules/pandas_wrapper/pandas_pow_series.py new file mode 100644 index 0000000..a21a9b6 --- /dev/null +++ b/modules/pandas_wrapper/pandas_pow_series.py @@ -0,0 +1,43 @@ +from typing import Any, Dict +from io import StringIO +import pandas as pd +from .utils import jsons_to_series + +class PandasPowSeries: + """ + PandasPowSeries: + A class for raising a Pandas DataFrame to the power of a Pandas Series. + """ + + @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": { + "a_dataframe": ("DATAFRAME", {}), + "b_series": ("PDSERIES", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, a_dataframe: pd.DataFrame, b_series: pd.Series) -> tuple: + """ + Raise a pandas DataFrame to the power of a pandas Series. + + Args: + a_dataframe (DataFrame): The base DataFrame. + b_series (Series): The exponent Series. + + Returns: + tuple: A tuple containing the DataFrame containing the result of exponentiation. + """ + df_out = a_dataframe.pow(b_series) + return (df_out,) diff --git a/modules/pandas_wrapper/pandas_save_csv.py b/modules/pandas_wrapper/pandas_save_csv.py index ca6176c..3d059b3 100644 --- a/modules/pandas_wrapper/pandas_save_csv.py +++ b/modules/pandas_wrapper/pandas_save_csv.py @@ -17,7 +17,7 @@ class PandasSaveCSV: def INPUT_TYPES(s): return { "required": { - "dataframe_json": ("STRING", {"forceInput": True}), + "dataframe": ("DATAFRAME", {}), "file_path": ("STRING", {"multiline": False}) }, "hidden": { @@ -34,7 +34,7 @@ class PandasSaveCSV: CATEGORY = "Data Analysis" - def save_csv(self, dataframe_json,file_path=None, unique_id=None, extra_pnginfo=None): + def save_csv(self, dataframe, file_path=None, unique_id=None, extra_pnginfo=None): text = None if unique_id is not None and extra_pnginfo is not None: if not isinstance(extra_pnginfo, list): @@ -47,8 +47,7 @@ class PandasSaveCSV: elif file_path is None or len(file_path) == 0: print("Error: file path is not specified") else: - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json[0])) + df = dataframe[0] df.to_csv(path_or_buf=file_path[0]) # Save as CSV text = [str(df)] # wrap in list workflow = extra_pnginfo[0]["workflow"] diff --git a/modules/pandas_wrapper/pandas_save_json.py b/modules/pandas_wrapper/pandas_save_json.py index 691938d..f6c895a 100644 --- a/modules/pandas_wrapper/pandas_save_json.py +++ b/modules/pandas_wrapper/pandas_save_json.py @@ -17,7 +17,7 @@ class PandasSaveJSON: def INPUT_TYPES(s): return { "required": { - "dataframe_json": ("STRING", {"forceInput": True}), + "dataframe": ("DATAFRAME", {}), "file_path": ("STRING", {"multiline": False}) }, "hidden": { @@ -34,7 +34,7 @@ class PandasSaveJSON: CATEGORY = "Data Analysis" - def save_json(self, dataframe_json,file_path=None, unique_id=None, extra_pnginfo=None): + def save_json(self, dataframe, file_path=None, unique_id=None, extra_pnginfo=None): text = None if unique_id is not None and extra_pnginfo is not None: if not isinstance(extra_pnginfo, list): @@ -47,8 +47,7 @@ class PandasSaveJSON: elif file_path is None or len(file_path) == 0: print("Error: file path is not specified") else: - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json[0])) + df = dataframe[0] df.to_json(path_or_buf=file_path[0]) # Save as JSON text = [str(df)] # wrap in list workflow = extra_pnginfo[0]["workflow"] diff --git a/modules/pandas_wrapper/pandas_select_columns.py b/modules/pandas_wrapper/pandas_select_columns.py index 06be67e..76310af 100644 --- a/modules/pandas_wrapper/pandas_select_columns.py +++ b/modules/pandas_wrapper/pandas_select_columns.py @@ -18,31 +18,26 @@ class PandasSelectColumns: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}), + "dataframe": ("DATAFRAME", {}), "column_names": ("STRING", {"default": ""}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "select_columns" CATEGORY: str = "Data Analysis" - def select_columns(self, dataframe_json: str, column_names: str) -> tuple: + def select_columns(self, dataframe: pd.DataFrame, column_names: str) -> tuple: """ Selects specific columns from a pandas DataFrame. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. column_names (str): A comma-separated string of column names to select. Returns: - tuple: A tuple containing a JSON string of the DataFrame with selected columns. + tuple: A tuple containing the DataFrame with selected columns. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - - # Process column names selected_columns = [col.strip() for col in column_names.split(",")] - df2 = df[selected_columns] - - return (df2.to_json(),) + df2 = dataframe[selected_columns] + return (df2,) diff --git a/modules/pandas_wrapper/pandas_select_rows.py b/modules/pandas_wrapper/pandas_select_rows.py index 30abc7d..64f2e4a 100644 --- a/modules/pandas_wrapper/pandas_select_rows.py +++ b/modules/pandas_wrapper/pandas_select_rows.py @@ -18,30 +18,26 @@ class PandasSelectRows: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}), + "dataframe": ("DATAFRAME", {}), "condition": ("STRING", {"default": ""}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "select_rows" CATEGORY: str = "Data Analysis" - def select_rows(self, dataframe_json: str, condition: str) -> tuple: + def select_rows(self, dataframe: pd.DataFrame, condition: str) -> tuple: """ Selects specific rows from a pandas DataFrame based on a given condition. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. condition (str): A string representing the condition to filter rows. Returns: tuple: A tuple containing a JSON string of the filtered DataFrame. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - # Apply condition - df2 = df.query(condition) - - return (df2.to_json(),) + df2 = dataframe.query(condition) + return (df2,) diff --git a/modules/pandas_wrapper/pandas_series_to_string.py b/modules/pandas_wrapper/pandas_series_to_string.py index b5b6257..e427146 100644 --- a/modules/pandas_wrapper/pandas_series_to_string.py +++ b/modules/pandas_wrapper/pandas_series_to_string.py @@ -19,7 +19,7 @@ class PandasSeriesToString: """ return { "required": { - "series_json": ("STRING", {"multiline": True}), + "series": ("PDSERIES", {}), } } @@ -27,16 +27,14 @@ class PandasSeriesToString: FUNCTION: str = "series_to_string" CATEGORY: str = "Data Analysis" - def series_to_string(self, series_json: str) -> tuple: + def series_to_string(self, series: pd.Series) -> tuple: """ Converts a Pandas Series to a string representation. Args: - series_json (str): A JSON string representation of the Series. + series (Series): The Series. Returns: tuple: A tuple containing the string representation of the Series. """ - # Deserialize JSON string to DataFrame - series = jsons_to_series(series_json) return (str(series),) diff --git a/modules/pandas_wrapper/pandas_show_dataframe.py b/modules/pandas_wrapper/pandas_show_dataframe.py index d72c199..169bee1 100644 --- a/modules/pandas_wrapper/pandas_show_dataframe.py +++ b/modules/pandas_wrapper/pandas_show_dataframe.py @@ -12,7 +12,7 @@ class PandasShowDataFrame: def INPUT_TYPES(s): return { "required": { - "dataframe_json": ("STRING", {"forceInput": True}), + "dataframe": ("DATAFRAME", {}) }, "hidden": { "unique_id": "UNIQUE_ID", @@ -28,7 +28,7 @@ class PandasShowDataFrame: CATEGORY = "Data Analysis" - def notify(self, dataframe_json, unique_id=None, extra_pnginfo=None): + def notify(self, dataframe, unique_id=None, extra_pnginfo=None): text = None if unique_id is not None and extra_pnginfo is not None: if not isinstance(extra_pnginfo, list): @@ -39,8 +39,7 @@ class PandasShowDataFrame: ): print("Error: extra_pnginfo[0] is not a dict or missing 'workflow' key") else: - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json[0])) + df = dataframe[0] text = [str(df)] # wrap in list workflow = extra_pnginfo[0]["workflow"] node = next( @@ -48,7 +47,11 @@ class PandasShowDataFrame: None, ) if node: - node["widgets_values"] = [text] + node["widgets_values"] = text # [text] else: print("unique_id or extra_pnginfo is None.") - return {"ui": {"text": text}, "result": (text,)} + + # "ui" value is the one that is shown on the node UI. + # Note that "ui" return value needs to a list of strings. + return {"ui": {"text": text}, + "result": (text,)} diff --git a/modules/pandas_wrapper/pandas_show_index.py b/modules/pandas_wrapper/pandas_show_index.py new file mode 100644 index 0000000..b2fc0c6 --- /dev/null +++ b/modules/pandas_wrapper/pandas_show_index.py @@ -0,0 +1,52 @@ +""" +This code is based on +https://github.com/pythongosssss/ComfyUI-Custom-Scripts/blob/main/py/show_text.py + +See credit/credit.md for the full license. +""" +import pandas as pd + +class PandasShowIndex: + @classmethod + def INPUT_TYPES(s): + return { + "required": { + "index_list": ("PDINDEX", {}), + }, + "hidden": { + "unique_id": "UNIQUE_ID", + "extra_pnginfo": "EXTRA_PNGINFO", + }, + } + + INPUT_IS_LIST = True + RETURN_TYPES = ("STRING",) + FUNCTION = "notify" + OUTPUT_NODE = True + OUTPUT_IS_LIST = (True,) + + CATEGORY = "Data Analysis" + + def notify(self, index_list, unique_id=None, extra_pnginfo=None): + text = None + if unique_id is not None and extra_pnginfo is not None: + if not isinstance(extra_pnginfo, list): + print("Error: extra_pnginfo is not a list") + elif ( + not isinstance(extra_pnginfo[0], dict) + or "workflow" not in extra_pnginfo[0] + ): + print("Error: extra_pnginfo[0] is not a dict or missing 'workflow' key") + else: + ind = index_list[0] + text = [str(ind)] # wrap in list + workflow = extra_pnginfo[0]["workflow"] + node = next( + (x for x in workflow["nodes"] if str(x["id"]) == str(unique_id[0])), + None, + ) + if node: + node["widgets_values"] = [text] + else: + print("unique_id or extra_pnginfo is None.") + return {"ui": {"text": text}, "result": (text,)} diff --git a/modules/pandas_wrapper/pandas_show_series.py b/modules/pandas_wrapper/pandas_show_series.py index e86f500..27cdf3a 100644 --- a/modules/pandas_wrapper/pandas_show_series.py +++ b/modules/pandas_wrapper/pandas_show_series.py @@ -14,7 +14,7 @@ class PandasShowSeries: def INPUT_TYPES(s): return { "required": { - "series_json": ("STRING", {"forceInput": True}), + "series_list": ("PDSERIES", {}), }, "hidden": { "unique_id": "UNIQUE_ID", @@ -30,7 +30,7 @@ class PandasShowSeries: CATEGORY = "Data Analysis" - def notify(self, series_json, unique_id=None, extra_pnginfo=None): + def notify(self, series_list, unique_id=None, extra_pnginfo=None): text = None if unique_id is not None and extra_pnginfo is not None: if not isinstance(extra_pnginfo, list): @@ -41,8 +41,7 @@ class PandasShowSeries: ): print("Error: extra_pnginfo[0] is not a dict or missing 'workflow' key") else: - # Deserialize JSON string to DataFrame - series = jsons_to_series(series_json[0]) + series = series_list[0] text = [series_to_jsons(series)] # wrap in list workflow = extra_pnginfo[0]["workflow"] node = next( diff --git a/modules/pandas_wrapper/pandas_sort.py b/modules/pandas_wrapper/pandas_sort.py index 376df0a..b289edc 100644 --- a/modules/pandas_wrapper/pandas_sort.py +++ b/modules/pandas_wrapper/pandas_sort.py @@ -18,32 +18,27 @@ class PandasSort: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}), + "dataframe": ("DATAFRAME", {}), "column_name": ("STRING", {"default": ""}), "ascending": ("BOOLEAN", {"default": True}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "sort_rows" CATEGORY: str = "Data Analysis" - def sort_rows(self, dataframe_json: str, column_name: str, ascending: bool) -> tuple: + def sort_rows(self, dataframe: pd.DataFrame, column_name: str, ascending: bool) -> tuple: """ Sorts a pandas DataFrame by the specified column. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. column_name (str): The name of the column to sort by. ascending (bool): Whether to sort in ascending order. Returns: tuple: A tuple containing a JSON string of the sorted DataFrame. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - - # Sort DataFrame - df2 = df.sort_values(by=column_name, ascending=ascending) - - return (df2.to_json(),) + df2 = dataframe.sort_values(by=column_name, ascending=ascending) + return (df2,) diff --git a/modules/pandas_wrapper/pandas_std.py b/modules/pandas_wrapper/pandas_std.py index 775c624..2e91cb1 100644 --- a/modules/pandas_wrapper/pandas_std.py +++ b/modules/pandas_wrapper/pandas_std.py @@ -19,24 +19,22 @@ class PandasStd: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}) + "dataframe": ("DATAFRAME", {}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("PDSERIES",) FUNCTION: str = "f" CATEGORY: str = "Data Analysis" - def f(self, dataframe_json: str) -> tuple: + def f(self, dataframe: pd.DataFrame) -> tuple: """ Returns a Series with standard deviation for each column. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: - tuple: A tuple containing a JSON string for the Series. + tuple: A tuple containing the Series. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - return (series_to_jsons(df.std()),) + return (dataframe.std(),) diff --git a/modules/pandas_wrapper/pandas_sub.py b/modules/pandas_wrapper/pandas_sub.py new file mode 100644 index 0000000..7ccba05 --- /dev/null +++ b/modules/pandas_wrapper/pandas_sub.py @@ -0,0 +1,43 @@ +from typing import Any, Dict +from io import StringIO +import pandas as pd + + +class PandasSub: + """ + PandasSub: + A class for subtracting two pandas DataFrames. + """ + + @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": { + "a_dataframe": ("DATAFRAME", {}), + "b_dataframe": ("DATAFRAME", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, a_dataframe: pd.DataFrame, b_dataframe: pd.DataFrame) -> tuple: + """ + Subtract two pandas DataFrames. + + Args: + a_dataframe (DataFrame): The left DataFrame. + b_dataframe (DataFrame): The right DataFrame. + + Returns: + tuple: A tuple containing the DataFrame containing the result of subtraction. + """ + df_out = a_dataframe.sub(b_dataframe) + return (df_out,) diff --git a/modules/pandas_wrapper/pandas_sub_series.py b/modules/pandas_wrapper/pandas_sub_series.py new file mode 100644 index 0000000..b259f9c --- /dev/null +++ b/modules/pandas_wrapper/pandas_sub_series.py @@ -0,0 +1,43 @@ +from typing import Any, Dict +from io import StringIO +import pandas as pd +from .utils import jsons_to_series + +class PandasSubSeries: + """ + PandasSubSeries: + A class for subtracting a Pandas Series from a Pandas DataFrame. + """ + + @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": { + "a_dataframe": ("DATAFRAME", {}), + "b_series": ("PDSERIES", {}) + } + } + + RETURN_TYPES: tuple = ("DATAFRAME",) + FUNCTION: str = "f" + CATEGORY: str = "Data Analysis" + + def f(self, a_dataframe: pd.DataFrame, b_series: pd.Series) -> tuple: + """ + Subtract a pandas Series from a pandas DataFrame. + + Args: + a_dataframe (DataFrame): The DataFrame. + b_series (Series): The Series. + + Returns: + tuple: A tuple containing the DataFrame containing the result of subtraction. + """ + df_out = a_dataframe.sub(b_series) + return (df_out,) diff --git a/modules/pandas_wrapper/pandas_sum.py b/modules/pandas_wrapper/pandas_sum.py index af5e63e..83f7ebb 100644 --- a/modules/pandas_wrapper/pandas_sum.py +++ b/modules/pandas_wrapper/pandas_sum.py @@ -19,24 +19,22 @@ class PandasSum: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}) + "dataframe": ("DATAFRAME", {}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("PDSERIES",) FUNCTION: str = "f" CATEGORY: str = "Data Analysis" - def f(self, dataframe_json: str) -> tuple: + def f(self, dataframe: pd.DataFrame) -> tuple: """ Returns a Series with sum for each column. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: - tuple: A tuple containing a JSON string for the Series. + tuple: A tuple containing the Series. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - return (series_to_jsons(df.sum()),) + return (dataframe.sum(),) diff --git a/modules/pandas_wrapper/pandas_summary.py b/modules/pandas_wrapper/pandas_summary.py index ebecc01..cbe856f 100644 --- a/modules/pandas_wrapper/pandas_summary.py +++ b/modules/pandas_wrapper/pandas_summary.py @@ -18,28 +18,23 @@ class PandasSummary: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}), + "dataframe": ("DATAFRAME", {}), } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("DATAFRAME",) FUNCTION: str = "analyze_dataframe" CATEGORY: str = "Data Analysis" - def analyze_dataframe(self, dataframe_json: str) -> tuple: + def analyze_dataframe(self, dataframe: pd.DataFrame) -> tuple: """ Analyzes a pandas DataFrame and returns a summary. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: tuple: A tuple containing a string representation of the DataFrame summary. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - - # Perform summary operation - summary = df.describe() - + summary = dataframe.describe() return (str(summary),) diff --git a/modules/pandas_wrapper/pandas_to_string.py b/modules/pandas_wrapper/pandas_to_string.py index 3c28fc2..55ece59 100644 --- a/modules/pandas_wrapper/pandas_to_string.py +++ b/modules/pandas_wrapper/pandas_to_string.py @@ -18,7 +18,7 @@ class PandasToString: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}), + "dataframe": ("DATAFRAME", {}), } } @@ -26,16 +26,14 @@ class PandasToString: FUNCTION: str = "to_string" CATEGORY: str = "Data Analysis" - def to_string(self, dataframe_json: str) -> tuple: + def to_string(self, dataframe: pd.DataFrame) -> tuple: """ Converts a pandas DataFrame to a string representation. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: tuple: A tuple containing the string representation of the DataFrame. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - return (str(df),) + return (str(dataframe),) diff --git a/modules/pandas_wrapper/pandas_var.py b/modules/pandas_wrapper/pandas_var.py index 900fd70..d3d9c17 100644 --- a/modules/pandas_wrapper/pandas_var.py +++ b/modules/pandas_wrapper/pandas_var.py @@ -19,24 +19,22 @@ class PandasVar: """ return { "required": { - "dataframe_json": ("STRING", {"multiline": True}) + "dataframe": ("DATAFRAME", {}) } } - RETURN_TYPES: tuple = ("STRING",) + RETURN_TYPES: tuple = ("PDSERIES",) FUNCTION: str = "f" CATEGORY: str = "Data Analysis" - def f(self, dataframe_json: str) -> tuple: + def f(self, dataframe: pd.DataFrame) -> tuple: """ Returns a Series with variance for each column. Args: - dataframe_json (str): A JSON string representation of the DataFrame. + dataframe (DataFrame): The DataFrame. Returns: - tuple: A tuple containing a JSON string for the Series. + tuple: A tuple containing the Series. """ - # Deserialize JSON string to DataFrame - df = pd.read_json(StringIO(dataframe_json)) - return (series_to_jsons(df.var()),) + return (dataframe.var(),) diff --git a/pyproject.toml b/pyproject.toml index be4767b..a51d903 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.0.19" +version = "1.1.0" license = {file = "LICENSE"} [project.urls] diff --git a/web/js/ShowDataFrame.js b/web/js/ShowDataFrame.js index 81abda3..4fe2492 100644 --- a/web/js/ShowDataFrame.js +++ b/web/js/ShowDataFrame.js @@ -15,18 +15,20 @@ app.registerExtension({ if (nodeData.name === "PandasShowDataFrame") { // This needs to match NODE_CLASS_MAPPINGS in Python function populate(text) { if (this.widgets) { - for (let i = 1; i < this.widgets.length; i++) { + // Clear all widgets on the node + for (let i = 0; i < this.widgets.length; i++) { + // if onRemove method exists, call it. this.widgets[i].onRemove?.(); } - this.widgets.length = 1; + this.widgets.length = 0; } - const v = [...text]; + const v = [...text]; // Copy the text list (e.g. text.copy()) if (!v[0]) { v.shift(); } for (const list of v) { - const w = ComfyWidgets["STRING"](this, "text2", ["STRING", { multiline: true }], app).widget; + const w = ComfyWidgets["STRING"](this, "text0", ["STRING", { multiline: true }], app).widget; w.inputEl.readOnly = true; w.inputEl.style.opacity = 0.6; w.value = list; diff --git a/web/js/ShowIndex.js b/web/js/ShowIndex.js new file mode 100644 index 0000000..cbf8217 --- /dev/null +++ b/web/js/ShowIndex.js @@ -0,0 +1,66 @@ +/* +This code is based on +https://github.com/pythongosssss/ComfyUI-Custom-Scripts/blob/main/web/js/showText.js + +See credit/credit.md for the full license. +*/ + +import { app } from "../../../scripts/app.js"; +import { ComfyWidgets } from "../../../scripts/widgets.js"; + +// Displays input text on a node +app.registerExtension({ + name: "HowToSD.ShowIndex", + async beforeRegisterNodeDef(nodeType, nodeData, app) { + if (nodeData.name === "PandasShowIndex") { // This needs to match NODE_CLASS_MAPPINGS in Python + function populate(text) { + if (this.widgets) { + // Clear all widgets on the node + for (let i = 0; i < this.widgets.length; i++) { + // if onRemove method exists, call it. + this.widgets[i].onRemove?.(); + } + this.widgets.length = 0; + } + + const v = [...text]; // Copy the text list (e.g. text.copy()) + if (!v[0]) { + v.shift(); + } + for (const list of v) { + const w = ComfyWidgets["STRING"](this, "text0", ["STRING", { multiline: true }], app).widget; + w.inputEl.readOnly = true; + w.inputEl.style.opacity = 0.6; + w.value = list; + } + + requestAnimationFrame(() => { + const sz = this.computeSize(); + if (sz[0] < this.size[0]) { + sz[0] = this.size[0]; + } + if (sz[1] < this.size[1]) { + sz[1] = this.size[1]; + } + this.onResize?.(sz); + app.graph.setDirtyCanvas(true, false); + }); + } + + // When the node is executed we will be sent the input text, display this in the widget + const onExecuted = nodeType.prototype.onExecuted; + nodeType.prototype.onExecuted = function (message) { + onExecuted?.apply(this, arguments); + populate.call(this, message.text); + }; + + const onConfigure = nodeType.prototype.onConfigure; + nodeType.prototype.onConfigure = function () { + onConfigure?.apply(this, arguments); + if (this.widgets_values?.length) { + populate.call(this, this.widgets_values.slice(+this.widgets_values.length > 1)); + } + }; + } + }, +}); \ No newline at end of file diff --git a/web/js/ShowSeries.js b/web/js/ShowSeries.js index c721c06..f8acd49 100644 --- a/web/js/ShowSeries.js +++ b/web/js/ShowSeries.js @@ -15,18 +15,20 @@ app.registerExtension({ if (nodeData.name === "PandasShowSeries") { // This needs to match NODE_CLASS_MAPPINGS in Python function populate(text) { if (this.widgets) { - for (let i = 1; i < this.widgets.length; i++) { + // Clear all widgets on the node + for (let i = 0; i < this.widgets.length; i++) { + // if onRemove method exists, call it. this.widgets[i].onRemove?.(); } - this.widgets.length = 1; + this.widgets.length = 0; } - const v = [...text]; + const v = [...text]; // Copy the text list (e.g. text.copy()) if (!v[0]) { v.shift(); } for (const list of v) { - const w = ComfyWidgets["STRING"](this, "text2", ["STRING", { multiline: true }], app).widget; + const w = ComfyWidgets["STRING"](this, "text0", ["STRING", { multiline: true }], app).widget; w.inputEl.readOnly = true; w.inputEl.style.opacity = 0.6; w.value = list;