import pyarrow
from io import BytesIO
from pyarrow import parquet as pq

def to_parquetbytes(dataframe):
    buffer = BytesIO()
    table = pyarrow.Table.from_pandas(dataframe, preserve_index=False)
    pq.write_table(table, buffer)
    buffer.seek(0)
    parquetbytes = buffer.getvalue()
    return parquetbytes


def to_dataframe(parquetbytes):
    buffer = BytesIO()
    buffer.write(parquetbytes)
    dataframe = pq.read_table(buffer).to_pandas()
    return dataframe

# In metaflow, dataframes can be persisted to the backing datastore
# by writing them as parquet bytes `self.df = to_parquetbytes(df)`. 
# The written parquet bytes can be deserialized into dataframes by
# `df = to_dataframe(self.df)`.