Наиболее эффективный способ пакетного обновления базы данных peewee с кадра данных pandas - PullRequest
0 голосов
/ 23 октября 2018

база данных выглядит следующим образом:

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 dataframe 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)))

1 Ответ

0 голосов
/ 07 апреля 2019

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

...