Используя SQLAlchemy, я определил свой собственный TypeDecorator для хранения фреймов данных pandas в базе данных, закодированной как строка JSON.
class db_JsonEncodedDataFrameWithTimezone(db.TypeDecorator):
impl = db.Text
def process_bind_param(self, value, dialect):
if value is not None and isinstance(value, pd.DataFrame):
timezone = value.index.tz.zone
df_json = value.to_json(orient="index")
data = {'timezone': timezone, 'df': df_json, 'index_name': value.index.name}
value = json.dumps(data)
return value
def process_result_value(self, value, dialect):
if value is not None:
data = json.loads(value)
df = pd.read_json(data['df'], orient="index")
df.index = df.index.tz_localize('UTC')
df.index = df.index.tz_convert(data['timezone'])
df.index.name = data['index_name']
value = df
return value
Это отлично работает при первом сохранении базы данных, и загрузка тоже работает.
Проблема возникает, когда я увеличиваю значение, т. е. меняю DataFrame и пытаюсь изменить базу данных. Когда я вызываю
db.session.add(entity)
db.session.commit()
Я получаю обратную трассировку, которая указывает на то, что проблема заключается в сравнении значений:
x == y
ValueError: Can only compare identically-labeled DataFrame Objects.
Поэтому я подозреваю, что моя проблема как-то связана с принуждением компараторов. Я попробовал три вещи, но все они потерпели неудачу, и я действительно не знаю, что делать дальше:
#1st failed solution attempt inserting
coerce_to_is_types = (pd.DataFrame,)
#2nd failed solution attempt inserting
def coerce_compared_value(self, op, value):
return self.impl.coerce_compared_value(op, value)
#3rd failed solution attempt
class comparator_factory(db.Text.comparator_factory):
def __eq__(self, other):
try:
value = (self == other).all().all()
except ValueError:
value = False
return value
Подробнее здесь: https://stackoverflow.com/questions/467 ... son-errors
Декораторы типов SQLAlchemy и ошибки сравнения ⇐ Python
Программы на Python
-
Anonymous
1766790051
Anonymous
Используя SQLAlchemy, я определил свой собственный TypeDecorator для хранения фреймов данных pandas в базе данных, закодированной как строка JSON.
class db_JsonEncodedDataFrameWithTimezone(db.TypeDecorator):
impl = db.Text
def process_bind_param(self, value, dialect):
if value is not None and isinstance(value, pd.DataFrame):
timezone = value.index.tz.zone
df_json = value.to_json(orient="index")
data = {'timezone': timezone, 'df': df_json, 'index_name': value.index.name}
value = json.dumps(data)
return value
def process_result_value(self, value, dialect):
if value is not None:
data = json.loads(value)
df = pd.read_json(data['df'], orient="index")
df.index = df.index.tz_localize('UTC')
df.index = df.index.tz_convert(data['timezone'])
df.index.name = data['index_name']
value = df
return value
Это отлично работает при первом сохранении базы данных, и загрузка тоже работает.
Проблема возникает, когда я увеличиваю значение, т. е. меняю DataFrame и пытаюсь изменить базу данных. Когда я вызываю
db.session.add(entity)
db.session.commit()
Я получаю обратную трассировку, которая указывает на то, что проблема заключается в сравнении значений:
x == y
ValueError: Can only compare identically-labeled DataFrame Objects.
Поэтому я подозреваю, что моя проблема как-то связана с принуждением компараторов. Я попробовал три вещи, но все они потерпели неудачу, и я действительно не знаю, что делать дальше:
#1st failed solution attempt inserting
coerce_to_is_types = (pd.DataFrame,)
#2nd failed solution attempt inserting
def coerce_compared_value(self, op, value):
return self.impl.coerce_compared_value(op, value)
#3rd failed solution attempt
class comparator_factory(db.Text.comparator_factory):
def __eq__(self, other):
try:
value = (self == other).all().all()
except ValueError:
value = False
return value
Подробнее здесь: [url]https://stackoverflow.com/questions/46749550/sqlalchemy-typedecorators-and-comparison-errors[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия