1

我一直在玩先知。我对 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')

这是我的自大情节。我错过了一些明显的东西吗?感谢您的帮助!

顶起的情节

4

1 回答 1

0

我怀疑虚假日期来自 NaNs in df['date'],由fillna(value=0)行填充 0 ,并且 0 默认为 1970-01-01 in pd.DatetimeIndex(或更灵活的pd.to_datetime(df['date']))。

要解决此问题,您需要检查那些date为 null:的行df[df['date'].isnull()]。如果这些行包含有效数据但缺少日期,则可能值得插入它们的日期值。但是,如果日期为空的每一行都完全为空,则可以使用df.dropna(inplace=True).

于 2018-03-27T00:45:46.410 回答