【问题标题】:How to store Dataframe data to Firebase Storage?如何将 Dataframe 数据存储到 Firebase Storage?
【发布时间】:2022-03-09 03:23:42
【问题描述】:

给定一个包含一些数据的 pandas Dataframe,将这些数据存储到 Firebase 的最佳方法是什么?

我应该将 Dataframe 转换为本地文件(例如 .csv、.txt)然后将其上传到 Firebase Storage,还是可以直接存储 pandas Dataframe 而无需转换?还是有更好的最佳做法?

更新 01/03 - 到目前为止,我已经有了这个解决方案,它需要在本地编写一个 csv 文件,然后读入并上传它,然后删除本地文件。但是我怀疑这是最有效的方法,因此我想知道它是否可以做得更好更快?

import os
import firebase_admin
from firebase_admin import db, storage

cred   = firebase_admin.credentials.Certificate(cert_json)
app    = firebase_admin.initialize_app(cred, config)
bucket = storage.bucket(app=app)

def upload_df(df, data_id):
    """
    Upload a Dataframe as a csv to Firebase Storage
    :return: storage_ref
    """

    # Storage location + extension
    storage_ref = data_id + ".csv"

    # Store locally
    df.to_csv(data_id)

    # Upload to Firebase Storage
    blob    = bucket.blob(storage_ref)
    with open(data_id,'rb') as local_file:
        blob.upload_from_file(local_file)

    # Delete locally
    os.remove(data_id)

    return storage_ref

【问题讨论】:

  • 您要查询它还是只存储文件?如果要对数据执行查询,则需要遵守 Firebase 数据库数据类型。
  • 没有查询只是为了再次检索数据作为数据框
  • 已尝试使用此pypi.org/project/python-firebase。我认为您必须编写自定义脚本。
  • 我认为 firebase 不适合表格数据结构,但我能想到的最好方法是将 DataFrame 的 to_json 方法与 orient='records' 一起使用,并将每一行保存为文档.如果它是一个小表,你也可以使用orient='table',它也存储元数据(数据类型等)。

标签: python pandas firebase dataframe


【解决方案1】:

使用python-firebaseto_dict

postdata = my_df.to_dict()

# Assumes any auth/headers you need are already taken care of.
result = firebase.post('/my_endpoint', postdata, {'print': 'pretty'})
print(result)
# Snapshot info

您可以使用快照信息和端点取回数据,并使用from_dict() 重新建立df。您可以将此解决方案调整为SQLJSON 解决方案,pandas 也支持这些解决方案。

或者,根据脚本执行的位置,您可以考虑将 firebase 视为 db 并使用来自 firebase_admin 的 dbapi(请查看 this。)

至于是否符合最佳实践,在不了解您的用例的情况下很难说。

【讨论】:

  • 您认为将其存储到 Firebase 而不是 Firebase 存储更好?
  • 你的意思是 firebase db vs firebase storage?同样,这更具体到您的用例
  • 我的问题与 Firebase 存储有关,而不是您回答中的数据库。
  • 我的答案是使用 firebase 存储并建议使用 firebase 数据库替代方案
【解决方案2】:

如果你只是想减少代码长度和创建和删除文件的步骤,你可以使用upload_from_string

import firebase_admin
from firebase_admin import db, storage

cred   = firebase_admin.credentials.Certificate(cert_json)
app    = firebase_admin.initialize_app(cred, config)
bucket = storage.bucket(app=app)

def upload_df(df, data_id):
    """
    Upload a Dataframe as a csv to Firebase Storage
    :return: storage_ref
    """
    storage_ref = data_id + '.csv'
    blob = bucket.blob(storage_ref)
    blob.upload_from_string(df.to_csv())

    return storage_ref

https://googleapis.github.io/google-cloud-python/latest/storage/blobs.html#google.cloud.storage.blob.Blob.upload_from_string

【讨论】:

    【解决方案3】:

    经过数小时的研究,以下解决方案对我有用。您需要将 csv 文件转换为字节然后上传。

    import pyrebase
    import pandas
    
    firebaseConfig = {
       "apiKey": "xxxxx",
       "authDomain": "xxxxx",
       "projectId": "xxxxx",
       "storageBucket": "xxxxx",
       "messagingSenderId": "xxxxx",
       "appId": "xxxxx",
       "databaseURL":"xxxxx"
    };
    
    firebase = pyrebase.initialize_app(firebaseConfig)
    
    storage = firebase.storage()
    
    df = pd.read_csv("/content/Future Prices.csv")
    
    # here is the magic. Convert your csv file to bytes and then upload it
    df_string = df.to_csv(index=False)
    db_bytes = bytes(df_string, 'utf8')
    
    fileName = "Future Prices.csv"
    
    storage.child("predictions/" + fileName).put(db_bytes)
    

    这就是快乐编码!

    【讨论】:

      猜你喜欢
      • 2021-09-11
      • 2017-03-20
      • 2016-11-23
      • 1970-01-01
      • 2020-10-06
      • 2020-12-18
      • 2020-01-17
      • 1970-01-01
      • 2021-10-15
      相关资源
      最近更新 更多