Для многих людей Python – это их язык для анализа данных. Это в значительной степени, потому что язык Python позволяет очень легко подумать и писать функции, которые работают на единицах данных. Например, эта функция определяет числовую сегмент, которому принадлежит человек определенного возраста.
def age_segment(age): if age < 12: return 0 elif age < 18: return 1 elif age < 28: return 2 elif age < 48: return 3 elif age < 68: return 4 elif age < 88: return 5 else: return 6
Вот еще одна функция. Требуется в возрастном сегменте номера и возвращает, является ли человек юридически несовершеннолетним.
def is_under_age(age_segment): if age_segment <= 1: return True return False
И вот один последний. Работа этой функции – довольно печатать возраст. Это все это работа.
def print_age(age_segment): if age_segment == 0: print("0-12") elif age_segment == 1: print("12-18") elif age_segment == 2: print("18-18") elif age_segment == 3: print("28-48") elif age_segment == 4: print("48-68") elif age_segment == 5: print("68-88") elif age_segment == 6: print("88+")
Все эти функции работают на «единицах данных». Но очень распространенное значение для анализа данных есть куча «единиц данных», а затем имеет своего рода «трубопровод» функций, которые каждый блок проходит через каждую функцию, выполняющую операцию, которая постепенно преобразует данные.
В качестве примера, скажем, у нас есть такой список данных. И вы хотите принять каждый элемент данных и пройти через этот вид «трубопровод» функций, которые вы можете построить, что передает данные первым в age_seget.
тогда к iS_under_age.
и, наконец, к print_age
Отказ
ages = [9, 19, 37, 28, 48, 13]
Теперь вы можете понять, что вы могли бы просто использовать Python для Loop Construct, для цирки по этому поводу и позвоните в функции в порядке в возрасте в списке. И это то, что будет много людей. Но есть несколько вопросов, в которые вы столкнетесь.
- Вам придется знать Python, чтобы изменить структуру трубопровода (например, – вы хотите удалить
age_seget.
Потому что ваши данные уже возрастные сегменты) - Вам придется писать (на мой взгляд) Messy Code, чтобы сделать функции, работающие параллельно (Python предоставляет multiPressing multipressing
библиотеку для выполнения функций одновременно - вместо одного после другого - и легко передавать данные между ними ; но это вводит довольно много дополнительного кода)
На самом деле это то, что это будет выглядеть.
from multiprocessing import Process, Queue from ages_utils import age_segment as age_segment from ages_utils import is_under_age as is_under_age from ages_utils import ages as ages from ages_utils import print_age as print_age class PLPipeSentinel: pass def run_ages(stream, out_queue): for data in stream: out_queue.put(data) out_queue.put(PLPipeSentinel()) def run_age_segment(in_queue, out_queue): while 1: inp = in_queue.get() if isinstance(inp, PLPipeSentinel): outp = PLPipeSentinel() if not isinstance(inp, PLPipeSentinel): outp = age_segment(inp) if out_queue is not None: out_queue.put(outp) if isinstance(inp, PLPipeSentinel): break def run_is_under_age(in_queue, out_queue): while 1: inp = in_queue.get() if isinstance(inp, PLPipeSentinel): outp = PLPipeSentinel() if not isinstance(inp, PLPipeSentinel): result = is_under_age(inp) if result: outp = inp else: continue if out_queue is not None: out_queue.put(outp) if isinstance(inp, PLPipeSentinel): break def run_print_age(in_queue, out_queue): while 1: inp = in_queue.get() if isinstance(inp, PLPipeSentinel): outp = PLPipeSentinel() if not isinstance(inp, PLPipeSentinel): outp = print_age(inp) if out_queue is not None: out_queue.put(outp) if isinstance(inp, PLPipeSentinel): break if __name__ == "__main__": data = ages() in_age_segment = Queue() in_is_under_age = Queue() in_print_age = Queue() ages_process = Process(target=run_ages, args=(data, in_age_segment)) age_segment_process = Process(target=run_age_segment, args=(in_age_segment,in_is_under_age,)) is_under_age_process = Process(target=run_is_under_age, args=(in_is_under_age,in_print_age,)) print_age_process = Process(target=run_print_age, args=(in_print_age,None,)) ages_process.start() age_segment_process.start() is_under_age_process.start() print_age_process.start() age_segment_process.join() is_under_age_process.join() print_age_process.join()
Может быть, это разборчиво для вас, но это, конечно, не для меня.
Что, если произошел простой язык высокого уровня для описания структуры трубопровода с компилятором, который компилирует код языка в Python. Этот язык был бы языком, который может использовать кого-либо – ученый, руководитель бизнеса … буквально кто-либо.
Вы бы работали с компонентами трубопровода, имеющего базовое понимание того, что делают компоненты (например, – is_under_age), если возраст считается юридически несовершеннолетним), но никакие необходимые знания о том, как они реализованы. Кто-то, кто знает, Python будет писать реализации компонентов, но затем трубопровод может быть написан и переписан и снова структурирован без необходимости обратиться к человеку, который знает Python, потому что трубопровод написан на простом языке высокого уровня, который тезисы прочь функции, которые составляют любой трубопровод.
Этот язык высокого уровня существует! Это называется трубопроводами. С языком трубопроводов вышеприведенные 63 строки кода Python сводится к описанию линии ниже 5 ниже.
from ages_utils import ages from ages_utils import age_segment from ages_utils import is_under_age from ages_utils import print_age ages |> age_segment /> is_under_age |> print_age
|>
Указывает, что каждый элемент передан в age_segent
и print_age
преобразуется путем передачи в age_seget ()
и print_age ()
Функции с результатами затем передаются на следующую функцию в трубопроводе, если вы существуете.
\>
Указывает, что каждый элемент передан в Is_under_age
фильтруется. Элемент передан в Is_under_age
И если результат это Истинный
Это передано. Если результат это Ложь
Это не передается.
Для языка гораздо больше, чем просто трубы и фильтры и функции, предназначенные для более сложных потоков данных, и все можно найти в «README» на репозитории GitHUB.
Calebwin/трубопроводы
Трубопроводы – это язык для анализа данных высокого уровня.
Трубопроводы – это язык и время выполнения для создания массивно параллельных трубопроводов. В отличие от других языков для определения потока данных, язык трубопровода требует внедрения компонентов, которые будут определены отдельно на языке сценариев Python. Это позволяет отделить детали реализаций от структуры трубопровода, при этом обеспечивая доступ к тысячам активных библиотек для машинного обучения, анализа данных и обработки. Перейти к Начало работы Чтобы установить компилятор трубопровода.
Пример
В качестве вводного примера простой трубопровод для Fizz Buzz на четных числах может быть написан следующим образом –
from fizzbuzz import numbers from fizzbuzz import even from fizzbuzz import fizzbuzz from fizzbuzz import printer numbers /> even |> fizzbuzz where (number=*, fizz="Fizz", buzz="Buzz") |> printer
Между тем, реализация компонентов будет написана в Python –
def numbers() for
Если вы решите использовать в своем собственном анализе данных, пожалуйста, дайте мне знать – я хотел бы увидеть, что вы делаете! Если нет, я был бы признателен за это, если бы вы могли звездить репозиторий Github напоследствии, если вы найдете это интересное и потенциально полезное.
Оригинал: “https://dev.to/calebwin/a-language-for-data-flow-and-analysis-3fmj”