Spaces:
Sleeping
Sleeping
mchinea
commited on
Commit
·
0d8c865
1
Parent(s):
2f8eaba
update tools
Browse files
tools.py
CHANGED
|
@@ -144,46 +144,8 @@ def convert_units(value: float, from_unit: str, to_unit: str) -> float:
|
|
| 144 |
return conversions[key](value)
|
| 145 |
|
| 146 |
|
| 147 |
-
def convert_query_to_pandas_syntax(natural_query: str, column_names: list) -> str:
|
| 148 |
-
"""
|
| 149 |
-
Converts a natural language query to pandas query syntax using basic heuristics.
|
| 150 |
-
|
| 151 |
-
Args:
|
| 152 |
-
natural_query: A string with a question or filter expression in plain English.
|
| 153 |
-
column_names: List of column names from the DataFrame.
|
| 154 |
-
|
| 155 |
-
Returns:
|
| 156 |
-
A best-effort string in pandas query() format.
|
| 157 |
-
"""
|
| 158 |
-
# Preprocess query
|
| 159 |
-
query = natural_query.lower().strip()
|
| 160 |
-
|
| 161 |
-
# Heuristic rules
|
| 162 |
-
rules = [
|
| 163 |
-
(r"(\w+) greater than (\d+)", r"\1 > \2"),
|
| 164 |
-
(r"(\w+) less than (\d+)", r"\1 < \2"),
|
| 165 |
-
(r"(\w+) equal to ['\"]?([\w\s]+)['\"]?", r"\1 == '\2'"),
|
| 166 |
-
(r"(\w+) not equal to ['\"]?([\w\s]+)['\"]?", r"\1 != '\2'"),
|
| 167 |
-
(r"(\w+) more than (\d+)", r"\1 > \2"),
|
| 168 |
-
(r"(\w+) less than or equal to (\d+)", r"\1 <= \2"),
|
| 169 |
-
(r"(\w+) greater than or equal to (\d+)", r"\1 >= \2"),
|
| 170 |
-
(r"(\w+) is ['\"]?([\w\s]+)['\"]?", r"\1 == '\2'"),
|
| 171 |
-
]
|
| 172 |
-
|
| 173 |
-
for pattern, replacement in rules:
|
| 174 |
-
if re.search(pattern, query):
|
| 175 |
-
query = re.sub(pattern, replacement, query)
|
| 176 |
-
break
|
| 177 |
-
|
| 178 |
-
# Handle AND/OR logic
|
| 179 |
-
query = query.replace(" and ", " and ")
|
| 180 |
-
query = query.replace(" or ", " or ")
|
| 181 |
-
|
| 182 |
-
return query
|
| 183 |
-
|
| 184 |
-
|
| 185 |
@tool
|
| 186 |
-
def query_table_data(file_path: str,
|
| 187 |
"""
|
| 188 |
Loads a table from CSV or Excel and filters it using a pandas query.
|
| 189 |
|
|
@@ -208,8 +170,30 @@ def query_table_data(file_path: str, query_pandas_syntax: str, sheet_name: str =
|
|
| 208 |
else:
|
| 209 |
raise ValueError(f"Unsupported file extension: {ext}")
|
| 210 |
try:
|
| 211 |
-
|
| 212 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 213 |
except Exception as e:
|
| 214 |
raise ValueError(f"Invalid query: {query_pandas_syntax}. Error: {e}")
|
| 215 |
except ImportError:
|
|
@@ -368,7 +352,6 @@ level1_tools = [
|
|
| 368 |
web_search,
|
| 369 |
arvix_search,
|
| 370 |
convert_units,
|
| 371 |
-
convert_query_to_pandas_syntax,
|
| 372 |
query_table_data,
|
| 373 |
download_file_from_url,
|
| 374 |
save_and_read_file,
|
|
|
|
| 144 |
return conversions[key](value)
|
| 145 |
|
| 146 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 147 |
@tool
|
| 148 |
+
def query_table_data(file_path: str, query: str, sheet_name: str = None) -> str:
|
| 149 |
"""
|
| 150 |
Loads a table from CSV or Excel and filters it using a pandas query.
|
| 151 |
|
|
|
|
| 170 |
else:
|
| 171 |
raise ValueError(f"Unsupported file extension: {ext}")
|
| 172 |
try:
|
| 173 |
+
#Converts a natural language query to pandas query syntax using basic heuristics.
|
| 174 |
+
# Preprocess query
|
| 175 |
+
query_l = query.lower().strip()
|
| 176 |
+
# Heuristic rules
|
| 177 |
+
rules = [
|
| 178 |
+
(r"(\w+) greater than (\d+)", r"\1 > \2"),
|
| 179 |
+
(r"(\w+) less than (\d+)", r"\1 < \2"),
|
| 180 |
+
(r"(\w+) equal to ['\"]?([\w\s]+)['\"]?", r"\1 == '\2'"),
|
| 181 |
+
(r"(\w+) not equal to ['\"]?([\w\s]+)['\"]?", r"\1 != '\2'"),
|
| 182 |
+
(r"(\w+) more than (\d+)", r"\1 > \2"),
|
| 183 |
+
(r"(\w+) less than or equal to (\d+)", r"\1 <= \2"),
|
| 184 |
+
(r"(\w+) greater than or equal to (\d+)", r"\1 >= \2"),
|
| 185 |
+
(r"(\w+) is ['\"]?([\w\s]+)['\"]?", r"\1 == '\2'"),
|
| 186 |
+
]
|
| 187 |
+
|
| 188 |
+
for pattern, replacement in rules:
|
| 189 |
+
if re.search(pattern, query):
|
| 190 |
+
query = re.sub(pattern, replacement, query)
|
| 191 |
+
break
|
| 192 |
+
# Handle AND/OR logic
|
| 193 |
+
query_pandas_syntax = query.replace(" and ", " and ")
|
| 194 |
+
query_pandas_syntaxs = query.replace(" or ", " or ")
|
| 195 |
+
filtered_df = df.query(query_pandas_syntax)
|
| 196 |
+
return filtered_df.head(10).to_markdown(index=False)
|
| 197 |
except Exception as e:
|
| 198 |
raise ValueError(f"Invalid query: {query_pandas_syntax}. Error: {e}")
|
| 199 |
except ImportError:
|
|
|
|
| 352 |
web_search,
|
| 353 |
arvix_search,
|
| 354 |
convert_units,
|
|
|
|
| 355 |
query_table_data,
|
| 356 |
download_file_from_url,
|
| 357 |
save_and_read_file,
|