數據採集與預處理課設——人在迴路的氣溫數據動態處理與可視化
- 2022 年 7 月 20 日
- 筆記
數據採集與預處理課設——人在迴路的氣溫數據動態處理與可視化
摘要
本次研究旨在通過python網絡爬蟲技術,獲得中國各城市近90天的氣象數據,運用HTML、Xpath、jieba、counter等技術對數據進行處理,繪製動態可視化圖、詞雲圖等,結合@chenjiandongx等人提供的pyecharts技術將其具現在地圖上的同時,採用LSTM時間序列分析技術實現基於歷史數據的天氣預測。我們希望通過實現全國城市氣象數據的可視化,把握異常氣候影響範圍與程度。相較於傳統的圖片可視化,本研究採用網頁動態展示,通過實現地圖中城市鏈接到對應網頁,網頁控件關聯數據表數據視圖、圖表類型以及窗口範圍,大大增加了交互性,方便了研究與使用。
引言
大數據時代的到來為氣象研究提供了大量的數據支撐,如何高效地獲取與使用現有的大量數據已成為重要的研究課題。但由於數據過於分散,沒有公開的大型氣象信息可視化平台,日常研究受到數據數量以及工具的限制。
本研究試通過對全國數據整合分析,實現數據全覽的可視化分析網頁平台搭建,基於當前易獲取數據做出對於大數據的情況的合理規劃與嘗試,設計了滑動窗口與數據縮放,並提供了基於LSTM時間序列分析的氣象預測數據,為氣象學者研究氣候學做出切實可行的嘗試,有利於對水電等重要資源進行合理規劃與調度。
數據模型
如表1-1,在天氣網導航頁中記錄了各個城市歷史天氣信息的網址索引鏈接。通過訪問導航頁面,採用xpath訪問./@href的值,獲得各個城市歷史信息的網址。
表1-1 擬爬取網頁信息表
全國所有城市信息 |
//www.tianqishi.com/lishi/ |
單個城市近90天天氣數據 |
//www.tianqishi.com + city.xpath(‘./@href’) |
如表1-2,訪問頁面獲取各個城市的數據,得到圖1中的歷史天氣信息表格,通過加註數據標籤設置省市名稱,備註網站URL,添加數據標籤轉存到csv文件中,並以省市名稱命名文件。
圖1 網頁中歷史天氣數據信息
程序中用到的城市天氣信息數據如表1-2。
表1-2 城市天氣信息數據採集表
字段名稱 |
數據類型 |
數據說明 |
provinceName |
Str |
省級名稱 |
city_name |
Str |
城市名稱 |
city_url |
Str |
城市對應網頁地址 |
data |
List[Str,Str,Str,Str,Str,Str] |
城市單日天氣數據 |
軟件架構
如圖2,首先採用python網絡爬蟲技術獲取網頁數據信息,通過文本預處理,採用正則表達式提取城市信息、對日期信息進行數據類型轉換、此外將其他數據進行收集與文字編碼後存儲至csv文件中。通過訪問csv文件,將「天氣情況」數據使用逗號拼接為文本,而後調用jieba庫進行中文分詞、採用counter進行詞頻統計。
調用pyecharts實現中國城市地圖具象在網頁中,而後在每個城市對應控件後的value中存儲其url的值。對每個城市存儲在csv的信息進行動態可視化與詞雲圖繪製,實現line表和bar表的切換,同時設置對最高溫和最低溫的堆疊、平鋪功能切換,設置區域縮放以及窗口自調整功能。通過Page.SimplePageLayout布局形式將其居中顯示在網頁中間,更好地適應用戶使用以及屏幕大小的改變。
最後在map圖中添加鼠標響應,對value值進行調用,改變map中屬性的值實現每個城市控件的高亮顯示,以及通過window.open實現新窗口的打開。
圖2 軟件架構圖
採集策略與預處理模型
數據採集流程圖
圖3 數據採集流程圖
關鍵數據採集與預處理策略
(1)通過xpath訪問ul結點,存儲每個結點下的HTML內容,然後同樣採用xpath爬蟲技術,通過url_head + city.xpath(‘./@href’) 的方式,獲得城市頁面的網址,然後記錄省市作為標籤,調用get_WeatherMessage方法獲取數據,此外調用time包,採用time.sleep
的方式控制爬蟲速度,防止被網站服務器發現並停止爬蟲進程。
url_head = '//www.tianqishi.com' for i in tree.xpath("//div[@class='box p']/ul"): provinceName = i.xpath('./li[1]//text()')[0] for city in i.xpath('./li/a'): city_url = url_head + city.xpath('./@href')[0] city_name = city.xpath('.//text()')[0] get_WeatherMessage(provinceName, city_name, city_url) time.sleep(30)
(2)由分析的URL來分別爬取近90天全國各省市的天氣數據,包括日期時間、氣溫、天氣情況、風向、風力、日出、日落等六項數據,獲取到的數據會以指定格式存放。由於採用. CSV 文件能夠使數據交換更加容易,故採用 CSV的形式進行存儲[1]。使用open(fr’D:/dataSave/{provinceName}{city_name}.csv’, ‘a’, encoding=’utf-8′)創建文件並以省市命名csv文件以及sheet,將已讀取的數據列表以續寫的打開方式,採用編碼為utf-8寫入方便後續調用研究使用該數據。
for box in range(1, 90): data = city_tree.xpath(f"//tr[{box}]/td//text()") with open(fr'D:/dataSave/{provinceName}{city_name}.csv', 'a', encoding='utf-8', newline="") as writer: csv_write = csv.writer(writer, dialect='excel') csv_write.writerow(data) writer.close() print('已完成對', city_name, '的爬取', '\n')
(3)採用os.listdir訪問文件夾,獲得文件夾中全部的文件名,記入dirs。然後通過字符拼接獲得所有文件訪問的路徑。此外,通過正則表達式"
歷史天氣(.*?).csv"
獲取文件目錄中的城市名,便於後續在地圖中對應分析。此外,對於日期時間信息進行格式轉化,將其通過pd.to_datetime()轉為日期型數據,再通過dt.date刪去多餘的精度,有利於後續對於單個城市的可視化建圖。然後在通過遍歷表格得到關於天氣情況的txt文本,使用jieba和counter進行詞頻統計。
dirs = os.listdir('D:/dataSave') for filename in dirs: path = 'D:/dataSave/' + filename city = re.findall(r"歷史天氣(.*?).csv", path)[0] data = pd.read_csv(path, encoding='utf-8') data['日期時間'] = data['日期時間'].apply(lambda x: pd.to_datetime(x, format="%Y%m%d")) data['日期時間'] = data['日期時間'].dt.date text = "" for i in data['天氣情況']: text = text + ',' + i words = [x for x in jieba.lcut(text) if x != ','] words_count = Counter(words).most_common(40)
數據分析與可視化
數據可視化
為了使得課題研究數據結果更加清晰明顯,決定將對數據圖進行可視化製作,由於本次課題主要是為了研究各地的天氣波動,於是嘗試將該數據在地圖上採用html的形式展示。
(1)採用來自麻省理工大學的@chenjiandongx等人製作的pyecharts.map中國地圖可視化json文件,並針對可視化需要進行修改。在初始模板中,沒有提供可視化實現方式,僅提供市級區分,以及對應的數據填寫位置,但其對於數據只提供了數字以及字符串類型的解析支持,想要完成外鏈需要自己另外尋找解決方案。通過調試,在每個城市對應的按鍵中以字符串形式存儲了URL地址,實現了僅支持實現單個區域選中並塗色處理。而後嘗試了通過在map中新增方法實現URL的觸發,但由於其不支持HTML文本解析,即使外部導入HTML庫也無法完成該功能;而後嘗試通過在外部添加pyautogui庫實現鼠標事件的獲取,但由於目標數量過多且處於動態變化,無法對應地添加控件時間監視器,故pyautogui庫也無法實現該功能。

