将稀疏 pandas 数据帧保存为不同的文件类型

Save sparse pandas dataframe to different file types

提问人:Coffeemug13 提问时间:4/1/2020 最后编辑:Coffeemug13 更新时间:4/1/2020 访问量:1303

问:

我正在处理来自一个来源的物联网数据,该数据源从传感器读数中发送大量 GB 的稀疏数据。为了制作用于分析的快照,我尝试将它们导出到一个小文件中,稍后将其作为稀疏 panda 数据帧读取,以保持较低的内存使用率。

随着 pandas 的 v1.0 发生变化,很多事情都发生了变化,我被卡住了:-(

下面是我的测试工作流程

  1. 创建一些具有不同数据类型(int、 float, string as a category, string, date)
  2. 将它们转换为 Panda DataFrame(工作正常)
  3. 保存它们(以查找稀疏数据的差异) --> 错误
  4. 将熊猫帧转换为稀疏数据帧 --> v1.0 之前出现错误
  5. 保存它们(以查找稀疏数据的差异) -->错误

问题:

  • 拜托,谁知道,出了什么问题以及如何解决它
  • 我以新的熊猫方式获得稀疏数据帧的方法是否正确?

多谢

首先,创建一些稀疏输入数据

import datetime
import sys
import time
import random
import pandas as pd
from IPython.display import display, HTML

input_data = list()

# create the input for a sparse matrix with different dtypes
columns = list(map(chr, range(ord('F'), ord('Z') - 1)))
category = ['Category A', 'Category B', 'Category C']
random.seed('dsgsdf')
chunk_size = 100 * 1000  # for testing bigger or smaller data sets
for row in range(1 * chunk_size):
    r = dict()
    r['A'] = row
    if random.randint(0, 9) >= 3:
        r['B'] = str(datetime.datetime.now())  # make the datetime conversion a bit harder
    if random.randint(0, 9) >= 5:
        r['C'] = category[random.randint(0, len(category) - 1)]
    if random.randint(0, 9) >= 9:
        r['D'] = random.randint(0,1000)
    if random.randint(0, 9) >= 9:
        r['E'] = pd.util.testing.rands(4) # random string = no category
    r[columns[random.randint(0, len(columns) - 1)]] = float(random.randint(0, 1000)/2)
    input_data.append(r)

转换为密集 pandas 数据帧

dense_df = pd.DataFrame(input_data)
dense_df = dense_df.reindex(sorted(dense_df.columns), axis=1) # sort by column name
dense_df['B'] = pd.to_datetime(dense_df['B'], format='%Y-%m-%d %H:%M:%S.%f')
dense_df['C'] = dense_df['C'].astype('category') # strings as category
dense_df = dense_df.convert_dtypes() # without this line the export works, but with the line lower memory usage

将密集矩阵以不同的格式保存到磁盘。这不起作用,第 .convert_dtypes() 行

dense_df.to_hdf("data/dense-data-c0.h5", key='my',complevel=0,mode='w',format='table')
dense_df.to_hdf("data/dense-data-c9.h5", key='my',complevel=9,mode='w',format='table')
dense_df.to_pickle("data/dense-data.pkl.zip")
dense_df.to_parquet("data/dense-data.parquet.gzip",compression="gzip",allow_truncated_timestamps=True)
dense_df.to_parquet("data/dense-data.parquet",allow_truncated_timestamps=True)
dense_df.to_pickle("data/dense-data.pkl")
dense_df.to_json("data/dense-data.json")

转换为稀疏矩阵,以节省内存使用量。这在 pandas v1.0 之前就有效

import numpy as np
start = time.time()
sparse_df = dense_df.copy()

# define some sparse dtypes
dtype_float = pd.SparseDtype('float')
dtype_int = pd.SparseDtype('int')
dtype_str = pd.SparseDtype('string')
dtype_datetime = pd.SparseDtype('datetime64')
sparse_df['B'] = sparse_df['B'].astype(dtype_datetime)
sparse_df['E'] = sparse_df['E'].astype(dtype_str)
sparse_df['D'] = sparse_df['D'].astype(dtype_int)

将密集矩阵以不同的格式保存到磁盘。这是行不通的

sparse_df.to_hdf("data/sparse-data-c0.h5", key='my',complevel=0,mode='w',format='table')
sparse_df.to_hdf("data/sparse-data-c9.h5", key='my',complevel=9,mode='w',format='table')
sparse_df.to_pickle("data/sparse-data.pkl.zip")
sparse_df.to_parquet("data/sparse-data.parquet.gzip",compression="gzip",allow_truncated_timestamps=True)
sparse_df.to_parquet("data/sparse-data.parquet",allow_truncated_timestamps=True)
sparse_df.to_pickle("data/sparse-data.pkl")
sparse_df.to_json("data/sparse-data.json")
Python Pandas 数据帧 稀疏矩阵

评论


答: 暂无答案