From 12da5ef328e7ba9a8fcfbd2198f43cfaa402b0a6 Mon Sep 17 00:00:00 2001 From: kinshuk Date: Thu, 27 Mar 2025 16:14:27 +0530 Subject: [PATCH 1/2] added export to csv faeture --- src/vanna/base/base.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/vanna/base/base.py b/src/vanna/base/base.py index 4c05de58..a62efcae 100644 --- a/src/vanna/base/base.py +++ b/src/vanna/base/base.py @@ -2099,3 +2099,35 @@ def get_plotly_figure( fig.update_layout(template="plotly_dark") return fig + + def export_to_csv(self, df: pd.DataFrame, filepath: str, **kwargs) -> None: + """ + Example: + ```python + vn.export_to_csv(df, "results.csv") + ``` + + Export a pandas DataFrame to a CSV file with proper UTF-8 encoding. + This ensures that non-ASCII text(such as Chinese characters) are correctly rendered in the exported file. + + Args: + df (pd.DataFrame): The DataFrame to export to CSV. + filepath (str): The file path where the CSV will be saved. + **kwargs: Additional keyword arguments to pass to pandas' to_csv method. + + Returns: + None + """ + # Set default encoding to UTF-8 if not provided + if 'encoding' not in kwargs: + kwargs['encoding'] = 'utf-8' + + # Set default index parameter to False if not provided + if 'index' not in kwargs: + kwargs['index'] = False + + try: + df.to_csv(filepath, **kwargs) + except Exception as e: + self.log(f"Error exporting DataFrame to CSV: {e}", title="Export Error") + raise \ No newline at end of file From 62c47dd658d759f8e1fa3657ef061829430ca9b7 Mon Sep 17 00:00:00 2001 From: kinshuk Date: Fri, 28 Mar 2025 13:46:02 +0530 Subject: [PATCH 2/2] added type validation --- src/vanna/base/base.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/vanna/base/base.py b/src/vanna/base/base.py index a62efcae..3aaf57d2 100644 --- a/src/vanna/base/base.py +++ b/src/vanna/base/base.py @@ -2118,6 +2118,11 @@ def export_to_csv(self, df: pd.DataFrame, filepath: str, **kwargs) -> None: Returns: None """ + if not isinstance(df, pd.DataFrame): + raise TypeError("Expected pandas DataFrame") + if not isinstance(filepath, str): + raise TypeError("Filepath must be string") + # Set default encoding to UTF-8 if not provided if 'encoding' not in kwargs: kwargs['encoding'] = 'utf-8' @@ -2128,6 +2133,9 @@ def export_to_csv(self, df: pd.DataFrame, filepath: str, **kwargs) -> None: try: df.to_csv(filepath, **kwargs) - except Exception as e: - self.log(f"Error exporting DataFrame to CSV: {e}", title="Export Error") + except OSError as e: + self.log(f"File system error: {e}", title="Export Error") + raise + except pd.errors.PandasError as e: + self.log(f"Data export error: {e}", title="Export Error") raise \ No newline at end of file