Самый эффективный способ пакетного обновления базы данных peewee из фрейма данных pandas.

база данных выглядит так:

date            value
2000-01-01      foo
2000-01-01      foo
2000-01-01      foo
2000-01-02      bar
2000-01-02      bar
2000-01-02      bar
2000-01-10      yyy
2000-01-10      yyy
2000-01-10      yyy

Кадр данных Pandas MyDataframe выглядит так:

date            value
2000-01-01      new_foo
2000-01-02      new_bar
2000-01-10      new_yyy

Как вы могли догадаться, мне нужно, чтобы база данных выглядела так:

date            value
2000-01-01      new_foo
2000-01-01      new_foo
2000-01-01      new_foo
2000-01-02      new_bar
ecc...

Я мог бы перебрать MyDataframe и запустить серию .update:

for date, value in MyDataframe:
    query = MyModel.update(value=value).where(MyModel.date == date).execute()
    query.execute()

Мой вопрос: есть ли способ сделать это всего одним вызовом execute() (или любым другим более эффективным способом)? Что-то вроде bulk_execute(array_of_queries)?

Есть ли способ напрямую передать кадр данных в .update()? Как это:

MyModel.update(value=MyDataframe.loc[MyModel.date]).execute()

К сожалению, это не работает: индекс, переданный .loc[], является не фактическим значением, а объектом DateTimeField. Действительно, выдает такую ​​ошибку:

KeyError('the label [<DateTimeField: MyModel.date>] is not in the [index]',)

документация предполагает, что вы можете запускать реальный код в функции обновления, предоставляя такие примеры, как:

Employee.update(bonus=(Employee.bonus + (Employee.salary * .1)))

person Saturnix    schedule 23.10.2018    source источник


Ответы (1)


Вы можете попробовать объединить фрейм данных и заменить исходный столбец значений.

person learner101    schedule 07.04.2019
comment
Пожалуйста, предоставьте какой-нибудь код, который действительно будет делать то, что вы записали в своем ответе. - person fulaphex; 08.04.2019