2024-10-03 23:20:10 发布
网友
我一直在试图找到一种方法来迭代多个时间序列(对于一个键是“customer”)并为每个时间序列返回一个简单的是/否,即它是否有可靠的季节性成分
我知道R中有一个相对较新的库(seastests)——Python中有什么东西可以不用绘制每个时间序列就可以使用吗
我知道这很古老,但我刚刚遇到了一个类似的问题
我建议使用SARIMAX模型对每个客户的数据序列进行季节性分解,然后计算并使用季节性参数p、d、q(p:季节性自回归顺序-d:季节性差异顺序-q:季节性移动平均顺序)来确定序列是否是季节性的。如果这些参数为=0,对于最小AIC,我们可以假设该系列不是季节性的(y_ds是系列数据值):
#customize data as per problem needs - in my case I have ds as date, customer_id and y as series values data = pd.DataFrame({'ds': pd.to_datetime(data.ds), 'customer_id' : data['customer_id'], 'y' : data['y']}) data.set_index('ds', inplace=True) customers = data['customer_id'].unique() for i in range(len(customers)): datai = data.loc[data['customer_id'] == customers[i]] datai['log_y'] = np.log(datai['y']) y_ds = datai['log_y'].resample('MS').mean() y_ds = y_ds.fillna(0) p = d = q = range(0, 2) pdq = list(itertools.product(p, d, q)) seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))] cols = ['param','seasonal_param','AIC'] lst = pd.DataFrame(columns=cols) for param in pdq: for param_seasonal in seasonal_pdq: try: mod = sm.tsa.statespace.SARIMAX(y_ds, order=param, seasonal_order=param_seasonal, enforce_stationarity=False, enforce_invertibility=False) results = mod.fit() lst = lst.append({'param':param, 'seasonal_param':param_seasonal, 'AIC':results.aic},ignore_index=True) except: continue order_param = lst.param[lst.AIC == lst.AIC.min()] order_param = order_param.values[0] seasonal_order_param = lst.seasonal_param[lst.AIC == lst.AIC.min()] seasonal_order_param = seasonal_order_param.values[0] if seasonal_order_param == (0,0,0,12): pattern = 'NON SEASONAL' else: pattern = 'SEASONAL' df = pd.DataFrame({'Trend': pattern,'customer_id': customers[i]}) df_final = pd.concat([df_final, df])
我知道这很古老,但我刚刚遇到了一个类似的问题
我建议使用SARIMAX模型对每个客户的数据序列进行季节性分解,然后计算并使用季节性参数p、d、q(p:季节性自回归顺序-d:季节性差异顺序-q:季节性移动平均顺序)来确定序列是否是季节性的。如果这些参数为=0,对于最小AIC,我们可以假设该系列不是季节性的(y_ds是系列数据值):
相关问题 更多 >
编程相关推荐