| name | statsmodels |
| description | Statsmodels library for statistical modeling and econometrics. Use for time series decomposition, trend analysis, regression, and seasonal adjustment of economic data. |
Statsmodels
Statsmodels provides statistical modeling tools for time series and econometric analysis.
Time Series Decomposition
from statsmodels.tsa.seasonal import seasonal_decompose
import pandas as pd
# Ensure datetime index with frequency
df.index = pd.to_datetime(df.index)
df = df.asfreq('QE') # Quarterly end frequency
# Perform seasonal decomposition
result = seasonal_decompose(
df['current_account'],
model='additive', # or 'multiplicative'
period=4 # quarterly data has period of 4
)
# Access components
trend = result.trend
seasonal = result.seasonal
residual = result.resid
# Plot decomposition
result.plot()
plt.savefig('/app/output/decomposition.png')
Extracting Decomposition Results
from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(df['current_account'], model='additive', period=4)
# Create DataFrame with components
decomposition_df = pd.DataFrame({
'observed': result.observed,
'trend': result.trend,
'seasonal': result.seasonal,
'residual': result.resid
})
# Identify peak seasonal quarter
seasonal_by_quarter = df.groupby(df.index.quarter)['seasonal'].mean()
peak_quarter = f"Q{seasonal_by_quarter.idxmax()}"
Trend Analysis
from statsmodels.tsa.filters.hp_filter import hpfilter
# Hodrick-Prescott filter for trend extraction
cycle, trend = hpfilter(df['current_account'], lamb=1600)
# Determine trend direction
trend_slope = (trend.iloc[-1] - trend.iloc[0]) / len(trend)
trend_direction = "improving" if trend_slope > 0 else "deteriorating"
OLS Regression
import statsmodels.api as sm
# Time trend regression
X = sm.add_constant(range(len(df)))
y = df['current_account']
model = sm.OLS(y, X)
results = model.fit()
print(results.summary())
print(f"R-squared: {results.rsquared:.4f}")
print(f"Trend coefficient: {results.params[1]:.4f}")
Autocorrelation Analysis
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
plot_acf(df['current_account'].dropna(), ax=axes[0], lags=12)
plot_pacf(df['current_account'].dropna(), ax=axes[1], lags=12)
plt.tight_layout()
plt.savefig('/app/output/acf_pacf.png')
Stationarity Testing
from statsmodels.tsa.stattools import adfuller
result = adfuller(df['current_account'].dropna())
print(f'ADF Statistic: {result[0]:.4f}')
print(f'p-value: {result[1]:.4f}')
print(f'Critical Values: {result[4]}')