messenger_logo
Liên hệ qua Messenger
SciEco

Tích hợp stata và python: làm việc với api và dữ liệu json

I
IEFPA
Ngày viết: 30/03/2026

Dữ liệu hiện diện ở khắp mọi nơi. Các cơ quan chính phủ, tổ chức tài chính, trường đại học và nền tảng mạng xã hội thường cung cấp quyền truy cập dữ liệu của họ thông qua API. Hệ thống này đóng vai trò như một cầu nối, thường trả về khối dữ liệu được yêu cầu dưới định dạng tệp JSON. Việc nắm vững cách sử dụng Python để gửi các truy vấn API và xử lý dữ liệu JSON thu được ngay bên trong môi trường Stata là một kỹ năng cực kỳ hữu ích cho quá trình phân tích dữ liệu hiện đại.

Khái quát về cấu trúc API và định dạng JSON

API là một phần mềm trung gian cho phép hệ thống của bạn yêu cầu dữ liệu từ một hệ thống máy tính khác. Cú pháp truy vấn thường mang tính đặc thù tùy thuộc vào từng hệ thống cung cấp, nhưng một cấu trúc điển hình luôn bắt đầu bằng một URL theo sau là các tùy chọn tham số. Bài viết này sẽ lấy ví dụ về việc sử dụng hệ thống openFDA để truy xuất dữ liệu về các biến cố bất lợi của thuốc từ Cục Quản lý Thực phẩm và Dược phẩm Hoa Kỳ.

Chúng ta hoàn toàn có thể thêm các điều kiện lọc vào lời gọi API để thu hẹp phạm vi dữ liệu trả về. Dữ liệu này hiển thị dưới dạng JSON, một định dạng lưu trữ phổ biến được cấu trúc bởi tập hợp các cặp khóa và giá trị. Khóa hoạt động tương tự như một biến số trong tập dữ liệu Stata, còn giá trị chính là dữ liệu thực tế được ghi nhận.

Điểm đặc trưng của JSON là dữ liệu thường được lồng ghép vào nhau thành nhiều tầng. Cấu trúc lồng ghép này đòi hỏi chúng ta phải có kỹ thuật bóc tách phù hợp. Mục tiêu cốt lõi là gọi dữ liệu từ openFDA, giải quyết cấu trúc lồng nhau này và chuyển đổi thành một tập dữ liệu Stata hoàn chỉnh thông qua hai thư viện là requests và pandas.

Khởi tạo và xây dựng địa chỉ truy vấn dữ liệu

Bước đầu tiên là xác định một chuỗi mang tên URL bên trong khối mã Python. Chuỗi này chứa đường dẫn cơ bản dùng để lấy dữ liệu. Thay vì viết một chuỗi truy vấn dài và phức tạp, việc chia nhỏ các thành phần sẽ giúp mã lệnh dễ kiểm soát hơn. Các biến chuỗi sẽ lần lượt đại diện cho ngày tháng, quốc gia và tên thuốc cần lọc. Quá trình nối chuỗi sẽ tạo ra một địa chỉ URL hoàn chỉnh.

1API = 'https://api.fda.gov/drug/event.json?search='
2date = 'receivedate:[20180101+TO+20180105]'
3country = 'occurcountry:"US"'
4drug = 'patient.drug.openfda.brand_name:"Fentanyl"'
5data = 'count=receivedate'
6URL = API + date + "+AND+" + country + "+AND+" + drug + "&" + data
7print(URL)

Gửi yêu cầu truy xuất và định dạng kết quả

Khi địa chỉ truy vấn đã được xây dựng chính xác, bước tiếp theo là gửi yêu cầu đến máy chủ cung cấp dữ liệu. Hàm get từ thư viện requests sẽ thực thi việc truy cập URL và lưu trữ toàn bộ phản hồi JSON vào một đối tượng từ điển. Do dữ liệu thô ban đầu hiển thị dưới dạng một khối văn bản đặc rất khó đọc, mô đun json sẽ được sử dụng để tái định dạng lại.

Bằng cách thiết lập thông số thụt đầu dòng, các cấp độ lồng nhau của khối dữ liệu hiện ra rõ ràng hơn. Chúng ta có thể thấy dữ liệu được chia thành hai nhóm khóa chính, trong đó khóa lưu trữ kết quả thực tế là phần thông tin trọng tâm cần trích xuất.

1import requests
2import json
3data = requests.get(URL).json()
4print(json.dumps(data, indent=4, sort_keys=True))

Chuyển đổi dữ liệu JSON thành tập dữ liệu Stata

Dựa vào cấu trúc vừa phân tích, phương thức get sẽ tiến hành trích xuất riêng phần dữ liệu thuộc khóa kết quả và đặt chúng vào một đối tượng danh sách. Mặc dù đã được tách riêng, dữ liệu vẫn mang định dạng khóa và giá trị. Để biến đổi thành cấu trúc hàng và cột truyền thống, thư viện pandas sẽ can thiệp thông qua phương thức read_json, đưa toàn bộ danh sách này vào một data frame.

