Tóm tắt buổi trước và nội dung kỳ này

Trong buổi trước chúng ta chủ yếu đi qua cách cài đặt Python và đặc biệt là Anaconda (hoặc Miniconda) – Trình quản lý Python package. Chúc mừng bạn đã đặt những bước chân đầu tiên vào con đường lập trình Python trong Phân tích dữ liệu và các các lĩnh vực đỉnh của chóp sau này như Machine Learning hay A.I

Bữa nay mình sẽ tập trung nói về trình biên dịch Python và IPython

Vì nội dung Install khá ngắn nên phần buổi Live ngày 3 bao gồm lun cả nội dung của cả 2 ngày là 2 và 3 😥. Mình sẽ cố tổ chức nội dung Live thống nhất hơn vào các buổi sau nhen

Lưu ý nhỏ

🔴 Buổi Live ngày 3

Lưu ý nhỏ trước khi bắt đầu

Để khớp với kết quả đầu ra của tác giả thì trước hết các bạn nên chạy các options này đầu mỗi chương trình

import numpy as np
import pandas as pd
pd.options.display.max_columns = 20
pd.options.display.max_rows = 20
pd.options.display.max_colwidth = 80
np.set_printoptions(precision=4, suppress=True)

Naming convention: quy ước khi đặt tên của cộng đồng Python

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import statsmodels as sm

Điều này có nghĩa là khi bạn thấy np.arange, đây là một tham chiếu đến hàm arange trong NumPy. Còn một lý do nữa bởi vì nó được coi là một thói quen xấu trong phát triển phần mềm Python để nhập tất cả mọi thứ (from numpy import *) từ một gói lớn như NumPy.


Các Chương 2 và 3 sẽ hướng dẫn cô đọng nhất có thể về các đặc trưng của ngôn ngữ Python, IPython shell (giao diện dòng lệnh tương tác cho Python) và Jupyter notebooks.

Chương 4 sẽ giới thiệu ngắn về các chức năng chính của Numpy, phần phụ lục A sẽ đi sâu hơn cho bạn nào quan tâm, và Chương 5 sẽ giới thiệu về pandas.

Từ Chương 6 trở đi sẽ được dồn hết để nói về các chủ đề phân tích bằng pandas, NumPy và matplotlib (dùng visualization). Thứ tự của các chương này đã được sắp xếp quy trình Manipulate data.

The Python Interpreter


Python là một ngôn ngữ lập trình thông/biên dịch (interpreted language) nên nó sẽ chạy chương trình bằng cách thực thi từng dòng lệnh một.

Nhờ vào trình biên dịch mà những gì bạn nhập máy nó mới hiểu, nói sâu hơn xíu là mã nguồn của bạn được chuyển đổi thành một dạng trung gian gọi là mã bytecode.

Sau đây mình sẽ giới thiệu mặt mũi của nó, với tên gọi standard interactive Python intergreter. Hãy mở command line lên (cmd) hoặc terminal và gõ python :

