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)

 

 

 

By Rafał Kraik in Python

Python – oczyszczanie kolumny tekstowej w PANDAS (Seria danych)

2019-02-11

Załóżmy, że mam listę z wartościami prezentującymi liczby, ale z nieco zamieszanymi formatami. W oparciu o tą listę tworzę serię:

import pandas as pd
lst = ['112,000.000','4,500,000']
s = pd.Series(lst)
s
wynik to:
0    112,000.000
1      4,500,000
dtype: object

Jak widać typ to object, czyli w PANDAS – napis. Możesz teraz zbudować dowolną funkcję lambda oczyszczającą ten tekst:

s = s.apply(lambda x: x.replace(',',''))
s

wynik to nadal typ object, ale dane już przypominają liczby:

0    112000.000
1       4500000
dtype: object

teraz wreszcie można skonwertować typ do float

s = s.astype('float')
s

wynik to:

0     112000.0
1    4500000.0
dtype: float64

Kluczowe jest to, w jaki sposób tekst ma być oczyszczony – ale to już zależy też od rodzaju szumu, jaki został do tej kolumny kiedyś wprowadzony.

By Rafał Kraik in Python

Powershell: Write-Host, Write-Warning i inne polecenia z serii…

2019-01-28

Zacznijmy od tego co to jest host. Jeśli administrujesz systemami, to pewnie hostem nazywasz komputer: „pingować hosta”, „logować się do hosta” itp. W przypadku powershella host to nie komputer, tylko program jakim łączysz sie do powrshella. Stąd też np polecenie

Get-Host zwraca np wersję programu jakim się łączysz do powershella, a $PSVersionTable zwraca wersję powershella 🙂

Polecenie Write-Host ma na zadanie wyświetlić tekst na hoście. Możesz go wyświetlać na kolorowo (masz opcje -ForegroundColor, -Backgroundcolor). Te komunikaty są zazwyczaj ładne,… a czasami odpustowe 🙂

Polecenie Write-Warning nie ma opcji zmieniających kolorki. Należy go używać do wyświetlania na wyjściu diagnostycznym (którym domyślnie jest host) właśnie ostrzeżeń. Czy w Polce, czy w Japonii, jak skrypter powershella zobaczy pomarańczowy komunikat, to będzie wiedział, że to ostrzeżenie.

Mamy też Write-Error – polecenie wyświetlające i zgłaszające błąd.

Oprócz tego są też inne wyspecjalizowane polecenia: Czytaj dalej »

By Rafał Kraik in Power Shell