Python 时间序列分析-不均匀间隔测量-熊猫和x2B;statsmodels
我有两个numpy数组light_points和time_points,我想对这些数据使用一些时间序列分析方法 然后我试了一下:Python 时间序列分析-不均匀间隔测量-熊猫和x2B;statsmodels,python,pandas,machine-learning,time-series,statsmodels,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
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'])
rdf = pd.Series({'light':light_points[:]})
rdf.index = pd.DatetimeIndex(tdf['time'])
这是可行的,但不是做正确的事情。
事实上,测量值的时间间隔不是均匀的,如果我只是将时间帧声明为帧的索引,我会得到一个错误:
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
我不知道怎么纠正这个。
此外,熊猫的TimeSeries
似乎也不受欢迎
我试过这个:
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'])
rdf = pd.Series({'light':light_points[:]})
rdf.index = pd.DatetimeIndex(tdf['time'])
但它给了我一个长度不匹配:
ValueError: Length mismatch: Expected axis has 1 elements, new values have 122 elements
然而,我不明白它从何而来,因为rdf['light']和
tdf['time']的长度相同
最后,我尝试将我的rdf定义为熊猫系列:
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
然后,我尝试将索引替换为
pd.TimeSeries(time_points[:])
这给了我一个关于季节分解方法行的错误:
AttributeError: 'Float64Index' object has no attribute 'inferred_freq'
如何处理间距不均的数据?
我在考虑通过在现有值之间添加许多未知值并使用插值“评估”这些点来创建一个大致等距的时间数组,但我认为可能有一个更干净、更简单的解决方案。季节分解()需要一个频率
,该频率作为日期时间索引
元信息的一部分提供,可以通过pandas.Index.expressed\u freq
推断,或者由用户作为一个整数
推断,给出每个周期的周期数。e、 例如,每月12次(从docstring
到季节平均值
):
举例说明-使用随机样本数据:
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
对该数据运行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()
如果你发了一个帖子,你会增加更改以得到一个好的答案。为什么你使用了freq=52
-,为什么52不是另一个数字?已经有一段时间了,但我相信,因为我的示例使用了每周随机数据-见上文。
Notes
-----
This is a naive decomposition. More sophisticated methods should
be preferred.
The additive model is Y[t] = T[t] + S[t] + e[t]
The multiplicative model is Y[t] = T[t] * S[t] * e[t]
The seasonal component is first removed by applying a convolution
filter to the data. The average of this smoothed series for each
period is the returned seasonal component.