熊猫float16转换

时间:2019-06-10 07:51:16

标签: python pandas

我正在尝试优化df dtype以消耗更少的内存。

我提出了以下浮点解决方案:

@staticmethod
def optimize_float(series):
    low_consumption = series.astype('float16')
    if any(low_consumption.isin([np.inf])):
        medium_consumption = series.astype('float32')
        if any(medium_consumption.isin([np.inf])):
            return series.astype('float64')
        return medium_consumption
    return low_consumption

我遇到了一个奇怪的用例,如下所示:

In[89]: df = pd.DataFrame({'a':[11111,22222,3333]})
In[90]: df
Out[90]: 
       a
0  11111
1  22222
2   3333
In[91]: df.astype('float16')
Out[91]: 
         a
0  11112.0
1  22224.0
2   3332.0
In[92]: df.astype('float32')
Out[92]: 
         a
0  11111.0
1  22222.0
2   3333.0

当转换为float16时,它会四舍五入\更改我系列中的值,而我希望它放入inf或抛出错误,如果它不能将其转换为我通过的dtype。

我还注意到该df上describe()方法输出的差异:

In[83]: df = pd.DataFrame({'a':[11111,22222,3333]})
In[84]: df['a'].describe()
Out[84]: 
count        3.000000
mean     12222.000000
std       9493.383011
min       3333.000000
25%       7222.000000
50%      11111.000000
75%      16666.500000
max      22222.000000
Name: a, dtype: float64
In[85]: df['a'].astype('float16').describe()
Out[85]: 
count    3.000000e+00
mean     1.222400e+04
std               inf
min      3.332000e+03
25%      7.222000e+03
50%      1.111200e+04
75%      1.666800e+04
max      2.222400e+04
Name: a, dtype: float64

如何在不丢失\更改任何数据的情况下将系列转换为消耗最少的内存类型?

我在optimize_float函数中的逻辑哪里失败了?

0 个答案:

没有答案