3

I want to use R package "seasonal" in Python. I am trying to use rpy2 Python package to do so. My code are as below, but I get an error.

I am guessing I need to convert my input data "s" into an acceptable form for "seasonal". How do I do so?

Thank you

#Import necessary packages
import rpy2.robjects as robjects
from rpy2.robjects.packages import importr
import pandas as pd
from pandas import Timestamp


s = pd.Series(
    {Timestamp('2013-03-01 00:00:00'): 838.2,
 Timestamp('2013-04-01 00:00:00'): 865.17,
 Timestamp('2013-05-01 00:00:00'): 763.0,
 Timestamp('2013-06-01 00:00:00'): 802.99,
 Timestamp('2013-07-01 00:00:00'): 875.56,
 Timestamp('2013-08-01 00:00:00'): 754.4,
 Timestamp('2013-09-01 00:00:00'): 617.48,
 Timestamp('2013-10-01 00:00:00'): 994.75,
 Timestamp('2013-11-01 00:00:00'): 860.86,
 Timestamp('2013-12-01 00:00:00'): 786.66})
     
sea_package=importr('seasonal')

m=sea_package.seas(s)

But I get error:


raise embedded.RRuntimeError(_rinterface._geterrmessage())

RRuntimeError: Error in x13_prepare(list = list, na.action = na.action, iofile = iofile) : 
  'x' argument is not a time series
raise embedded.RRuntimeError(_rinterface._geterrmessage())

RRuntimeError: Error in x13_prepare(list = list, na.action = na.action, iofile = iofile) : 
  'x' argument is not a time series
123456
  • 393
  • 3
  • 12

1 Answers1

0

We need to re-create the dataset as a ts object to be passed into "seasonal" package.

Also, the R version must be at least 4.2.2.

import os 

os.environ['R_Home']=r'C:\Program Files\R\R-4.2.2'

import rpy2.robjects as robjects
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri
from rpy2.robjects.conversion import localconverter
import pandas as pd

ts_r=robjects.r("ts")
is_ts=robjects.r("is.ts")

ls= [1, 2,  3, 4, 5, 6, 7 ,8, 9, 10] 
table1=pd.DataFrame({'values': ls})

with localconverter(robjects.default_converter + pandas2ri.converter):
    r_dt1=robjects.conversion.py2rpy(table1)
   
data=ts_r(r_dt1, start=2001.1, frequency=4)
print(data)
print(is_ts(data)) # Is True
sea_package=importr('seasonal')
m=sea_package.seas(x=data) # Works as x is ts


123456
  • 393
  • 3
  • 12