Python: typy mutable, immutable i metoda copy()

2020-03-09

W Pythonie występują typy mutable i immutable.

Immutable – niezmienne – typy takie jak int, float, bool, str. Zmienna wskazuje na komórkę w pamięci, ale kiedy do tej zmiennej wstawiasz nową wartość, to dla zmiennej rezerwuje się nową komórkę i tam przechowuje się jej wartość. Funkcja id() pozwala zmieniać adres tej komórki. W skrypcie poniżej początkowo i oraz new_i wskazują na tą samą wartość komórki, ale potem, po zmianie i, funkcja id() zwraca inne wartości dla każdej zmiennej. Immutable – wartość komórki pamięci się nie zmienia

i = 0
new_i = i

print(id(i), id(new_i)) 
i = 10

print(i, new_i)
print(id(i), id(new_i))

Mutable – zmienne – typy takie jak listy, zbiory, słowniki. Zmienna wskazuje na pewne miejsce w pamięci. Jeśli zmienia się wartość zmiennej (np. dodaje element do listy), to adres komórki zostaje ten sam, ale zmienia się zawartość struktury pamięciowej. Tutaj box i new_box, to właściwie to samo. Funkcja id() zwraca dokładnie ten sam identyfikator. Jeśli do box dodasz nowy element, to pojawi on się też w new_box. Mutable – wartość komórki pamięci się zmienia:

box = ['ab','bcd','cde']
new_box = box

print(id(box), id(new_box))
box.append('fgh')

print(box, new_box)
print(id(box), id(new_box))

Takie działanie typów mutable bywa niekiedy niepożądane i dlatego mamy do dyspozycji funkcję copy(). Ta metoda bierze oryginalny obiekt z pamięci i kopuje go w inne miejsce w pamięci, tworząc nową zmienną. Funkcja id() wywoływana dla zmiennej utworzonej poprzez copy() zwróci inną wartość, a co za tym idzie oba obiekty są różnymi obiektami i można je modyfikować niezależnie:

box = ['ab','bcd','cde']
another_box = box.copy()

print(id(box), id(another_box))
box.append('klm')

print(box, another_box)
print(id(box), id(another_box))
By Rafał Kraik in Python

VirtualBox – błąd: WHvSetupPartition failed – VERR_NEM_VM_CREATE_FAILED

2020-03-01

Korzystanie z techik wirtualizacji to na dzisiaj konieczność. Zazwyczaj korzystam z Hyper-V, który jest licencjonowany razem z systemem operacyjnym, więc jeden kłopot z głowy.

Do zastosowań prywatnych są jednak dostępne rozwiązania VirtualBox lub VMPlayer. Od czasu do czasu trzeba więc skorzystać z jednej lub innej technologii. I tu może się pojawić konflikt.

Podczas uruchamiania maszyny wirtualnej pod VirtualBoxem pojawił się błąd:

WHvSetupPartition failed – VERR_NEM_VM_CREATE_FAILED

Najwyraźniej jest to powodowane właśnie obecnością innych „wirtualizatorów”, bo wykonanie polecenia:

bcdedit /set hypervisorlaunchtype off

i restart komputera pomogły!

By Rafał Kraik in Helpdesk

SQL: Query Store 1 – Konfiguracja

2020-02-22

Kiedyś zapytanie działało dobrze, a teraz działa gorzej? Co się zmieniło, że spadek wydajności jest zauważalny?

Nie ma na to jednej odpowiedzi, bo do kroków analizy należałoby dodać także sprawdzenie dostępnej ilości RAM, szybkości dostępu do dysków itp. O ile jednak administratorzy z tymi testami zazwyczaj problemów nie mają, o tyle sprawdzanie wydajności z dokładnością do pojedynczego zapytania zwykle było pewnym problemem. Rozwiązaniem, które ma w tym pomóc jest Query Store dostępny w SQL Server od wersji 2016.

Dzięki zbieranym statystykom na temat zapytań, administrator może porównać plany zapytań jakie były wykorzystywane pewien czas temu z tymi, jakie są wykorzystywane teraz, a nawet określić, który plan zapytania ma być stosowany. I to wszystko odbywa się bez ingerencji w plan zapytania!

Oto jak skonfigurować Query Store

Query Store może być włączony na poziomie bazy danych:

ALTER DATABASE MyDb SET QUERY_STORE = ON

Korzystając z polecenia alter można zmieniać konfigurację Query Store: Czytaj dalej »

By Rafał Kraik in SQL

Python: Pycharm – wyświetlanie dużych DataFame ze wszystkimi kolumnami bez kropek

2020-02-22

Kiedy pracujesz z dużymi danymi w Pycharm, chcesz zwykle zobaczyć, co w tych danych się znajduje. Najprościej to zrobić wyświetlając DataFrame na ekranie. Niestety, jeśli obiekt ma wiele kolumn to domyślnie zostanie wyświetlonych tylko kilka a między nimi pojawi się symbol trzech kropek mówiący o tym, że nie wszystko się zmieściło. Podobnie kiedy do wyświetlenia jest wiele wierszy, może pojawić się jeden wiersz wypełniony kropkami, informujący o tym, że python zdecydował się nie wyświetlać wszystkiego:

