尝试使用 ExponentialSmoothing 进行预测时出现 KeyError
a KeyError when trying to forecast using ExponentialSmoothing
我正在尝试根据人口预测有关我所在城市的一些数据。我有一个 table 显示我的城市从 1950 年到 2021 年的人口。使用 pandas 和 ExpotentialSmoothing,我试图预测并查看未来 10 年我的城市将有多少人口。我被困在这里:
train_data = df.iloc[:60]
test_data = df.iloc[59:]
fitted = ExponentialSmoothing(train_data["Population"],
trend = "add",
seasonal = "add",
seasonal_periods=12).fit()
fitted.forecast(10)
但是,我收到这条消息:
'The start
argument could not be matched to a location related to the index of the data.'
更新:这是我工作中的一些代码:
Jeddah_tb = pd.read_html("https://www.macrotrends.net/cities/22421/jiddah/population", match ="Jiddah - Historical Population Data", parse_dates=True)
df['Year'] = pd.to_datetime(df['Year'], format="%Y")
df.set_index("Year", inplace=True)
这是索引:
DatetimeIndex(['2021-01-01', '2020-01-01', '2019-01-01', '2018-01-01',
'2017-01-01', '2016-01-01', '2015-01-01', '2014-01-01',
'2013-01-01', '2012-01-01', '2011-01-01', '2010-01-01',
'2009-01-01', '2008-01-01', '2007-01-01', '2006-01-01',
'2005-01-01', '2004-01-01', '2003-01-01', '2002-01-01',
'2001-01-01', '2000-01-01', '1999-01-01', '1998-01-01',
'1997-01-01', '1996-01-01', '1995-01-01', '1994-01-01',
'1993-01-01', '1992-01-01', '1991-01-01', '1990-01-01',
'1989-01-01', '1988-01-01', '1987-01-01', '1986-01-01',
'1985-01-01', '1984-01-01', '1983-01-01', '1982-01-01',
'1981-01-01', '1980-01-01', '1979-01-01', '1978-01-01',
'1977-01-01', '1976-01-01', '1975-01-01', '1974-01-01',
'1973-01-01', '1972-01-01', '1971-01-01', '1970-01-01',
'1969-01-01', '1968-01-01', '1967-01-01', '1966-01-01',
'1965-01-01', '1964-01-01', '1963-01-01', '1962-01-01',
'1961-01-01', '1960-01-01', '1959-01-01', '1958-01-01',
'1957-01-01', '1956-01-01', '1955-01-01', '1954-01-01',
'1953-01-01', '1952-01-01', '1951-01-01', '1950-01-01'],
dtype='datetime64[ns]', name='Year', freq='-1AS-JAN')
我在尝试重现您的代码时没有遇到任何问题。但是,在进行时间序列预测之前,请确保您的数据按日期升序排列。 df = df.sort_values(by='Year',ascending = True)
。在您的例子中,train_data
来自 2021 to 1962
,test_data
来自 1962-1950
。所以你正在训练最近的数据,但在过去测试它。因此,请按升序对您的数据框进行排序。还要制作 test_data = df.iloc[60:]
因为 1962
存在于 train_data
和 test_data
.
中
我正在尝试根据人口预测有关我所在城市的一些数据。我有一个 table 显示我的城市从 1950 年到 2021 年的人口。使用 pandas 和 ExpotentialSmoothing,我试图预测并查看未来 10 年我的城市将有多少人口。我被困在这里:
train_data = df.iloc[:60]
test_data = df.iloc[59:]
fitted = ExponentialSmoothing(train_data["Population"],
trend = "add",
seasonal = "add",
seasonal_periods=12).fit()
fitted.forecast(10)
但是,我收到这条消息:
'The start
argument could not be matched to a location related to the index of the data.'
更新:这是我工作中的一些代码:
Jeddah_tb = pd.read_html("https://www.macrotrends.net/cities/22421/jiddah/population", match ="Jiddah - Historical Population Data", parse_dates=True)
df['Year'] = pd.to_datetime(df['Year'], format="%Y")
df.set_index("Year", inplace=True)
这是索引:
DatetimeIndex(['2021-01-01', '2020-01-01', '2019-01-01', '2018-01-01',
'2017-01-01', '2016-01-01', '2015-01-01', '2014-01-01',
'2013-01-01', '2012-01-01', '2011-01-01', '2010-01-01',
'2009-01-01', '2008-01-01', '2007-01-01', '2006-01-01',
'2005-01-01', '2004-01-01', '2003-01-01', '2002-01-01',
'2001-01-01', '2000-01-01', '1999-01-01', '1998-01-01',
'1997-01-01', '1996-01-01', '1995-01-01', '1994-01-01',
'1993-01-01', '1992-01-01', '1991-01-01', '1990-01-01',
'1989-01-01', '1988-01-01', '1987-01-01', '1986-01-01',
'1985-01-01', '1984-01-01', '1983-01-01', '1982-01-01',
'1981-01-01', '1980-01-01', '1979-01-01', '1978-01-01',
'1977-01-01', '1976-01-01', '1975-01-01', '1974-01-01',
'1973-01-01', '1972-01-01', '1971-01-01', '1970-01-01',
'1969-01-01', '1968-01-01', '1967-01-01', '1966-01-01',
'1965-01-01', '1964-01-01', '1963-01-01', '1962-01-01',
'1961-01-01', '1960-01-01', '1959-01-01', '1958-01-01',
'1957-01-01', '1956-01-01', '1955-01-01', '1954-01-01',
'1953-01-01', '1952-01-01', '1951-01-01', '1950-01-01'],
dtype='datetime64[ns]', name='Year', freq='-1AS-JAN')
我在尝试重现您的代码时没有遇到任何问题。但是,在进行时间序列预测之前,请确保您的数据按日期升序排列。 df = df.sort_values(by='Year',ascending = True)
。在您的例子中,train_data
来自 2021 to 1962
,test_data
来自 1962-1950
。所以你正在训练最近的数据,但在过去测试它。因此,请按升序对您的数据框进行排序。还要制作 test_data = df.iloc[60:]
因为 1962
存在于 train_data
和 test_data
.