.. _sec_pandas:
Xử lý sơ bộ dữ liệu
===================
Cho đến nay chúng tôi đã giới thiệu một loạt các kỹ thuật để thao tác dữ
liệu đã được lưu trữ trong hàng chục. Để áp dụng deep learning để giải
quyết các vấn đề trong thế giới thực, chúng ta thường bắt đầu với tiền
xử lý dữ liệu thô, thay vì những dữ liệu được chuẩn bị độc đáo ở định
dạng tensor. Trong số các công cụ phân tích dữ liệu phổ biến trong
Python, gói ``pandas`` thường được sử dụng. Giống như nhiều gói mở rộng
khác trong hệ sinh thái rộng lớn của Python, ``pandas`` có thể làm việc
cùng với hàng chục. Vì vậy, chúng tôi sẽ đi qua một thời gian ngắn các
bước để xử lý trước dữ liệu thô với ``pandas`` và chuyển đổi chúng sang
định dạng tensor. Chúng tôi sẽ đề cập đến nhiều kỹ thuật tiền xử lý dữ
liệu hơn trong các chương sau.
Đọc tập dữ liệu
---------------
Ví dụ, chúng ta bắt đầu bằng cách tạo một tập dữ liệu nhân tạo được lưu
trữ trong tệp csv (giá trị phân cách bằng dấu phẩy)
``../data/house_tiny.csv``. Dữ liệu được lưu trữ ở các định dạng khác có
thể được xử lý theo những cách tương tự.
Dưới đây chúng tôi viết từng hàng tập dữ liệu vào một tệp csv.
.. code:: python
import os
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:
f.write('NumRooms,Alley,Price\n') # Column names
f.write('NA,Pave,127500\n') # Each row represents a data example
f.write('2,NA,106000\n')
f.write('4,NA,178100\n')
f.write('NA,NA,140000\n')
Để tải tập dữ liệu thô từ tệp csv đã tạo , chúng tôi nhập gói ``pandas``
và gọi hàm ``read_csv``. Tập dữ liệu này có bốn hàng và ba cột, trong đó
mỗi hàng mô tả số phòng (“NumRooms”), kiểu hẻm (“Alley”), và giá
(“Price”) của một ngôi nhà.
.. raw:: html
.. raw:: html
.. code:: python
# If pandas is not installed, just uncomment the following line:
# !pip install pandas
import pandas as pd
data = pd.read_csv(data_file)
print(data)
.. parsed-literal::
:class: output
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
.. raw:: html
.. raw:: html
.. code:: python
# If pandas is not installed, just uncomment the following line:
# !pip install pandas
import pandas as pd
data = pd.read_csv(data_file)
print(data)
.. parsed-literal::
:class: output
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
.. raw:: html
.. raw:: html
.. code:: python
# If pandas is not installed, just uncomment the following line:
# !pip install pandas
import pandas as pd
data = pd.read_csv(data_file)
print(data)
.. parsed-literal::
:class: output
NumRooms Alley Price
0 NaN Pave 127500
1 2.0 NaN 106000
2 4.0 NaN 178100
3 NaN NaN 140000
.. raw:: html
.. raw:: html
Xử lý dữ liệu bị thiếu
----------------------
Lưu ý rằng các mục “nan” bị thiếu giá trị. Để xử lý dữ liệu bị thiếu,
các phương pháp điển hình bao gồm *imputation* và *xoá*, trong đó
imputation thay thế các giá trị bị thiếu bằng các giá trị thay thế,
trong khi xóa bỏ qua các giá trị bị thiếu. Ở đây chúng tôi sẽ xem xét
imputation.
Bằng cách lập chỉ mục dựa trên vị trí số nguyên (``iloc``), chúng tôi
chia ``data`` thành ``inputs`` và ``outputs``, trong đó cái trước lấy
hai cột đầu tiên trong khi cột sau chỉ giữ cột cuối cùng. Đối với các
giá trị số trong ``inputs`` bị thiếu, chúng ta thay thế các mục “nan”
bằng giá trị trung bình của cùng một cột.
.. raw:: html
.. raw:: html
.. code:: python
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
.. parsed-literal::
:class: output
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
.. raw:: html
.. raw:: html
.. code:: python
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
.. parsed-literal::
:class: output
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
.. raw:: html
.. raw:: html
.. code:: python
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]
inputs = inputs.fillna(inputs.mean())
print(inputs)
.. parsed-literal::
:class: output
NumRooms Alley
0 3.0 Pave
1 2.0 NaN
2 4.0 NaN
3 3.0 NaN
.. raw:: html
.. raw:: html
Đối với các giá trị phân loại hoặc rời rạc trong ``inputs``, chúng tôi
coi “nan” là một thể loại. Vì cột “Alley” chỉ lấy hai loại giá trị phân
loại “Pave” và “nan”, ``pandas`` có thể tự động chuyển đổi cột này thành
hai cột “Alley\_Pave” và “Alley\_nan”. Một hàng có kiểu hẻm là “Pave” sẽ
đặt giá trị của “Alley\_Pave” và “Alley\_nan” thành 1 và 0. Một hàng có
kiểu hẻm bị thiếu sẽ đặt giá trị của chúng thành 0 và 1.
.. raw:: html
.. raw:: html
.. code:: python
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
.. parsed-literal::
:class: output
NumRooms Alley_Pave Alley_nan
0 3.0 1 0
1 2.0 0 1
2 4.0 0 1
3 3.0 0 1
.. raw:: html
.. raw:: html
.. code:: python
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
.. parsed-literal::
:class: output
NumRooms Alley_Pave Alley_nan
0 3.0 1 0
1 2.0 0 1
2 4.0 0 1
3 3.0 0 1
.. raw:: html
.. raw:: html
.. code:: python
inputs = pd.get_dummies(inputs, dummy_na=True)
print(inputs)
.. parsed-literal::
:class: output
NumRooms Alley_Pave Alley_nan
0 3.0 1 0
1 2.0 0 1
2 4.0 0 1
3 3.0 0 1
.. raw:: html
.. raw:: html
Chuyển đổi sang định dạng Tensor
--------------------------------
Bây giờ tất cả các mục trong ``inputs`` và ``outputs`` đều là số, chúng
có thể được chuyển đổi sang định dạng tensor. Khi dữ liệu ở định dạng
này, chúng có thể được thao tác thêm với các chức năng tensor mà chúng
tôi đã giới thiệu trong :numref:`sec_ndarray`.
.. raw:: html
.. raw:: html
.. code:: python
from mxnet import np
X, y = np.array(inputs.values), np.array(outputs.values)
X, y
.. parsed-literal::
:class: output
(array([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=float64),
array([127500, 106000, 178100, 140000], dtype=int64))
.. raw:: html
.. raw:: html
.. code:: python
import torch
X, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
X, y
.. parsed-literal::
:class: output
(tensor([[3., 1., 0.],
[2., 0., 1.],
[4., 0., 1.],
[3., 0., 1.]], dtype=torch.float64),
tensor([127500, 106000, 178100, 140000]))
.. raw:: html
.. raw:: html
.. code:: python
import tensorflow as tf
X, y = tf.constant(inputs.values), tf.constant(outputs.values)
X, y
.. parsed-literal::
:class: output
(,
)
.. raw:: html
.. raw:: html
Tóm tắt
-------
- Giống như nhiều gói mở rộng khác trong hệ sinh thái rộng lớn của
Python, ``pandas`` có thể làm việc cùng với hàng chục.
- Imputation và xóa có thể được sử dụng để xử lý dữ liệu bị thiếu.
Bài tập
-------
Tạo một tập dữ liệu thô với nhiều hàng và cột hơn.
1. Xóa cột với các giá trị còn thiếu nhiều nhất.
2. Chuyển đổi tập dữ liệu được xử lý trước sang định dạng tensor.
.. raw:: html
.. raw:: html
`Discussions `__
.. raw:: html
.. raw:: html
`Discussions `__
.. raw:: html
.. raw:: html
`Discussions `__
.. raw:: html
.. raw:: html