Округление с плавающей точкой в ​​базе данных - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть следующее df:

df
          Process Commodity Direction  ratio  ratio-min
0      Coal plant      Coal        In   1.00        NaN
1      Coal plant      Elec       Out   0.40        NaN
2      Coal plant       CO2       Out   0.30        NaN
3   Lignite plant   Lignite        In   1.00        NaN
4   Lignite plant      Elec       Out   0.40        NaN
5   Lignite plant       CO2       Out   0.40        NaN
6       Gas plant       Gas        In   1.00        NaN
7       Gas plant      Elec       Out   0.60        NaN
8       Gas plant       CO2       Out   0.20        NaN
9   Biomass plant   Biomass        In   1.00        NaN
10  Biomass plant      Elec       Out   0.35        NaN
11  Biomass plant       CO2       Out   0.00        NaN
12      Wind park      Wind        In   1.00        NaN
13      Wind park      Elec       Out   1.00        NaN
14    Hydro plant     Hydro        In   1.00        NaN
15    Hydro plant      Elec       Out   1.00        NaN
16  Photovoltaics     Solar        In   1.00        NaN
17  Photovoltaics      Elec       Out   1.00        NaN

Как видите, ratio значения являются плавающими числами.

Я пытаюсь отправить этот кадр данных в банк данных с помощью sqlalchemy.

Здесь я настраиваю таблицу:

import sqlalchemy as sa

table = sa.Table(table_name,
                 metadata,
                 sa.Column('index', sa.Integer, primary_key=True, autoincrement=True, nullable=False),
                 sa.Column('Process', sa.VARCHAR(50)),
                 sa.Column('Commodity', sa.VARCHAR(50)),
                 sa.Column('Direction', sa.VARCHAR(50)),
                 sa.Column('ratio', sa.Float(10)),
                 sa.Column('ratio-min', sa.Float(10)),
                 schema=schema_name)

Затем я отправляю таблицу в банк данных через: df.to_sql(table_name, engine, schema=schema_name, if_exists='replace')

Проблема в том, что я проверяю банк данных все значенияratio как-то округлено.И вот что я получаю из банка данных (это тоже те же округленные значения в банке данных)

          Process Commodity Direction  ratio ratio-min
0      Coal plant      Coal        In    1.0      None
1      Coal plant      Elec       Out    0.0      None
2      Coal plant       CO2       Out    0.0      None
3   Lignite plant   Lignite        In    1.0      None
4   Lignite plant      Elec       Out    0.0      None
5   Lignite plant       CO2       Out    0.0      None
6       Gas plant       Gas        In    1.0      None
7       Gas plant      Elec       Out    1.0      None
8       Gas plant       CO2       Out    0.0      None
9   Biomass plant   Biomass        In    1.0      None
10  Biomass plant      Elec       Out    0.0      None
11  Biomass plant       CO2       Out    0.0      None
12      Wind park      Wind        In    1.0      None
13      Wind park      Elec       Out    1.0      None
14    Hydro plant     Hydro        In    1.0      None
15    Hydro plant      Elec       Out    1.0      None
16  Photovoltaics     Solar        In    1.0      None
17  Photovoltaics      Elec       Out    1.0      None

Как бы я запретил to_sql округлять мои ratio значения?

1 Ответ

0 голосов
/ 17 декабря 2018

Вы можете обойти это, указав тип данных вашего столбца следующим образом:

from sqlalchemy.types import Float

, затем добавьте

dtype={'ratio': Float()}

к аргументам df.to_sql:

df.to_sql(table_name, engine, schema=schema_name, if_exists='replace', dtype={'ratio': Float()})

Аргумент dtype - это словарь, в котором имена столбцов используются в качестве ключей, а типы данных - в качестве значений.Это должно предотвратить округление значений ratio.

...