Co zrobić?

Metoda 1. Dodajesz kilka poleceń, które zmieniają opcje działania poleceń wyświetlających data frame:

– display.width – ile znaków może być w jednej linijce w czasie wyświetlania wiersza

– display.max_columns – ile kolumn ma być maksymalnie wyświetlanych

– jeśli to samo chciałbyś robić z obiektami numpy to jest do tego opcja linewidth Czytaj dalej »

By Rafał Kraik in Python

R: pobranie pliku CSV z jedną uszkodzoną linijką

2020-02-02

Instrukcje dostępne w języku R (ale też w innych), po cichu zakładają, że dane na jakich pracują są czyste. Pisząc czyste, mam na myśli o ustalonej strukturze. Niestety, może  się zdarzyć, że jedna linijka znajdująca się gdzieś pośrodku jest… uszkodzona. Pobranie całego pliku kończy się wtedy błedem. Oto przykład:

> cars <- fread(
+ input ='https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data',
+ header = F,
+ sep = ' ',
+ na.strings = '?',
+ fill = T)
 [0%] Downloaded 0 bytes...
Warning message:
In fread(input = "https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data", :
 Stopped early on line 293. Expected 12 fields but found 13. Consider fill=TRUE and comment.char=. 
First discarded non-empty line: <<18.5 8 360.0 150.0 3940. 13.0 79 1 "chrysler lebaron town @ country (sw)">>

Gdyby takie dane były dostarczane przez np. inny dział firmy, najprościej byłoby się z nimi skontaktować i zwrócić uwagę na nieprawidłowo utworzony plik. Jeśli jednak takiej możliwości nie ma… można próbować obejść problem.

Propozycja nr 1 – opuśćmy uszkodzoną linijkę

Skorzystamy z parametrów nrow (ile wierszy pobrać) oraz skip (ile opuścić). Aby pobrać pierwsze 292 wiersze uruchom

cars <- fread(
 input ='https://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data',
 header = F,
 sep = ' ',
 na.strings = '?',
 fill = T,
 nrow=292)

A  żeby pobrać od 294 linijki: Czytaj dalej »

By Rafał Kraik in R

SQL: Setup.exe się nie uruchamia

2020-01-16

Objawy:

Po uruchomieniu setup.exe w celu instalacji aktualizacji, nic się nie dzieje. Wygląda na poważny problem z .NET lub zabezpieczeniami antywirusowymi, które uniemożliwiają uruchomienie programu

Troubleshooting:

Nawet kiedy wygląda, że nic się nie dzieje, to coś się jednak dzieje. Setup.exe powinien w katalogu wskazywanym przez zmienną środowiskową %temp% tworzyć pliki log, z zapisem wykonywanych czynności i napotykanych błędów.

1. Kliknij start >> run i wpisz %temp%

2. W oknie wyszukaj plików/katalogów z datą modyfikacji z chwili próby uruchomienia setup.exe

3. W moim przypadku znalazł się plik sqlsetup.log z zapisami:

.Net security policy file does exist
Attempting to load .Net security policy file
Error: Cannot load .Net security policy file
Error: InitializeSqlSetupCodeGroupCore (64bit) failedError: InitializeSqlSetupCode failed: 0x80004005

Rozwiązanie

Wygląda więc na to, że coś jest nie tak z .Net security policy. To ustawienie można zresetować komendą:

C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727>caspol.exe -machine -reset
By Rafał Kraik in SQL

Python: Numpy: Broadcasting na przykładach

2020-01-15

W uczeniu maszynowym często wykonujemy operacje na macierzach (wektor to też przykład macierzy, tylko że jeden z wymiarów wynosi 1). Cchcemy takie operacje wykonywać, gdzie tylko się da przy pomocy funkcji z modułu numpy, bo tak jest efektywniej!

Matematyka jest bezlitosna. Istnieją pewne określone reguły, określające warunki kiedy na macierzach można wykonywać operacje:

  • aby dodać do siebie macierze/wektory, muszą one mieć takie same wymiary
  • aby pomnożyć przez siebie dwie macierze, pierwsza z nich musi  mieć tyle kolumn, co druga wierszy

Tymczasem u nas te warunki nie zawsze będą spełnione. Można się jednak „umówić”, co do tego jak wykonywać operacje, których, matematycznie rzecz ujmując, nie można wykonywać. Taki mechanizm w numpy nosi nazwę broadcasting, bo określa on, jak należy powiększyć mniejszą macierz do rozmiarów pasujących do większej macierzy, aby w intuicyjny sposób wykonać operację na macierzach.

Żeby uniknąć matematycznego hejtu, na usprawiedliwienie należy dodać, że broadcasting-u można by uniknąć. W takim przypadku programista musiałby po prostu samodzielnie dbać o to, żeby macierze miały właściwe rozmiary. Taka praca, nie dość że nudna, to jeszcze spowoduje znaczne użycie pamięci. Dlatego tak się palimy do zautomatyzowanego i zoptymalizowanego procesu broadcastu. Czytaj dalej »