提问人:Coffeemug13 提问时间:4/1/2020 最后编辑:Coffeemug13 更新时间:4/1/2020 访问量:1303
将稀疏 pandas 数据帧保存为不同的文件类型
Save sparse pandas dataframe to different file types
问:
我正在处理来自一个来源的物联网数据,该数据源从传感器读数中发送大量 GB 的稀疏数据。为了制作用于分析的快照,我尝试将它们导出到一个小文件中,稍后将其作为稀疏 panda 数据帧读取,以保持较低的内存使用率。
随着 pandas 的 v1.0 发生变化,很多事情都发生了变化,我被卡住了:-(
下面是我的测试工作流程
- 创建一些具有不同数据类型(int、 float, string as a category, string, date)
- 将它们转换为 Panda DataFrame(工作正常)
- 保存它们(以查找稀疏数据的差异) --> 错误
- 将熊猫帧转换为稀疏数据帧 --> v1.0 之前出现错误
- 保存它们(以查找稀疏数据的差异) -->错误
问题:
- 拜托,谁知道,出了什么问题以及如何解决它
- 我以新的熊猫方式获得稀疏数据帧的方法是否正确?
多谢
首先,创建一些稀疏输入数据
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")
答: 暂无答案
评论