Embedded R Попробуйте, кроме добавления цикла - PullRequest
0 голосов
/ 22 октября 2018

Я слежу за блогом ниже как новичок в Python / R, и у меня возникают проблемы с добавлением оператора цикла в приведенный ниже код.В настоящее время я могу выполнить код полностью, но выводит только сезонный флаг для 1 клиента.Я бы хотел, чтобы он работал и работал для всех моих клиентов.

datamovesme.com / 2018/07/01 / seasonality-python-code

##Here comes the R code piece     
     try:
          seasonal = r(''' 
          fit<-tbats(customerTS, seasonal.periods = 12, use.parallel = TRUE)
          fit$seasonal
          ''')
      except: seasonal = 1
      seasonal_output = seasonal_output.append({'customer_id':customerid, 'seasonal': seasonal}, ignore_index=True)
      print(f' {customerid} | {seasonal} ')
print(seasonal_output)
seasonal_output.to_csv(outfile)

Я пробовал много комбинаций кода, чтобы запустить его,слишком много, чтобы перечислить здесь.Блог показывает существующие фреймы данных и объекты временных рядов, которые нам доступны.Я не уверен, какой из них использовать и как передать его в код R.

Спасибо!

1 Ответ

0 голосов
/ 22 октября 2018

Ссылка на блог содержит проблемы:

  1. Код неправильно выравнивает строки, как требование в синтаксисе Python.Возможно, это связано с отображением на веб-сайте пробелов или вкладок, но это плохо для читателей, поскольку отсутствует вывод изменений отступа.

  2. Код не учел проблему неэффективности добавления фреймов данных: Никогда не вызывайте DataFrame.append или pd.concat внутри цикла for.Это приводит к квадратичному копированию .Вместо этого, поскольку сезонное представляет собой одно значение, создайте список словарей, которые вы ввели в конструктор pd.DataFrame() вне цикла.

После устранения вышеуказанных проблем и запускаВесь блок кода, ваше решение должно выводить фрейм данных по всем показаниям .

# ... same above assignments ...
outfile = '[put your file path here].csv'
df_list = []

for customerid, dataForCustomer in filledIn.groupby(by=['customer_id']):
    startYear = dataForCustomer.head(1).iloc[0].yr
    startMonth = dataForCustomer.head(1).iloc[0].mnth
    endYear = dataForCustomer.tail(1).iloc[0].yr
    endMonth = dataForCustomer.tail(1).iloc[0].mnth

    #Creating a time series object
    customerTS = stats.ts(dataForCustomer.usage.astype(int),
                          start=base.c(startYear,startMonth),
                          end=base.c(endYear, endMonth), 
                          frequency=12)
    r.assign('customerTS', customerTS)

    ##Here comes the R code piece
    try:
        seasonal = r('''
                        fit<-tbats(customerTS, seasonal.periods = 12, use.parallel = TRUE)
                        fit$seasonal
                     ''')
    except: 
        seasonal = 1

    # APPEND DICTIONARY TO LIST (NOT DATA FRAME)
    df_list.append({'customer_id': customerid, 'seasonal': seasonal})
    print(f' {customerid} | {seasonal} ')

seasonal_output = pd.DataFrame(df_list)
print(seasonal_output)
seasonal_output.to_csv(outfile)
...