Python: Pandas: Pobranie pliku csv spakowanego gzip i import do data frame

2019-03-04

Python ma całe mnóstwo modułów, które pozwalają na wykonywanie prawie wszystkich operacji (no bez przesady, ale sporo można zrobić)!

Mamy moduł:

  • requests – do wykonywania operacji na stronach webowych
  • gzip lub zip – do kompresji plików (lub ogólniej danych)
  • io – do wykonywania operacji wejścia wyjścia
  • pandas – do przetwarzania danych

Jeśli dobrze się postarać można ze sobą połączyć te moduły i… pobrać plik, rozkompresować go i zaimportować do obiektu data frame!

Tutaj pobierzemy jeden z plików publikowanych na stronie EuroStat:

https://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing?sort=1&dir=data

import pandas as pd
import requests, gzip, io

url = 'https://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing?sort=1&file=data%2Faact_ali01.tsv.gz'
 
downloaded_file = requests.get(url)
unzipped_content = gzip.open(io.BytesIO(downloaded_file.content))
df = pd.read_csv(unzipped_content, delimiter='\t')

df.head()

w zależności od upodobań polecenie można skrócić:

import pandas as pd

import requests, gzip, io
url = 'https://ec.europa.eu/eurostat/estat-navtree-portlet-prod/BulkDownloadListing?sort=1&file=data%2Faact_ali01.tsv.gz'
 
with gzip.open(io.BytesIO(requests.get(url).content)) as unzipped_content:
 df = pd.read_csv(unzipped_content, delimiter='\t')
df.head()

 

 

 

 

By Rafał Kraik in Python

SQL: MSDTC: The partner transaction manager has disabled its support for remote/network transactions

2019-03-04

MSDTC to jedna z usług, o której… lepiej nie słyszeć, bo jeśli o niej nie słyszysz, to znaczy, że wszystko działa, a jak już ktoś coś o niej powie, to często zaczyna się szukanie igły w stogu siana. Na szczęście konfiguracja usługi nie jest aż tak bardzo kłopotliwa.

Ta opowieść zaczyna się od kontaktu ze strony administratora, który stwierdził, że jego aplikacja nie łączy się do MS Distributed Transaction Coordinator-a.

Oczywiście należy zacząć od sprawdzenia czy usługa MSDTC w ogóle działa! Jeśli akcja działaby się na pojedyńczym serwerze wystarczyłoby przejrzeć usługi. W przypadku clustra, MSDTC jest zwykle konfigurowane jako usługa roli clustra:

Get-ClusterResource | where {$_.ResourceType -eq 'Distributed Transaction Coordinator'}

Name                                    State  OwnerGroup   ResourceType
----                                    -----  ----------   ------------
New Distributed Transaction Coordinator Online SERVER_00123 Distributed Transaction Coordinator

Status online świadczy o tym, że usługa działa.

Kolejny pomysł to oczywiście pozamykane porty. Połączenie z MSDTC zaczyna się na porcie 135, a potem jest losowany port z zakresu 1024 do 65525. Po stronie serwera zazwyczaj istnieją już odpowiednie reguły w definicji firewall, wystarczy je włączyć.

To polecenie wyświetla reguły, które mają coś wspólnego z „distributed” lub „DTC”: Czytaj dalej »

By Rafał Kraik in SQL

Python: NameError: name 'Python’ is not defined

2019-02-28

Po wpisaniu: „python -V” wyświetla się „NameError: name 'Python’ is not defined”

To jest mniej problem z Pythonem, a bardziej z konfiguracja systemu operacyjnego. Kiedy uruchamiasz polecenie, to system operacyjny musi je odnaleźć na dysku. System operacyjny nie przegląda za każdym razem wszystkich katalogów żeby znaleźć jeden prasujący program. W systemie operacyjnym jest zdefiniowana zmienna środowiskowa o nazwie PATH, która zawiera w sobie wszystkie katalogi, które w tej sytuacji mają być przeszukane.

Podczas instalacji, już na pierwszym ekranie pada pytanie, czy instalator ma dodać Python do ścieżki

Czytaj dalej »

By Rafał Kraik in Python

Powershell: Zmienne globalne

2019-02-28

W skryptach PowerShell można korzystać ze zmiennych lokalnych (widocznych wewnątrz funkcji), zmiennych skryptu (widocznych w skrypcie) i zmiennych globalnych (widoczne wszędzie). Popatrz na taki przykład:

function Show-Variable()
{
 echo "Inside the function: $MyVar"
 $MyVar='BLUE'
}
$MyVar = 'GREEN'
echo "Outside the function: $MyVar"
Show-Variable
echo "Outside the function: $MyVar"

Jest tutaj funkcja, która wyświetla wartość zmiennej zdefiniowanej początkowo na poziomie skryptu. Pytanie, czy ta zmienna będzie widoczna dla funkcji i czy rzeczywiście uda się ją zmienić? Czytaj dalej »

By Rafał Kraik in Power Shell

Powershell: Błędu nie ma, a polecenie nie działa

2019-02-26

Mamy niby proste polecenie:

ls -Recurse C:\Users\admin\Documents\| 
Select-Object Name,CreationTime | 
Where-Object -FilterScript {($_.CreationTime -lt (Get-Date).AddDays(-2) -and $_.Extension -eq ".txt")}

Niestety nic nie jest wyświetlane, a na pewno w tym katalogu są pliki TXT utworzone wcześniej niż 2 dni temu. O co chodzi?

