pandas to_numeri c (…, downcast = 'float') теряет точность - PullRequest
1 голос
/ 19 апреля 2020

Downcasting pandas Фрейм данных (по столбцам) от float64 до float32 приводит к потере точности, хотя самый большой (9.761140e + 02) и наименьший (0.000000e + 00) элемент подходит для float32.

Набор данных довольно большой, 55 миллионов строк 12 столбцов. Это среднее значение для конкретного столбца без понижения (1.343987e + 00), а после - это 1.224472e + 00.

Те же результаты, что и при np.astype().

.

1 Ответ

3 голосов
/ 20 апреля 2020

Это был довольно интересный вопрос. Я протестировал несколько фреймов данных, начиная с 1 млн. Записей до 55 млн., Того же размера, что и ваш, сохраняя значения min, max аналогичными вашим.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

x, y = [], []
for idx, num in enumerate(range(1, 57, 2)):
    print(f"{idx+1}) Testing with {num} million records...")
    rows = num*(10**6)
    cols = ['col']

    df = pd.DataFrame(np.random.uniform(0, 9.761140e+02, size=(rows, len(cols))), columns=cols)
    df['col1'] = pd.to_numeric(df['col'], downcast='float')
    df['diff'] = df['col'] - df['col1']

    diff = df['col'].mean() - df['col1'].mean()

    x.append(num)
    y.append(diff)

plt.plot(x, y, 'ro')
plt.xlabel('number of rows (millions)')
plt.ylabel('precision value lost')
plt.show()

Вот график. enter image description here

Судя по графику, кажется, что после 35 миллионов записей наблюдается внезапное увеличение потери точности и, по-видимому, логарифмический характер c. Я еще не понял, почему это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...