Xử lý dữ liệu kinh tế từ GSO (National Summary Data Page)

Dành cho những ai chưa biết thì GSO gần đây đã cải tiến rất nhiều trong việc update cơ sở dữ liệu quốc gia. Hiện nay, dữ liệu của Tổng cục thống kê, Bộ tài chính và Ngân hàng nhà nước đã được thu về một mối và sử dụng cùng cấu trúc dữ liệu (National Summary Data Page). Bài viết hôm nay sẽ giúp các bạn lấy các dữ liệu đó bằng Python (machine-reading) trực tiếp từ nguồn. Rất có ích cho những người làm về data science và nghiên cứu kinh tế.

Nguồn dữ liệu

Mình nghĩ chuyển đổi số ở Việt Nam đang làm khá tốt, theo đúng hướng phát triển. Nguồn dữ liệu ở đây:

Link: http://nsdp.gso.gov.vn/index.htm

Ở đây có khá đầy đủ các dữ liệu quan trọng về kinh tế vĩ mô. Ở đây có 2 lựa chọn chính, đó là download file .excel (Browse Data) hoặc tải file .xml (Download in SDMX). Ở đây, mình quan tâm đến file .xml. Tuy nhiên, để có cái nhìn trực quan về dữ liệu, các bạn cũng nên tải file excel về xem trong đó có những gì.

Trong bài viết này, mình sẽ xử lý dữ liệu về Chỉ số sản xuất công nghiệp (IIP).

Do file xml khó xử lý trong Python, sau khi đọc, chúng ta sẽ convert nó sang dạng dict.

Đọc file .xml và convert sang Python dict

Các library cần dùng

import pandas as pd 
import requests
from bs4 import BeautifulSoup
import xmltodict, json

Đầu tiên, dùng request để load dữ liệu xml, sau đó dùng Beautiful Soup để đọc nó sang dạng text. Cuối cùng, dùng thư viện xmltodict để parse dữ liệu này sang dạng dict của Python

url = 'http://nsdp.gso.gov.vn/GSO-chung/SDMXFiles/GSO/GSO.%20Chi%20so%20cong%20nghiep.IIP_Vietnam.xml'
# read xml file from url 
r = requests.get(url)
soup = BeautifulSoup(r.text, 'xml')
# convert xml to python dict
data = xmltodict.parse(str(soup))

Dữ liệu sau khi được làm sạch khá dễ đọc. Chú ý tới mục ‘Series‘, các bạn có thể nhìn thấy dữ liệu nằm trong 1 list gồm các dict cho mỗi loại dữ liệu. Chỉ số công nghiệp có đến 5 biến, là Industry (tổng), Manufacturing, Mining, Electricity&Gas, Water nên dữ liệu cho mỗi biến này là 1 dict. Trong mỗi dict gồm có @INDICATOR là nhãn của dữ liệu, và ‘Obs’ là key chúng ta cần tìm. Value của key này là một list gồm các dữ liệu time-series. Mỗi phần tử của list là một dict gồm có 2 items, @OBS_VALUE là giá trị, @TIME_PERIOD là thời gian.

Trích xuất dữ liệu

Sau khi hiểu được dữ liệu cần tìm rồi thì việc tiếp theo là làm sao để lấy nó ra.

Đầu tiên, chúng ta cần access đến cái level chứa dữ liệu. Bám theo “phả hệ” ở hình trên thì cái mục ‘Series’ nằm ở đây.

data_series = data['message:StructureSpecificData']['message:DataSet']['Series']

List này gồm 5 cục đại diện cho 5 biến mình đã kể ở trên. Ở đây, để nêu ví dụ, mình sẽ lấy dữ liệu của Industry (tức là tổng tất cả các ngành công nghiệp), nằm ở vị trí đầu tiên.

df_industry = data_series[0]

Dữ liệu được chứa ở ‘Obs’. Do mỗi mốc quan sát là một từ điển (là một phần tử của list) nên chúng ta sẽ lấy chúng ra bằng cách iterate qua cái list này. Mình sẽ add dữ liệu tháng vào 1 list và giá trị vào 1 list. Trong khi lấy dữ liệu, ta sẽ convert cho đúng định dạng của từng quan sát, tức là biến tháng thành datetime và giá trị thành float. Tốt nhất là tạo một function để làm điều đó.

def get_industry_data(dataframe):
   x_dict = []
   y_dict = []
   for i in range(0, len(dataframe['Obs'])):
      x = dataframe['Obs'][i]['@TIME_PERIOD'] 
      y = dataframe['Obs'][i]['@OBS_VALUE']
      x = pd.to_datetime(x).strftime('%Y-%m') #convert x to datetime
      x_dict.append(x)
      y_dict.append(float(y)) #convert y to float
   return x_dict, y_dict

Sử dụng function trên

x, y = get_industry_data(df_industry)

Và thế là ta đã thu được dữ liệu thành công. Các bạn có thể làm vô vàn thứ với dữ liệu này.

Plot

Mình sẽ dùng dữ liệu thu được để vẽ biểu đồ. Để biết cách vẽ hình động, các bạn xem bài mình đã viết trước đó ở đây:

Cách lấy dữ liệu từ Tổng cục thống kê (GSO) và tạo hình động biểu đồ GDP

Để lại bình luận

Điền thông tin vào ô dưới đây hoặc nhấn vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s

Trang web này sử dụng Akismet để lọc thư rác. Tìm hiểu cách xử lý bình luận của bạn.