时间序列分析 - 不均匀间隔的测量 - 熊猫+ statsmodels

时间:2015-12-28 13:51:15

标签: python pandas machine-learning time-series statsmodels

我有两个numpy数组light_points和time_points,并希望对这些数据使用一些时间序列分析方法。

然后我尝试了这个:

import statsmodels.api as sm
import pandas as pd
tdf = pd.DataFrame({'time':time_points[:]})
rdf =  pd.DataFrame({'light':light_points[:]})
rdf.index = pd.DatetimeIndex(freq='w',start=0,periods=len(rdf.light))
#rdf.index = pd.DatetimeIndex(tdf['time'])

这可行,但没有做正确的事情。 实际上,测量时间间隔不均匀,如果我只是将time_points pandas DataFrame声明为我的帧的索引,我会收到一个错误:

rdf.index = pd.DatetimeIndex(tdf['time'])

decomp = sm.tsa.seasonal_decompose(rdf)

elif freq is None:
raise ValueError("You must specify a freq or x must be a pandas object with a timeseries index")

ValueError: You must specify a freq or x must be a pandas object with a timeseries index

我不知道如何纠正这个问题。 此外,似乎熊猫' {/ 1}}已被弃用。

我试过了:

TimeSeries

但它给我一个长度不匹配:

rdf = pd.Series({'light':light_points[:]})
rdf.index = pd.DatetimeIndex(tdf['time'])

尽管如此,我并不了解它的来源,如rdf [' light']和 tdf [' time']长度相同...

最后,我尝试将我的rdf定义为熊猫系列:

ValueError: Length mismatch: Expected axis has 1 elements, new values have 122 elements

我明白了:

rdf = pd.Series(light_points[:],index=pd.DatetimeIndex(time_points[:]))

然后,我尝试用

替换索引
ValueError: You must specify a freq or x must be a pandas object with a timeseries index

它给了我在seasonal_decompose方法行上的错误:

 pd.TimeSeries(time_points[:])

如何使用不均匀间隔的数据? 我正在考虑通过在现有值之间添加许多未知值并使用插值来评估"来评估"这些点,但我认为可以有一个更清洁,更容易的解决方案。

1 个答案:

答案 0 :(得分:13)

seasonal_decompose()要求freq作为DateTimeIndex元信息的一部分提供,可由pandas.Index.inferred_freq推断,或由用户推断为{{1}这给出了每个周期的周期数。例如,每月12个(来自integer的{​​{1}}):

docstring

为了说明 - 使用随机样本数据:

seasonal_mean

到目前为止,非常好 - 现在从def seasonal_decompose(x, model="additive", filt=None, freq=None): """ Parameters ---------- x : array-like Time series model : str {"additive", "multiplicative"} Type of seasonal component. Abbreviations are accepted. filt : array-like The filter coefficients for filtering out the seasonal component. The default is a symmetric moving average. freq : int, optional Frequency of the series. Must be used if x is not a pandas object with a timeseries index. 随机丢弃元素以创建不均匀的空间数据:

length = 400
x = np.sin(np.arange(length)) * 10 + np.random.randn(length)
df = pd.DataFrame(data=x, index=pd.date_range(start=datetime(2015, 1, 1), periods=length, freq='w'), columns=['value'])

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 400 entries, 2015-01-04 to 2022-08-28
Freq: W-SUN

decomp = sm.tsa.seasonal_decompose(df)
data = pd.concat([df, decomp.trend, decomp.seasonal, decomp.resid], axis=1)
data.columns = ['series', 'trend', 'seasonal', 'resid']

Data columns (total 4 columns):
series      400 non-null float64
trend       348 non-null float64
seasonal    400 non-null float64
resid       348 non-null float64
dtypes: float64(4)
memory usage: 15.6 KB

对此数据运行DateTimeIndex'有效':

df = df.iloc[np.unique(np.random.randint(low=0, high=length, size=length * .8))]

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 222 entries, 2015-01-11 to 2022-08-21
Data columns (total 1 columns):
value    222 non-null float64
dtypes: float64(1)
memory usage: 3.5 KB

df.index.freq

None

df.index.inferred_freq

None

问题是 - 结果有多大用处。即使数据中没有空白使季节性模式的推断复杂化(请参阅release notes中使用seasonal_decomp的示例,decomp = sm.tsa.seasonal_decompose(df, freq=52) data = pd.concat([df, decomp.trend, decomp.seasonal, decomp.resid], axis=1) data.columns = ['series', 'trend', 'seasonal', 'resid'] DatetimeIndex: 224 entries, 2015-01-04 to 2022-08-07 Data columns (total 4 columns): series 224 non-null float64 trend 172 non-null float64 seasonal 224 non-null float64 resid 172 non-null float64 dtypes: float64(4) memory usage: 8.8 KB 也可按如下方式对此过程进行限定:

.interpolate()