#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
помощью .