pandas 有多少个整数可以完全表示一个浮点数?

k2arahey  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(187)

问题和我目前的解决方案:

例如,以纬度和经度值的两列为例:
| 迟|隆|
| - -|- -|
| 30.1239871239| -80.1239871239 |
| 30.1239991239的一个月| -80.1439871239 |
我想创建表示浮点数的整数列。
这是我目前拥有的:
| 迟|纬度_十进制|纬度符号|
| - -|- -|- -|
| 三十|小行星1239|一个|
| 三十|小行星123999|一个|
| 隆|长度_十进制|符号(_S)|
| - -|- -|- -|
| 八十|小行星1239| -1个|
| 八十|小行星1239| -1个|
通过执行以下操作,其中collatlon

df[f'{col}_dec'] = df[col].apply(lambda x: int(str(x).split('.')[-1]))
df[f'{col}_sign'] = np.sign(df[col])
df[col] = abs(df[col].astype(int))

然后我运行一个过程,最小化每个列的数据类型,分别为第一个、第二个和第三个整型列生成uint 8、uint 32和int 8。即25%尺寸减小。
"你能让它变得更好吗"

  • 你能把尺寸再缩小一点吗?
  • 是否有更好的方法来创建列?
  • 如果我的数据集非常大(5 TB),我是否应该这样做?
vlju58qv

vlju58qv1#

你能做得更好吗?
只有你知道什么是更好。
你能把尺寸再缩小一点吗?
是的。你现在存储坐标的方式有大约10μm(1 e-5 m)的分辨率。这似乎过于精确了。如果你能接受大约1米的分辨率,你可以把坐标值分解成63356个值的增量,并使用单个uint16int16来存储每个值(每个坐标对4个字节)。

import numpy as np

INCREMENTS_PER_DEGREE_LONG = np.iinfo(np.uint16).max / 360.0
INCREMENTS_PER_DEGREE_LAT = (np.iinfo(np.int16).max -
                             np.iinfo(np.int16).min) / 180.0

def longitude_to_increments(longitude_deg):
    assert longitude_deg >= 0 and longitude_deg < 360
    return np.uint16(longitude_deg * INCREMENTS_PER_DEGREE_LONG)

def increments_to_longitude(increments: np.uint16):
    return increments / INCREMENTS_PER_DEGREE_LONG

# similar for latitude but use a np.int16 for [-90, 90] degree range

相关问题