python南方涛动指数SOI数据分析

 下面直接给出核心代码

# 任务一:
# 用pandas 库读取 soi.long.data.csv 文件,
# 将所有时间抽取为单独的列Date(形式为YYYY-MM-01),如1866-01-01
# 所有异常值抽取为一个单独的列SOI,将所有缺失值丢弃处理,
# 并到处到新的txt文件soi_dropnan.txt,第一行为表头,列名分别为Date和SOI,
# 且表头和数据行中的不同字段信息都是用逗号分隔
def task1():
    try:
        # 输入数据文件和输出数据文件
        file1, file2 = input("请输入数据文件名:如soi.long.data.csv"), input("请输入输出文件名:如soi_dropnan.txt")
        data = pd.read_csv(file1)
    except FileNotFoundError:
        print('文件不存在')
        return
    else:
        # 去除缺失值
        data = data.dropna()
        # 设置索引
        data = data.set_index('Year')
        # 把列名的月份转换为数字
        data.columns = range(1, 13)
        # 新建一个空的DataFrame
        df = pd.DataFrame(columns=['Date', 'SOI'])
        # 遍历data的行
        for index, row in data.iterrows():
            # 遍历data的列
            for col in data.columns:
                # 拼接字符串
                date = str(index) + '-' + str(col) + '-01'
                # 添加到df中
                df = pd.concat([df, pd.DataFrame({'Date': [date], 'SOI': [row[col]]})])
        # 重置索引
        df = df.reset_index(drop=True)
        df.to_csv(file2, index=False)
        print(df)
        print("任务一完成")

# 读取新的数据集soi_dropnan.txt,选择SOI字段,统计最大值、最小值、平均值。
def task2():
    try:
        file1 = input('请输入数据文件名:如soi_dropnan.txt')
        data = pd.read_csv(file1)
    except FileNotFoundError:
        print('文件不存在')
        return
    else:
        # 选择SOI字段
        data = data['SOI']
        print('最大值:', data.max())
        print('最小值:', data.min())
        print('平均值:', data.mean())
        print("任务二完成")
    pass

def task3():
    # 重新读取文件soi_dropnan.txt,利用第三步统计结果最大值maxValue、最小值minValue,利用category = [minValue,0, maxValue]和
    # labels = ['NinoRelate','LaNinaRelate',]将SOI进行离散化;
    # 并将离散化结果作为一个新的列Label添加到原始数据集,并保存为soi_dropnan_result.csv,从左到右三个列名分别为
    # Date、SOI、Label;
    # 根据离散化结果画出饼状图,保存为soi_pie.png,要求分辨率不低于300dpi。
    try:
        file1 = input('请输入数据文件名:如soi_dropnan.txt')
        data = pd.read_csv(file1)
    except FileNotFoundError:
        print('文件不存在')
        return
    else:
        max = data['SOI'].max()
        min = data['SOI'].min()
        # 离散化
        data['Label'] = pd.cut(data['SOI'], bins=[min, 0, max], labels=['NinoRelate', 'LaNinaRelate'])

        data.to_csv('soi_dropnan_result.csv', index=False)

        data['Label'].value_counts().plot.pie()

        plt.savefig('soi_pie.png', dpi=400)
        print("任务三完成,请查看soi_pie.png")
    pass

# 读取文件soi_dropnan_result.csv,利用matplotlib 库,可视化显示SOI值,要求包括图例、图标题,x轴刻度以年显示且间隔为10,y轴显示刻度值,曲线颜色为蓝色。
def task4():
    try:
        file1 = input('请输入数据文件名:如soi_dropnan_result.csv')
        data = pd.read_csv(file1)
    except FileNotFoundError:
        print('文件不存在')
        return
    else:
        # 清洗数据,将Date列转换为时间格式
        data['Date'] = pd.to_datetime(data['Date'])
        data1 = pd.DataFrame

        x = data['Date'].values
        y = data['SOI'].values
        plt.figure(figsize=(10, 6))
        plt.plot(x, y, color='blue')

        # 设置x轴刻度间隔为10年,只显示年份
        plt.gca().xaxis.set_major_locator(mdates.YearLocator(base=10))  # set_major_locator设置主刻度
        plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y'))  # set_major_formatter设置主刻度格式

        plt.rcParams['font.sans-serif'] = ['SimHei']
        plt.rcParams['axes.unicode_minus'] = False

        plt.xlabel('Year')
        plt.ylabel('SOI')
        plt.title('SOI年份-值关系图')
        plt.legend(['SOI'])
        plt.savefig('soi_plot.png', dpi=400)
        print("任务四完成,请查看soi_plot.png")
    pass

觉得有帮助希望点个赞,鼓励分享!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值