簡體   English   中英

通過使用每列的縮放數據來減少 Pandas DataFrame 內存消耗?

[英]Reducing pandas DataFrame memory consumption by use of scaled data for each column?

我想在管理一些 Pandas DataFrame 時減少內存消耗。 例如,我知道從 float64 切換到 flot32 的技巧,這很有趣。

更進一步,並且知道我的數值實際上具有“小”絕對最小值和最大值,我想知道是否可以要求熊貓對給定列使用比例因子?

最好的例子是百分比。

對於百分比,您知道最小值為 0,最大值為 1。這些最小值和最大值可以存儲為列的屬性。

然后我可以使用 int16 例如,列值將存儲為 [-128; 之間的縮放值; 127]。 然后在使用時,它們將使用已存儲為列屬性的最小值和最大值縮放回其“原始值”(帶有一些舍入)。

這種方法可以用於管理熊貓數據幀嗎?

感謝您的幫助和反饋! 最好的,

我使用這個有用的輔助函數。 但是當然可以使用更好的解決方案。

def reduce_mem_usage(data_frame):
    start_mem_usg = data_frame.memory_usage(deep=True).sum() / 1024 ** 2
    print("Memory usage of the dataframe is : {:03.2f} {}".format(start_mem_usg, " MB"))
    for col in data_frame.columns:
        if data_frame[col].dtype not in [object, "datetime64", "datetime64[ns]"]:  # Exclude strings

            print("******************************")
            print("Column: ", col)
            print("dtype before: ", data_frame[col].dtype)
            is_int = False
            try:
                mx = data_frame[col].max()
            except Exception:
                continue
            mn = data_frame[col].min()
            try:
                as_int = data_frame[col].fillna(0).astype(numpy.int64)
                result = (data_frame[col] - as_int)
                result = result.sum()
                if result > -0.01 and result < 0.01:
                    is_int = True
            except:
                continue

            try:

                if is_int:
                    if mn >= 0:
                        if mx < 255:
                            data_frame[col] = data_frame[col].astype(numpy.uint8)
                        elif mx < 65535:
                            data_frame[col] = data_frame[col].astype(numpy.uint16)
                        elif mx < 4294967295:
                            data_frame[col] = data_frame[col].astype(numpy.uint32)
                        else:
                            data_frame[col] = data_frame[col].astype(numpy.uint64)
                    else:
                        if mn > numpy.iinfo(numpy.int8).min and mx < numpy.iinfo(numpy.int8).max:
                            data_frame[col] = data_frame[col].astype(numpy.int8)
                        elif mn > numpy.iinfo(numpy.int16).min and mx < numpy.iinfo(numpy.int16).max:
                            data_frame[col] = data_frame[col].astype(numpy.int16)
                        elif mn > numpy.iinfo(numpy.int32).min and mx < numpy.iinfo(numpy.int32).max:
                            data_frame[col] = data_frame[col].astype(numpy.int32)
                        elif mn > numpy.iinfo(numpy.int64).min and mx < numpy.iinfo(numpy.int64).max:
                            data_frame[col] = data_frame[col].astype(numpy.int64)

                            # Make float datatypes 32 bit
                else:
                    data_frame[col] = data_frame[col].astype(numpy.float32)
                print("dtype after: ", data_frame[col].dtype)
                print("******************************")
            except ValueError:
                continue
    print("___MEMORY USAGE AFTER COMPLETION:___")
    mem_usg = data_frame.memory_usage(deep=True).sum() / 1024 ** 2
    print("Memory usage is: {:03.2f} {}".format(mem_usg, " MB"))
    print("This is ", 100 * mem_usg / start_mem_usg, "% of the initial size")
    return data_frame

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM