2023认证杯小美赛a题思路代码太阳黑子预测

a:太阳黑子预测

背景介绍:

太阳黑子是太阳光球上暂时出现的、比周围区域暗的斑点。
它们是由于磁通量集中引起的表面温度降低的区域。
太阳黑子通常成对出现,并具有相反的磁极性。
太阳黑子的数量随着大约11年一个周期的太阳活动周期而变化。
太阳黑子与其他太阳活动相关联,且与太阳磁场的变化周期相一致。
预测太阳黑子活动对于了解太阳活动、太空天气、电离层状态、短波无线电传播和卫星通信等方面非常重要。

预测任务:

预测当前和下一个太阳活动周期的开始和结束时间。
预测下一个太阳活动周期的太阳极大期的开始时间和持续时间。
预测当前和下一个太阳活动周期中太阳黑子的数量和面积,并说明模型的可靠性。
为了完成这些任务,我们需要采用数学建模的方法来分析和预测太阳黑子的活动。这可能包括时间序列分析、频谱分析、神经网络等方法,以及对历史观测数据的详细分析。可以利用的公开数据包括太阳黑子的历史数量、面积以及其他可能相关的指标。

数据来源:
https://www.sidc.be/SILSO/datafiles

数据表包含了从1818年开始的太阳黑子观测数据,具体字段如下:
Year, Month, Day:观测日期。
Date in Fraction:日期的小数表示,方便进行时间序列分析。
Sunspot Number:太阳黑子数量。
Standard Deviation:标准偏差,可能代表黑子数量测量的不确定性。
Observations:观测次数或观测站点数量。
Definitive/Provisional:数据的状态,可能表示数据是最终的还是暂定的。
接下来,我们可以使用这些数据来预测太阳黑子活动。首先,我们需要处理数据,包括清洗(如处理缺失值)、转换日期格式,并可能需要构造额外的特征,如基于时间的统计量。然后,我们可以应用时间序列分析方法或机器学习模型来进行预测。
由于太阳黑子活动具有周期性,时间序列分析(如ARIMA模型)可能是一种合适的方法。我们也可以探索使用机器学习模型,如随机森林或神经网络,尤其是在处理非线性和复杂的时间依赖性时。

先进行可视化和数据预处理
这幅图显示了从1818年开始的太阳黑子数量随时间的变化。从图中可以看出,太阳黑子数量呈现出明显的周期性波动,这与太阳活动的周期性特征相符。此外,黑子数量的高峰和低谷代表了太阳活动的高峰期和低谷期

在尝试分解数据以观察其季节性成分时,遇到了一个问题:数据中存在缺失值。在进行时间序列分析之前,需要处理这些缺失值。
处理缺失值的一种常见方法是插值,但考虑到我们正在处理太阳黑子数量的时间序列,我们需要谨慎选择合适的插值方法,以确保不会引入误导性的数据。对于太阳黑子数量,线性插值可能是一个合理的选择,因为它可以平滑地连接缺失点前后的数据。
我将对数据进行处理,然后重新尝试分析和预测。

现在,我们使用处理后的数据(对缺失值进行了线性插值)完成了太阳黑子数量的时间序列分析和预测。从图中可以看到:
蓝线表示观测到的趋势(经过插值处理)。
红线表示未来的预测趋势。
粉色区域代表预测的置信区间,即预测值的可能波动范围。
这个预测模型基于季节性自回归综合移动平均(SARIMA)模型,该模型可以处理具有季节性周期性的时间序列数据。模型参数是基于太阳黑子活动周期大约为11年(132个月)的特性来选择的。

第一问代码:
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.statespace.sarimax import SARIMAX
from pandas.plotting import register_matplotlib_converters

注册matplotlib转换器

register_matplotlib_converters()

读取数据

file_path = ‘path_to_your_file/SN_d_tot_V2.0.csv’
df = pd.read_csv(file_path, delimiter=‘;’, header=None, names=[“Year”, “Month”, “Day”, “Date in Fraction”, “Sunspot Number”, “Standard Deviation”, “Observations”, “Definitive/Provisional”])

数据预处理

df = df[df[‘Sunspot Number’] != -1] # 过滤无效数据
df.index = pd.to_datetime(df[[‘Year’, ‘Month’, ‘Day’]]) # 创建datetime索引
monthly_data = df[‘Sunspot Number’].resample(‘M’).mean() # 按月计算平均值
monthly_data_interpolated = monthly_data.interpolate(method=‘linear’) # 线性插值处理缺失值

时间序列分解

decomposition = seasonal_decompose(monthly_data_interpolated, model=‘additive’, period=132) # 大约11年周期
trend_component = decomposition.trend.dropna() # 使用趋势组件进行预测

训练和测试数据集划分

train = trend_component.iloc[:-20]
test = trend_component.iloc[-20:]

构建并拟合SARIMA模型

预测结果

2.预测下一个太阳活动周期的太阳极大期的开始时间和持续时间。

思路如下:

使用SARIMA模型进行预测:首先,我们需要使用上一步骤中相同的SARIMA模型来预测未来的太阳黑子数量。

寻找极大值:然后,我们需要在预测结果中寻找极大值点,这些点代表太阳活动的极大期。

确定极大期的开始和持续时间:为了确定极大期的开始时间和持续时间,我们可以假设每个太阳周期大约是11年(132个月),极大期通常出现在周期的中间。因此,我们可以假设极大期开始于极大值点之前的66个月,并持续132个月。

3.预测当前和下一个太阳活动周期中太阳黑子的数量和面积,并说明模型的可靠性。

要预测当前和下一个太阳活动周期中太阳黑子的数量和面积,并评估模型的可靠性,我们将继续使用SARIMA模型。
预测模型的可靠性将通过计算预测区间和评估模型拟合度来确定。
后续会增加替换模型以提高预测精度

猜你喜欢

转载自blog.csdn.net/yeqianqian_/article/details/134729281