Как прочитать файл (.RDS) с URL-адреса в python?

#python #r

#python #r

Вопрос:

Итак, я пытаюсь получить данные из NFLfastR, и мой эквивалентный код R:

 data <- readRDS(url('https://raw.githubusercontent.com/guga31bb/nflfastR-data/master/data/play_by_play_2019.rds'))
data
  

Я ранее также пробовал модуль pyreadr, но у меня это не сработало. В настоящее время я использую модуль rpy2, чтобы заставить его работать. Вот код, который я пытаюсь:

 import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri
import os
os.environ["R_HOME"] = r"C:Program FilesRR-3.6.3"
os.environ["PATH"]   = r"C:Program FilesRR-3.6.3binx64"   ";"   os.environ["PATH"]

pandas2ri.activate()

readRDS = robjects.r['readRDS']
df = readRDS(url('https://raw.githubusercontent.com/guga31bb/nflfastR-data/master/data/play_by_play_2019.rds'))
df = pandas2ri.ri2py(df)
  

Комментарии:

1. И в чем проблема с вашим кодом? Пожалуйста, опубликуйте ошибки или заниженные результаты. Также, пожалуйста, опубликуйте library строки, используемые в рабочем коде R. Необходимо знать происхождение url .

Ответ №1:

Файлы Rds и Rdata трудно читать на других языках, кроме R, поскольку формат, хотя и открытый, недокументирован. Поэтому существует не так много вариантов того, как читать их в python. Один из них — это то, что вы предлагаете. Другой вариант — использовать pyreadr, но сначала вы должны загрузить файл на диск, поскольку pyreadr не может читать напрямую с URL-адреса:

 import pyreadr
from urllib.request import urlopen
link="https://raw.githubusercontent.com/guga31bb/nflfastR-data/master/data/play_by_play_2019.rds"
response = urlopen(link)
content = response.read()
fhandle = open( 'play_by_play_2019.rds', 'wb')
fhandle.write(content)
fhandle.close()
result = pyreadr.read_r("play_by_play_2019.rds")
print(result.keys())
  

Редактировать

pyreadr 0.3.7 теперь включает функцию для загрузки файлов:

 import pyreadr

url = "https://github.com/hadley/nycflights13/blob/master/data/airlines.rda?raw=true"
dst_path = "/some/path/on/disk/airlines.rda"
res = pyreadr.read_r(pyreadr.download_file(url, dst_path), dst_path)
  

Ответ №2:

В R, в отличие от Python, вам не нужно указывать для каждой функции исходный код пакета, если вы не сталкиваетесь с конфликтами имен. Кроме того, в R нет встроенного метода. Каждая вызываемая вами функция находится в пакете. Но R поставляется с пакетами по умолчанию, такими как utils , base , stats для обычных методов.

В частности, ваш рабочий код R вызывает две функции из base package, как показано с псевдонимами с двойным двоеточием:

 nfl_url <- 'https://raw.githubusercontent.com/guga31bb/nflfastR-data/master/data/play_by_play_2019.rds'
data <- base::readRDS(base::url(NFL))

data
  

Следовательно, вам необходимо выполнить аналогичную процедуру в Python rpy2 , явно импортировав base пакет:

 from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri

base = importr("base")

nfl_url <- 'https://raw.githubusercontent.com/guga31bb/nflfastR-data/master/data/play_by_play_2019.rds'
r_df <- base.readRDS(base.url(nfl_url))

pandas2ri.activate()
py_df = pandas2ri.ri2py(r_df)
  

Ответ №3:

Ну, если вы просто хотите прочитать данные nflFastR, вы можете напрямую прочитать их в python следующим образом:

 import pandas as pd
pd.read_csv('https://github.com/guga31bb/nflfastR-data/blob/master/data/' 
                         'play_by_play_2019.csv.gz?raw=True',
                         compression='gzip', low_memory=False)
  

Но на данный момент нет способа сделать это с помощью python. Достаточно сложно прочитать локальный файл (.rds) при чтении с URL-адреса — это то, что я никогда не видел реализованным. Итак, вам нужно загрузить файл локально, затем вы можете прочитать его напрямую, используя пакет pyreadr или rpy2 (если у вас установлен R), как вы упомянули.

Комментарии:

1. Это помогло. Но все же мне интересно, как читать файл (.Rds) с URL-адреса в целом.

2. @RetroInvader, смотрите Мой ответ ниже, как прочитать .rds из URL с rpy2 помощью .