Python 3.11.5 (tags/v3.11.5:cce6ba9, Aug 24 2023, 14:38:34) [MSC v.1936 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

Sau dấu >>> là nơi bạn gõ các code. Để thoát hãy gõ exit() hoặc Ctrl+D (trên Linux và macOS)

giờ ví dụ mình có 1 file dummy có dòng lệnh sau:

print("Hello world")

Như mình nói Python là interpreted language nên mình chỉ cần gõ vào cmd lệnh sau để in ra kếch quả mong muốn (Lưu ý phải nằm cùng thư mục nhen):

$ python hello_world.py
Hello world

🔥 commands cmd phổ biến

DIR

Lệnh DIR được sử dụng để liệt kê các tệp và thư mục trong một thư mục. Cú pháp của lệnh DIR như sau:

dir [đường dẫn thư mục]

Ví dụ, để liệt kê các tệp và thư mục trong thư mục hiện tại, bạn có thể sử dụng lệnh sau:

dir

DEL

Lệnh DEL được sử dụng để xóa các tệp. Cú pháp của lệnh DEL như sau:

del [tên tệp]

Ví dụ, để xóa tệp có tên “myfile.txt”, bạn có thể sử dụng lệnh sau:

del myfile.txt

COPY

Lệnh COPY được sử dụng để sao chép các tệp. Cú pháp của lệnh COPY như sau:

copy [tên tệp nguồn] [tên tệp đích]

Ví dụ, để sao chép tệp có tên “myfile.txt” sang thư mục “myfolder”, bạn có thể sử dụng lệnh sau:

copy myfile.txt myfolder

MD

Lệnh MD được sử dụng để tạo thư mục. Cú pháp của lệnh MD như sau:

md [tên thư mục]

Ví dụ, để tạo thư mục có tên “myfolder”, bạn có thể sử dụng lệnh sau:

md myfolder

RD

Lệnh RD được sử dụng để xóa thư mục. Cú pháp của lệnh RD như sau:

rd [tên thư mục]

Ví dụ, để xóa thư mục có tên “myfolder”, bạn có thể sử dụng lệnh sau:

rd myfolder

PWD

Where am I?


Mặc dù dân dev Python hệ console sẽ dùng cách này để chạy chương trình, nhưng dân Data thường sử dụng IPython, một trình thông dịch Python nâng cao hoặc sổ Jupyter notebook, chạy trên nền web.

Nếu bạn muốn có cái nhìn sâu hơn về chức năng IPython trong Phụ lục A: NumPy nâng cao của sách.

Trong trường hợp bạn muốn chạy một file .py nằm cùng thư mục thì hãy dùng lệnh %run | run, IPython sẽ thực thi code trong tệp được chỉ định và cho ra thông báo kết quả ngay bên dưới.

🔥 IPython prompt with number

Dấu nhắc IPython In [1]: được đánh số là một trong những tính năng đặc trưng nhất của IPython. Nó cho phép bạn theo dõi thứ tự các biểu thức mã mà bạn đã thực thi và quay lại các biểu thức trước đó một cách dễ dàng.

(base) C:\Users\Admin>ipython
Python 3.11.4 | packaged by Anaconda, Inc. | (main, Jul  5 2023, 13:47:18) [MSC v.1916 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 8.15.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: %run hello_world.py
Hello world

In [2]:

IPython prompt mặc định sử dụng kiểu số In [2]:, khác với kiểu >>> tiêu chuẩn.

Fact

In: Cho biết rằng trình thông dịch đang chờ người dùng nhập mã.
[2]: Cho biết đây là dòng thứ hai của mã mà người dùng đang nhập.

Các thành phần của IPython Prompt

IPython basics – cẩm nang IPython

🔥 Khởi chạy IPython Shell

Cách để mở IPython là gõ ipython vào cmd – Siêu dễ nhưng nhớ phải cài đặt nó rùi mới mở được nhen, có trò vui là bạn thử test câu này xem 😂

conda remove ipython 

Bạn có thể thực thi các câu lệnh Python tùy ý bằng cách gõ chúng và nhấn Enter. Thử ví dụ sau nè:

In [5]: import numpy as np

In [6]: data = [np.random.standard_normal() for i in range(7)]

In [7]: data
Out[7]: 
[-0.20470765948471295,
 0.47894333805754824,
 -0.5194387150567381,
 -0.55573030434749,
 1.9657805725027142,
 1.3934058329729904,
 0.09290787674371767]

Hai dòng đầu là các câu lệnh mã Python; câu lệnh thứ hai tạo một biến có tên data tham chiếu đến một danh sách mới được tạo. Dòng cuối in giá trị của data ra.

Nhiều loại đối tượng Python được định dạng để dễ đọc hơn, hoặc được pretty-printed (“in đẹp”), nâng cấp hơn so với print trong cmd. Nếu bạn in biến data ở trên trong trình thông dịch Python tiêu chuẩn, đây là thứ nó trả về:

>>> import numpy as np
>>> data = [np.random.standard_normal() for i in range(7)]
>>> print(data)
>>> data
[-0.5767699931966723, -0.1010317773535111, -1.7841005313329152,
-1.524392126408841, 0.22191374220117385, -1.9835710588082562,
-1.6081963964963528]

IPython cũng cung cấp cách để thực thi một khối mã – code block. Ví dụ

Trong python cmd

def greet(name):
  print(f"Hello, {name}!")

greet("Bard")

Trong IPython

In [1]: def greet(name):
...: print(f"Hello, {name}!")
...:
In [2]: greet("Bard")
Hello, Bard!

🔥 Khởi chạy Jupyter Notebook

Một trong những thành phần chính của dự án Jupyter là notebook, là một interactive document for code + text (including Markdown) + data visualizations + others output.

Để khởi động Jupyter, hãy chạy lệnh jupyter notebook

File extension của Notebook là .ipynb .

Bài tập về nhà nè:

Bài 1: Hãy thử tìm cách đổi tên, mở một notebook sẵn có và đóng hẳn một notebook (tắt luôn Python process link với nó) xem thử nào? 😂

Bài 2: Chạy đoạn code sau thử (tải data từ trang này nè: link )

🔥 Tab Completion

Xét về giao diện IPython trông giống như phiên bản được trang trí khác của trình thông dịch Python tiêu chuẩn (được gọi bằng python).

Nhưng một trong những cải tiến lớn so với giao diện Python tiêu chuẩn là tab completion, được tìm thấy trong nhiều IDE. Khi nhập biểu thức trong giao diện, nhấn phím Tab sẽ tìm kiếm namespace – là một cơ chế để tổ chức các tên giúp bạn tránh các xung đột tên khi bạn đang lập trình, cho bất kỳ biến (đối tượng, hàm, v.v.) nào khớp với các ký tự bạn đã nhập. Ví dụ:

In [1]: an_apple = 27

In [2]: an_example = 42

In [3]: an<Tab>
an_apple   an_example  any

any là hàm của có sẵn của Python. Ngoài ra còn có các hàm có sẵn của một số cấu trúc dữ liệu mặc định của Python

In [3]: b = [1, 2, 3]

In [4]: b.<Tab>
append()  count()   insert()  reverse()
clear()   extend()  pop()     sort()
copy()    index()   remove()

Tương tự cho các module

In [1]: import datetime

In [2]: datetime.<Tab>
date          MAXYEAR       timedelta
datetime      MINYEAR       timezone
datetime_CAPI time          tzinfo

IPython sẽ ẩn các phương thức và thuộc tính bắt đầu bằng dấu gạch dưới, chẳng hạn như magic methods (các phương thức đặc biệt được Python sử dụng để thực hiện các hành vi đặc biệt, chẳng hạn như khởi tạo đối tượng (phương thức __init__), internal “private” methods and attributes

Các phương thức và thuộc tính này cũng có thể thấy được khi tab-completed, nhưng trước tiên bạn phải gõ một dấu gạch dưới để nhìn thấy chúng. Nếu bạn luôn muốn nhìn thấy các phương thức đó trong tab completion, bạn có thể thay đổi cài đặt này trong cấu hình IPython.

Tab completion hoạt động trong nhiều ngữ cảnh bên ngoài việc tìm kiếm namespace và các thuộc tính của đối tượng hoặc mô-đun. Khi nhập bất cứ thứ gì trông giống như đường dẫn tệp (ngay cả trong chuỗi cú pháp Python), nhấn phím Tab sẽ hoàn thành bất cứ thứ gì trên hệ thống tệp máy tính của bạn khớp với những gì bạn đã nhập.

Kết hợp với lệnh %run (xem Phụ lục B.2.1: Lệnh %run), chức năng này có thể giúp bạn tiết kiệm nhiều lần gõ phím.

Ngoài ra tab completion giúp tiết kiệm thời gian là trong việc hoàn thành tham số từ khóa của hàm (bao gồm = sign!).

🔥 Instrospect – Nội suy

Introspection trong Python là khả năng truy cập thông tin về một đối tượng.

Một số cách để nội suy một đối tượng hay một biến như sau:

  • Sử dụng dấu (?) trước và sau đối tượng.
  • Sử dụng các thuộc tính và phương thức đặc biệt của đối tượng.
  • Truy cập tới

Đối với sử dụng ? thì xem ví dụ sau đây

In [1]: b = [1, 2, 3]

In [2]: b?
--------------------------------
Type:        list
String form: [1, 2, 3]
Length:      3
Docstring:
Built-in mutable sequence.

If no argument is given, the constructor creates a new empty list.
The argument must be an iterable if specified.


In [3]: print?
-------------------------------
Docstring:
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file:  a file-like object (stream); defaults to the current sys.stdout.
sep:   string inserted between values, default a space.
end:   string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
Type:      builtin_function_or_method

Python cung cấp một số hàm và thuộc tính tích hợp để hỗ trợ introspection. Một số trong những quan trọng nhất bao gồm:

  • dir(): Hàm này trả về một danh sách các thuộc tính và phương thức của một đối tượng. Bao gồm các hàm
  • getattr(): Hàm này trả về giá trị của một thuộc tính của một đối tượng, hoặc None nếu thuộc tính không tồn tại.
  • setattr(): Hàm này đặt giá trị của một thuộc tính của một đối tượng.
  • hasattr(): Hàm này kiểm tra xem một đối tượng có thuộc tính cụ thể hay không.
  • callable(): Hàm này kiểm tra xem một đối tượng có thể gọi được hay không.
  • inspect: Mô-đun này cung cấp nhiều chức năng hơn để kiểm tra các đối tượng và mã Python.

🔥 Từ Widldcard tới Regex

Các ký tự đại diện như ? hay * được gọi là the wildcard expression ngoài dùng cho nội suy đối tượng thì công dụng phổ biến dùng trong kỹ thuật regex dùng để tìm kiếm chuỗi ký tự theo một pattern xác định.

Có thể bạn chưa biết

Trong Regex thì * dùng để chỉ định bất kì ký tự nào còn ? đại diện cho 1 ký tự. Dễ hiểu là thế nhưng có nhiều hơn 2 wildcard token ngoài kia.

Cho dễ hiểu thì

Xét ví dụ validate email bằng Regex sau:

^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$

Ý nghĩa của các thành phần:

^ Beginning: Áp Regex cho phần bắt đầu của một chuỗi ký tự.

[ Chracter set: Bắt đầu pattern set

  • \w Word: Match bất kỳ ký tự nào (alphanumeric và underscore)
  • - Character: Match 1 ký tự “-“
  • \. Escaped character: Match 1 ký tự “.”

] Kết thúc pattern.

+ Quantifier: Nối các pattern lại với nhau

@ Character: Match 1 ký tự “@”

{2,4} Quantifier: Giới hạn chỉ 2 tới 4 pattern liền trước, ví dụ không thể match @com.carry4u

$ End: Kết thúc chuỗi ký tự

Trang web để vọc Regex: https://regexr.com/

Qủa thật là để làm một pattern regex như trên nó rất là cực, nhưng Ơn trời Python cho chúng ta sẵn một thư viện có hỗ trợ Regex khá là ngon

# Regular expression library
import re

# Add or remove the words in this list to vary the results
wordlist = ["color", "colour", "work", "working",
            "fox", "worker", "working"]

for word in wordlist:
        # The . symbol is used in place of ? symbol
        if re.search('col.r', word) : 
                print (word)

Trong ví dụ trên thì dấu . đã được dùng thay thế cho dấu ?. Trong chương trình trên ta tìm kiếm tất cả các từ khớp với mẫu col?r

Tương tự .+ sẽ thay thế cho dấu * như ví dụ sau là tìm kiếm tất cả từ bắt đầu với work

# Regular expression library
import re

# Add or remove the words in this list to vary the results
wordlist = ["color", "colour", "work", "working",
            "fox", "worker"]

for word in wordlist:
        # The .+ symbol is used in place of * symbol
        if re.search('work.+', word) : 
                print (word)

Nhưng đó là đối với các yêu cầu tìm kiếm đơn giản, bạn hoàn toàn có thể dùng những mẫu pattern phức tạp tùy theo nhu cầu của bạn luôn nè. Dưới đây là một hàm để crawl data với mục tiêu bỏ đi các tag trong file HTML:

def removeHtmlTags(page):
    p = re.compile(r'''<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>''')
    return p.sub('', page)

Với DA tụi mình thì kỹ thuật này sẽ cực kỳ hữu ích trong việc phân tích văn bản.

Lời kết

Những kiến thức trên có thể là trừu tượng và đôi khi bạn sẽ chưa thấy được tính ứng dụng nhưng càng ở trình độ cao bạn sẽ thấy chúng giúp ích khá là nhiều.

Riêng phần hướng dẫn khởi chạy Jupyter Notebook thì mình tin chỉ cần các bạn chịu khó vọc một xíu là thành master nó liền à

Hẹn gặp các bạn và buổi Livestream kế tiếp nhé (8:00 PM – T3 và CN hằng tuần)

Các kênh cộng đồng của mình

Facebook: https://www.facebook.com/bocuoilamdata

Youtube: https://www.youtube.com/@CarrY4U_VN

Website: https://carry4u.org/

© Bản quyền thuộc về CarrY4U và Bò Cười Làm Data
© Copyright by CarrY4U and bocuoilamdata ☞ Do not Reup”