NumPy, NumPy ale Pandas to dopiero coś

Kiedyś już wspominałam o Pandas czyli bibliotece do Pythona, która umożliwia analizę danych a przy tym robi to bardzo wydajnie oraz jest łatwa i przyjemna w użyciu. Przy tym jest obecnie najpopularniejszą biblioteką do pracy z danymi tabelarycznymi w Pythonie.

W Pandas do przedstawiania danych tabelarycznych stosujemy tzw dataframe czyli dwuwymiarową strukturę, która dostarcza nam zestaw narzędzi do szybkiego przeglądania, analizowania i wizualizowania danych.

W czym Pandas jest lepsze od NumPy?

  • Jednym z powodów jest to, że w NumPy w tabeli mogliśmy mieć wyłącznie dane jednego typu. W Pandas te dane mogą mieć różne typy.
  • Przewagą Pandas jest również obiekt NaN, który umożliwia nam obsługę nie istniejących danych (na przykład pustych niektórych pól w tabeli).
  • Kolejna rzecz to możliwość odwoływania się do wierszy i kolumn nie tylko poprzez numery, ale również poprzez nazwy (label).

Przede mną jeszcze kilka lekcji na temat Pandas, więc na pewno wrócę tutaj z kolejnymi ciekawostkami.

Rekruterów rozmaite przypadki – część 2

Witajcie w drugiej części cyklu na temat różnych przypadków związanych z procesem rekrutacji widzianej oczami kandydatów. Poprzednią część znajdziecie tutaj:

http://programistka.net/rekruterow-rozmaite-przypadki-czesc-1/

Tajny agent

Poprzednio pisałam o anonimowości oferty pracy polegającej na ukrywaniu nazwy firmy na początku procesu rekrutacyjnego. Dziś będzie o czymś podobnym, ale z drugiej strony – o tzw anonimizacji profilu kandydata. Jest to mechanizm, który stosują niektóre firmy rekrutacyjne aby ograniczyć dyskryminację.

Na czym to polega? Otóż z CV wysyłanego klientowi (firmie dla której rekruter szuka kandydatów) usunięte są wszelkie dane osobowe – od imienia i nazwiska, poprzez zdjęcie, narodowość, wiek czy płeć kandydata. Póki co wszystko w porządku.

Niestety niektóre firmy idą o krok dalej i mieszają w CV. W skrajnym przypadku – tutaj akurat moim własnym, doprowadziło to do tego, że w CV przestawiono dane na temat okresów zatrudnienia w poszczególnych firmach. O ile zmiana kolejności firm, w których pracowałam nie byłaby jeszcze niczym strasznym o tyle zmieniono daty początku i końca zatrudnienia. Zrobiono to na dodatek tak nieudolnie, iż okresy się o siebie zazębiały i z CV wynikało, że w danym momencie pracuję jednocześnie w trzech firmach.

Na szczęście historia ta ma szczęśliwy koniec, bo dostałam zaproszenie na rozmowę w firmie do której byłam rekrutowana i miałam okazję odpowiedzieć na pytanie jak to się stało, że pracuję w trzech miejscach naraz. Możliwe, że nawet nie dostałabym zaproszenia na tą rozmowę, ale okazało się, że pomógł mój profil na LinkedIn, który umożliwił ludziom z firmy zweryfikowanie tego CV gdy już dostali moje pełne dane i domyślenie się, że to firma rekruterska maczała palce w tak dziwnym dokumencie.

Wniosek

Niestety nie zawsze mamy wpływ  na to co z naszym CV zrobi firma rekruterska, ale pewne ryzyka możemy ograniczyć. Ja od wielu lat swoje CV wysyłam wyłącznie w formacie PDF, żeby uniemożliwić nieautoryzowane przeze mnie zmiany. Niestety zdarza się, że rekruter prosi nas o dokument w formacie Word – jeśli tak, koniecznie dopytajmy czy zamierza wprowadzać w nim jakieś zmiany i czy możemy się z nimi zapoznać przed wysłaniem naszego CV do firmy docelowej.  Dobrze również mieć swój profil w sieci – LinkedIn, Goldenline, lub na własnej stronie. Firma do której się rekrutujemy ma wówczas jakiś punkt odniesienia oprócz naszego CV. Dodatkowo możemy tam umieścić o wiele więcej informacji niż w tym jednym dokumencie.

Kolejne fajne rzeczy w NumPy

