35 lines
1.0 KiB
Python
35 lines
1.0 KiB
Python
from __future__ import annotations
|
|
from typing import Dict
|
|
import polars as pl
|
|
from tools.base import BaseTool
|
|
|
|
|
|
class TransposeTool(BaseTool):
|
|
def execute(self, inputs: Dict[str, pl.DataFrame]) -> Dict[str, pl.DataFrame]:
|
|
df = inputs.get("Input", pl.DataFrame())
|
|
if self.config is None or df.is_empty():
|
|
return {"Output": df}
|
|
|
|
keys = [
|
|
f.attrib["name"]
|
|
for f in self.config.findall("KeyFields/Field")
|
|
if f.attrib["name"] in df.columns
|
|
]
|
|
data_cols = [
|
|
f.attrib["name"]
|
|
for f in self.config.findall("DataFields/Field")
|
|
if f.attrib["name"] in df.columns
|
|
]
|
|
|
|
if not data_cols:
|
|
# Default: all non-key columns become data columns
|
|
data_cols = [c for c in df.columns if c not in keys]
|
|
|
|
result = df.unpivot(
|
|
on=data_cols,
|
|
index=keys,
|
|
variable_name="Name",
|
|
value_name="Value",
|
|
)
|
|
return {"Output": result}
|