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.

Commonlounge – czyli społeczności skupione wokół różnych tematów w jednym

Niedawno w przestrzeniach internetu napotkałam coś takiego jak Commonlounge – Competitive Programming. Jest to społeczność pasjonująca się tematem Competitive Programming czyli rozrywek typu SPOJHackerRank czy Topcoder o których jakiś czas temu tutaj pisałam.

Commonlounge to tak naprawdę zbiór różnych społeczności – Competitive Programming to tylko jedna z nich. Są też na przykład: Algorithms and Data StructuresSphere Online Judge (SPOJ) czy z innej beczki: TED Talks.

To co wyróżnia Competitive Programming jest to, że mamy tutaj oczywiście to co lubię najbardziej czyli zadania;) ale jest to tak zorganizowane, że możemy zasubskrybować się do listy i rozwiązywać zadania po kolei w swoim własnym czasie. Przychodzą nam po kolei na maila, rozwiązujemy, odznaczamy że zrobione i przychodzą kolejne.
Poza tym serwis jest raczej zorientowany na wymianę wiedzy – jest dużo dyskusji oraz materiałów na temat popularnych algorytmów. Pozostaje pytanie czy warto się nim zajmować kiedy mamy takie strony jak HackerRank, CodeWars itd oraz oczywiście Stackoverflow na którym możemy przecież również wymienić myśli. Ja to widzę tak, że społeczność Competitive Programming ma na celu właśnie przygotowanie do stawania w szrankach w konkursach i zadaniach algorytmicznych. Zbiera wszystkie informacje w jednym miejscu i pozwala szybko dotrzeć do innych osób zainteresowanych tematem. Póki co więc myślę, że warto się tej stronie przyglądać i to zamierzam robić. Może i Wam się spodoba.

Ponieważ jednak dopiero co się zarejestrowałam być może odkryję jeszcze jakieś inne ciekawe funkcjonalności – obiecuję bezzwłocznie o nich napisać:) A może Wy już znacie ten serwis i możecie coś ciekawego o nim dodać?

Konto zablokowane z powodu przekroczenia transferu:)

„Konto zablokowane z powodu przekroczenia transferu” – taki komunikat czekał na mnie w skrzynce mailowej w sobotę rano:) No i fajnie! Miło jest przekroczyć transfer, bo jednak świadczy to o tym, że strona jest odwiedzana i nie zieje pustką. Bardzo mnie to cieszy. I pozdrawiam wszystkich odwiedzających, którzy do tego przekroczenia się przyczynili. Dziękuję!

Co ciekawe po kontakcie z firmą hostingową, ponieważ nie wiedziałam jak ten transfer w tym momencie rozszerzyć, okazało się, że coś mieli źle ustawione i w moim planie hostingowym jest nie nie 20GB a 50GB więc mogę hulać wesoło dalej bez dopłat. Z jednej strony shame, bo przez ich niedopatrzenie moja strona nie działała przez ponad 7 godzin:( a z drugiej fajnie, że w sobotę 7.30 jest tam ktoś, kto odpisuje w kilka minut. Choć może to typowe dla takich firm:) Nie wiem, bo od lat korzystam praktycznie wyłącznie z linuxpl.com i mimo tej pomyłki nadal ich polecam:)