W zeszłym tygodniu pisałam o tym jak NumPy ułatwia nam życie. Dziś będzie jeszcze troszkę w tym temacie. Co jeszcze fajnego dostarcza nam NumPy? Na przykład wygodnego filtrowania danych. Załóżmy, że mamy jakąś tablicę:

some_numbers = numpy_array([0, 10, 100, 200, 201]);

I chcemy z niej wyciągnąć tylko wartości, które dzielą się przez 100.
W zwykłym Pythonie oczywiście musielibyśmy przejść pętlą przez całą tablicę i po kolei sprawdzać poszczególne wartości. Z pomocą NumPy możemy to zrobić dużo sprawniej. Zapiszemy sobie coś takiego:

divisible_by_one_hundred = (some_numbers % 100)

Ale to tylko krok pośredni. W tablicy divisible_by_one_hundred będziemy mieli obecnie coś takiego:

[false, false, true, true, false]

Co możemy z tym zrobić dalej by uzyskać pożądany wynik? Otóż możemy tablicy divisible_by_one_hundred użyć jako filtra w ten oto sposób:

numbers_divisible_by_one_hundred = some_numbers[divisible_by_one_hundred]

To stworzy nam taką oto tablicę:

[100, 200]

Proste i takie wygodne! Analiza danych w takich warunkach to naprawdę fajna sprawa:)

Rekruterów rozmaite przypadki – część 1

Co rusz napotykam się na artykuły z cyklu „błędy kandydatów podczas rekrutacji”, „tego nie rób na rozmowie kwalifikacyjnej” itp. Zawsze wtedy przypominają mi się sytuacje z własnych bądź zasłyszanych doświadczeń na temat drugiej strony – czyli tego jak rekruterzy wypadają w oczach kandydatów.
Dzisiaj chciałabym podzielić się właśnie tymi doświadczeniami. Tak dla przeciwwagi:)

Najpierw miał być to jeden artykuł, ale w trakcie tworzenia okazało się, że zawarcie wszystkiego w jednym poście jest niemożliwe, zatem powstał cykl.

Na początku jednak chciałabym zaznaczyć, że nie ma to być żaden hejt na rekruterów, choć faktycznie do poprawy jest mnóstwo rzeczy. Niemniej na swojej drodze spotkałam również ludzi bardzo kompetentnych i profesjonalnych a kontakt z nimi zaowocował ciekawymi ofertami pracy. Niestety mam wrażenie, że takich przypadków jest zdecydowana mniejszość.

Jako programiści niemalże codziennie w naszej skrzynce email/LinkedIn/Goldenline znajdujemy kolejne oferty – lepsze i gorsze. Bardzo ciężko jest czasami oddzielić ziarno od plew i zdecydować na co warto odpowiedzieć. Niestety nadawcy nie zawsze nam to ułatwiają. Mam nadzieję, że ten cykl nieco Wam pomoże w zorientowaniu się czego się spodziewać.

Tajne/poufne:)

Pierwszy typ ofert to oferty anonimowe – czyli zaczynające się od słów „dla naszego klienta z branży takiej a takiej poszukujemy”.

Tutaj sytuacje mogą być dwie – pierwsza, to gdy firma faktycznie nie chce się ujawnić i to raczej nie jest dobry znak. Głównie dlatego, że często zanim się dowiemy o jaką naprawdę firmę chodzi czeka nas co najmniej jedna rozmowa z rekruterem, czasem nawet dwie – pierwsza żeby nam przedstawił ofertę i sprawdził czy się z grubsza nadajemy a druga, gdy firma docelowa zaakceptuje naszą kandydaturę. Czyli dwie rozmowy telefoniczne + odpowiedź którą musimy wysłać na pierwszą propozycję mailową. Trochę dużo czasu, żeby poznać nazwę firmy.
Co najlepsze – w skrajnym przypadku może się okazać, że rekruter nie dysponuje naszym aktualnym CV, ponieważ jesteśmy w jego bazie już od wielu lat (wielu prac wstecz) i na tej pierwszej rozmowie telefonicznej dowiemy się, że chce nas zrekrutować do naszej aktualnej firmy albo którejś z poprzednich. Znów spora strata czasu. Co ciekawe przecież to nie tylko nasz czas, to też czas rekruterów. Czemu więc sami sobie utrudniają życie zamiast przechodzić do konkretów na samym początku?

Ważne jest też, by zadać pytanie czemu firma ukrywa swoją nazwę? Jaką ma opinię na rynku? Może czegoś się wstydzi i boi się, że jeśli na samym początku się ujawni, to nikt się nie zgłosi. Gdy już proces rekrutacyjny się rozpocznie, to niektórym kandydatom będzie trochę szkoda się wycofać.

