Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

WBOY
WBOYke hadapan
2023-04-26 15:19:181717semak imbas

1. Pemerolehan data

Minta pautan tapak web

Pertama-tama semak Rangkaian Cuaca China Di sini, lawati tapak web cuaca tempatan , cuma ubah suai sahaja nombor kawasan 101280701 yang terakhir Cuaca di hadapan mewakili halaman web 7 hari, weather1d mewakili hari semasa dan weather15d mewakili 14 hari seterusnya. Di sini kami terutamanya melawat Rangkaian Cuaca China 7 hari dan 14 hari. Gunakan kaedah requests.get() untuk meminta halaman web Jika akses berjaya, anda akan mendapat semua teks rentetan halaman web. Ini adalah proses permintaan.

def getHTMLtext(url):
"""请求获得网页内容"""
 try:
r = requests.get(url, timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
print("成功访问")
return r.text
 except:
print("访问错误")
 return" "
Ekstrak maklumat berguna

Pustaka BeautifulSoup digunakan untuk mengekstrak data daripada rentetan yang baru diperolehi Mula-mula, semak halaman web dan cari teg yang perlu mendapatkan data:

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

Anda boleh mendapati bahawa maklumat data 7 hari berada dalam teg div dan id="7d", dan tarikh, cuaca, suhu, paras angin dan maklumat lain adalah semua dalam teg ul dan li, jadi kami boleh Gunakan BeautifulSoup untuk mencari teks halaman web yang diperolehi untuk tag div id="7d", ketahui semua teg ul dan li yang terkandung di dalamnya, dan kemudian ekstrak nilai data yang sepadan dalam tag dan simpannya dalam senarai yang sepadan.

Satu perincian yang perlu diperhatikan di sini ialah kadangkala tarikh tidak mempunyai suhu tertinggi, dan keadaan tanpa data perlu dinilai dan diproses. Di samping itu, beberapa format storan data mesti diproses terlebih dahulu, seperti simbol Celsius di belakang suhu, pengekstrakan nombor tarikh dan pengekstrakan teks peringkat angin Ini memerlukan carian aksara dan pemprosesan penghirisan rentetan.

def get_content(html):
"""处理得到有用信息保存数据文件"""
final = []# 初始化一个列表保存数据
bs = BeautifulSoup(html, "html.parser")# 创建BeautifulSoup对象
body = bs.body
data = body.find('div', {'id': '7d'})# 找到div标签且id = 7d

Yang berikut merangkak data hari semasa

data2 = body.find_all('div',{'class':'left-div'})
text = data2[2].find('script').string
text = text[text.index('=')+1 :-2] # 移除改var data=将其变为json数据
jd = json.loads(text)
dayone = jd['od']['od2'] # 找到当天的数据
final_day = [] # 存放当天的数据
count = 0
for i in dayone:
temp = []
if count <=23:
temp.append(i[&#39;od21&#39;]) # 添加时间
temp.append(i[&#39;od22&#39;]) # 添加当前时刻温度
temp.append(i[&#39;od24&#39;]) # 添加当前时刻风力方向
temp.append(i[&#39;od25&#39;]) # 添加当前时刻风级
temp.append(i[&#39;od26&#39;]) # 添加当前时刻降水量
temp.append(i[&#39;od27&#39;]) # 添加当前时刻相对湿度
temp.append(i[&#39;od28&#39;]) # 添加当前时刻控制质量
#print(temp)
final_day.append(temp)
count = count +1

Yang berikut merangkak data 7 hari

ul = data.find(&#39;ul&#39;)# 找到所有的ul标签
li = ul.find_all(&#39;li&#39;)# 找到左右的li标签
i = 0 # 控制爬取的天数
for day in li:# 遍历找到的每一个li
if i < 7 and i > 0:
temp = []# 临时存放每天的数据
date = day.find(&#39;h2&#39;).string # 得到日期
date = date[0:date.index(&#39;日&#39;)] # 取出日期号
temp.append(date)
inf = day.find_all(&#39;p&#39;)# 找出li下面的p标签,提取第一个p标签的值,即天气
temp.append(inf[0].string)
 tem_low = inf[1].find(&#39;i&#39;).string # 找到最低气温
 if inf[1].find(&#39;span&#39;) is None: # 天气预报可能没有最高气温
 tem_high = None
 else:
 tem_high = inf[1].find(&#39;span&#39;).string# 找到最高气温
 temp.append(tem_low[:-1])
 if tem_high[-1] == &#39;℃&#39;:
temp.append(tem_high[:-1])
 else:
temp.append(tem_high)
 wind = inf[2].find_all(&#39;span&#39;)# 找到风向
 for j in wind:
temp.append(j[&#39;title&#39;])
 wind_scale = inf[2].find(&#39;i&#39;).string # 找到风级
 index1 = wind_scale.index(&#39;级&#39;)
 temp.append(int(wind_scale[index1-1:index1]))
 final.append(temp)
i = i + 1
return final_day,final

Begitu juga untuk /weather15d: 15 hari maklumat, Proses yang sama telah dilakukan Selepas menyemak di sini, didapati hanya 8-14 hari dimasukkan ke dalam laman web 15-7 hari sebelumnya di /weather secara berasingan dan menggabungkan data yang diperolehi dengan merangkak data 14 hari terakhir. - Bahagian hadapan adalah proses merangkak data untuk 14 hari berikutnya Untuk data maklumat cuaca 24 jam pada hari itu, selepas mencari, didapati bahawa ia adalah data json kaedah .loads(), dan kemudian melaksanakan maklumat cuaca pada hari itu.

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

Simpan fail csv

Tambahkan data yang dirangkak pada senarai tadi, perkenalkan perpustakaan csv di sini dan gunakan f_csv.writerow(header) dan f_csv . Kaedah writerows(data) masing-masing menulis data dalam pengepala jadual dan setiap baris Di sini, data untuk 1 hari dan 14 hari berikutnya disimpan secara berasingan dan masing-masing disimpan sebagai weather1.csv dan weather14.csv jadual yang mereka simpan:

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

2. Analisis visual

Keluk perubahan suhu pada hari itu

menggunakan kaedah plt.plot dalam matplotlib () melukis lengkung perubahan suhu selama 24 jam sehari, dan menggunakan kaedah plt.text() untuk menunjukkan suhu tertinggi dan terendah, dan melukis garis suhu purata lengkung perubahan suhu: (lihat lampiran untuk kod)

Hebat! N projek sumber terbuka yang penting untuk menjalankan kerja persendirian! Cepat dan kumpulkan

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

Analisis boleh mendapati suhu tertinggi pada hari ini ialah 33℃, suhu terendah ialah 28℃ dan suhu purata sekitar 20.4℃ analisis masa, didapati siang dan malam Perbezaan suhu ialah 5°C, dengan suhu rendah pada awal pagi dan suhu tinggi dalam tempoh dari tengah hari hingga petang.

Keluk perubahan kelembapan relatif untuk hari ini

Menggunakan kaedah plt.plot() dalam matplotlib untuk melukis lengkung perubahan kelembapan selama 24 jam sehari dan melukis garisan kelembapan relatif purata rajah di bawah menunjukkan graf lengkung perubahan kelembapan: (Lihat lampiran untuk kod)

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

Analisis boleh mendapati bahawa kelembapan relatif tertinggi pada hari ini ialah 86%, relatif terendah kelembapan adalah 58 ℃, dan kelembapan relatif purata adalah sekitar 75%, melalui analisis masa, kelembapan pada awal pagi agak tinggi, manakala kelembapan pada sebelah petang hingga senja adalah agak rendah.

Carta analisis korelasi suhu dan kelembapan

Selepas menganalisis dua angka sebelumnya, kita dapat merasakan bahawa terdapat hubungan antara suhu dan kelembapan Untuk merasakan hubungan ini dengan lebih jelas dan intuitif, gunakan Kaedah plt.scatter() menetapkan suhu sebagai absis dan kelembapan sebagai ordinat Titik pada setiap saat diserlahkan dalam graf, dan pekali korelasi dikira angka berikut ialah hasilnya >

Analisis boleh mendapati bahawa terdapat korelasi yang kuat antara suhu dan kelembapan sehari Mereka berkorelasi negatif, yang bermaksud bahawa mereka berkorelasi negatif dengan masa lebih banyak kelembapan di udara, dan kelembapan Secara semulajadi, apabila suhu tinggi, air menyejat, dan udara menjadi lebih kering dan kelembapan lebih rendah, yang konsisten dengan fenomena iklim biasa.

Carta Bar Indeks Kualiti Udara

Indeks Kualiti Udara AQI ialah indeks yang secara kuantitatif menerangkan keadaan kualiti udara, semakin besar pencemaran udara dan semakin besar kemudaratan kepada kesihatan manusia. . Indeks kualiti udara secara amnya dibahagikan kepada 6 tahap Semakin tinggi tahap, semakin serius pencemaran Berikut menggunakan kaedah plt.bar untuk melukis histogram kualiti udara selama 24 jam sehari, dan mengikut enam tahap. , histogram yang sepadan Warna juga berubah dari terang ke gelap, yang juga menunjukkan bahawa pencemaran semakin meningkat, menunjukkan keadaan pencemaran dengan lebih intuitif Indeks kualiti udara tertinggi dan terendah juga ditanda, dan indeks kualiti udara purata dilukis dengan garis putus-putus. Rajah di bawah adalah hasil lukisan :

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

Gambar di atas adalah carta kualiti kawalan Zhuhai di selatan indeks kualiti udara adalah yang tertinggi dan ia juga dalam julat sihat, menunjukkan bahawa udara di Zhuhai adalah sangat baik Analisis boleh mendapati bahawa hari ini Indeks kualiti udara tertinggi mencapai 35, yang paling rendah hanya 14, dan purata adalah sekitar. 25. Ia juga boleh didapati mengikut masa bahawa udara pada dasarnya adalah yang terbaik pada awal pagi (jam 4-9), dan pencemaran udara adalah yang paling serius pada waktu petang, jadi anda biasanya boleh pergi ke luar menghirup udara segar pada awal pagi, apabila pencemaran adalah minimum.

Peta kualiti udara di bawah adalah dari bandar di utara Anda dapat melihat bahawa persekitaran di sini jauh lebih rendah daripada Zhuhai.

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

Carta radar arah angin dan aras angin

Statistik kuasa angin dan arah angin untuk sehari memandangkan kuasa dan arah angin lebih baik dipaparkan menggunakan koordinat kutub , yang digunakan di sini ialah Koordinat kutub memaparkan daya angin dan gambarajah arah pada hari itu Bulatan dibahagikan kepada 8 bahagian, setiap bahagian mewakili arah angin, dan jejari mewakili daya angin purata. warna biru semakin dalam. Keputusan akhir adalah seperti berikut:

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

Analisis boleh mendapati bahawa angin barat daya adalah yang paling kuat pada hari ini, dengan paras angin purata mencapai 1.75 juga merupakan sejumlah kecil angin timur laut dengan tahap 1.0, dan tiada angin di arah kosong yang lain.

Keluk perubahan suhu tinggi dan rendah untuk 14 hari seterusnya
Statistik tentang perubahan suhu tinggi dan rendah untuk 14 hari seterusnya, dan lukis lengkung perubahannya, menggunakan garis putus-putus untuk melukis puratanya garis suhu. Keputusan akhir adalah seperti berikut:

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

Analisis boleh mendapati purata suhu tinggi dalam 14 hari berikutnya ialah 30.5 ℃. tetapi akan ada penyejukan dalam 8 hari akan datang, yang perlu dilakukan adalah baik untuk bersedia untuk penyejukan Suhu rendah berada pada trend yang stabil dan mula menurun pada hari ke-8. suhu keseluruhan menurun Purata suhu rendah adalah sekitar 27°C.

Arah angin dan peta radar aras angin untuk 14 hari seterusnya
Statistik arah angin dan purata daya angin untuk 14 hari seterusnya, dan menggunakan koordinat kutub seperti sebelumnya, membahagikan bulatan kepada 8 bahagian, mewakili 8 arah, semakin gelap warnanya, semakin tinggi paras angin Keputusan akhir adalah seperti berikut:

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

Analisis boleh mencari arah angin utama dan paras angin. angin tenggara dan barat daya dalam 14 hari akan datang Tahap tertinggi mencapai tahap 5, dan tahap angin barat purata terendah ialah tahap 3.

Carta pai taburan iklim untuk 14 hari seterusnya
Kira iklim untuk 14 hari seterusnya, cari jumlah hari untuk setiap iklim, dan akhir sekali lukis carta pai untuk setiap iklim. Hasilnya adalah seperti berikut:

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

Analisis boleh mendapati bahawa iklim dalam tempoh 14 hari akan datang pada dasarnya adalah "hujan", "mendung hingga hujan" dan "hujan di sana". akan lebih banyak hari hujan Digabungkan dengan taburan suhu sebelum ini Dapat dilihat dari angka suhu turun pada hari ke-8 dan ke-9 Boleh diduga hujan pada hari itu menyebabkan suhu turun.

3. Kesimpulan

1. Pertama, berdasarkan analisis data suhu dan kelembapan yang dirangkak, suhunya adalah dari rendah pada waktu pagi hingga tinggi pada waktu tengah hari dan kemudian rendah pada waktu petang. Trend kelembapan dan suhu adalah bertentangan Melalui korelasi Pekali mendapati bahawa suhu dan kelembapan mempunyai korelasi negatif yang kuat. udara berkurangan dan kelembapan berkurangan. Sudah tentu, kelembapan dipengaruhi oleh kedua-dua tekanan udara dan hujan, dan kelembapan akan meningkat dengan ketara apabila hujan.

2.经查阅资料空气质量不仅跟工厂、汽车等排放的烟气、废气等有关,更为重要的是与气象因素有关。由于昼夜温差明显变化,当地面温度高于高空温度时,空气上升,污染物易被带到高空扩散;当地面温度低于一定高度的温度时,天空形成逆温层,它像一个大盖子一样压在地面上空,使地表空气中各种污染物不易扩散。一般在晚间和清晨影响较大,而当太阳出来后,地面迅速升温,逆温层就会逐渐消散,于是污染空气也就扩散了。

3.风是由气压在水平方向分布的不均匀导致的。风受大气环流、地形、水域等不同因素的综合影响,表现形式多种多样,如季风、地方性的海陆风、山谷风等,一天的风向也有不同的变化,根据未来14天的风向雷达图可以发现未来所有风向基本都有涉及,并且没有特别的某个风向,原因可能是近期没有降水和气文变化不大,导致风向也没有太大的变化规律。

4.天气是指某一个地区距离地表较近的大气层在短时间内的具体状态。跟某瞬时内大气中各种气象要素分布的综合表现。根据未来14天的天气和温度变化可以大致推断出某个时间的气候,天气和温度之间也是有联系的。

4、代码框架

代码主要分为weather.py:对中国天气网进行爬取天气数据并保存csv文件;data1_analysis.py:对当天的天气信息进行可视化处理;data14_analysis.py:对未来14天的天气信息进行可视化处理。下面是代码的结构图:

Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?

附源代码

weather.py

# weather.py
import requests
from bs4 import BeautifulSoup
import csv
import json
def getHTMLtext(url):
"""请求获得网页内容"""
 try:
r = requests.get(url, timeout = 30)
r.raise_for_status()
r.encoding = r.apparent_encoding
print("成功访问")
return r.text
 except:
print("访问错误")
return" "
def get_content(html):
"""处理得到有用信息保存数据文件"""
final = []# 初始化一个列表保存数据
bs = BeautifulSoup(html, "html.parser")# 创建BeautifulSoup对象
body = bs.body
data = body.find(&#39;div&#39;, {&#39;id&#39;: &#39;7d&#39;})# 找到div标签且id = 7d
# 下面爬取当天的数据
data2 = body.find_all('div',{'class':'left-div'})
text = data2[2].find('script').string
text = text[text.index('=')+1 :-2] # 移除改var data=将其变为json数据
jd = json.loads(text)
dayone = jd['od']['od2'] # 找到当天的数据
final_day = [] # 存放当天的数据
count = 0
for i in dayone:
 temp = []
 if count <=23:
temp.append(i['od21']) # 添加时间
temp.append(i['od22']) # 添加当前时刻温度
temp.append(i['od24']) # 添加当前时刻风力方向
temp.append(i['od25']) # 添加当前时刻风级
temp.append(i['od26']) # 添加当前时刻降水量
temp.append(i['od27']) # 添加当前时刻相对湿度
temp.append(i['od28']) # 添加当前时刻控制质量
#print(temp)
final_day.append(temp)
 count = count +1
 # 下面爬取7天的数据
ul = data.find('ul')# 找到所有的ul标签
li = ul.find_all('li')# 找到左右的li标签
i = 0 # 控制爬取的天数
for day in li:# 遍历找到的每一个li
if i < 7 and i > 0:
temp = []# 临时存放每天的数据
date = day.find('h2').string # 得到日期
date = date[0:date.index('日')] # 取出日期号
temp.append(date)
inf = day.find_all('p')# 找出li下面的p标签,提取第一个p标签的值,即天气
temp.append(inf[0].string)
tem_low = inf[1].find('i').string # 找到最低气温
if inf[1].find('span') is None: # 天气预报可能没有最高气温
tem_high = None
else:
tem_high = inf[1].find('span').string# 找到最高气温
temp.append(tem_low[:-1])
if tem_high[-1] == '℃':
 temp.append(tem_high[:-1])
else:
 temp.append(tem_high)
wind = inf[2].find_all('span')# 找到风向
for j in wind:
 temp.append(j['title'])
wind_scale = inf[2].find('i').string # 找到风级
index1 = wind_scale.index('级')
temp.append(int(wind_scale[index1-1:index1]))
final.append(temp)
i = i + 1
return final_day,final
#print(final)
def get_content2(html):
"""处理得到有用信息保存数据文件"""
final = []# 初始化一个列表保存数据
bs = BeautifulSoup(html, "html.parser")# 创建BeautifulSoup对象
body = bs.body
data = body.find('div', {'id': '15d'})# 找到div标签且id = 15d
ul = data.find('ul')# 找到所有的ul标签
li = ul.find_all('li')# 找到左右的li标签
final = []
i = 0 # 控制爬取的天数
for day in li: # 遍历找到的每一个li
if i < 8:
temp = [] # 临时存放每天的数据
date = day.find('span',{'class':'time'}).string# 得到日期
date = date[date.index('(')+1:-2]# 取出日期号
temp.append(date)
weather = day.find('span',{'class':'wea'}).string# 找到天气
temp.append(weather)
tem = day.find('span',{'class':'tem'}).text# 找到温度
temp.append(tem[tem.index('/')+1:-1]) # 找到最低气温
temp.append(tem[:tem.index('/')-1])# 找到最高气温
wind = day.find('span',{'class':'wind'}).string# 找到风向
if '转' in wind: # 如果有风向变化
 temp.append(wind[:wind.index('转')])
 temp.append(wind[wind.index('转')+1:])
else: # 如果没有风向变化,前后风向一致
 temp.append(wind)
 temp.append(wind)
wind_scale = day.find('span',{'class':'wind1'}).string# 找到风级
index1 = wind_scale.index('级')
temp.append(int(wind_scale[index1-1:index1]))
final.append(temp)
return final
def write_to_csv(file_name, data, day=14):
"""保存为csv文件"""
with open(file_name, 'a', errors='ignore', newline='') as f:
 if day == 14:
header = ['日期','天气','最低气温','最高气温','风向1','风向2','风级']
 else:
header = ['小时','温度','风力方向','风级','降水量','相对湿度','空气质量']
 f_csv = csv.writer(f)
 f_csv.writerow(header)
 f_csv.writerows(data)
def main():
"""主函数"""
print("Weather test")
# 珠海
url1 = 'http://www.weather.com.cn/weather/101280701.shtml'# 7天天气中国天气网
url2 = 'http://www.weather.com.cn/weather15d/101280701.shtml' # 8-15天天气中国天气网
html1 = getHTMLtext(url1)
data1, data1_7 = get_content(html1)# 获得1-7天和当天的数据
html2 = getHTMLtext(url2)
data8_14 = get_content2(html2) # 获得8-14天数据
data14 = data1_7 + data8_14
#print(data)
write_to_csv('weather14.csv',data14,14) # 保存为csv文件
write_to_csv('weather1.csv',data1,1)
if __name__ == '__main__':
main()

data1_analysis.py:

# data1_analysis.py
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import math
def tem_curve(data):
"""温度曲线绘制"""
hour = list(data[&#39;小时&#39;])
tem = list(data[&#39;温度&#39;])
for i in range(0,24):
 if math.isnan(tem[i]) == True:
tem[i] = tem[i-1]
 tem_ave = sum(tem)/24 # 求平均温度
tem_max = max(tem)
tem_max_hour = hour[tem.index(tem_max)] # 求最高温度
tem_min = min(tem)
tem_min_hour = hour[tem.index(tem_min)] # 求最低温度
x = []
y = []
for i in range(0, 24):
 x.append(i)
 y.append(tem[hour.index(i)])
plt.figure(1)
plt.plot(x,y,color=&#39;red&#39;,label=&#39;温度&#39;) # 画出温度曲线
plt.scatter(x,y,color=&#39;red&#39;) # 点出每个时刻的温度点
plt.plot([0, 24], [tem_ave, tem_ave], c=&#39;blue&#39;, linestyle=&#39;--&#39;,label=&#39;平均温度&#39;)# 画出平均温度虚线
plt.text(tem_max_hour+0.15, tem_max+0.15, str(tem_max), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最高温度
plt.text(tem_min_hour+0.15, tem_min+0.15, str(tem_min), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最低温度
plt.xticks(x)
plt.legend()
plt.title(&#39;一天温度变化曲线图&#39;)
plt.xlabel(&#39;时间/h&#39;)
plt.ylabel(&#39;摄氏度/℃&#39;)
plt.show()
def hum_curve(data):
"""相对湿度曲线绘制"""
hour = list(data[&#39;小时&#39;])
hum = list(data[&#39;相对湿度&#39;])
for i in range(0,24):
 if math.isnan(hum[i]) == True:
hum[i] = hum[i-1]
 hum_ave = sum(hum)/24 # 求平均相对湿度
hum_max = max(hum)
hum_max_hour = hour[hum.index(hum_max)] # 求最高相对湿度
hum_min = min(hum)
hum_min_hour = hour[hum.index(hum_min)] # 求最低相对湿度
x = []
y = []
for i in range(0, 24):
 x.append(i)
 y.append(hum[hour.index(i)])
plt.figure(2)
plt.plot(x,y,color=&#39;blue&#39;,label=&#39;相对湿度&#39;) # 画出相对湿度曲线
plt.scatter(x,y,color=&#39;blue&#39;) # 点出每个时刻的相对湿度
plt.plot([0, 24], [hum_ave, hum_ave], c=&#39;red&#39;, linestyle=&#39;--&#39;,label=&#39;平均相对湿度&#39;)# 画出平均相对湿度虚线
plt.text(hum_max_hour+0.15, hum_max+0.15, str(hum_max), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最高相对湿度
plt.text(hum_min_hour+0.15, hum_min+0.15, str(hum_min), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最低相对湿度
plt.xticks(x)
plt.legend()
plt.title(&#39;一天相对湿度变化曲线图&#39;)
plt.xlabel(&#39;时间/h&#39;)
plt.ylabel(&#39;百分比/%&#39;)
plt.show()
def air_curve(data):
"""空气质量曲线绘制"""
hour = list(data[&#39;小时&#39;])
air = list(data[&#39;空气质量&#39;])
print(type(air[0]))
for i in range(0,24):
 if math.isnan(air[i]) == True:
air[i] = air[i-1]
 air_ave = sum(air)/24 # 求平均空气质量
air_max = max(air)
air_max_hour = hour[air.index(air_max)] # 求最高空气质量
air_min = min(air)
air_min_hour = hour[air.index(air_min)] # 求最低空气质量
x = []
y = []
for i in range(0, 24):
 x.append(i)
 y.append(air[hour.index(i)])
plt.figure(3)

for i in range(0,24):
 if y[i] <= 50:
plt.bar(x[i],y[i],color=&#39;lightgreen&#39;,width=0.7)# 1等级
 elif y[i] <= 100:
plt.bar(x[i],y[i],color=&#39;wheat&#39;,width=0.7) # 2等级
 elif y[i] <= 150:
plt.bar(x[i],y[i],color=&#39;orange&#39;,width=0.7) # 3等级
 elif y[i] <= 200:
plt.bar(x[i],y[i],color=&#39;orangered&#39;,width=0.7)# 4等级
 elif y[i]  300:
plt.bar(x[i],y[i],color=&#39;maroon&#39;,width=0.7) # 6等级
plt.plot([0, 24], [air_ave, air_ave], c=&#39;black&#39;, linestyle=&#39;--&#39;)# 画出平均空气质量虚线
plt.text(air_max_hour+0.15, air_max+0.15, str(air_max), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最高空气质量
plt.text(air_min_hour+0.15, air_min+0.15, str(air_min), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最低空气质量
plt.xticks(x)
plt.title(&#39;一天空气质量变化曲线图&#39;)
plt.xlabel(&#39;时间/h&#39;)
plt.ylabel(&#39;空气质量指数AQI&#39;)
plt.show()
def wind_radar(data):
"""风向雷达图"""
wind = list(data[&#39;风力方向&#39;])
wind_speed = list(data[&#39;风级&#39;])
for i in range(0,24):
 if wind[i] == "北风":
wind[i] = 90
 elif wind[i] == "南风":
wind[i] = 270
 elif wind[i] == "西风":
wind[i] = 180
 elif wind[i] == "东风":
wind[i] = 360
 elif wind[i] == "东北风":
wind[i] = 45
 elif wind[i] == "西北风":
wind[i] = 135
 elif wind[i] == "西南风":
wind[i] = 225
 elif wind[i] == "东南风":
wind[i] = 315
degs = np.arange(45,361,45)
temp = []
for deg in degs:
 speed = []
 # 获取 wind_deg 在指定范围的风速平均值数据
 for i in range(0,24):
if wind[i] == deg:
 speed.append(wind_speed[i])
 if len(speed) == 0:
temp.append(0)
 else:
temp.append(sum(speed)/len(speed))
print(temp)
N = 8
theta = np.arange(0.+np.pi/8,2*np.pi+np.pi/8,2*np.pi/8)
# 数据极径
radii = np.array(temp)
# 绘制极区图坐标系
plt.axes(polar=True)
# 定义每个扇区的RGB值(R,G,B),x越大,对应的颜色越接近蓝色
colors = [(1-x/max(temp), 1-x/max(temp),0.6) for x in radii]
plt.bar(theta,radii,width=(2*np.pi/N),bottom=0.0,color=colors)
plt.title(&#39;一天风级图&#39;,x=0.2,fontsize=20)
plt.show()
def calc_corr(a, b):
"""计算相关系数"""
a_avg = sum(a)/len(a)
b_avg = sum(b)/len(b)
cov_ab = sum([(x - a_avg)*(y - b_avg) for x,y in zip(a, b)])
 sq = math.sqrt(sum([(x - a_avg)**2 for x in a])*sum([(x - b_avg)**2 for x in b]))
corr_factor = cov_ab/sq
return corr_factor
def corr_tem_hum(data):
"""温湿度相关性分析"""
tem = data[&#39;温度&#39;]
hum = data[&#39;相对湿度&#39;]
plt.scatter(tem,hum,color=&#39;blue&#39;)
plt.title("温湿度相关性分析图")
plt.xlabel("温度/℃")
plt.ylabel("相对湿度/%")
plt.text(20,40,"相关系数为:"+str(calc_corr(tem,hum)),fontdict={&#39;size&#39;:&#39;10&#39;,&#39;color&#39;:&#39;red&#39;})
plt.show()
print("相关系数为:"+str(calc_corr(tem,hum)))
def main():
plt.rcParams[&#39;font.sans-serif&#39;]=[&#39;SimHei&#39;] # 解决中文显示问题
plt.rcParams[&#39;axes.unicode_minus&#39;] = False# 解决负号显示问题
data1 = pd.read_csv(&#39;weather1.csv&#39;,encoding=&#39;gb2312&#39;)
print(data1)
tem_curve(data1)
hum_curve(data1)
air_curve(data1)
wind_radar(data1)
corr_tem_hum(data1)
if __name__ == &#39;__main__&#39;:
main()
data14_analysis.py:
# data14_analysis.py
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import math
def tem_curve(data):
"""温度曲线绘制"""
date = list(data[&#39;日期&#39;])
tem_low = list(data[&#39;最低气温&#39;])
tem_high = list(data[&#39;最高气温&#39;])
for i in range(0,14):
 if math.isnan(tem_low[i]) == True:
tem_low[i] = tem_low[i-1]
 if math.isnan(tem_high[i]) == True:
tem_high[i] = tem_high[i-1]
 tem_high_ave = sum(tem_high)/14 # 求平均高温
 tem_low_ave = sum(tem_low)/14 # 求平均低温

tem_max = max(tem_high)
tem_max_date = tem_high.index(tem_max) # 求最高温度
tem_min = min(tem_low)
tem_min_date = tem_low.index(tem_min) # 求最低温度
x = range(1,15)
plt.figure(1)
plt.plot(x,tem_high,color=&#39;red&#39;,label=&#39;高温&#39;)# 画出高温度曲线
plt.scatter(x,tem_high,color=&#39;red&#39;) # 点出每个时刻的温度点
plt.plot(x,tem_low,color=&#39;blue&#39;,label=&#39;低温&#39;)# 画出低温度曲线
plt.scatter(x,tem_low,color=&#39;blue&#39;) # 点出每个时刻的温度点

plt.plot([1, 15], [tem_high_ave, tem_high_ave], c=&#39;black&#39;, linestyle=&#39;--&#39;)# 画出平均温度虚线
plt.plot([1, 15], [tem_low_ave, tem_low_ave], c=&#39;black&#39;, linestyle=&#39;--&#39;)# 画出平均温度虚线
plt.legend()
plt.text(tem_max_date+0.15, tem_max+0.15, str(tem_max), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最高温度
plt.text(tem_min_date+0.15, tem_min+0.15, str(tem_min), ha=&#39;center&#39;, va=&#39;bottom&#39;, fontsize=10.5)# 标出最低温度
plt.xticks(x)
plt.title(&#39;未来14天高温低温变化曲线图&#39;)
plt.xlabel(&#39;未来天数/天&#39;)
plt.ylabel(&#39;摄氏度/℃&#39;)
plt.show()
def change_wind(wind):
"""改变风向"""
for i in range(0,14):
 if wind[i] == "北风":
wind[i] = 90
 elif wind[i] == "南风":
wind[i] = 270
 elif wind[i] == "西风":
wind[i] = 180
 elif wind[i] == "东风":
wind[i] = 360
 elif wind[i] == "东北风":
wind[i] = 45
 elif wind[i] == "西北风":
wind[i] = 135
 elif wind[i] == "西南风":
wind[i] = 225
 elif wind[i] == "东南风":
wind[i] = 315
return wind
def wind_radar(data):
"""风向雷达图"""
wind1 = list(data[&#39;风向1&#39;])
wind2 = list(data[&#39;风向2&#39;])
wind_speed = list(data[&#39;风级&#39;])
wind1 = change_wind(wind1)
wind2 = change_wind(wind2)

degs = np.arange(45,361,45)
temp = []
for deg in degs:
 speed = []
 # 获取 wind_deg 在指定范围的风速平均值数据
 for i in range(0,14):
if wind1[i] == deg:
 speed.append(wind_speed[i])
if wind2[i] == deg:
 speed.append(wind_speed[i])
 if len(speed) == 0:
temp.append(0)
 else:
temp.append(sum(speed)/len(speed))
print(temp)
N = 8
theta = np.arange(0.+np.pi/8,2*np.pi+np.pi/8,2*np.pi/8)
# 数据极径
radii = np.array(temp)
# 绘制极区图坐标系
plt.axes(polar=True)
# 定义每个扇区的RGB值(R,G,B),x越大,对应的颜色越接近蓝色
colors = [(1-x/max(temp), 1-x/max(temp),0.6) for x in radii]
plt.bar(theta,radii,width=(2*np.pi/N),bottom=0.0,color=colors)
plt.title(&#39;未来14天风级图&#39;,x=0.2,fontsize=20)
plt.show()
def weather_pie(data):
"""绘制天气饼图"""
weather = list(data[&#39;天气&#39;])
dic_wea = { }
for i in range(0,14):
 if weather[i] in dic_wea.keys():
dic_wea[weather[i]] += 1
 else:
dic_wea[weather[i]] = 1
print(dic_wea)
explode=[0.01]*len(dic_wea.keys())
color = [&#39;lightskyblue&#39;,&#39;silver&#39;,&#39;yellow&#39;,&#39;salmon&#39;,&#39;grey&#39;,&#39;lime&#39;,&#39;gold&#39;,&#39;red&#39;,&#39;green&#39;,&#39;pink&#39;]
plt.pie(dic_wea.values(),explode=explode,labels=dic_wea.keys(),autopct=&#39;%1.1f%%&#39;,colors=color)
plt.title(&#39;未来14天气候分布饼图&#39;)
plt.show()
def main():
plt.rcParams[&#39;font.sans-serif&#39;]=[&#39;SimHei&#39;] # 解决中文显示问题
plt.rcParams[&#39;axes.unicode_minus&#39;] = False# 解决负号显示问题
data14 = pd.read_csv(&#39;weather14.csv&#39;,encoding=&#39;gb2312&#39;)
print(data14)
tem_curve(data14)
wind_radar(data14)
weather_pie(data14)
if __name__ == &#39;__main__&#39;:
main()

Atas ialah kandungan terperinci Apakah kaedah untuk merangkak data cuaca dan analisis visual dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam