Estoy tratando de escribir un marco de datos de pandas como un archivo pickle en un depósito s3 en AWS. Sé que puedo escribir dataframe new_df como csv en un depósito s3 de la siguiente manera:
bucket='mybucket' key='path' csv_buffer = StringIO() s3_resource = boto3.resource('s3') new_df.to_csv(csv_buffer, index=False) s3_resource.Object(bucket,path).put(Body=csv_buffer.getvalue()) Intenté usar el mismo código que el anterior con to_pickle() pero sin éxito.
Además de su respuesta, no necesita convertir a csv. El método pickle.dumps devuelve un byte obj. ver aquí: https://docs.python.org/3/library/pickle.html
import boto3 import pickle bucket='your_bucket_name' key='your_pickle_filename.pkl' pickle_byte_obj = pickle.dumps([var1, var2, ..., varn]) s3_resource = boto3.resource('s3') s3_resource.Object(bucket,key).put(Body=pickle_byte_obj)Encontré la solución, necesito llamar a BytesIO en el búfer para archivos pickle en lugar de StringIO (que son para archivos CSV).
import io import boto3 pickle_buffer = io.BytesIO() s3_resource = boto3.resource('s3') new_df.to_pickle(pickle_buffer) s3_resource.Object(bucket, key).put(Body=pickle_buffer.getvalue())esto funcionó para mí con pandas 0.23.4 y boto3 1.7.80:
bucket='your_bucket_name' key='your_pickle_filename.pkl' new_df.to_pickle(key) s3_resource.Object(bucket, key).put(Body=open(key, 'rb'))