SQL-запрос для создания отдельных фреймов данных для каждой отдельной комбинации значений 4 столбцов базы данных? - PullRequest
0 голосов
/ 09 июля 2019

Как я могу создать несколько фреймов данных из всех возможных комбинаций из 4 столбцов в таблице базы данных Oracle в Python?

Как мне написать такой SQL-запрос, в котором все выбранные записи будут загружены в мой фрейм данных?Я использую Oracle12c

Допустим, мои имена столбцов: «A», «B», «C», «D».Их количество различных значений в моей таблице базы данных составляет 4, 3, 2, 6 соответственно.Здесь общее число возможных комбинаций составляет 4 * 3 * 2 * 6 = 144. Поэтому в основном мне нужно 144 кадра данных.

Теперь я хочу загрузить все записи, извлеченные из одной комбинации этих значений (скажем, A1-B1-C1-D1) в одном кадре данных, все записи, извлеченные из другой комбинации этих значений (A1-B1-C1-D2) в следующем кадре данных и т. Д. И т. Д.

Я новичок во всем этом, так что получаюзастрял здесь.

Ответы [ 3 ]

1 голос
/ 09 июля 2019

Не приведет ли ваш запрос к загрузке всей таблицы как есть?Если вы найдете каждую отдельную комбинацию столбцов A, B, C, D и затем присоедините свою таблицу к этим комбинациям, то вы просто вернете исходную таблицу.

Не могли бы вы вместо этого создать новый столбец, объединяющийзначения A, B, C, D?

select
  A || '-' || B || '-' || C || '-' || D as ABCD
, A
, B
, C
, D
from my_table

Вывод будет:

ABCD           A    B    C    D
A1-B1-C1-D1    A1   B1   C1   D1
A1-B1-C1-D2    A1   B1   C1   D2

. Перенесите это в фрейм данных так:

import pandas as pd
query = """
        select
          A || '-' || B || '-' || C || '-' || D as ABCD
          , A
          , B
          , C
          , D
        from my_table
        """
df = pd.read_sql(sql = query, con = conn)

Теперь у вас есть фрейм данных с новым столбцом ABCD, который вы можете использовать для группировки по всем вашим сценариям A, B, C, D.Я настоятельно рекомендую не разбивать их на отдельные кадры данных.Интересно, зачем вам это делать?

Если вы хотите обратиться к конкретному сценарию, просто сделайте следующее:

df[df['ABCD'] == 'A1-B1-C1-D1']
1 голос
/ 09 июля 2019

Предполагая библиотеку Python pandas, рассмотрите возможность загрузки всего запроса как есть и затем запустите groupby, чтобы создать список или словарь из 144 фреймов данных.Это отвечает:

Как я могу создать несколько кадров данных из всех возможных комбинаций из 4 столбцов ...?

Гораздо лучше хранить много похожих структурированных объектов в *Контейнер 1011 * один вместо 144 отдельных объектов, заполняющих вашу глобальную среду.Вы не потеряете функциональность фрейма данных, если хранитесь внутри списка или словаря.

sql_df = pd.read_sql("""SQL Query""", conn)

# DICTIONARY COMPREHENSION
df_dict = {i:g for i,g in sql_df.groupby(['A', 'B', 'C', 'D']) }

# REFERENCE INDIVIDUAL DFs WITH TUPLE KEYS
df_dict[(A1, B1, C1, D1)].head()

df_dict[(A1, B1, C1, D2)].describe()

df_dict[(A1, B1, C1, D3)].tail()

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

df_dict = {"_".join(map(str, i)):g for i,g in sql_df.groupby(['A', 'B', 'C', 'D']) }

# REFERENCE INDIVIDUAL DFs WITH TUPLE KEYS
df_dict['A1_B1_C1_D1'].head()

df_dict['A1_B1_C1_D2'].describe()

df_dict['A1_B1_C1_D3'].tail()
1 голос
/ 09 июля 2019

Вам нужно SELECT каждый набор значений и CROSS JOIN их вместе.Например,

SELECT     a, b, c, d
FROM       ( SELECT a FROM my_table ) xa
CROSS JOIN ( SELECT b FROM my_table ) xb
CROSS JOIN ( SELECT c FROM my_table ) xc
CROSS JOIN ( SELECT d FROM my_table ) xd

Вы можете изменить подзапросы, чтобы выбрать DISTINCT значения, возможно.

Это даст вам набор результатов со всеми возможными комбинациями значений из четырех столбцов..

Теперь я хочу загрузить все записи, извлеченные из одной комбинации этих значений (скажем, A1-B1-C1-D1) в одном кадре данных, все записи, извлеченные из другой комбинации этих значений (A1-B1-C1-D2) в следующем фрейме данных и т. Д. И т. Д.

Я не знаю, что такое «фрейм данных», поэтому я не могу помочь вам с этой частью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...