Druga sytuacja jest wtedy, gdy rekruter wysyła nam ofertę, która zaczyna się od takich tajemniczych słów, ale bez trudu jesteśmy w stanie znaleźć w Google dany opis stanowiska wraz z nazwą firmy. Skąd więc ta anonimowość?

Tutaj również są dwie opcje – jedna to, że rekruter obawia się, iż jeśli poda nam już na początku nazwę firmy, to zgłosimy się do niej bezpośrednio a on straci prowizję. Jest to obawa zrozumiała dlatego zdecydowanie zachęcam Was, jako kandydatów, do niepostepowania w ten sposób. Być może spowoduje to, że tajemniczych ofert będzie mniej. Z kolei ze strony rekruterów jest też dość naiwnym sądzenie, że kandydat chociaż nie spróbuje wyszukać nazwy firmy na własną rękę.

Druga opcja to z kolei oferty, gdzie firma docelowa nawet nie wie, że jakiś rekruter dla niej szuka kandydatów. Jak to możliwe? Rekruter wyszukuje oferty pracy różnych firm po czym kontaktuje się z kandydatami działając samodzielnie. Jeśli ktoś okaże się zainteresowany, próbuje skontaktować go z firmą. Najczęściej próby te nie kończą się sukcesem a kontakt z rekruterem się urywa.

Wniosek

Najlepsze oferty to takie, gdzie mamy jasną informację na temat nazwy firmy. Wszelkie utajniania powinny wzbudzić naszą czujność i sprawić byśmy dwa razy się wszystkiemu przyjrzeli zanim w ogóle rozpoczniemy proces rekrutacji na dane stanowisko.

NumPy – jak ładnie ułatwia nam życie

Załóżmy, że mamy takie oto dane:

Year Number of items Number of another items
2001 100 1000
2002 101 1001
2003 102 1002
2004 103 1003

Wszystko to znajduje się w pliku csv o nazwie data.csv i chcemy je sobie wczytać do jakiejś zmiennej. W czystym Pythonie musimy zrobić coś takiego:

with open('data.csv', 'r') as csvfile:
    reader = csv.reader(csvfile)
    data = []
    for row in reader:
        data.append(row)

Kiedyś już wspominałam o tym, że w ramach zapoznawania się z tematem data science uczę się również NumPy czyli pakietu szeroko stosowanego w przetwarzaniu danych w Pythonie. I tak jakbyśmy chcieli wykorzystać NumPy by uzyskać to samo co powyżej musielibyśmy napisać coś takiego:

import numpy
data = numpy.genfromtxt('data.csv', delimiter=',', dtype="U75")

Dużo mniej kodu prawda?

NumPy pozwala nam od razu z pliku zrobić sobie tablicę. Nie musimy pisać pętli by dane z pliku sobie do tablicy przypisać. Co znaczą te tajemicze ustawienia – delimiter i dtype? Otóż pierwsze z nich to ustawienie znaku którym oddzielane są poszczególne kolumny w naszym pliku. Natomiast drugie to ustawienie które powoduje, że wszystkie wczytywane wartości zostaną zinterpretowane jako 75 bajtowy unicode. Umożliwia nam to wówczas pracę nie tylko z danymi liczbowymi, ale również poprawne wczytanie tekstów.

Kolejna rzecz jaką często robi się przy przetwarzaniu danych to wyciągniecie wartości z wyłącznie jednej kolumny w naszym zbiorze danych.
By zrobić to w czystym Pythonie musimy napisać:

number_of_items = []
for item in data:
    number_of_items.append(data[1])

Natomiast korzystając z NumPy:

number_of_items = data[:,0:1]

Podobnie na przykład możemy z pomocą NumPy wyciągnąć prosto wartości 2 i 3 kolumny tylko dla 1 i 2 wiersza. Robimy to w następujący sposób:

number_of_items = data[1:2,0:1]

Notacja z dwukropkiem jest również w czystym Pythonie, ale nie daje nam aż takich możliwości. Pozwala na wyciągniecie zakresu pewnych wartości. Przykładowo

otherdata[a:b]

zwróci nam wartości z tablicy jednowymiarowej other_data o indeksach od a włącznie do b wyłącznie. Z kolei jeśli zapiszemy:

otherdata[a:]

zwróci nam wartości o indeksach zaczynających się od a włącznie.
Tymczasem:

otherdata[:b]

zwróci nam wartości o indeksach od 0 do b wyłącznie.