Пътят на змията

Съвети и трикове на Pythonic — Извличане на честота

Как да конструирате DataFrame от списък

Python е отличен език за учене от новите програмисти. Неговата интуитивна природа улеснява повечето хора бързо да разберат какво всъщност правят кодовете и алгоритмите. В тази статия и в много други в бъдеще ще разгледаме многото начини, по които човек може да използва Python за решаване на упражнения за начинаещи на по-сложни проблеми. Обърнете внимание, че за всички тези статии ще използвам Jupyter Notebook, за да покажа резултатите от кода.

Нека да започнем!

Нека си представим, че ви е даден списък с думи и трябва да извлечете конкретни показатели от него. Как бихте постъпили за това?

Думите

wordy_list = ['dog cat bear tiger tiger tiger dog dog cat cat bear   
               tiger tiger panda panda panda iguana iguana']

Първото нещо, което може да забележите, е, че списъкът по-горе не се поддава много добре на анализ на данни. Ключов проблем е, че данните се съхраняват като единичен низ. Първата ни стъпка тогава е да разделим низа на списък от думи. За да направим това, използваме надеждната функция split() в Python.

list_of_words = wordy_list.split()

О, не, изглежда имаме грешка. Причината за това е проста. Ако разгледаме променливата, тя е техническисписък, но това е списък, който съдържа само един низ като елемент. Такива проблеми са доста често срещани в областта на науката за данни, като такива трябва да сме бдителни и да откриваме такива проблеми възможно най-рано. За да заобиколим тази грешка, можем просто да използваме функцията split() във връзка с индекс.

list_of_words = wordy_list[0].split()

Отлично, този списък се поддава добре на анализ на данни. Така че нека започнем с някои основни задачи.

Пребройте колко пъти се появява всяка дума

Доста проста задача, с която ще се сблъскате много пъти по време на своето научно научно пътуване, е честотният анализ. Функцията по-долу ще върне всички елементи на списък като набор от кортежи с (елемент, честота на елемент):

def word_counter(word_list):
    new_list = []
    for w in word_list:
        number = word_list.count(w)
        datapoint = (w, number)
        new_list.append(datapoint)
    return set(new_list)
counted_list = word_counter(list_of_words)

Страхотно, задачата вече е изпълнена!

Но нека кажем, че искате да впечатлите шефа си и колежите си. Не трябва да им давате такъв код. Въпреки че кодът изпълнява функцията си, има по-естетични начини да го напишете. По-долу е пример за код, който изпълнява абсолютно същата задача, но е написан изключително чисто.

def word_counter(word_list):
    return set([(element, word_list.count(element)) 
               for element in word_list])
counted_list = word_counter(list_of_words)

Виждаме, че функцията вече е намалена до един ред код. Кодът не само запазва цялата си функционалност, но го прави по начин, който изглежда прост, но елегантен.

Пребройте колко пъти се появява всяка дума И подредете изхода от най-честите до най-рядко срещаните

Сега вашият шеф иска да конструирате броя на честотите, НО СЪЩО ТОГО иска да върнете данните, подредени от най-често срещаната дума до най-рядко срещаната. Разбира се, можем просто да обработим данните, след като ги върнем, но за да ни спести време, нека вградим тази функция във функцията. За да направим това, нека използваме функцията sorted(), както и ламбда функция.

def word_counter(word_list):
    new_list = [(element, word_list.count(element)) 
                for element in set(word_list)]
    return sorted(new_list, key = lambda j: j[1], reverse  = True)
counted_list = word_counter(list_of_words)

Отлично, вече изпълнихме задачата.

ПРОМЕНИ В ПОСЛЕДНАТА МОМЕНТА!!!

Да приемем, че вашият шеф ви се обажда в 7 сутринта и спешно трябва да промените кода си.

„Какъв е проблемът?“ Може да попитате.

„Имаме нужда от данните, подредени от най-често срещаните към най-рядко срещаните И СЛЕД това по азбучен ред, също така се нуждаем от тях, съхранени като рамка с данни“, казва вашият шеф.

Повярвайте ми, подобни сценарии са доста често срещани в света на науката за данни. Нека изпълним искането. Кодът по-долу гарантира, че изходът е подреден от най-често срещания към най-рядко срещания елемент И СЛЕД това сортира елементите по азбучен ред. Освен това зареждаме данните в pandas DataFrame. Имайте предвид, че трябва да импортираме модула pandas.

import pandas as pd
def word_counter(word_list):
    new_list = [(element, word_list.count(element)) 
                for element in set(word_list)]
    return pd.DataFrame(sorted(new_list, 
                               key=lambda x:(-x[1], x[0])),
                        columns = ['element', 'frequency_count'])
df_counted = word_counter(list_of_words)

Страхотно, това трябва да удовлетвори нашия шеф и други заинтересовани страни.

В заключение

Видяхме някои от начините, по които Python може да улесни анализа на данни. За тази статия примерният списък, който използвах, беше доста кратък, но в действителност подобни задачи биха включвали хиляди, ако не и стотици хиляди неструктурирани точки от данни. В бъдещи уроци ще разгледаме други начини, по които можем да използваме Python, за да ни помогне да анализираме данни, но засега се надявам, че успях да ви дам идея как да прилагате Python към прости задачи.