[英]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.