TIL 01 | Data Manip 02 | Datasets Basics

Section đầu tiên, rất đơn giản thôi, làm quen và khởi động. Tuy nhiên đối với người mới bắt đầu lại như tôi thì cái gì cũng nên bài bản một chút.

Loading Datasets

Ở bài đầu tiên sẽ sử dụng data từ Kaggle. Do sử dụng Google Colab nên tôi sẽ tìm cách load thẳng mà không phải tải về. Link dataset: https://www.kaggle.com/ronitf/heart-disease-uci

Kaggle có sẵn api cho việc load data, đầu tiên tôi muốn download thẳng về Google Drive vì dataset quá nhẹ (11kB), nhưng khi bấm vào tải về thì Kaggle bắt đăng nhập. Đằng nào thì cũng phải dùng tới cách load từ api nên tôi bỏ thời gian ra để xem và thử luôn.

Tạo file kaggle.json và đưa vào thư mục trên Drive. Sau đó sử dụng:

import os
## setting path for kaggle.json
os.environ['KAGGLE_CONFIG_DIR'] = "/content/drive/My Drive/Data/.kaggle/"
import kaggle
!kaggle datasets download -d ronitf/heart-disease-uci -p "/content/drive/My Drive/Data/.kaggle/" --unzip
Downloading heart-disease-uci.zip to /content/drive/My Drive/Data/.kaggle
  0% 0.00/3.40k [00:00<?, ?B/s]
100% 3.40k/3.40k [00:00<00:00, 512kB/s]

Sau một hồi xoay xở thì tôi cũng tìm ra một cách khá ngắn gọn như trên. Một vài chú ý:

  • library kaggle đã được install sẵn trong Colab, không cần !pip install kaggle nữa
  • environment variable KAGGLE_CONFIG_DIR khi đổi đường dẫn cần Restart lại Colab
  • Tham khảo thêm tại: https://github.com/Kaggle/kaggle-api

Thử dùng pandas để đọc bộ dữ liệu:

import pandas as pd
filename = "/content/drive/My Drive/Data/.kaggle/heart.csv"

df = pd.read_csv(filename)
df.head()
age sex cp trestbps chol fbs restecg thalach exang oldpeak slope ca thal target
0 63 1 3 145 233 1 0 150 0 2.3 0 0 1 1
1 37 1 2 130 250 0 1 187 0 3.5 0 0 2 1
2 41 0 1 130 204 0 0 172 0 1.4 2 0 2 1
3 56 1 1 120 236 0 1 178 0 0.8 2 0 2 1
4 57 0 0 120 354 0 1 163 1 0.6 2 0 2 1

Course có trình bày thêm cách sử dụng numpy hoặc manual function để load data, tuy nhiên 99% thời gian là sử dụng pd.read_csv, nên 2 cách kia bỏ qua, chưa cần nhớ. Ngoài ra còn có pd.read_* cho các trường hợp khác (pd.read_excel, pd.read_pickle, etc). Nếu muốn lấy array từ dataframe, sử dụng to_numpy()

Tạo DataFrames

Cách đơn giản để tạo dataframe nhanh cho các thử nghiệm

import numpy as np

df2 = pd.DataFrame(np.random.random(size=(100000, 4)),columns=["A", "B", "C", "D"])
df2.head()
A B C D
0 0.327064 0.620241 0.598070 0.411404
1 0.916305 0.181835 0.027234 0.656636
2 0.434116 0.866313 0.637173 0.685788
3 0.336978 0.508938 0.051990 0.987994
4 0.007570 0.027970 0.232108 0.020192

Save data: Sự khác biệt về thời gian khi save dưới dạng csvpkl (pickle).
HDF5 dùng khi load dữ liệu lớn được nhanh hơn. Pickle nhanh hơn CSV, nhưng không dễ đọc bằng CSV.
Vì vậy, cho các bộ dữ liệu nhỏ và vừa, csvpickle vẫn là lựa chọn tốt nhất.

df2.to_csv("test_data.csv", index=False, float_format="%0.4f")
df2.to_pickle("test_data.pkl")

Khám phá dữ liệu

Mục này chúng ta sẽ sử dụng dữ liệu về các du hành gia từ NASA: https://www.kaggle.com/nasa/astronaut-yearbook
Load dữ liệu từ Kaggle:

!kaggle datasets download -d nasa/astronaut-yearbook -p "/content/drive/My Drive/Data/.kaggle/" --unzip
df = pd.read_csv("/content/drive/My Drive/Data/.kaggle/astronauts.csv")
Downloading astronaut-yearbook.zip to /content/drive/My Drive/Data/.kaggle
  0% 0.00/20.3k [00:00<?, ?B/s]
100% 20.3k/20.3k [00:00<00:00, 2.84MB/s]

Xem 2 dòng đầu của datasets:

