title: R tbats Model Seasonal Customer Flag No Results
body: <p>I am following this blog to identify seasonal customers in my time series data: 
  <a href="https://www.kristenkehrer.com/seasonality-code" rel="nofollow noreferrer">https://www.kristenkehrer.com/seasonality-code</a></p>
  
  <p>My code is shamelessly nearly identical to the blog, with some small tweaks, code is below. I am able to run the code entirely, for 2000 customers. A few hours later, 0 customers were flagged as seasonal in my results.</p>
  
  <p>Manually looking at customers data over time, I do believe I have many examples of seasonal customers that should have been picked up. Below is a sample of the data I am using.</p>
  
  <p>Am I missing something stupid? am I in way over my head to even try this, being very new to python?</p>
  
  <p>Note that I am adding the "0 months" in my data source, but I don't think it would hurt anything for that function to check again. I'm also not including the data source credentials step. </p>
  
  <p>Thank you </p>
  
  <p><a href="https://i.stack.imgur.com/3IVGj.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/3IVGj.png" alt="Sample Data"></a></p>
  
  <pre><code>import pandas as pa
  import numpy as np
  import pyodbc as py
  
  cnxn = py.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password)
  
  original = pa.read_sql_query('SELECT s.customer_id, s.yr, s.mnth, Case when s.usage&lt;0 then 0 else s.usage end as usage  FROM dbo.Seasonal  s   Join   ( Select Top 2000  customer_id, SUM(usage) as usage   From dbo.Seasonal where Yr!=2018    Group by customer_id ) t ON s.customer_id = t.customer_id Where yr!= 2018 Order by customer_id, yr, mnth', cnxn)
  
  grouped = original.groupby(by='customer_id')
  
  def yearmonth_to_justmonth(year, month):
  
      return year * 12 + month - 1
  
  def fillInForOwner(group):
      min = group.head(1).iloc[0]
      max = group.tail(1).iloc[0]
      minMonths = yearmonth_to_justmonth(min.yr, min.mnth)
      maxMonths = yearmonth_to_justmonth(max.yr, max.mnth)
      filled_index = pa.Index(np.arange(minMonths, maxMonths, 1), name="filled_months")
      group['months'] = group.yr * 12 + group.mnth - 1
      group = group.set_index('months')
      group = group.reindex(filled_index)
      group.customer_id = min.customer_id
      group.yr = group.index // 12
      group.mnth = group.index % 12 + 1
      group.usage = np.where(group.usage.isnull(), 0, group.usage).astype(int)
      return group
  
  filledIn = grouped.apply(fillInForOwner)
  newIndex = pa.Index(np.arange(filledIn.customer_id.count()))
  
  import rpy2 as r
  from rpy2.robjects.packages import importr
  from rpy2.robjects import r, pandas2ri, globalenv
  pandas2ri.activate()
  
  base = importr('base')
  colorspace = importr('colorspace')
  forecast = importr('forecast')
  times = importr('timeSeries')
  stats = importr('stats')
  
  outfile = 'results.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
  
  
      customerTS = stats.ts(dataForCustomer.usage.astype(int),
                        start=base.c(startYear,startMonth),
                        end=base.c(endYear, endMonth), 
                        frequency=12)
      r.assign('customerTS', customerTS)
  
      try:
          seasonal = r('''
                          fit&lt;-tbats(customerTS, seasonal.periods = 12, 
                          use.parallel = TRUE)
                          fit$seasonal
                       ''')
      except: 
          seasonal = 1
      df_list.append({'customer_id': customerid, 'seasonal': seasonal})
      print(f' {customerid} | {seasonal} ')
  
  seasonal_output = pa.DataFrame(df_list)
  print(seasonal_output)
  seasonal_output.to_csv(outfile)
  </code></pre>