dash icon indicating copy to clipboard operation
dash copied to clipboard

dcc.send_data_frame polars support

Open omarirfa opened this issue 8 months ago • 1 comments

Currently dcc.send_data_frame only supports pandas-style writers. I was wondering if polars support can be added as well. Previously, I used to do all my operations in polars and then on the final step when I need to download the dataframe I converted it to pandas to utilize the dcc.send_data_frame function. However, now im using my solution below. I am wondering if we can add a feature to support both pandas and polars via the send_data_frame function

Workaround solution to use polars to send dataframe:

import polars as pl
from dash import Dash, html, dcc, callback, Output, Input
import io
import base64

def polars_to_send_data_frame(df: pl.DataFrame, filename: str, **csv_kwargs):
    buffer = io.StringIO()
    df.write_csv(buffer, **csv_kwargs)
    
    return {
        'content': base64.b64encode(buffer.getvalue().encode('utf-8')).decode('utf-8'),
        'filename': filename,
        'type': 'text/csv',
        'base64': True
    }

app = Dash(__name__)

# Sample data
df = pl.DataFrame({
    'A': range(5),
    'B': ['foo', 'bar', 'baz', 'qux', 'quux'],
    'C': [1.1, 2.2, 3.3, 4.4, 5.5]
})

app.layout = html.Div([
    html.Button("Download CSV", id="btn"),
    dcc.Download(id="download")
])

@callback(
    Output("download", "data"),
    Input("btn", "n_clicks"),
    prevent_initial_call=True
)
def download_csv(n_clicks):
    return polars_to_send_data_frame(df, "data.csv")

if __name__ == '__main__':
    app.run(debug=True)

I would love to contribute and make a pr to add polars support!

omarirfa avatar Feb 06 '25 23:02 omarirfa