df.head(2)
Name Year Group Status Birth Date Birth Place Gender Alma Mater Undergraduate Major Graduate Major Military Rank Military Branch Space Flights Space Flight (hr) Space Walks Space Walks (hr) Missions Death Date Death Mission
0 Joseph M. Acaba 2004.0 19.0 Active 5/17/1967 Inglewood, CA Male University of California-Santa Barbara; Univer... Geology Geology NaN NaN 2 3307 2 13.0 STS-119 (Discovery), ISS-31/32 (Soyuz) NaN NaN
1 Loren W. Acton NaN NaN Retired 3/7/1936 Lewiston, MT Male Montana State University; University of Colorado Engineering Physics Solar Physics NaN NaN 1 190 0 0.0 STS 51-F (Challenger) NaN NaN

Nhìn thử dòng cuối:

df.tail(1)
Name Year Group Status Birth Date Birth Place Gender Alma Mater Undergraduate Major Graduate Major Military Rank Military Branch Space Flights Space Flight (hr) Space Walks Space Walks (hr) Missions Death Date Death Mission
356 George D. Zamka 1998.0 17.0 Retired 6/29/1962 Jersey City, NJ Male US Naval Academy; Florida Institute of Technology Mathematics Engineering Management Colonel US Marine Corps (Retired) 2 692 0 0.0 STS-120 (Discovery), STS-130 (Endeavor) NaN NaN

Thông tin về các cột trong dữ liệu:

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 357 entries, 0 to 356
Data columns (total 19 columns):
 #   Column               Non-Null Count  Dtype  
---  ------               --------------  -----  
 0   Name                 357 non-null    object 
 1   Year                 330 non-null    float64
 2   Group                330 non-null    float64
 3   Status               357 non-null    object 
 4   Birth Date           357 non-null    object 
 5   Birth Place          357 non-null    object 
 6   Gender               357 non-null    object 
 7   Alma Mater           356 non-null    object 
 8   Undergraduate Major  335 non-null    object 
 9   Graduate Major       298 non-null    object 
 10  Military Rank        207 non-null    object 
 11  Military Branch      211 non-null    object 
 12  Space Flights        357 non-null    int64  
 13  Space Flight (hr)    357 non-null    int64  
 14  Space Walks          357 non-null    int64  
 15  Space Walks (hr)     357 non-null    float64
 16  Missions             334 non-null    object 
 17  Death Date           52 non-null     object 
 18  Death Mission        16 non-null     object 
dtypes: float64(3), int64(3), object(13)
memory usage: 53.1+ KB

Một hàm như cái tên của nó:

df.describe()
Year Group Space Flights Space Flight (hr) Space Walks Space Walks (hr)
count 330.000000 330.000000 357.000000 357.000000 357.000000 357.000000
mean 1985.106061 11.409091 2.364146 1249.266106 1.246499 7.707283
std 13.216147 5.149962 1.428700 1896.759857 2.056989 13.367973
min 1959.000000 1.000000 0.000000 0.000000 0.000000 0.000000
25% 1978.000000 8.000000 1.000000 289.000000 0.000000 0.000000
50% 1987.000000 12.000000 2.000000 590.000000 0.000000 0.000000
75% 1996.000000 16.000000 3.000000 1045.000000 2.000000 12.000000
max 2009.000000 20.000000 7.000000 12818.000000 10.000000 67.000000

Xem kích thước của dataframe:

df.shape
(357, 19)

Tương quan giữa các đại lượng:

df.corr()
Year Group Space Flights Space Flight (hr) Space Walks Space Walks (hr)
Year 1.000000 0.980934 0.036420 0.331386 0.210073 0.253502
Group 0.980934 1.000000 -0.011386 0.325683 0.217891 0.261384
Space Flights 0.036420 -0.011386 1.000000 0.325233 0.257073 0.258642
Space Flight (hr) 0.331386 0.325683 0.325233 1.000000 0.472796 0.454408
Space Walks 0.210073 0.217891 0.257073 0.472796 1.000000 0.985755
Space Walks (hr) 0.253502 0.261384 0.258642 0.454408 0.985755 1.000000

Thông tin cụ thể về giá trị của 1 cột:

df["Year"].value_counts()
1996.0    35
1978.0    35
1998.0    25
1990.0    23
1966.0    19
1995.0    19
1980.0    19
1992.0    19
1984.0    18
2000.0    17
1987.0    15
1963.0    14
1985.0    13
1967.0    11
2004.0    11
2009.0     9
1962.0     8
1969.0     7
1959.0     7
1965.0     6
Name: Year, dtype: int64

TIL

Bài này thì khá là nhẹ nhàng, tôi có thể tóm gọn lại những gì mình học được như sau:

  • Load datasets từ Kaggle về Google Drive và chạy trong Colab
  • Save Datasets
  • Khám phá DataFrame với một vài hàm siêu đơn giản

Đó, ít thế thôi, lần đầu làm quen cũng mất thời gian lắm.