佛山天气数据分析和可视化

实验内容 

1、寻找数据

   首先,我们需要自行收集寻找有关佛山天气的数据,我是在网站:http://www.guangzhoutianqi114.com/foshan/12yuefen.html收集了佛山2023年9月、10月、11月、12月的天气情况,内容有:日期、最高气温℃、最低气温℃、天气、风向、风力。

2、收集数据

   为了更好的完成实验,将数据整合到天气.txt,一共有122组数据

3、转化数据

  为了在分析数据时减少错误,避免数据误差,我们将天气.txt转变成天气.csv,以此更直观的分析数据。

  • 导入了csv模块,它是Python标准库中的一个模块,用于读写CSV文件。
  • 定义了一个名为headers的列表,包含CSV文件的表头。
  • 使用with open('天气.txt', 'r', encoding='utf-8') as txt_file:打开名为“天气.txt”的文件进行读取,并指定编码为utf-8。with语句用于处理文件对象,它会在处理完成后自动关闭文件。
  • 再次使用with open('天气.csv', 'w', newline='', encoding='utf-8-sig') as csv_file:打开名为“天气.csv”的文件进行写入,并指定编码为utf-8-sig。newline参数被设置为'',以避免写入CSV文件时出现空行。
  • 创建一个csv writer对象,用于写入CSV文件。
  • 使用writer.writerow(headers)将表头写入CSV文件。
  • 使用txt_file.readline()跳过天气.txt文件的第一行(通常是表头)。
  • 使用for循环逐行读取天气.txt文件中的数据,并使用line.strip().split('\t')去除每行末尾的换行符并按制表符进行分割,得到一个列表。
  • 使用writer.writerow(data)将分割后的数据写入CSV文件。
  1. 天气数据分析和可视化

(1)分析数据,用折线图显示佛山2023年12月份的最高气温和最低气温。 

使用折线图显示佛山2023年12月份的最高气温和最低气温,主要的意义在于直观地展示该月份气温的变化趋势。这种图表可以帮助我们了解该月份气温的波动情况,从而回答以下问题:佛山2023年12月份的最高气温和最低气温的总体趋势是什么?是逐渐升高、逐渐降低,还是保持稳定?该月份的最高气温和最低气温有没有特别高或特别低的日子?如果有,具体是哪几天?最高气温和最低气温之间的温差变化情况如何?是否有较大的波动?这些气温数据对于当地居民的生活、农业、工业等方面有何影响?例如,是否需要采取措施来应对极端高温或低温天气?通过分析这些数据,我们可以更好地了解该月份的气候状况,并据此做出相应的决策或采取适当的措施。

(2)分析数据,用饼图统计不同天气的风力出现次数。

使用饼图统计不同天气的风力出现次数,主要的意义在于直观地展示在各种天气条件下,不同风力等级出现的频次。这种图表可以帮助我们快速了解哪种天气类型常伴随着高风力,哪种天气类型常伴随着低风力。通过这种分析,我们可以回答以下问题:在不同的天气类型中,哪种风力出现的次数最多?这可以帮助我们了解哪种天气最容易产生大风或小风;风力的分布是否具有年度、季度或月度的变化趋势?这有助于预测未来的风力情况,从而为能源、交通、农业等领域提供决策依据。

  • plt.rc('font', size=10): 调整matplotlib的全局字体大小为10。
  • df = pd.read_csv('天气.csv'): 使用pandas的read_csv函数读取名为'天气.csv'的CSV文件,并将数据存储在DataFrame对象df中。
  • wind_counts = df['风力'].value_counts(): 从df中提取'风力'列,并使用value_counts函数统计该列中不同值(风力级别)的出现次数,并将结果存储在wind_counts中。

(3)分析数据,计算温差,用散点图观察最近温差的变化。

使用散点图观察最近温差的变化,其意义在于深入理解气温变化的模式和趋势,并能够回答以下问题:通过散点图,可以清晰地观察到温差随时间的变化趋势。是温差在逐渐增大、减小,还是基本保持稳定?基于对历史温差数据的分析,可以对未来的温差变化做出预测。这对于农业、交通、能源消耗等多个领域都有重要的意义。对于当地居民和决策者来说,了解温差的变化趋势有助于制定或调整适应策略,以应对气候变化带来的挑战对于气象学家和相关领域的学者,这些数据和分析结果可以为他们的研究提供有价值的信息,以更好地理解气候变化的机制和影响。通过分析数据、计算温差并用散点图观察其变化,我们不仅可以深入理解气候变化的模式和趋势,还能为未来的适应和缓解措施提供科学依据。

  • data = pd.read_csv('天气.csv', encoding='utf-8'): 使用pandas库的read_csv函数读取名为'天气.csv'的CSV文件,并指定编码为'utf-8'data['温差'] = data['最高气温℃'] - data['最低气温℃']: 计算温差,即最高气温减去最低气温,并将结果添加到数据框中作为新的列data['日期'] = pd.to_datetime(data['日期']): 将'日期'列转换为datetime对象,以便进行日期操作data['月日'] = data['日期'].dt.strftime('%m.%d'): 将日期格式化为月日的形式,例如'07.17'。
  • plt.scatter(data.index, data['温差']): 绘制散点图,其中x轴是数据框的索引(默认是行索引),y轴是温差for i in range(len(data)): 和 plt.text(...): 在散点图上标注每个点的温差值x_ticks = range(0, len(data), 5) 和 x_labels = data['月日'][::5]: 设置X轴的间隔为5天,并获取相应的日期标签。