圖4 經過初步調試的中國城市地圖
(2)同樣採用@chenjiandongx等人提供的網頁line表繪製,通過查閱資料自己定義屬性值,更改數據顯示方式,頁面框架,動畫渲染,實現了動態切換折線圖與柱狀圖、保存圖片為.png格式查看與更改表格數據、下方設置拉伸條,調整時間條的同時解決了數據密度較大的情況下可能出現的問題,通過標註表示最高溫、最低溫,以及每日最高溫的平均值、最低溫的平均值,可以通過鼠標移動查看每個日期所帶數據,可以選擇隱藏最高氣溫/最低氣溫,僅觀察一項,此外設置區間縮放功能以及撤回功能。由此實現直觀、流暢、界面簡潔、展示效果好的可交互式可視化,供研究使用。

(3)通過調取數據表中「天氣情況」列數據進行文本分析,通過調用jieba庫實現中文分詞,而後採用counter庫進行詞頻統計,最後調用wordcloud生成詞雲圖,該圖表可以實現對近日天氣情況頻率的分析。此外利用網頁的優勢,添加了鼠標事件動態響應標籤,更好地補全了網頁展示的信息。
圖11 天氣情況詞雲圖
(4)通過直接查看與修改網頁前端代碼,學習相關JavaScript知識。先是嘗試了使用JQ選擇器,獲取網頁事件並通過標籤調用實現URL獲取,但由於網頁標籤不夠詳細,無法實現URL的精確定位,故無法解決(1)中的遺留問題;最後選擇在網頁中自行添加鼠標事件獲取響應信息,解析pramas獲得URL地址,而後通過window.open實現新網頁頁面的打開。
chart_46c9f11bad4044d2aa5bde8fd9fda973.on("click", function (params) { url ='file:///'+params.data.value; window.open(url); // window.location.href=url; //更新窗口 });
(5)採用LSTM時間序列分析,基於已有數據訓練得到新的數據。長短期記憶(Long short-term memory, LSTM)相比普通的RNN,LSTM能夠在更長的序列中有更好的表現,故而在面對日益增長的天氣數據時,LSTM能發揮更好的作用。以安徽安慶數據為例,將前十天的日最低氣溫作為訓練集,而後對新一天的最低溫進行預測,得到新的一天的真實數據後加入訓練集進行增強訓練,最終預測結果如圖10所示:可以看到預測結果趨勢與真實值一致,預測效果較為理想。
圖12 時間序列分析預測結果對比圖(橙:實際值,藍:預測值)
結論
本文通過使用python網絡爬蟲獲取天氣網的天氣狀況,實現豐富多樣的數據可視化,幫助使用者在運用相關的專業知識實現對以往數據的橫向和縱向、大尺度和小尺度的比較[1];再者,通過分析氣溫的變化規律,可以得到局部對流空氣對我國天氣的影響情況;通過某地區天氣情況詞頻統計可以判斷城市的宜居程度以及提供旅遊時間參考。
可視化中提供了滑動窗口、視圖縮放,在數據預測分析中採用了LSTM神經網絡,能夠很好地適應數據量增大的情況。總體上,本研究對於構建全國城市大數據氣象信息平台做出了切實可行的嘗試,不論是對氣象學研究還是全國各城市的能源的合理調度分配工作都具有重要意義。
參考文獻
[1] 霍瑛,李海峰,王沖. 基於天氣指數的數據分析_霍瑛[J]. 哈爾濱商業大學學報(自然科學版), 2018, 34(4): 440-446.
[2] 於學斗,柏曉鈺. 基於Python的城市天氣數據爬蟲程序分析_於學斗[J]. 辦公自動化, 2022, 27(7): 10-13, 9.
相較最終版有省略
製作:BDT20040