Распаковать словарь данных - PullRequest
       4

Распаковать словарь данных

0 голосов
/ 27 сентября 2019

Я использовал sqlalchemy для чтения таблиц из базы данных PostgreSQL, и они хранятся в словаре (ключи - это имена таблиц, значения - это фреймы данных).Я могу получить к ним доступ по одному, но хотел бы масштабировать решение так, чтобы у меня были все таблицы из данной базы данных / схемы в виде кадров данных pandas.Мой код для импорта следующий:

import os
import pandas as pd
import psycopg2
from sqlalchemy import create_engine

engine = create_engine(os.environ['postgres_credentials'] +'db')
conn = engine.connect()
trans = conn.begin()

#Initialize empty dictionary
frames_dict = {}

#Use loop and pd.read_sql() to read tables from DB
table_names = engine.table_names()
select_template = 'SELECT * FROM {table_name}'

for tname in table_names:
    query = select_template.format(table_name = tname)
    frames_dict[tname] = pd.read_sql(query, conn)

# Close connection
conn.close()

Это успешно получает ключ: значение table_name: dataframe.Основная цель - иметь возможность ссылаться на кадры данных с теми же именами, которые они хранят в качестве ключей и в базе данных (я могу играть с данными оттуда).

Я пробовал следующее:

  • Создание списков с использованием .keys () и .values ​​() и индексация списков для назначения
  • Использование setattr для перебора списков ключей и значений для назначения имен df (как строк всписок) к соответствующим фреймам данных.

Также я знаю, что это перефразировка этого вопроса четыре года назад, но не было дано однозначного ответа.

Если ключи в виде списка:

['name1','name2','name3']

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

[In] name1
[Out] Col1 |  Col2 | Col3
      --------------------
      foo  |    2  |  a
      bar  |    17 |  b
      ...

Спасибо всемза любую помощь, которую вы можете предложить!

1 Ответ

1 голос
/ 27 сентября 2019

Одна вещь, о которой я могу подумать, это использовать namedtuple из collections:

from collections import namedtuple
import pandas as pd

supposedly_your_dict = {
    'table_1': pd.DataFrame(columns=['t_1_col_1', 't_1_col_2']),
    'table_2': pd.DataFrame(columns=['t_2_col_1', 't_2_col_2']),
    'table_3': pd.DataFrame(columns=['t_3_col_1', 't_3_col_2'])
}

DBSnapshot = namedtuple('DBSnapshot', supposedly_your_dict.keys())

db_tables = DBSnapshot(**supposedly_your_dict)

Теперь вы сможете получить доступ к таблицам так, как вам хочется.db_tables.table_1 Результат:

Empty DataFrame
Columns: [t_1_col_1, t_1_col_2]
Index: []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...