Sử dụng một numpy. dtype hoặc kiểu Python để chuyển toàn bộ đối tượng pandas thành cùng loại. Ngoài ra, sử dụng {col. dtype, …}, trong đó col là nhãn cột và dtype là numpy. dtype hoặc loại Python để truyền một hoặc nhiều cột của DataFrame thành các loại dành riêng cho cột
bản sao bool, mặc định ĐúngTrả lại một bản sao khi
>>> df.int_col.dtypesdtype['int64']22 [hãy rất cẩn thận khi đặt
>>> df.astype['int32'].dtypes col1 int32 col2 int32 dtype: object0 vì các thay đổi đối với giá trị sau đó có thể lan truyền sang các đối tượng gấu trúc khác]
Khi thực hiện phân tích dữ liệu, điều quan trọng là đảm bảo các loại dữ liệu chính xác. Nếu không, bạn có thể nhận được kết quả hoặc lỗi không mong muốn. Trong trường hợp của Pandas, nó sẽ suy luận chính xác các loại dữ liệu trong nhiều trường hợp và bạn có thể tiếp tục với phân tích của mình mà không cần suy nghĩ thêm về chủ đề này
Mặc dù gấu trúc hoạt động tốt như thế nào, tại một số điểm trong quá trình phân tích dữ liệu của bạn, bạn có thể sẽ cần chuyển đổi rõ ràng dữ liệu từ loại này sang loại khác. Bài viết này sẽ thảo luận về cách thay đổi dữ liệu thành kiểu số. Cụ thể hơn, bạn sẽ học cách sử dụng các phương pháp tích hợp sẵn của Pandas
>>> df.int_col.dtypesdtype['int64']5 và
>>> df.int_col.dtypesdtype['int64']6 để giải quyết các vấn đề phổ biến sau
- Chuyển đổi chuỗi/int thành int/float
- Chuyển đổi float sang int
- Chuyển đổi một cột của các loại dữ liệu hỗn hợp
- Xử lý các giá trị còn thiếu
- Chuyển đổi một cột tiền để thả nổi
- Chuyển đổi boolean thành 0/1
- Chuyển đổi nhiều cột dữ liệu cùng lúc
- Xác định loại dữ liệu khi đọc tệp CSV
- Tạo một chức năng tùy chỉnh để chuyển đổi loại dữ liệu
>>> df.int_col.dtypesdtype['int64']
5 so với.>>> df.int_col.dtypesdtype['int64']
6
Để trình diễn, chúng tôi tạo một tập dữ liệu và sẽ tải nó bằng một hàm
import pandas as pd
import numpy as npdef load_df[]:
return pd.DataFrame[{
'string_col': ['1','2','3','4'],
'int_col': [1,2,3,4],
'float_col': [1.1,1.2,1.3,4.7],
'mix_col': ['a', 2, 3, 4],
'missing_col': [1.0, 2, 3, np.nan],
'money_col': ['£1,000.00','£2,400.00','£2,400.00','£2,400.00'],
'boolean_col': [True, False, True, True],
'custom': ['Y', 'Y', 'N', 'N']
}]df = load_df[]
hình ảnh của tác giả
Vui lòng kiểm tra repo Github để biết mã nguồn
Kiểm tra kiểu dữ liệu
Trước khi chúng tôi đi sâu vào các loại dữ liệu thay đổi, hãy xem nhanh cách kiểm tra các loại dữ liệu. Nếu chúng tôi muốn xem tất cả các loại dữ liệu trong DataFrame, chúng tôi có thể sử dụng thuộc tính
>>> df.int_col.dtypesdtype['int64']9
>>> df.dtypesstring_col object
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
Thuộc tính này cũng có trong Series và chúng ta có thể sử dụng nó để kiểm tra kiểu dữ liệu trên một cột cụ thể. Chẳng hạn, hãy kiểm tra kiểu dữ liệu của int_col
>>> df.int_col.dtypesdtype['int64']
Nếu chúng tôi muốn khám phá dữ liệu, phương pháp
>>> df.info[]RangeIndex: 4 entries, 0 to 30 có thể hữu ích hơn vì nó cung cấp RangeIndex, tổng số cột, số lượng không null, dtypes và mức sử dụng bộ nhớ. Đây là nhiều thông tin có giá trị giúp chúng ta nắm bắt được bức tranh tổng thể hơn về dữ liệu
Data columns [total 8 columns]:
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 string_col 4 non-null object
1 int_col 4 non-null int64
2 float_col 4 non-null float64
3 mix_col 4 non-null object
4 missing_col 3 non-null float64
5 money_col 4 non-null object
6 boolean_col 4 non-null bool
7 custom 4 non-null object
dtypes: bool[1], float64[2], int64[1], object[4]
memory usage: 356.0+ bytes
>>> df.info[]RangeIndex: 4 entries, 0 to 31. Chuyển đổi chuỗi thành int/float
Data columns [total 8 columns]:
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 string_col 4 non-null object
1 int_col 4 non-null int64
2 float_col 4 non-null float64
3 mix_col 4 non-null object
4 missing_col 3 non-null float64
5 money_col 4 non-null object
6 boolean_col 4 non-null bool
7 custom 4 non-null object
dtypes: bool[1], float64[2], int64[1], object[4]
memory usage: 356.0+ bytes
Cách đơn giản nhất để chuyển đổi một cột Pandas sang một loại khác là sử dụng phương pháp của Sê-ri
>>> df.int_col.dtypesdtype['int64']5. Chẳng hạn, để chuyển đổi chuỗi thành số nguyên, chúng ta có thể gọi nó như sau
>>> df.int_col.dtypesdtype['int64']2
Chúng ta có thể thấy rằng nó đang sử dụng số nguyên 64 bit theo mặc định. Trong một số trường hợp, việc sử dụng các số nguyên ngắn hơn có thể hiệu quả hơn về bộ nhớ khi xử lý một tập dữ liệu lớn. Để làm điều đó, bạn chỉ cần gọi
>>> df.info[]RangeIndex: 4 entries, 0 to 32 ,
Data columns [total 8 columns]:
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 string_col 4 non-null object
1 int_col 4 non-null int64
2 float_col 4 non-null float64
3 mix_col 4 non-null object
4 missing_col 3 non-null float64
5 money_col 4 non-null object
6 boolean_col 4 non-null bool
7 custom 4 non-null object
dtypes: bool[1], float64[2], int64[1], object[4]
memory usage: 356.0+ bytes
>>> df.info[]RangeIndex: 4 entries, 0 to 33 hoặc
Data columns [total 8 columns]:
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 string_col 4 non-null object
1 int_col 4 non-null int64
2 float_col 4 non-null float64
3 mix_col 4 non-null object
4 missing_col 3 non-null float64
5 money_col 4 non-null object
6 boolean_col 4 non-null bool
7 custom 4 non-null object
dtypes: bool[1], float64[2], int64[1], object[4]
memory usage: 356.0+ bytes
>>> df.info[]RangeIndex: 4 entries, 0 to 34
Data columns [total 8 columns]:
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 string_col 4 non-null object
1 int_col 4 non-null int64
2 float_col 4 non-null float64
3 mix_col 4 non-null object
4 missing_col 3 non-null float64
5 money_col 4 non-null object
6 boolean_col 4 non-null bool
7 custom 4 non-null object
dtypes: bool[1], float64[2], int64[1], object[4]
memory usage: 356.0+ bytes
Tương tự, nếu muốn chuyển kiểu dữ liệu sang float, chúng ta có thể gọi
>>> df.info[]RangeIndex: 4 entries, 0 to 35. Theo mặc định, nó đang sử dụng số dấu phẩy động 64 bit. Chúng ta có thể sử dụng
Data columns [total 8 columns]:
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 string_col 4 non-null object
1 int_col 4 non-null int64
2 float_col 4 non-null float64
3 mix_col 4 non-null object
4 missing_col 3 non-null float64
5 money_col 4 non-null object
6 boolean_col 4 non-null bool
7 custom 4 non-null object
dtypes: bool[1], float64[2], int64[1], object[4]
memory usage: 356.0+ bytes
>>> df.info[]RangeIndex: 4 entries, 0 to 36 để có độ chính xác cao hơn hoặc
Data columns [total 8 columns]:
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 string_col 4 non-null object
1 int_col 4 non-null int64
2 float_col 4 non-null float64
3 mix_col 4 non-null object
4 missing_col 3 non-null float64
5 money_col 4 non-null object
6 boolean_col 4 non-null bool
7 custom 4 non-null object
dtypes: bool[1], float64[2], int64[1], object[4]
memory usage: 356.0+ bytes
>>> df.info[]RangeIndex: 4 entries, 0 to 37 để có hiệu quả bộ nhớ tốt hơn
Data columns [total 8 columns]:
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 string_col 4 non-null object
1 int_col 4 non-null int64
2 float_col 4 non-null float64
3 mix_col 4 non-null object
4 missing_col 3 non-null float64
5 money_col 4 non-null object
6 boolean_col 4 non-null bool
7 custom 4 non-null object
dtypes: bool[1], float64[2], int64[1], object[4]
memory usage: 356.0+ bytes
>>> df.int_col.dtypesdtype['int64']92. Chuyển đổi float thành int
Nếu chúng ta muốn chuyển đổi một cột float thành số nguyên, chúng ta có thể thử sử dụng
>>> df.int_col.dtypesdtype['int64']5 mà chúng ta đã sử dụng ở trên
>>> df.int_col.dtypesdtype['int64']1
hình ảnh của tác giả
Tuy nhiên, có một chút vấn đề. Bằng cách hiển thị DataFrame, chúng ta có thể thấy rằng cột được chuyển đổi thành số nguyên nhưng làm tròn tất cả các giá trị xuống. Nó có thể ổn, nhưng trong hầu hết các trường hợp, tôi sẽ tưởng tượng rằng không. Nếu chúng ta muốn chuyển đổi thành số nguyên và làm tròn theo cách mà chúng ta mong đợi, trước tiên chúng ta có thể thực hiện
>>> df.info[]RangeIndex: 4 entries, 0 to 39
Data columns [total 8 columns]:
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 string_col 4 non-null object
1 int_col 4 non-null int64
2 float_col 4 non-null float64
3 mix_col 4 non-null object
4 missing_col 3 non-null float64
5 money_col 4 non-null object
6 boolean_col 4 non-null bool
7 custom 4 non-null object
dtypes: bool[1], float64[2], int64[1], object[4]
memory usage: 356.0+ bytes
>>> df.int_col.dtypesdtype['int64']3
hình ảnh của tác giả
Bây giờ, số
>>> df.int_col.dtypesdtype['int64']20 được làm tròn thành
>>> df.int_col.dtypesdtype['int64']213. Chuyển đổi một cột của các loại hỗn hợp
Hãy chuyển sang một cột gồm các chuỗi và số hỗn hợp. Khi chạy
>>> df.int_col.dtypesdtype['int64']22, chúng tôi nhận được ValueError
>>> df.int_col.dtypesdtype['int64']7
hình ảnh của tác giả
Lỗi cho thấy đó là sự cố với giá trị
>>> df.int_col.dtypesdtype['int64']23 vì nó không thể được chuyển đổi thành số nguyên. Để giải quyết vấn đề này, chúng ta có thể sử dụng hàm Pandas
>>> df.int_col.dtypesdtype['int64']6 với đối số
>>> df.int_col.dtypesdtype['int64']25
>>> df.int_col.dtypesdtype['int64']1
Nhưng khi kiểm tra
>>> df.int_col.dtypesdtype['int64']9, bạn sẽ thấy nó được chuyển đổi thành
>>> df.int_col.dtypesdtype['int64']27
>>> df.dtypesstring_col object0
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
Trong một số trường hợp, bạn không muốn xuất ra giá trị float mà bạn muốn nó là số nguyên, chẳng hạn như chuyển đổi cột ID. Chúng ta có thể gọi
>>> df.int_col.dtypesdtype['int64']28. Lưu ý rằng nó có vốn
>>> df.int_col.dtypesdtype['int64']29 và khác với Numpy
>>> df.int_col.dtypesdtype['int64']90. Điều này làm là thay đổi Numpy's
>>> df.int_col.dtypesdtype['int64']91 thành Pandas'
>>> df.int_col.dtypesdtype['int64']92 và điều này cho phép nó là một số nguyên
>>> df.dtypesstring_col object1
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
Ngoài ra, chúng ta có thể thay thế Numpy
>>> df.int_col.dtypesdtype['int64']93 bằng một giá trị khác [ví dụ: thay thế
>>> df.int_col.dtypesdtype['int64']91 bằng
>>> df.int_col.dtypesdtype['int64']95] và gọi
>>> df.int_col.dtypesdtype['int64']22
>>> df.dtypesstring_col object24. Xử lý các giá trị còn thiếu
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
Bây giờ chúng ta nên được trang bị đầy đủ để xử lý các giá trị còn thiếu. Trong Pandas, các giá trị bị thiếu được gán giá trị
>>> df.int_col.dtypesdtype['int64']91, viết tắt của “Không phải là số”. Vì lý do kỹ thuật, các giá trị
>>> df.int_col.dtypesdtype['int64']91 này luôn là của
>>> df.int_col.dtypesdtype['int64']27
>>> df.dtypesstring_col object3
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
Khi chuyển đổi một cột có giá trị bị thiếu thành số nguyên, chúng tôi cũng sẽ nhận được ValueError vì không thể chuyển đổi
>>> df.int_col.dtypesdtype['int64']91 thành số nguyên
hình ảnh của tác giả
Để khắc phục lỗi, chúng ta có thể gọi
>>> df.int_col.dtypesdtype['int64']28 như chúng ta đã làm ở trên [Lưu ý đó là
>>> df.int_col.dtypesdtype['int64']29 viết hoa, giống như đã đề cập trong phần trước]. Điều này làm là thay đổi Numpy's
>>> df.int_col.dtypesdtype['int64']91 thành Pandas'
>>> df.int_col.dtypesdtype['int64']92 và điều này cho phép nó là một số nguyên
>>> df.dtypesstring_col object4
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
Ngoài ra, chúng ta có thể thay thế Numpy
>>> df.int_col.dtypesdtype['int64']91 bằng một giá trị khác [ví dụ: thay thế
>>> df.int_col.dtypesdtype['int64']91 bằng
>>> df.int_col.dtypesdtype['int64']95] và gọi
>>> df.int_col.dtypesdtype['int64']22
>>> df.dtypesstring_col object5
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
Nếu bạn muốn tìm hiểu thêm về cách xử lý các giá trị bị thiếu, bạn có thể xem
Làm việc với các giá trị còn thiếu trong Pandas
Hướng dẫn về giá trị bị thiếu trong Pandas và cách sử dụng các phương thức tích hợp sẵn để xử lý chúng
hướng tới khoa học dữ liệu. com
5. Chuyển cột tiền thành sốHãy chuyển sang cột tiền. Vấn đề là nếu chúng tôi đang sử dụng phương pháp trên, chúng tôi sẽ nhận được tất cả các giá trị
>>> df.int_col.dtypesdtype['int64']91 hoặc
>>> df.int_col.dtypesdtype['int64']92 vì chúng đều là các chuỗi có ký hiệu
>>> df.int_col.dtypesdtype['int64']31 và
>>> df.int_col.dtypesdtype['int64']32 và chúng không thể được chuyển đổi thành số. Vì vậy, điều đầu tiên chúng ta phải làm là xóa tất cả các biểu tượng không hợp lệ
>>> df.dtypesstring_col object6
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
Chúng tôi xâu chuỗi 2 cuộc gọi
>>> df.int_col.dtypesdtype['int64']33, một cho
>>> df.int_col.dtypesdtype['int64']31 và một cho
>>> df.int_col.dtypesdtype['int64']32, để thay thế chúng bằng một chuỗi trống
Nếu bạn đã quen với biểu thức chính quy, chúng ta cũng có thể thay thế các ký hiệu đó bằng biểu thức chính quy
>>> df.dtypesstring_col object7
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
>>> df.int_col.dtypesdtype['int64']36 nói rằng chúng tôi muốn thay thế
>>> df.int_col.dtypesdtype['int64']31 và
>>> df.int_col.dtypesdtype['int64']32 bằng một chuỗi rỗng. Đối số
>>> df.int_col.dtypesdtype['int64']39 giả định mẫu được truyền vào là một biểu thức chính quy [Lưu ý rằng nó mặc định là
>>> df.int_col.dtypesdtype['int64']70]6. Chuyển đổi boolean thành 0/1
Chúng tôi có
>>> df.int_col.dtypesdtype['int64']70/
>>> df.int_col.dtypesdtype['int64']72, nhưng bạn có thể tưởng tượng trường hợp cần những thứ này như
>>> df.int_col.dtypesdtype['int64']95 và
>>> df.int_col.dtypesdtype['int64']74 , chẳng hạn, nếu bạn đang xây dựng một mô hình học máy và đây là một trong những tính năng đầu vào của bạn, thì bạn cần nó phải là số và . Điều này thực ra rất đơn giản, bạn chỉ cần gọi
>>> df.int_col.dtypesdtype['int64']22
>>> df.dtypesstring_col object87. Chuyển đổi nhiều kiểu dữ liệu cột cùng một lúc
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
Cho đến nay, chúng tôi đã chuyển đổi loại dữ liệu một cột tại một thời điểm. Ví dụ
>>> df.dtypesstring_col object9
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
Có một phương thức DataFrame còn có tên là
>>> df.int_col.dtypesdtype['int64']5 cho phép chúng ta chuyển đổi nhiều kiểu dữ liệu cột cùng một lúc. Tiết kiệm thời gian khi bạn có nhiều cột muốn thay đổi
>>> df.int_col.dtypesdtype['int64']08. Xác định kiểu dữ liệu của từng cột khi đọc tệp CSV
Nếu bạn muốn đặt kiểu dữ liệu cho từng cột khi đọc tệp CSV, bạn có thể sử dụng đối số
>>> df.int_col.dtypesdtype['int64']11 khi tải dữ liệu bằng
>>> df.int_col.dtypesdtype['int64']12
>>> df.int_col.dtypesdtype['int64']1
Đối số
>>> df.int_col.dtypesdtype['int64']11 lấy một từ điển với khóa đại diện cho cột và giá trị đại diện cho kiểu dữ liệu. Sự khác biệt giữa phương pháp này và phương pháp trên là phương pháp này thực hiện chuyển đổi trong quá trình đọc và có thể tiết kiệm thời gian và hiệu quả hơn về bộ nhớ9. Tạo một chức năng tùy chỉnh để chuyển đổi dữ liệu thành số
Khi dữ liệu hơi phức tạp để chuyển đổi, chúng ta có thể tạo một chức năng tùy chỉnh và áp dụng nó cho từng giá trị để chuyển đổi sang loại dữ liệu phù hợp
Chẳng hạn, cột money_col, đây là một hàm đơn giản mà chúng ta có thể sử dụng
>>> df.int_col.dtypesdtype['int64']2
Chúng ta cũng có thể sử dụng hàm lambda
>>> df.int_col.dtypesdtype['int64']310. Sự khác biệt giữa
>>> df.int_col.dtypesdtype['int64']5 và
>>> df.int_col.dtypesdtype['int64']6
Cách đơn giản nhất để chuyển đổi kiểu dữ liệu từ loại này sang loại khác là sử dụng phương thức
>>> df.int_col.dtypesdtype['int64']5. Phương pháp này được hỗ trợ bởi cả Pandas DataFrame và Series. Nếu bạn đã có kiểu dữ liệu số [
>>> df.int_col.dtypesdtype['int64']17,
>>> df.int_col.dtypesdtype['int64']18,
>>> df.int_col.dtypesdtype['int64']19,
>>> df.dtypesstring_col object00,
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
>>> df.dtypesstring_col object01,
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
>>> df.dtypesstring_col object02,
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
>>> df.int_col.dtypesdtype['int64']27,
>>> df.dtypesstring_col object04 và
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
>>> df.dtypesstring_col object05], bạn cũng có thể sử dụng
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
>>> df.int_col.dtypesdtype['int64']5 để
- chuyển đổi nó thành kiểu dữ liệu số khác [int thành float, float thành int, v.v. ]
- sử dụng nó để truyền xuống kích thước byte nhỏ hơn hoặc upcast lên kích thước byte lớn hơn
Tuy nhiên,
>>> df.int_col.dtypesdtype['int64']5 sẽ không hoạt động đối với cột có nhiều loại khác nhau. Chẳng hạn, mix_col có
>>> df.dtypesstring_col object08 và missing_col có
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
>>> df.int_col.dtypesdtype['int64']91. Nếu chúng tôi cố gắng sử dụng
>>> df.int_col.dtypesdtype['int64']5, chúng tôi sẽ nhận được ValueError. Kể từ Pandas 0. 20. 0, lỗi này có thể được khắc phục bằng cách đặt đối số
>>> df.dtypesstring_col object11 nhưng dữ liệu gốc của bạn sẽ được trả về nguyên vẹn
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
Hàm Pandas
>>> df.int_col.dtypesdtype['int64']6 có thể xử lý các giá trị này một cách dễ dàng hơn. Thay vì thất bại, chúng ta có thể đặt đối số
>>> df.int_col.dtypesdtype['int64']25 để ép buộc các giá trị không hợp lệ thành
>>> df.int_col.dtypesdtype['int64']91
>>> df.int_col.dtypesdtype['int64']4Kết luận
Chúng ta đã thấy cách chúng ta có thể chuyển đổi cột dữ liệu Pandas thành kiểu số với
>>> df.int_col.dtypesdtype['int64']5 và
>>> df.int_col.dtypesdtype['int64']6.
>>> df.int_col.dtypesdtype['int64']5 là cách đơn giản nhất và cung cấp nhiều khả năng hơn trong cách chuyển đổi, trong khi
>>> df.int_col.dtypesdtype['int64']6 có nhiều chức năng mạnh mẽ hơn để xử lý lỗi
Tôi hy vọng bài viết này sẽ giúp bạn tiết kiệm thời gian trong việc học Pandas. Tôi khuyên bạn nên xem tài liệu về API
>>> df.dtypesstring_col object19 và
int_col int64
float_col float64
mix_col object
missing_col float64
money_col object
boolean_col bool
custom object
dtype: object
>>> df.int_col.dtypesdtype['int64']6 và để biết về những điều khác mà bạn có thể làm
Cảm ơn vì đã đọc. Vui lòng kiểm tra sổ ghi chép để biết mã nguồn và tiếp tục theo dõi nếu bạn quan tâm đến khía cạnh thực tế của máy học