(4)分析数据,用横向柱状图统计分析各种天气的天数

(5)分析数据,计算温差,用纵向柱形图统计温差天数。

  1.    分析数据、计算温差,并用纵向柱形图统计温差天数的意义在于提供一种直观的方式,展示在不同时间段内温差超过某一阈值的天数。这样的统计有助于回答以下问题:通过纵向柱形图,可以清晰地看到在一段时间内,温差超过某一特定阈值的频率是多少。分析不同时间段内温差天数的变化,可以探究哪些因素(如季节变化、气候模式等)影响了温差的变化。对于气象学家和相关领域的学者,这些数据可以为他们的研究提供有价值的信息,以更好地理解气候变化的机制和影响。通过分析数据、计算温差并用纵向柱形图统计温差天数,我们能够深入理解气候变化的模式和趋势,为未来的适应和缓解措施提供科学依据。
  2. (6)分析数据,根据天气的出现频率,制作云图。
  3. 分析数据并根据天气的出现频率制作云图,其意义在于提供一个直观的方式来展示不同天气类型在一段时间内的分布和频率。这样的云图有助于回答以下问题:通过分析不同时间段内的云图,可以探究气候变化对天气类型分布和频率的影响。这有助于深入理解气候变化的后果和影响。不同天气类型可能会对生态系统产生不同的影响,如降雨量、气温等。云图可以提供有关这些影响的线索,帮助生态学家和其他学者更好地理解生态系统的动态。基于对历史天气数据的分析,可以使用云图来预测未来的天气趋势。这对于农业、交通和其他与天气密切相关的领域都具有重要意义。通过分析数据并根据天气的出现频率制作云图,我们可以深入理解气候变化和天气模式,为未来的适应和缓解措施提供科学依据。
  4. (7)分析数据,输入日期,可查看当天的天气预报,根据天气情况,提示你受否需要带伞,适不适合出门。

根据天气情况判断是否建议用户带伞。如果天气包含“雨”字,则建议带伞。

总结

首先,本次大作业里综合运用了上两个实验的知识,了解了其在数据可视化方面的应用。通过对天气数据分析和可视化,使用matplotlib绘制不同类型的图形,如折线图、柱状图、散点图等。同时,matplotlib对图形进行美化,如设置坐标轴标签、图例、标题等。此外,本次大作业还运用了matplotlib处理和分析数据,如数据的筛选、排序、计算等。

其次,在期末大作业中我们需要自己去寻找大量的数据,并将其保存到文件中,这就需要使用Python编程语言从文件中读取数据,并将其转换为适合绘图的格式如:CSV格式。在使用Matplotlib库绘制各种图形,如折线图、饼图、柱状图等图形时,我遇到了一些问题。比如,文件编码错误,将encoding参数设置为utf-8,以确保文件正确解码,然后我们重新运行代码,代码运行成功。

最后,通过对佛山天气数据的分析和可视化,数据分析结果的意义能够回答的问题有:

  1. 平均气温和季节变化:分析佛山的历史气温数据可以提供每个季节的平均气温、温度范围和季节变化的趋势。这对于了解佛山的气候特征、制定合适的穿着和活动计划非常有意义。
  2. 极端天气事件:通过分析佛山的天气数据,我们可以研究大风、暴雨、高温等极端天气事件的发生频率和持续时间。这有助于了解佛山的天气风险,提前做好应对措施。
  3. 季节性降水量和干旱情况:通过分析降水数据,可以了解佛山的降水分布和季节性变化。这对于农业、水资源管理和自然灾害预防非常重要。
  4. 温度变化趋势:通过对历史气温数据进行趋势分析,可以观察佛山的温度变化趋势,是否存在全球变暖等问题。这对于气候变化研究和环境保护具有重要意义。
  5. 气象预测和规划:通过建立气象预测模型,可以对佛山未来的天气情况进行短期或长期预测,这有助于决策者、农民、商家等规划和做出相应的应对措施。

