Bài 11: Đọc dữ liệu và kĩ thuật reindexing – Python Panda

Trang chủ » Training » Bài 11: Đọc dữ liệu và kĩ thuật reindexing – Python Panda
22/02/2022 Training 137 viewed

1. Đọc dữ liệu

Pandas cung cấp một số công cụ giúp đọc một số định dạng dữ liệu phổ biến và trả về một dataframe. Đọc định dạng *csv ta dùng pd.read_csv(), đọc định dạng excel ta dùng pd.read_excel(), đọc định dạng html ta dùng pd.read_html(), đọc định dạng json ta sử dụng pd.read_json(). Trong bài này tôi sẽ đi sâu vào phần đọc dữ liệu từ định dạng *csv. Hàm pd.read_csv() có rất nhiều đối số giúp chúng ta tùy biến đọc dữ liệu, trong đó tôi thấy cần chú ý một số các đối số sau:
+ filepath_or_buffer: chính là đường dẫn của file, đường dẫn này cũng chấp nhận cả dạng URL.
+ sep: để chỉ định các giá trị trong file được phân biệt qua kí tự nào ví dụ như: ‘,’ hoặc ‘space’, ‘t’. Giá trị mặc định là ‘,’.
+ header: để chỉ rõ dataframe sẽ nhận hàng nào làm tên của cột. và dữ liệu sẽ bắt đầu được tải lên từ sau dòng đấy.
+ index_col: tham số rất hữu ích để chọn một cột làm index.
+ parse_dates:
Nhận giá trị True/False để. Nếu là True sẽ cố gắng chuyển index theo định nghĩa của tham số date_parser về dạng datatime.
List: ví dụ [1,2,3] sẽ cố gắng chuyển cột 1,2,3 theo định nghĩa của tham số date_parser về dạng datatime.
List của list: ví dụ [[1,2,3]] chúng sẽ kết hợp cột 1,2,3 để có thể chuyển thành cột duy nhất có dạng datatime theo định nghĩa date_parser.
+ chunksize: khi bộ nhớ máy tính không đủ để load một lần thì giải pháp đọc từng phần thành một lựa chọn thích hợp vì vậy tham số chunksize sẽ là một giải pháp cho việc này. Ví dụ giải pháp sử dụng  tại https://stackoverflow.com/questions/25962114/how-to-read-a-6-gb-csv-file-with-pandas.
import pandas as pd

def chunck_generator(filename, header=False,chunk_size = 10 ** 5):

   for chunk in pd.read_csv(filename,delimiter=',', iterator=True, chunksize=chunk_size, parse_dates=[1] ):

        yield (chunk)

def _generator( filename, header=False,chunk_size = 10 ** 5):

    chunk = chunck_generator(filename, header=False,chunk_size = 10 ** 5)

    for row in chunk:

        yield row

if __name__ == "__main__":

filename = r'file.csv'

        generator = generator(filename=filename)

        while True:

           print(next(generator))
Ví dụ: Tôi sử dụng “sales_14.csv” từ link sau https://gitlab.com/bambootran89/vimentor_data/blob/master/sales_14.csv.
>>> import pandas as pd

>>> df = pd.read_csv("sales_14.csv",header=0, index_col='Date', parse_dates=True)

>>> df.head()

                             Company   Product  Units

Date

2015-02-02 08:30:00            Hooli  Software      3

2015-02-02 21:00:00        Mediacore  Hardware      9

2015-02-03 14:00:00          Initech  Software     13

2015-02-04 15:30:00        Streeplex  Software     13

2015-02-04 22:00:00  Acme Coporation  Hardware     14

>>>
Trong ví dụ trên chúng tôi có sử dụng hàm DataFrame.head(n=5). Hàm này trả về n hàng đầu tiên được đọc từ file “sales_14.csv”. Trong đó n có kiểu int và default là 5, biểu thị số hàng sẽ được lựa chọn.

2. Kĩ thuật reindexing

Khi ta chia sẻ thông tin giữa các dataframes sử dụng indexes. Reindexing là vô cùng đặc biệt trong các phần bài học tiếp theo khi cần ghép nối dữ liệu với nhau, bởi indexes mang ý nghĩa là định danh của hàng trong dataframe. Ta sẽ đi vào ví dụ sau với 2 dataframes: quarterly_sales_2016 có index được sắp xếp theo thứ tự bảng chữ cái và quarterly_sales_2017 có index theo đúng thứ tự thời gian.
>>> quarterly_sales_2016 = pd.DataFrame({'turnover':[120000,130000,140000,150000]},index=['Apr','Jan','Jul','Oct'])

>>> quarterly_sales_2016

     turnover

Apr    120000

Jan    130000

Jul    140000

Oct    150000

>>> quarterly_sales_2017 = pd.DataFrame({'turnover':[110000,150000,130000,120000]},index=['Jan','Apr','Jul','Oct'])

>>> quarterly_sales_2017

     turnover

Jan    110000

Apr    150000

Jul    130000

Oct    120000

>>>
Bài toán 1: index cần tuân theo thứ tự thời gian
Ta cần định nghĩa một list theo thứ tự thời gian và sử dụng .reindex() để tạo ra một dataframe mới từ quarterly_sales_2016 có index theo thứ tự thời gian như quarterly_sales_2017.
>>> ordered = ['Jan','Apr','Jul','Oct']

>>> quarterly_sales_2016.reindex(ordered)

     turnover

Jan    130000

Apr    120000

Jul    140000

Oct    150000

>>>
Bài toán 2: index cần tuân theo thứ tự bảng chữ cái. .sort_index() sẽ trả về dataframe mới từ quarterly_sales_2017 có index theo thứ tự bảng chữ cái.
>>> quarterly_sales_2017.sort_index()

     turnover

Apr    150000

Jan    110000

Jul    130000

Oct    120000

>>>
Bài toán 3. Reindexing dataframe A giống với dataframe B. Quay lại bài toán 1 không cần định nghĩa thủ công một list hãy sử dụng luôn index của quarterly_sales_2017 làm index cho quarterly_sales_2016.
>>> quarterly_sales_2016.reindex(quarterly_sales_2017.index)

     turnover

Jan    130000

Apr    120000

Jul    140000

Oct    150000

>>>
Yêu cầu đọc thêm từ khóa method. Trong reindex() để giúp việc thay thế giá trị NaN sinh ra trong quá trình reindex() bởi một giá trị được xác định qua từ khóa ‘method’ tại.
Trong bài học này chúng tôi đã giới thiệu một số hàm giúp đọc một số định dạng dữ liệu phổ biến như định dạng csv, excel, json… trong Pandas. Trong đó có đi chi tiết hơn vào định dạng csv, được sử dụng nhiều trong Data Scientist. Có rất nhiều đối số liên quan, các bạn cần nắm được một số đối số cần chú ý để tùy chỉnh dữ liệu đầu vào có định dạng như mong muốn.
Thêm vào đó trong những bài toán thực tế, chúng ta cần xử lý nhiều dữ liệu đầu vào. Việc chia sẻ thông tin và hợp nhất chúng với nhau sao cho chính xác, không bị mất mát dữ liệu là vô cùng quan trọng. Pandas.DataFrame hỗ trợ hàm reindex() giúp chúng ta giải quyết bài toán trên.
Chia sẻ:
Tags:
TOP HOME