Анализ данных Python из запроса SQL

Я собираюсь начать анализ данных Python, в отличие от всего, что я делал раньше. В настоящее время я изучаю numpy, но пока это не дает мне представления о том, как это сделать.

Я использую python 2.7.14 Anaconda с cx_Oracle для запроса сложных записей.

Каждая запись будет уникальным человеком со столбцом для идентификатора сотрудника, кортежей отношений (код типа отношения в паре с номером отдела, может содержать несколько), флагов учетных записей (строки флагов, могут содержать несколько). (Всего 3 столбца)

так что одна запись может быть:

 [(123456), (135:2345678, 212:4354670, 198:9876545), (Flag1, Flag2, Flag3)]

Мне нужно разработать сценарий Python, который будет принимать эти записи и создавать различные подсчеты.

Примерная запись будет учитываться как минимум в 9 различных счетчиках
Сколько с родством: 135
Сколько с родством: 212
Сколько с родством: 198
Сколько в отделении: 2345678
Сколько в отделении: 4354670
Сколько в отделении: 9876545
Сколько с Flag: Flag1
Сколько с Flag: Flag2
Сколько с Flag: Flag3

Другая сложная часть этого состоит в том, что я не могу заранее определить коды отношений, отделы или флаги. То, что я рассчитываю, должно определяться данными, полученными из запроса.

Как только я пойму, как это сделать, надеюсь, следующий шаг, чтобы узнать, сколько отношений X имеет флаг y и т. д., Будет интуитивно понятным.

Я знаю, что об этом нужно много спрашивать, но если бы кто-то мог просто указать мне в правильном направлении, чтобы я мог исследовать или попробовать несколько руководств, которые были бы очень полезны. Спасибо!

Если вы хотите выполнять всю работу в numpy, тогда "sql" и "oracle" не являются подходящими тегами.

Gordon Linoff 13.07.2018 16:51
Идентификатор сотрудника, кортежи отношений (код типа отношения в паре с номером отдела, может содержать несколько), флаги учетных записей (строки флагов, могут содержать несколько) ... если ваша таблица базы данных действительно имеет такую ​​структуру, рассмотрите нормализация в длинном формате без вложенных значений, особенно в корпоративной RBDMS, такой как Oracle! Даже в pandas / numpy вложенные значения не рекомендуются.
Parfait 13.07.2018 18:16

На dominicgiles.com/blog/blog.html есть несколько недавних сообщений об анализе данных с помощью Python и Oracle DB, например. dominicgiles.com/blog/files/category-python.html#Simple-Orac‌ le /…, который может представлять фоновый интерес.

Christopher Jones 15.07.2018 03:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
567
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы хотите рассмотреть другие пакеты, взгляните на панды, который построен на основе numpy. Вы можете читать операторы sql прямо в фрейм данных, а затем выполнять фильтрацию.

Например,

import pandas
sql = '''SELECT * FROM <table> WHERE <condition>'''
df = pandas.read_sql(sql, <connection>)

# Your output might look like the following:

        0                                         1                     2
0   12346   (135:2345678, 212:4354670, 198:9876545) (Flag1, Flag2, Flag3)
1   12345   (136:2343678, 212:4354670, 198:9876545) (Flag1, Flag2, Flag4)

# Format your records into rows
# This part will take some work, and really depends on how your data is formatted
# Do you have repeated values? Are the records always the same size?

# Select only the rows where relationship = 125
rel_125 = df[df['Relationship'] = 125]

Форматирование pandas более детально, чем уместно в вопросах и ответах, но здесь есть несколько полезных ресурсов: 10 минут до панд.

Вы также можете напрямую фильтровать строки, хотя это может быть не самым эффективным. Например, следующий запрос выбирает только те строки, в которых отношение начинается с «212».

df[df['Relationship'].apply(lambda x: any(y.startswith('212') for y in x))]

По крайней мере, вам нужно структурировать эти данные, чтобы сделать хороший анализ, вы можете сделать это в своем движке базы данных или на Python (я сделаю это таким образом, используя панды, такие как предложил SNygard).

Сначала я создаю фальшивые данные (предоставленные вами):

import pandas as pd 
import numpy as np
from ast import literal_eval

data = [[12346, '(135:2345678, 212:4354670, 198:9876545)', '(Flag1, Flag2, Flag3)'],
[12345, '(136:2343678, 212:4354670, 198:9876541, 199:9876535)', '(Flag1, Flag4)']]

df = pd.DataFrame(data,columns=['id','relationships','flags'])
df = df.set_index('id')
df

Это возвращает такой фрейм данных: raw_pandas_dataframe

Чтобы суммировать или подсчитывать по столбцам, нам нужно улучшить нашу структуру данных, чтобы мы могли применять группировку по операциям с отделами, отношениями или флагами.

Мы преобразуем наши отношения и столбцы флагов из строкового типа в список строк Python. Таким образом, столбец флагов будет списком флагов Python, а столбец отношений будет списком отношений Python.

df['relationships'] = df['relationships'].str.replace('\(','').str.replace('\)','')
df['relationships'] = df['relationships'].str.split(',')

df['flags'] = df['flags'].str.replace('\(','').str.replace('\)','')
df['flags'] = df['flags'].str.split(',')
df

Результат: dataframe_1

Преобразовав наш столбец relationships в список, мы можем создать новый фрейм данных с таким же количеством столбцов как отношения в тех списках у нас есть.

rel = pd.DataFrame(df['relationships'].values.tolist(), index=rel.index)

После этого нам нужно сложить наши столбцы, сохраняя их индекс, поэтому мы будем использовать pandas multi_index: идентификатор и номер столбца отношения (0,1,2,3)

relations = rel.stack()
relations.index.names = ['id','relation_number']
relations

Получаем: dataframe_2

На данный момент у нас есть все наши отношения в строках, но мы по-прежнему не можем группировать с помощью Функция relation_type. Итак, мы разделим данные наших отношений на два столбца: relation_type и department, используя :.

clear_relations = relations.str.split(':')
clear_relations = pd.DataFrame(clear_relations.values.tolist(), index=clear_relations.index,columns=['relation_type','department'])
clear_relations

Результат dataframe_3_clear_relations

Наши отношения готовы к анализу, но наша структура флагов по-прежнему очень бесполезна. Итак, мы преобразуем список флагов в столбцы, а затем сложим их.

flags = pd.DataFrame(df['flags'].values.tolist(), index=rel.index)
flags = flags.stack()
flags.index.names = ['id','flag_number']

Результат dataframe_4_clear_flags


Вуаля !, Все готово к анализу !.

Так, например, сколько отношений каждого типа у нас есть, и какое из них самое большое:

clear_relations.groupby('relation_type').agg('count')['department'].sort_values(ascending=False)

Получаем: group_by_relation_type


Весь код: Проект Github

Другие вопросы по теме