ls zwraca obiekty, które mają duuużo właściwości, między innymi Name, CreationTime i Extension

Potem te obiekty przechodzą do Select, a select to chirurg, który wyciął wszystko oprócz Name i CreationTime. Czyli teraz ten obiekt ma już +/- tylko 2 właściwości: Name i CreationTime, ale nie ma Extension

Potem w Where każemy wyświetlić tylko te pliki, które mają odpwiedni CreationTime i z tym nie ma problemu, ale dodatkowo chcemy mieć określony Extension… a tej właściwości na tym etapie już nie ma.

Co zrobić? Można zmień kolejność – napierw Where a potem Select i będzie ok:

 ls -Recurse C:\Users\rafal\Documents | 
 Where-Object -FilterScript {($_.CreationTime -lt (Get-Date).AddDays(-2) -and $_.Extension -eq ".txt")} |
 Select-Object CreationTime,Name, Extension

Drugie rozwiązanie, to dodać do listy właściwości w poleceniu Select dodatkowej właściwości Extension:

 ls -Recurse C:\Users\rafal\Documents | 
 Select-Object CreationTime,Name, Extension | 
  Where-Object -FilterScript {($_.CreationTime -lt (Get-Date).AddDays(-2) -and $_.Extension -eq ".txt")}

 

 

By Rafał Kraik in Power Shell

Python i PANDAS: Połączenie do bazy danych MSSQL

2019-02-26

Pyton jest dobrym środowiskiem do analizy danych, ale te dane skąś trzeba brać i gdzieś trzeba je zapisywać. Tu z pomocą przyjdzie moduł pyodbc. Oto przykład gdzie:

  • pobieramy dane z bazy danych AdventureWorks
  • zapisujemy te dane do obiektu data frame
  • tworzymy tabelę w bazie danych tempdb
  • zapisujemy wybrane dane z dataframe do tej tabeli
import pandas as pd
import pyodbc

sql_conn = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};\
                            SERVER=Dragon01;\
                            DATABASE=Adventureworks;\
                            Trusted_Connection=yes') 
query = "select CurrencyCode, Name, ModifiedDate from Sales.Currency"
df = pd.read_sql(query, sql_conn)
print(df.head(3))

sql_conn = pyodbc.connect('DRIVER={ODBC Driver 13 for SQL Server};\
                            SERVER=Dragon01;\
                            DATABASE=tempdb;\
                            Trusted_Connection=yes')
cursor = sql_conn.cursor()

cursor.execute("IF OBJECT_ID('dbo.currencies') IS NOT NULL  DROP TABLE dbo.currencies")
sql_conn.commit()

cursor.execute("CREATE TABLE dbo.currencies(\
                             code VARCHAR(3),\
                             name VARCHAR(30))")
sql_conn.commit()

for index,row in df.iterrows():
  cursor.execute("INSERT INTO dbo.currencies(code,name) values (?,?)",
                      row['CurrencyCode'], row['Name']) 
  sql_conn.commit()

cursor.close()
sql_conn.close()

Po kolei: Czytaj dalej »

By Rafał Kraik in Python

Python: brak podpowiedzi po kropce, control+spacja, TAB. Intellisense nie działa

2019-02-11

Dobre środowisko programistyczne w naszych czasach powinno „myśleć” razem z programistą. Ktokolwiek pracował w edytorze, który podpowiada ciąg dalszy nazw zmiennych, funkcji itp. ten wie o czym mówię. Dramat zaczyna się wtedy, kiedy te metody zawiodą!

I tak w Python IDLE zdarza się, że TAB nie działa

Tabulator działa, ale jego użycie może być trochę „tricky”. Zrób tak:

-napisz

tekst='Friday'

lub coś innego co spowoduje powstanie zmiennej tekstowej.

-zapisz plik

-uruchom go chociaż raz. Teraz w pamięci Pythona jest już informacja, że text jest zmienną typu tekstowego

-teraz wróć do edytora i napisz nazwę zmiennej i kropkę

text.

-teraz naciśnij tabulator. Powinny się pokazać funkcje specyficzne dla typu string

To jest super niewygodne kiedy chcesz to zrobić dla jednej zmiennej w banalnie prostym skrypcie. Ale kiedy piszesz dłuuuugi skrypt i uruchamiasz go dziesiątki razy, to Python jest świadomy wszystkich zmiennych i ładnie podpowiada.

Gdyby mimo to podpowiadanie nie działało, to jest jeszcze prawdopodobne, że coś poszło nie tak z intalacją i brakuje rozszerzenia odpowiadającego za podpowiadanie. Po wejściu do ustawień IDLE na zakładce Extensions można sprawdzić obecność rozszerzenia AutoComplete i ewentualnie sprawdzić czy jest włączone. Podobno pomaga reinstalacja pythona (zwróć uwagę na zaznaczenie [ ] Add Python to PATH)

Inne możliwe przyczyny takiego zachowania:

  • katalog, w którym jest wykonana instalacja, albo katalog ze skryptami, albo nazwa użytkownika zawierają polskie literki np. ą, ś, ł itp.
  • jeden z wcześniej utworzonych skryptów  otrzymał nazwę, która jest używana przez wymagany przez IDLE moduł pythona. Staraj się unikać nazw, co do których można mieć podejrzenie, że są one już wykorzystywane w Pythonie, np. time, random, int itp. Tworząc własne skrypty możesz np. stosować nietypowe  nazwy w rodzaju measure_time.py, generate_randoms.py, test_int.py itd.

 

 

By Rafał Kraik in Python