通过对佛山天气数据的分析和可视化,我们可以提供有关佛山气候的客观基础,帮助人们更好地了解和应对不同季节的天气变化和极端天气事件。这对于生活、农业、旅游、城市规划等方面都具有实际和重要的意义。

源代码 

import csv
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 折线图
df = pd.read_csv('天气.csv')    # 读取天气数据文件
# 提取日期列
df['日期'] = pd.to_datetime(df['日期'])
df['日期'] = df['日期'].dt.strftime('%m-%d')
df_december = df[df['日期'].str.startswith('12')]     # 筛选出12月份的数据
# 提取最高气温和最低气温列
high_temps = df_december['最高气温℃']
low_temps = df_december['最低气温℃']
dates = df_december['日期']
plt.figure(figsize=(10, 6))    # 设置图形大小
plt.plot(dates, high_temps, label='最高气温', marker='o')     # 绘制最高气温折线图
plt.plot(dates, low_temps, label='最低气温', marker='o')       # 绘制最低气温折线图
# 设置折线标注
for date, high_temp, low_temp in zip(dates, high_temps, low_temps):
    plt.text(date, high_temp, high_temp, fontsize=8, ha='center')
    plt.text(date, low_temp, low_temp, fontsize=8, ha='center')
plt.xticks(dates[::2])    # x轴日期间隔为2天
plt.legend()    # 设置图例
# 设置坐标轴标签
plt.xlabel('日期')
plt.ylabel('气温(℃)')
plt.title('12月最高气温与最低气温')   # 设置标题
plt.show()    # 显示图形

# 饼图
plt.rc('font', size=10)    # 调整全局字体大小
df = pd.read_csv('天气.csv')    # 读取天气数据文件
wind_counts = df['风力'].value_counts()     # 统计不同天气的风力出现次数
plt.figure(figsize=(10, 10))    # 设置图形大小
plt.pie(wind_counts, labels=wind_counts.index, autopct='%1.1f%%')     # 绘制饼图
plt.axis('equal')    # 设置图形为正圆形
# 设置标题和图例
plt.title('不同风力的天气统计')
plt.legend(title='风力')
# 标注天数
annotation = ''
for wind, count in zip(wind_counts.index, wind_counts):
    annotation += f'{wind}: {count}天\n'
plt.text(-1.5, -0.8, annotation, fontsize=10)
plt.show()

# 散点图
data = pd.read_csv('天气.csv', encoding='utf-8')    # 读取天气数据
data['温差'] = data['最高气温℃'] - data['最低气温℃']   # 计算温差
data['日期'] = pd.to_datetime(data['日期'])   # 提取日期的月日
data['月日'] = data['日期'].dt.strftime('%m.%d')
# 绘制散点图
plt.scatter(data.index, data['温差'])
# 标注温差值
for i in range(len(data)):
    plt.text(data.index[i], data['温差'][i], str(data['温差'][i]), ha='center', va='bottom', fontsize=7)
# 设置X轴的间隔为5天
x_ticks = range(0, len(data), 5)
x_labels = data['月日'][::5]
plt.xticks(x_ticks, x_labels, rotation=45)
# 添加标题和标
plt.title('温差分布')
plt.xlabel('日期')
plt.ylabel('温差')
plt.show()   # 显示图像

# 绘制横向柱状图
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

data = pd.read_csv('天气.csv', encoding='utf-8')    # 读取天气数据
weather_counts = data['天气'].value_counts()     # 统计各种天气的天数
# 设置柱状图颜色
colors = ['blue', 'orange', 'green', 'red', 'purple', 'brown', 'pink', 'gray', 'yellow', \
          'cyan','magenta', 'lightblue', 'lightgray', 'lightgreen', 'lightpink', 'lightyellow']
# 生成刻度位置并按天数间隔调整
y_pos = np.arange(len(weather_counts)) * 3
x_ticks = range(0, weather_counts.max()+1, 3)
plt.barh(y_pos, weather_counts.values, color=colors, height=2.5)     # 绘制纵向柱状图
# 在每个柱形的后面显示天数
for i in range(len(weather_counts)):
    plt.text(weather_counts.values[i] + 0.5, y_pos[i], str(weather_counts.values[i]), \
             horizontalalignment='left', verticalalignment='center')
# 设置纵轴标签和标题并调整字体
plt.ylabel('天气', fontsize=10)
plt.xlabel('天数', fontsize=12)
plt.title('各种天气的天数统计', fontsize=14)
# 设置刻度位置和标签并调整字体
plt.yticks(y_pos, weather_counts.index, fontsize=10)
plt.xticks(x_ticks, fontsize=10)
plt.show()    # 显示图形