Khi data frame đã hình thành với các cột hiển thị thời gian và số lượng biến cố, phương thức to_stata thực hiện nhiệm vụ cuối cùng là xuất data frame này thành tệp Stata có đuôi mở rộng dta để tương thích với quy trình phân tích thống kê tiếp theo.

1import requests
2import json
3import pandas as pd
4API = 'https://api.fda.gov/drug/event.json?search='
5date = 'receivedate:[20100101+TO+20200101]'
6country = 'occurcountry:"US"'
7drug = 'patient.drug.openfda.brand_name:"Fentanyl"'
8data = 'count=receivedate'
9URL = API + date + "+AND+" + country + "+AND+" + drug + "&" + data
10data = requests.get(URL).json()
11fdadata = data.get('results', [])
12fda_df = pd.read_json(json.dumps(fdadata))
13fda_df.to_stata('fentanyl.dta', version=118)

Sau khi tệp dữ liệu được lưu thành công trên ổ cứng, các mã lệnh Stata thuần túy có thể lập tức mở tệp, xử lý lại định dạng chuỗi thời gian cho chuẩn xác và tiến hành vẽ biểu đồ trực quan hóa xu hướng sự kiện.

1use fentanyl.dta, clear
2drop index
3generate date = mofd(date(string(time, "%8.0f"),"YMD"))
4format date %tm
5collapse (sum) count, by(date)
6tsset date, monthly

✨ Khả năng kết hợp sức mạnh thu thập dữ liệu tự động của Python với nền tảng phân tích thống kê chuyên sâu của Stata mang lại một quy trình làm việc hoàn toàn liền mạch. Người làm khoa học dữ liệu không còn phải chuyển đổi thủ công qua lại giữa các phần mềm, từ đó giảm thiểu sai sót và tối ưu hóa thời gian từ bước thu thập thô đến bước trực quan hóa cuối cùng.

Cấu trúc lồng ghép của định dạng JSON đôi khi không chỉ dừng lại ở một hoặc hai cấp độ mà có thể chứa các danh sách phức tạp nằm sâu bên trong. Theo bạn, khi đối mặt với một phản hồi API chứa các mảng dữ liệu lồng nhau đan xen không đồng nhất, phương pháp nào trong thư viện pandas là tối ưu nhất để làm phẳng toàn bộ cấu trúc này trước khi xuất sang tệp thống kê?


Bài viết khác
Trong bài phân tích trước, chúng ta đã làm quen với mô hình tuyến tính tổng quát thông qua một tập dữ liệu khá đặc biệt: số ca tử vong do ngựa đá trong quân đội Phổ. Tập dữ liệu này đếm số lượng tử vong của các quân đoàn qua từng năm. Vì đây là dữ liệu đếm, chúng ta đã điều chỉnh mô hình tuyến tính để sử dụng phân phối Poisson, đồng thời áp dụng hàm liên kết log. Tuy nhiên, có một khía cạnh mà chúng ta chưa xem xét: liệu tất cả các quân đoàn có tỷ lệ tử vong giống hệt nhau không? Khám phá dữ liệu theo từng nhóm Trước tiên, chúng ta cần thiết lập môi trường trong R.
Trong các phân tích dữ liệu không gian, việc theo dõi sự thay đổi qua thời gian và địa điểm là một kỹ năng quan trọng. Sau khi đã nắm vững cách tải dữ liệu từ kho lưu trữ GitHub, vẽ đồ thị chuỗi thời gian và tạo bản đồ choropleth tĩnh, bước tiếp theo là đưa dữ liệu vào không gian chuyển động. Bài viết này sẽ hướng dẫn bạn cách tạo một bản đồ choropleth động để khám phá sự phân bố của dịch bệnh qua từng ngày. Cách tạo bản đồ cho từng ngày Để bắt đầu, chúng ta cần làm sạch và mô tả dữ liệu thô. Dữ liệu này chứa số lượng ca nhiễm tích lũy cho từng quận tại Mỹ bắt đầu từ cuối tháng 1 năm 2020. Các biến số lưu trữ dữ liệu theo ngày được đặt tên theo định dạng từ v12 đến v86. Quá trình chuẩn bị dữ liệu đòi hỏi chúng ta phải hợp nhất dữ liệu địa lý, dữ liệu ca bệnh và dữ liệu dân số. Chúng ta sử dụng dấu hoa thị như một wildcard trong lệnh gọi biến để giữ lại toàn bộ các cột ngày tháng.
SciEco
Science for Economics
Định hướng đào tạo phân tích dữ liệu, xây dựng chính sách, tối ưu hoá danh mục tài chính cá nhân và dự báo thị trường.
Liên hệ
Địa chỉ: Số 60, ngõ 41, Phố Thái Hà, Trung Liệt, Đống Đa, Hà Nội (Google Map)
Email: science.for.economics@gmail.com
Hotline: 03.57.94.7680 (Mrs. Hà)
Mạng xã hội