csv文件怎么打开数据不丢失,无法保存csv文件怎么办
csv文件怎么打开数据不丢失,无法保存csv文件怎么办
CSV的优势:
CSV的缺点:
在开始之前,我们首先来了解一下这些文件格式如何处理各种数据类型。
Pandas 支持非常多数据类型,其中一些还具有多个子类型,用于提高处理大数据帧的效率。基本数据类型包括:
由于 pandas 使用 numpy 数组作为其后端结构,因此 ints 和 float 可以区分为内存效率更高的类型,例如 int8,int16,int32,int64,unit8,uint16,uint32 和 uint64 以及 float32 和 float64。
CSV 不存储有关数据类型的信息,所以我们必须在每个 read_csv()中对它进行指定。在不告知 CSV 阅读器的情况下,它将推断所有整数列为效率的 int64,将 float 转换为 float64,将类别作为字符串以及日期时间加载。
#对于每个加载的数据集,必须指定让数据帧更高效的格式df = pd.read_csv(new_file, dtype={"colA": "int8", "colB": "int16", "colC": "uint8", "colcat": "category"}, parse_dates=["colD","colDt"])
TimeDeltas以字符串的形式存储在 CSVs-5days+18:59:39.000000 中,我们必须编写一个特殊的解析器来将这些字符串转换回 pandas 的 timedelta 格式。
时区看起来像 2020-08-06 15:35:06-06:00,并且需要在 read_csv()中进行特殊处理。
使用没有参数的read_csv()比较原始dtypes和自动推断的类型
幸运的是,csv不是保存数据帧的选择。阅读 Pandas 的 IO 工具,你会发现一个数据帧可以写入多种格式、数据库,甚是剪贴板。
接下来我们来详细描述数据是如何创建的,并将教大家使用真实的数据帧完成性能测试和健全性检查。
Pickle 是用于对象序列化的 python 本地格式。 它允许 python 代码实现任何形式的增强,例如PEP574 酸洗带外数据缓冲区中描述的协议5。
这也意味着很难在 Python 生态系统之外进行酸洗。 但是,如果你想存储一些预处理的数据以备后用,或者不想在不立即使用数据的情况下浪费几个小时的分析工作,那么你只需对它们进行 pickle 处理即可。
# Pandas的to_pickle方法df.to_pickle(path)
与 .to_csv()相反,.to_pickle()方法仅接受3个参数:
pickle 的优点:
pickle 的缺点:
Pickle能够100%序列化的padnas数据类型
apache parquet 是 Hadoop 生态系统中使用的压缩二进制列存储格式。它允许序列化复杂的嵌套结构,支持按列压缩和按列编码,并提供快速读取,甚不需要读取整个列,因为我们只需要部分数据。
# Pandas的to_parquet方法df.to_parquet(path, engine, compression, index, partition_cols)
.to_parquet()方法仅接受以下几个参数:
parquet 的优势:
parquet 的缺点:
将数据导出到 excel 中可以更加方便操作。它以最慢的读写速度为代价,就是为了更加易于操作。它还忽略了许多数据类型,而且时区根本不能写入 excel 。
# 将数据框导出到exceldf.to_excel(excel_writer, sheet_name, many_other_parameters)
to_excel 中非常有用的几个参数:
excel的优点:
excel的缺点:
只有54%的列保留原始数据类型,它占用了CSV大小的90%,但是写入时间增加了20倍,读取时间增加了42倍
使用适于大量异构数据的内部文件状结构的压缩格式。如果我们需要随机访问数据集的各个部分,这也是理想的选择。如果数据存储为表(PyTable),则可以使用 store.select(key,where =“ A> 0或B <5”)直接查询 hdf 存储。
# 将数据帧导出到hdfdf.to_hdf(path_or_buf, key, mode, complevel, complib, append ...)
to_hdf()中比较有用的几个参数:
HDF5的优点:
HDF5的缺点:
通常,将数据长保存到数据库中,是非常有必要的。像 sqlalchemy 这样的库就是专门用于此任务。
SQL的优点:
SQL的缺点:
Pandas 提供了非常多的方法,在此,我省略了 json 和 fix-width 文件,因为它们与 csv 具有类似的特性。另外,你可以用 .to_gbq()或 stata 格式直接写入 Google Big Query。满足各种云提供商通信需要的新格式就会出现。
很多方法保存的数据格式都比 CSV 好用,但是当 CSV 更容易被理解时,这些不同寻常的方法值得使用吗?让我们测试一下性能。
为此,我准备了一个50K大小,包含随机数、字符串、类别、日期时间和布尔值的数据集。
data = []for i in range(1000000): data.append( [random.randint(-127,127), # int8 random.randint(-32768,32767), # int16
生成随机样本是几乎每个测试都使用的一项技能。
你可以在以下的GitHub链接中检查生成随机字符串和日期的支持功能:
这里只介绍一个:
def get_random_string(length: int) -> str: """Generated random string up to the specific lenght""" letters = string.ascii_letters result_str = ''.join([random.choice(letters) for i in range(random.randint(3,length))]) return result_str
一旦我们有了数据,我们就可以用不同的算法反复处理它们。也可以分别编写每个测试,但让我们将测试压缩到一行:
# 性能测试performance_df = performance_test(exporting_types)# 结果performance_df.style.format("{:.2%}")
performance_test函数接受带有测试定义的字典,该字典如下所示:
d = { ..."parquet_fastparquet": { "type": "Parquet via fastparquet", "extension": ".parquet.gzip", "write_function": pd.DataFrame.to_parquet, "write_params": {"engine":"fastparquet","compression":"GZIP"}, "read_function": pd.read_parquet, "read_params": {"engine":"fastparquet"} }... }
字典包含应运行的功能,例如 pd.DataFrame.to_parquet 和参数。 我们迭代 dict 并逐个运行函数:
path = "output_file"# df是我们的性能测试样本数据帧# 保持dfd["write_function"](df, path, **d["write_params"])# 加载df df_loaded = d["read_function"](path, **d["read_params"]
将结果存储到一个数据帧中,利用 Plotly.Express 的功能通过几行代码来显示结果:
# 显示带有结果的图形fig = pe.bar(performance_df.T, barmode='group', text="value")#格式化标签fig.update_traces(texttemplate='%{text:.2%}', textposition='auto')# 添加标题fig.update_layout(title=f"Statistics for {dataset_size} records")fig.show()
完整性检查
对随机样本进行测试,在符实际的情况下,有助于建立我们的应用程序或工具有多好的印象。为了避免意外,你一定要在实际数据的基础上测试代码。在这里,我选择了我最喜欢的数据集——美国证券交易委员会季度数据转储,并对其进行了性能测试。取得了非常相似的结果,证明我的假设并非完全错误。
pickle 在性能上处于领先,但是我们还是会根据不同的数据集,选择不同的数据格式,在实际数据测试中,性能也可能会有所不同。
对我个人而言,.to_pickle()在存储预处理的数据集时是非常有用的,因为不需要担心数据格式,只需要 read_pickle()即可。
--END--