我正在尝试优化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
函数中的逻辑哪里失败了?