FBProphet 时间范围异常 - 在开头添加年份
FBProphet time range weirdness - adding years at the beginning
我一直在玩先知。我是 Python 的新手。不管怎样,出于某种原因,当我绘制我的预测时,它把 1970 年的 30 行日期放在开头。我的约会要到 2016 年才开始。我肯定在某个地方搞砸了。
我真的只想从 2016 年到 2021 年。它不应该从数据框中的最早日期开始吗?
%matplotlib inline
import pandas as pd
from fbprophet import Prophet
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
df = pd.read_csv('sp18.csv',parse_dates=True, skip_blank_lines=True)
(df['ar_balance'].replace( '[$,)]','', regex=True )
.replace( '[(]','-', regex=True ).astype(float))
df.fillna(value=0, method=None, axis=None, inplace=True, limit=None, downcast=None)
df.drop(['day_week', 'ar_balance', 'on_campus', 'online', 'day_num', 'total_cred', 'admissions_event', 'term'], axis = 1, inplace = True)
df.head(5)
Output:
date fte
0 11/7/2017 0.0
1 11/8/2017 0.0
2 11/9/2017 0.0
3 11/10/2017 0.0
4 11/11/2017 0.0
df['date'] = pd.DatetimeIndex(df['date'])
df.dtypes
Output:
date datetime64[ns]
fte float64
dtype: object
df = df.rename(columns={'date': 'ds',
'fte': 'y'})
ax = df.set_index('ds').plot(figsize=(12, 12))
ax.set_ylabel('FTE')
ax.set_xlabel('Date')
plt.show()
my_model = Prophet(interval_width=0.95)
my_model.fit(df)
future_dates = my_model.make_future_dataframe(periods=36)
forecast = my_model.predict(future_dates)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head()
Output:
ds yhat yhat_lower yhat_upper
0 1970-01-01 48.455828 -1690.768761 1747.227251
1 1970-01-01 48.455828 -1768.346730 1739.514319
2 1970-01-01 48.455828 -1696.532596 1698.719255
3 1970-01-01 48.455828 -1770.763440 1722.128055
4 1970-01-01 48.455828 -1621.479143 1664.295881
my_model.plot(forecast,
uncertainty=True)
my_model.plot_components(forecast)
forecast.to_csv('PredictOutput.csv')
这是我编造的情节。我错过了一些明显的东西吗?感谢您的帮助!
jacked up plot
我怀疑虚假日期来自df['date']
中的NaN,fillna(value=0)
行用0填充,pd.DatetimeIndex
中0默认为1970-01-01 (或者更灵活的pd.to_datetime(df['date'])
)。
要解决此问题,您需要检查 date
为空的那些行:df[df['date'].isnull()]
。如果这些行包含有效数据但缺少日期,则可能值得插入它们的日期值。但是,如果每一行带有空日期的行都是空的,你可以用 df.dropna(inplace=True)
.
删除它们
我一直在玩先知。我是 Python 的新手。不管怎样,出于某种原因,当我绘制我的预测时,它把 1970 年的 30 行日期放在开头。我的约会要到 2016 年才开始。我肯定在某个地方搞砸了。 我真的只想从 2016 年到 2021 年。它不应该从数据框中的最早日期开始吗?
%matplotlib inline
import pandas as pd
from fbprophet import Prophet
import matplotlib.pyplot as plt
plt.style.use('fivethirtyeight')
df = pd.read_csv('sp18.csv',parse_dates=True, skip_blank_lines=True)
(df['ar_balance'].replace( '[$,)]','', regex=True )
.replace( '[(]','-', regex=True ).astype(float))
df.fillna(value=0, method=None, axis=None, inplace=True, limit=None, downcast=None)
df.drop(['day_week', 'ar_balance', 'on_campus', 'online', 'day_num', 'total_cred', 'admissions_event', 'term'], axis = 1, inplace = True)
df.head(5)
Output:
date fte
0 11/7/2017 0.0
1 11/8/2017 0.0
2 11/9/2017 0.0
3 11/10/2017 0.0
4 11/11/2017 0.0
df['date'] = pd.DatetimeIndex(df['date'])
df.dtypes
Output:
date datetime64[ns]
fte float64
dtype: object
df = df.rename(columns={'date': 'ds',
'fte': 'y'})
ax = df.set_index('ds').plot(figsize=(12, 12))
ax.set_ylabel('FTE')
ax.set_xlabel('Date')
plt.show()
my_model = Prophet(interval_width=0.95)
my_model.fit(df)
future_dates = my_model.make_future_dataframe(periods=36)
forecast = my_model.predict(future_dates)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head()
Output:
ds yhat yhat_lower yhat_upper
0 1970-01-01 48.455828 -1690.768761 1747.227251
1 1970-01-01 48.455828 -1768.346730 1739.514319
2 1970-01-01 48.455828 -1696.532596 1698.719255
3 1970-01-01 48.455828 -1770.763440 1722.128055
4 1970-01-01 48.455828 -1621.479143 1664.295881
my_model.plot(forecast,
uncertainty=True)
my_model.plot_components(forecast)
forecast.to_csv('PredictOutput.csv')
这是我编造的情节。我错过了一些明显的东西吗?感谢您的帮助!
jacked up plot
我怀疑虚假日期来自df['date']
中的NaN,fillna(value=0)
行用0填充,pd.DatetimeIndex
中0默认为1970-01-01 (或者更灵活的pd.to_datetime(df['date'])
)。
要解决此问题,您需要检查 date
为空的那些行:df[df['date'].isnull()]
。如果这些行包含有效数据但缺少日期,则可能值得插入它们的日期值。但是,如果每一行带有空日期的行都是空的,你可以用 df.dropna(inplace=True)
.