У меня есть несколько больших кадров данных pandas, которые мне нужно добавлять каждую неделю в базу данных sqlite.Фреймы данных выглядят примерно так:
Raw Table
Date, Country, State, City, Size, Population
11/28/2018, a1, b1, c1, 1, 2,
11/28/2018, a2, b2, c2, 3, 4,
11/28/2018, a3, b3, c3, 5, 6,
Файл базы данных слишком велик, поскольку данных за 10 лет и сотни городов.Поэтому я ищу способы уменьшить размер.Я прочитал о нормализации базы данных и планирую поместить пару Страна, Штат, Город в отдельную таблицу и сохранить только индекс пары в исходной таблице, которая должна выглядетькак показано ниже:
City Table
City_id, Country, State, City
1, a1, b1, c1,
2, a2, b2, c2,
3, a3, b3, c3,
Table After Indexed
City_id, Date, Size, Population
1, 11/28/2018, 1, 2,
2, 11/28/2018, 3, 4,
3, 11/28/2018, 5, 6,
При использовании только панд для каждого нового информационного кадра мне необходимо:
1) запросить Таблица городов и проверить наличие новых городовнайти в кадре данных, вставить новую запись города в Таблица города , если не существует.
2) запросите снова и присоединитесь к фрейму данных, сохраните столбец city_id и удалите столбцы Courtry, State, City .
3) добавьте уменьшенный фрейм данных в индексированную таблицу в БД.
Я очень плохо знаком с sqlalchemy.Но поскольку он обеспечивает очень чистый ORM, я пытаюсь использовать его вместо использования только панд, чтобы справиться с этапом «индексации».Я определил две таблицы ниже:
Base = declarative_base()
class City(Base):
__tablename__ = 'city'
id = Column(Integer, primary_key=True)
country = Column(String(250), nullable=False)
state = Column(String(250), nullable=False)
city = Column(String(250), nullable=False)
class Indexed(Base):
__tablename__ = 'indexed'
id = Column(Integer, primary_key=True)
city_id = Column(Integer, ForeignKey('city.id'))
timestamp = Column(Integer, nullable=False)
size = Column(Integer, nullable=False)
population = Column(Integer, nullable=False)
У меня есть два вопроса.Любая помощь / указания / предложения приветствуются!
1) Выше верного способа нормализовать базу данных?
2) При использовании sqlalchemy я также мог бы выполнять итерации по строкам кадра данных.А именно get_or_create экземпляр города, индексировать строку данных, добавить в БД.Этот способ эффективнее чистых панд?