Khi tôi còn là sinh viên đại học, các khóa học về thống kê [Phân tích sống còn, Phân tích đa biến, v.v.] được dạy bằng R. Tuy nhiên, vì tôi muốn học Khoa học dữ liệu, tôi chọn Python vì nó có vẻ “ma quái” đối với tôi
Bằng cách chỉ làm việc với Python, tôi tình cờ phát hiện ra nhu cầu triển khai một số kỹ thuật Thống kê như Thử nghiệm Grubb cho các giá trị ngoại lai, Markov Chain Monte Carlo cho mô phỏng hoặc Mạng Bayesian cho dữ liệu tổng hợp. Do đó, bài viết này nhằm mục đích hướng dẫn giới thiệu để kết hợp R trong quy trình làm việc của bạn với tư cách là Nhà khoa học dữ liệu Python. Trong trường hợp, bạn muốn tích hợp Python vào quy trình làm việc của mình với tư cách là Nhà khoa học dữ liệu R, gói dạng lưới rất hữu ích, hãy xem [1]
rpy2Chúng tôi chọn khung rpy2, các tùy chọn khác là pyRserve hoặc pypeR, vì nó chạy R nhúng. Nói cách khác, nó cho phép giao tiếp giữa các đối tượng Python và R thông qua rpy2. cướp, sau này chúng ta sẽ xem một ví dụ cụ thể khi chuyển đổi DataFrame của pandas thành R DataFrame. Nếu bạn gặp khó khăn trong bất kỳ bước nào dưới đây, hãy đọc tài liệu chính thức hoặc tài liệu tham khảo
Chúng tôi sẽ đề cập đến ba bước thích hợp để bắt đầu làm việc với R trong Python. Cuối cùng, chúng tôi sẽ thực hiện một ví dụ thực tế và đề cập đến các chức năng khác mà gói rpy2 cho phép bạn xử lý
- Cài đặt các gói R
- Nhập các gói và chức năng từ R
- Chuyển đổi pandas DataFrame thành khung dữ liệu R và ngược lại
- Ví dụ thực tế [Chạy mạng Bayesian]
Nhưng trước tiên, chúng ta nên cài đặt gói rpy2
# Jupyter Notebook option
!pip install rpy2
# Terminal option
pip install rpy2
1. Cài đặt các gói R
Trong R, việc cài đặt các gói được thực hiện bằng cách tải xuống từ các máy nhân bản CRAN và sau đó cài đặt chúng cục bộ. Theo cách tương tự với các mô-đun Python, các gói có thể được cài đặt và sau đó được tải
# Choosing a CRAN Mirror
import rpy2.robjects.packages as rpackages
utils = rpackages.importr['utils']
utils.chooseCRANmirror[ind=1]# Installing required packages
from rpy2.robjects.vectors import StrVector
packages = ['bnlearn',...,'other desired packages']
utils.install_packages[StrVector[packages]]
Bằng cách chọn ind = 1
trong chosseCRANmirror
, chúng tôi đảm bảo chuyển hướng tự động đến máy chủ gần vị trí của chúng tôi nhất. Bây giờ, chúng ta sẽ thực hiện bước hai
2. Nhập các gói và chức năng
Ở đây, chúng ta sẽ nhập các thư viện và chức năng cần thiết để thực hiện Mạng Bayesian trong ví dụ thực tế
# Import packages
from rpy2.robjects.packages import importr
base, bnlearn = importr['base'], importr['bnlearn']# Import Functions
bn_fit, rbn = bnlearn.bn_fit, bnlearn.rbn
hpc, rsmax2, tabu = bnlearn.hpc, bnlearn.rsmax2, bnlearn.tabu
Để nhập bất kỳ chức năng nào, thật tiện lợi khi xem khóa 'rpy2' trong từ điển của mọi gói, ví dụ: để xem các chức năng có sẵn để nhập trên bnlearn, chúng tôi chạy
bnlearn.__dict__['_rpy2r']Output:
...
...
'bn_boot': 'bn.boot',
'bn_cv': 'bn.cv',
'bn_cv_algorithm': 'bn.cv.algorithm',
'bn_cv_structure': 'bn.cv.structure',
'bn_fit': 'bn.fit',
'bn_fit_backend': 'bn.fit.backend',
'bn_fit_backend_continuous': 'bn.fit.backend.continuous',
...
...
Để biết thêm thông tin về cách nhập chức năng, hãy kiểm tra [4] hoặc [5]
3. Chuyển đổi pandas DataFrame thành khung dữ liệu R và ngược lại
Cá nhân tôi nghĩ chức năng này cho phép bạn kết hợp khả năng mở rộng [trăn] với các công cụ thống kê [R]. Như một ví dụ cá nhân, trong khi tôi đang sử dụng thư viện python Đa xử lý để thực hiện tính toán song song, tôi cũng muốn thử hàm auto.arima[]
từ thư viện dự báo R, bên cạnh các hàm của gói Python statsmodels, để dự báo. Vì vậy,
# Choosing a CRAN Mirror0 là thứ cho phép một người hợp nhất những gì tốt nhất trong hai ngôn ngữ lập trình
import rpy2.robjects.packages as rpackages
utils = rpackages.importr['utils']
utils.chooseCRANmirror[ind=1]# Installing required packages
from rpy2.robjects.vectors import StrVector
packages = ['bnlearn',...,'other desired packages']
utils.install_packages[StrVector[packages]]
# Allow conversion
import rpy2.robjects as ro
from rpy2.objects import pandas2ri
pandas2ri.activate[]# Convert to R dataframe
r_dt = ro.conversion.py2rpy[dt] # dt is a pd.DataFrame object# Convert back to pandas DataFrame
pd_dt = ro.conversion.rpy2py[r_dt]
Khi kích hoạt chuyển đổi pandas [
# Choosing a CRAN Mirror1], nhiều chuyển đổi từ R sang pandas sẽ được thực hiện tự động. Tuy nhiên, để chuyển đổi rõ ràng, chúng tôi gọi các hàm
import rpy2.robjects.packages as rpackages
utils = rpackages.importr['utils']
utils.chooseCRANmirror[ind=1]# Installing required packages
from rpy2.robjects.vectors import StrVector
packages = ['bnlearn',...,'other desired packages']
utils.install_packages[StrVector[packages]]
# Choosing a CRAN Mirror2 hoặc
import rpy2.robjects.packages as rpackages
utils = rpackages.importr['utils']
utils.chooseCRANmirror[ind=1]# Installing required packages
from rpy2.robjects.vectors import StrVector
packages = ['bnlearn',...,'other desired packages']
utils.install_packages[StrVector[packages]]
# Choosing a CRAN Mirror3
import rpy2.robjects.packages as rpackages
utils = rpackages.importr['utils']
utils.chooseCRANmirror[ind=1]# Installing required packages
from rpy2.robjects.vectors import StrVector
packages = ['bnlearn',...,'other desired packages']
utils.install_packages[StrVector[packages]]
4. Ví dụ thực tế với Mạng Bayesian
Bên cạnh các phương pháp Monte-Carlo, Bayesian Networks là một tùy chọn để mô phỏng dữ liệu. Tuy nhiên, vì ngày nay không có thư viện nào cho tác vụ này trong Python. Vì vậy, tôi chọn gói bnlearn, cho phép tìm hiểu cấu trúc đồ họa của mạng Bayesian và thực hiện suy luận từ chúng
Trong ví dụ bên dưới, chúng tôi đang sử dụng thuật toán kết hợp [
# Choosing a CRAN Mirror4] để tìm hiểu cấu trúc của mạng vì nó cho phép chúng tôi sử dụng bất kỳ sự kết hợp nào giữa các thuật toán dựa trên ràng buộc và dựa trên điểm số. Tuy nhiên, tùy thuộc vào bản chất của vấn đề mà bạn nên chọn heuristic phù hợp, để biết danh sách đầy đủ các thuật toán có sẵn, xem [7]. Sau khi mạng được học, chúng tôi mô phỏng n mẫu ngẫu nhiên từ mạng bayesian bằng hàm
import rpy2.robjects.packages as rpackages
utils = rpackages.importr['utils']
utils.chooseCRANmirror[ind=1]# Installing required packages
from rpy2.robjects.vectors import StrVector
packages = ['bnlearn',...,'other desired packages']
utils.install_packages[StrVector[packages]]
# Choosing a CRAN Mirror5. Cuối cùng, chúng tôi thực hiện cấu trúc thử ngoại trừ để xử lý một loại lỗi cụ thể
import rpy2.robjects.packages as rpackages
utils = rpackages.importr['utils']
utils.chooseCRANmirror[ind=1]# Installing required packages
from rpy2.robjects.vectors import StrVector
packages = ['bnlearn',...,'other desired packages']
utils.install_packages[StrVector[packages]]
r_imputados = robjects.conversion.py2rpy[imputados]
try:
# Learn structure of Network
structure = rsmax2[data, restrict = 'hpc', maximize = 'tabu']
fitted = bn_fit[structure, data = data, method = "mle"]
# Generate n number of observations
r_sim = rbn[fitted, n = 10]
except rpy2.rinterface_lib.embedded.RRuntimeError:
print["Error while running R methods"]
RunTimeError xảy ra khi chúng ta không muốn chức năng bị lỗi hoặc làm điều gì đó không mong muốn. Trong trường hợp này, chúng tôi phát hiện lỗi này vì đó là một cách để thông báo cho người dùng khi có sự cố xảy ra rằng đó không phải là một loại lỗi khác [đối với các trường hợp ngoại lệ hoàn chỉnh, hãy xem [9]]. Như minh họa, mình bị lỗi không tìm thấy lai
# Choosing a CRAN Mirror6. máy tính. lọc trong khi chạy hàm
import rpy2.robjects.packages as rpackages
utils = rpackages.importr['utils']
utils.chooseCRANmirror[ind=1]# Installing required packages
from rpy2.robjects.vectors import StrVector
packages = ['bnlearn',...,'other desired packages']
utils.install_packages[StrVector[packages]]
# Choosing a CRAN Mirror4
import rpy2.robjects.packages as rpackages
utils = rpackages.importr['utils']
utils.chooseCRANmirror[ind=1]# Installing required packages
from rpy2.robjects.vectors import StrVector
packages = ['bnlearn',...,'other desired packages']
utils.install_packages[StrVector[packages]]
Các chức năng khác
Bạn có thể làm được nhiều điều hơn nữa với giao diện cấp thấp và giao diện cấp cao rpy2. Chẳng hạn, bạn có thể gọi các hàm python bằng R, hãy xem cách tìm giá trị nhỏ nhất của Hàm Colville bốn chiều thông qua Phương thức liên hợp-Gradient
from rpy2.robjects.vectors import FloatVector
from rpy2.robjects.packages import importr
import rpy2.rinterface as ri
stats = importr['stats']
# Colville f: R^4 ---> R
def Colville[x]:
x1, x2, x3, x4 = x[0], x[1], x[2], x[3]
return 100*[x1**2-x2]**2 + [x1-1]**2+[x3-1]**2 + 90*[x3**2-x4]**2 + 10.1*[[x2-1]**2 + [x4-1]**2] + 19.8*[x2-1]*[x4-1]
# Expose function to R
Colville = ri.rternalize[Colville]
# Initial point
init_point = FloatVector[[3, 3, 3, 3]]
# Optimization Function
res = stats.optim[init_point, Colville, method = c["CG"]]
Người giới thiệu
[1] Matt Brown. “Chạy mã Python từ R bằng cách sử dụng gói dạng lưới”. R-quán rượu. URL. https. //rstudio-pub-static. s3. amazonaws. com/407460_396f867ce3494d479fd700960879e22c. html
[2] Ajay Ohri. “Sử dụng Python và R cùng nhau. 3 cách tiếp cận chính”. KDnuggets. URL. https. //www. kdnuggets. com/2015/12/using-python-r-together. html
[3] Tài liệu chính thức của Rpy2. URL. https. //rpy2. github. io/doc/mới nhất/html/chỉ mục. html
[4]
[5] https. // stackoverflow. com/câu hỏi/49776568/calling-functions-from-within-r-packages-in-python-using-importr
[6] https. // stackoverflow. com/câu hỏi/47306899/how-do-i-catch-an-rpy2-rinterface-rruntimeerror-in-python
[7] Tài liệu chính thức của Bnlearn. http. //www. bnlearn. com/tài liệu/người/cấu trúc. học tập. html
[8] Daniel Oehm. “Ví dụ về mạng Bayesian với Gói bnlearn”. URL. http. // độ dốc giảm dần. com/bayesian-network-example-with-the-bnlearn-package/