我有以下数据集:
;with xmlnamespaces (N'http://schemas.xmlsoap.org/soap/envelope/' as ns0)
select @x.value('(/ns0:envelope/ns0:body/ns0:bogus)[1]', 'nvarchar(max)')
我需要的是将值1和值2外推30天。
我遇到了Extrapolate Pandas DataFrame。如果date列中没有重复的条目,它将很漂亮。
我考虑使用这种东西,但是我不明白如何在函数中添加v:
data = {
'date': ['1/1/2019', '1/2/2019', '1/3/2019', '1/4/2019', '1/1/2019', '1/2/2019', '1/3/2019', '1/4/2019'],
'account_id': [1, 1, 1, 1, 2, 2, 2, 2],
'value_1': [1, 2, 3, 4, 5, 6, 7, 8],
'value_2': [1, 3, 6, 9, 10, 12, 14, 16]
}
df = pd.DataFrame(data,index = data['date']).drop('date', 1)
df
答案 0 :(得分:0)
您可以按以下方式修改链接的答案:
def extrapolate(df):
new_max = df.index.max() + pd.to_timedelta('30D')
dates = pd.date_range(df.index.min(), new_max, freq='D')
ret_df = df.reindex(dates)
x = np.arange(len(df))
# new x values
new_x = pd.Series(np.arange(len(ret_df)), index=dates)
for col in df.columns:
fit = np.polyfit(x, df[col], 1)
# tranform and fill
ret_df[col].fillna(fit[0]*new_x + fit[1], inplace=True)
return ret_df
然后应用:
ext_cols = ['value_1', 'value_2']
df.groupby('account_id')[ext_cols].apply(extrapolate)
您还可以为每列指定多项式阶数:
poly_orders = [1,2]
ext_cols = ['value_1', 'value_2']
def extrapolate(df):
new_max = df.index.max() + pd.to_timedelta('30D')
dates = pd.date_range(df.index.min(), new_max, freq='D')
ret_df = df.reindex(dates)
x = np.arange(len(df))
# new x values
new_x = pd.Series(np.arange(len(ret_df)), index=dates)
for col, o in zip(ext_cols, poly_orders):
fit = np.polyfit(x, df[col], o)
print(fit)
# tranform and fill
new_vals = pd.Series(0, index=dates)
for i in range(1,o+1):
new_vals = new_x**i * fit[o-i]
ret_df[col].fillna(new_vals, inplace=True)
return ret_df
并使用sklearn.linear_model.LinearRegression
代替numpy.polyfit
来更好地控制输入/输出。