Я собираюсь начать анализ данных 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 и т. д., Будет интуитивно понятным.
Я знаю, что об этом нужно много спрашивать, но если бы кто-то мог просто указать мне в правильном направлении, чтобы я мог исследовать или попробовать несколько руководств, которые были бы очень полезны. Спасибо!
На dominicgiles.com/blog/blog.html есть несколько недавних сообщений об анализе данных с помощью Python и Oracle DB, например. dominicgiles.com/blog/files/category-python.html#Simple-Orac le /…, который может представлять фоновый интерес.






Если вы хотите рассмотреть другие пакеты, взгляните на панды, который построен на основе 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
Если вы хотите выполнять всю работу в numpy, тогда "sql" и "oracle" не являются подходящими тегами.