2
votes

Comment lire un fichier (.RDS) à partir d'une URL en python?

J'essaie donc d'obtenir des données de NFLfastR et mon code équivalent R est:

import rpy2.robjects as robjects
from rpy2.robjects import pandas2ri
import os
os.environ["R_HOME"] = r"C:\Program Files\R\R-3.6.3"
os.environ["PATH"]   = r"C:\Program Files\R\R-3.6.3\bin\x64" + ";" + 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)

J'ai déjà essayé le module pyreadr mais cela n'a pas fonctionné pour moi. Actuellement, j'utilise le module rpy2 pour le faire fonctionner. Voici le code que j'essaye:

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


1 commentaires

Et quel est le problème avec votre code? Veuillez publier des erreurs ou des résultats sous-estimés. Veuillez également publier les lignes de library utilisées dans le code R. Besoin de connaître les origines de l' url .


3 Réponses :


0
votes

Les fichiers Rds et Rdata sont difficiles à lire dans d'autres langues que R car le format bien qu'ouvert n'est pas documenté. Par conséquent, il n'y a pas beaucoup d'options sur la façon de les lire en python. L'un est ce que vous proposez. Une autre consiste à utiliser pyreadr, mais vous devez d'abord télécharger le fichier sur le disque car pyreadr ne peut pas lire directement à partir d'une URL:

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)

ÉDITER

pyreadr 0.3.7 inclut désormais une fonction de téléchargement de fichiers:

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())


0 commentaires

0
votes

Eh bien, si vous voulez simplement lire les données nflFastR, vous pouvez les lire directement en python comme suit:

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)

Mais pour le moment, il n'existe aucun moyen de le faire via python. C'est déjà assez difficile de lire un fichier sur site (.rds) tout en lisant à partir d'une URL est quelque chose que je n'ai jamais vu implémenté. Vous devez donc télécharger le fichier sur site, puis vous pouvez l'avoir lu directement en utilisant le package pyreadr ou rpy2 (si vous avez installé R) comme vous l'avez mentionné.


2 commentaires

Cela a aidé. Mais je suis toujours curieux de savoir comment lire un fichier (.Rds) à partir d'une URL en général.


@RetroInvader, voir ma réponse ci-dessous comment lire un .rds à partir d'une URL avec rpy2 .



0
votes

Dans R, contrairement à Python, vous n'avez pas à qualifier chaque fonction avec sa source de package, sauf si vous êtes confronté à des conflits de nom. De plus, dans R, il n'y a pas de méthode intégrée. Chaque fonction que vous appelez réside dans un package. Mais R est livré avec des packages par défaut tels que utils , base , stats pour les méthodes de routine.

Plus précisément, votre code R de travail appelle deux fonctions à partir du package de base , comme indiqué avec des alias double-virgule:

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)

Par conséquent, vous devez exécuter la procédure analogue dans rpy2 de Python en rpy2 explicitement base package de base :

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

data


0 commentaires