gpt4 book ai didi

python - Pandas DataFrame.values 转换错误或功能?

转载 作者:太空宇宙 更新时间:2023-11-04 05:22:46 25 4
gpt4 key购买 nike

pandas (v. 0.18.0) 似乎正在为 values 属性执行一些“幕后”转换,我遇到了一些困难>数据框。我有一个类似于以下内容的数据集:

data = [(1473897600000000, 9.9166, 1.8621, 15), 
(1473897660000000, 19.9166, 3.8621, 20),
(1473897720000000, 29.9166, 5.8621, 25),
(1473897780000000, 39.9166, 7.8621, 30)]

每个元组的第一个元素代表一个以微秒为单位的 POSIX UTC 时间戳。每个元素的(name, dtype)由下面的记录数组给出:

dtype = [('timestamp', np.dtype('int64')), 
('a', np.dtype('float32')),
('b', np.dtype('float32')),
('c', np.dtype('uint8'))]

我使用以下代码将其转换为 DataFrame:

data_array = np.array(data, dtype=dtype)
df = pd.DataFrame.from_records(data_array)

但是,下面的代码给出了一些奇怪的结果(至少对我而言):

ts_orig = np.array([x[0] for x in data], dtype=float)
ts_column = df['timestamp'].values.astype(float)
ts_values = df.values[:, 0]
ts_diff = ts_values - ts_column

print(np.column_stack((ts_orig, ts_column, ts_values, ts_diff)))

# OUTPUT
# ts_orig ts_column ts_values ts_diff
[[ 1.47389760e+15 1.47389760e+15 1.47389762e+15 1.87351040e+07]
[ 1.47389766e+15 1.47389766e+15 1.47389762e+15 -4.12648960e+07]
[ 1.47389772e+15 1.47389772e+15 1.47389775e+15 3.29528320e+07]
[ 1.47389778e+15 1.47389778e+15 1.47389775e+15 -2.70471680e+07]]

很明显,将时间戳值直接转换为相同的浮点值没有问题(第 1 列和第 2 列)。 DataFrame 中仍保留准确的值,但是当整个 DataFrame 通过 DataFrame.values 属性(第 3 列)转换为数组时发生了一些事情来扰乱时间戳值并将它们疯狂地扔掉。

为什么会发生这种情况,我该如何预防?

最佳答案

冒着听起来很愚蠢的风险,我会回答我自己的问题,首先应该更深入地挖掘一下。问题的根源是转换为最低公分母类型,引用自 DataFrame.values文档:

The dtype will be a lower-common-denominator dtype (implicit upcasting); that is to say if the dtypes (even of numeric types) are mixed, the one that accommodates all will be chosen. Use this with care if you are not dealing with the blocks

在这种情况下,选择的最适应类型是 float32,因此所有值都将转换为该类型。这可以存储 int64 时间戳的值,但由于 float32 类型的数字精度问题,时间戳值会对齐最近的 float32 值。如果将原始数据中的 dtype 值之一更改为 float64,问题就会悄无声息地消失。

不过这是一个后续问题。给定包含 64 位整数类型和浮点类型的混合数据集,最好的做法不是选择最宽的类型(64 位),这样就不会丢失精度吗?

关于python - Pandas DataFrame.values 转换错误或功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39794731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com