# 纵向柱形图
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置中文字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
data = pd.read_csv('天气.csv', encoding='utf-8')  # 读取天气数据
data['温差'] = data['最高气温℃'] - data['最低气温℃']   # 计算温差
temperature_diff_counts = data['温差'].value_counts()   # 统计各种温差的天数
temperature_diff_counts = temperature_diff_counts.sort_index()    # 排序温差数据
# 设置柱状图颜色
colors = ['blue', 'orange', 'green', 'red', 'purple', 'brown', 'pink', 'gray', 'yellow', \
          'cyan','magenta', 'lightblue', 'lightgray', 'lightgreen', 'lightpink', 'lightyellow']
x_pos = range(len(temperature_diff_counts))   # 生成刻度位置
# 绘制排序后的纵向柱状图
plt.bar(x_pos, temperature_diff_counts.values, color=colors, align='center', tick_label=temperature_diff_counts.index, label='温差')
# 设置横、纵轴标签和标题,并调整字体大小
plt.xlabel('温差', fontsize=12)
plt.ylabel('天数', fontsize=12)
plt.title('各种温差的天数统计', fontsize=14)
plt.show()

# 云图
from wordcloud import WordCloud
df = pd.read_csv('天气.csv')    # 读取天气数据文件
weather_counts = df['天气'].value_counts(normalize=True)   # 统计不同天气出现的频率q
# 绘制词云图
wordcloud = WordCloud(font_path='simhei.ttf',
                      background_color='white',
                      width=2000,
                      height=1000,
                      max_words=600).generate_from_frequencies(weather_counts)
# 显示词云图
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()

# 预测
from statsmodels.tsa.arima.model import ARIMA
# 读取数据,选择2023年9月至12月的数据
data = pd.read_csv('天气.csv')
data['日期'] = pd.to_datetime(data['日期'])
data = data.set_index('日期')
data = data['2023-09-01':'2023-12-31']
# 构建最高气温的ARIMA模型
model_high = ARIMA(data['最高气温℃'], order=(1, 1, 1))
model_high_fit = model_high.fit()
# 构建最低气温的ARIMA模型
model_low = ARIMA(data['最低气温℃'], order=(1, 1, 1))
model_low_fit = model_low.fit()
# 根据历史数据进行预测
forecast_high = model_high_fit.get_forecast(steps=1)
forecast_high_temp = forecast_high.predicted_mean[0]

forecast_low = model_low_fit.get_forecast(steps=1)
forecast_low_temp = forecast_low.predicted_mean[0]
# 预测天气
forecast_weather = ''
if forecast_high_temp > 30:
    forecast_weather = '晴热'
elif forecast_low_temp < 10:
    forecast_weather = '寒冷'
else:
    forecast_weather = '多云'
# 输出预测结果
print('预测的最高温度:', forecast_high_temp)
print('预测的最低温度:', forecast_low_temp)
print('预测的天气:', forecast_weather)
print("------------------------------------")

# 输入日期打印出日期信息
def print_weather_by_date(date):
    with open("天气.csv", "r", encoding="utf-8") as file:
        reader = csv.reader(file)
        next(reader)  # 跳过第一行表头
        for row in reader:
            if row[0] == date:
                print("日期: {}".format(row[0]))
                print("最高气温℃: {}".format(row[1]))
                print("最低气温℃: {}".format(row[2]))
                print("天气: {}".format(row[3]))
                print("风向: {}".format(row[4]))
                print("风力: {}".format(row[5]))
                # 判断是否需要带伞
                if "雨" in row[3]:
                    print("建议带伞")
                else:
                    print("不需要带伞")
                # 判断是否适合出门
                if "雨" in row[3]:
                    print("不适合出门")
                else:
                    print("适合出门")
                return
    print("未找到日期为{}的天气信息".format(date))
date = input("请输入日期(年.月.日): ")
print_weather_by_date(date)

结果

折线图显示佛山2023年12月份的最高气温和最低气温,每个折角都有显示自己的温度。

 

 

横向柱状图统计分析各种天气的天数,每个柱形后面都有天数显示。

散点图观察最近温差的变化,每个点上都有温度差值显示,使我们更直观的观察温度变化。

根据天气的出现频率,制作云图。 

纵向柱形图统计温差天数。 

 

 分析数据,使用ARIMA预测2024年1月1日的天气、最高气温和最低气温。

 

分析数据,输入日期,可查看当天的天气预报,根据天气情况,提示你受否需要带伞,适不适合出门。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值