точность, например Экстремальный пример ОП.
я есть MEMS IMU, по которому я собираю данные, и я использую панды, чтобы получить из них некоторые статистические данные. Каждый цикл содержит 6 32-битных операций с плавающей запятой. Скорости передачи данных фиксированы для данного прогона сбора. Скорость передачи данных варьируется от 100 Гц до 1000 Гц, а время сбора составляет 72 часа. Данные сохраняются в плоском двоичном файле. Я читаю данные так:
import numpy as np
import pandas as pd
dataType=np.dtype([('a','<f4'),('b','<f4'),('c','<f4'),('d','<f4'),('e','<f4'),('e','<f4')])
df=pd.DataFrame(np.fromfile('FILENAME',dataType))
df['c'].mean()
-9.880581855773926
x=df['c'].values
x.mean()
-9.8332081
-9,833 - правильный результат. Я могу создать похожий результат, который кто-то сможет повторить так:
import numpy as np
import pandas as pd
x=np.random.normal(-9.8,.05,size=900000)
df=pd.DataFrame(x,dtype='float32',columns=['x'])
df['x'].mean()
-9.859579086303711
x.mean()
-9.8000648778888628
Я повторил это на Linux и Windows, на процессорах AMD и Intel, в Python 2.7 и 3.5. Я в тупике. Что я делаю неправильно? И получите это:
x=np.random.normal(-9.,.005,size=900000)
df=pd.DataFrame(x,dtype='float32',columns=['x'])
df['x'].mean()
-8.999998092651367
x.mean()
-9.0000075889406528
Я мог бы принять эту разницу. Это предел точности 32-битных операций с плавающей запятой.
НЕВАЖНО. Я написал это в пятницу, и решение пришло ко мне сегодня утром. Это проблема точности с плавающей запятой, которая усугубляется большим объемом данных. Мне нужно было преобразовать данные в 64-битные с плавающей точкой при создании кадра данных следующим образом:
df=pd.DataFrame(np.fromfile('FILENAME',dataType),dtype='float64')
Я оставлю пост, если кто-то еще столкнется с подобной проблемой.