python气象数据分析_气象数据分析--数据预处理
氣象數(shù)據(jù)處理流程通常的數(shù)據(jù)分析流程相似,但是氣象數(shù)據(jù)有本身的一些特殊性存在,比如風(fēng)向和風(fēng)速,降水等數(shù)據(jù),其中風(fēng)向由0-360之間的值表示,而風(fēng)速的變化通常是很小的,除非碰到一些極端情況。
數(shù)據(jù)分析通常包括以下幾部分:明確分析目標(biāo)
數(shù)據(jù)準(zhǔn)備和數(shù)據(jù)預(yù)處理
數(shù)據(jù)分析和可視化
數(shù)據(jù)分析報(bào)告
以上是簡(jiǎn)單的數(shù)據(jù)分析任務(wù)涉及到的分析流程,對(duì)于一些比較復(fù)雜的數(shù)據(jù)分析任務(wù)可能需要花費(fèi)大量的時(shí)間進(jìn)行探索性數(shù)據(jù)分析(即數(shù)據(jù)挖掘中常說(shuō)的EDA)以及數(shù)學(xué)建模,并且不斷的對(duì)建模效果進(jìn)行評(píng)估。
下面以氣象風(fēng)向和風(fēng)速數(shù)據(jù)為例,講一下氣象數(shù)據(jù)分析流程。此次的數(shù)據(jù)分析的任務(wù)是對(duì)多個(gè)數(shù)據(jù)源進(jìn)行數(shù)據(jù)準(zhǔn)確度評(píng)估,因此不會(huì)涉及到太復(fù)雜的分析。在進(jìn)行分析評(píng)估之前需要對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,而數(shù)據(jù)預(yù)處理對(duì)于后續(xù)的數(shù)據(jù)分析和建模來(lái)說(shuō)是至關(guān)重要的,因?yàn)榇蟛糠衷紨?shù)據(jù)是不完整的,而且通常會(huì)包含很多噪聲,比如:重復(fù)數(shù)據(jù),缺失值,離散值(異常值)等問(wèn)題。
本文以觀測(cè)的風(fēng)場(chǎng)數(shù)據(jù)為例,重點(diǎn)說(shuō)一下數(shù)據(jù)預(yù)處理部分:
數(shù)據(jù)介紹
150個(gè)站點(diǎn)的逐小時(shí)風(fēng)場(chǎng)數(shù)據(jù),其中包括日期,站點(diǎn)名稱(chēng),經(jīng)度,緯度,風(fēng)速和風(fēng)向六個(gè)要素。這些數(shù)據(jù)是原始數(shù)據(jù)處理后保留的部分,原始數(shù)據(jù)包含更多要素,而且原始數(shù)據(jù)是按照每小時(shí)一個(gè)文件保存的,文件名按照時(shí)間命名,這部分涉及到數(shù)據(jù)批量處理,后面會(huì)說(shuō)。
數(shù)據(jù)預(yù)處理
相信很多人拿到原始數(shù)據(jù)的時(shí)候,面對(duì)逐小時(shí)的大量數(shù)據(jù)文件會(huì)感到非常頭疼。當(dāng)進(jìn)行時(shí)間序列數(shù)據(jù)的批處理時(shí),有兩種方式可以處理這種問(wèn)題:
1)逐文件讀取,并存儲(chǔ)每個(gè)文件名對(duì)應(yīng)的時(shí)間
這種方式應(yīng)該是比較好理解的,就是有多少文件就逐個(gè)讀,只是需要記錄每個(gè)文件的文件名來(lái)確定時(shí)間
2)確定起始時(shí)間和結(jié)束時(shí)間以及時(shí)間間隔,然后按照文件命名方式名稱(chēng)循環(huán)讀取
這種方式不需要額外的處理時(shí)間,因?yàn)楫?dāng)你讀取文件的時(shí)候就已經(jīng)確定時(shí)間了
上述兩種方式都需要注意一個(gè)問(wèn)題:數(shù)據(jù)缺失。比如,對(duì)于逐小時(shí)存儲(chǔ)的數(shù)據(jù),如果某一個(gè)小時(shí)的數(shù)據(jù)缺失了,那很可能沒(méi)有這個(gè)時(shí)刻的文件,如果不注意的話在進(jìn)行時(shí)間序列分析的時(shí)候就會(huì)出現(xiàn)問(wèn)題。
在程序中進(jìn)行循環(huán)讀取時(shí),要注意處理數(shù)據(jù)缺失的情況,尤其是按照第二種方式讀取時(shí),因?yàn)橐坏┯龅綌?shù)據(jù)缺失,而又沒(méi)有進(jìn)行處理,那么數(shù)據(jù)讀取就會(huì)因?yàn)槲募笔Ф袛唷?/p>
本文以python為例,給出以上兩種方式的處理代碼:
方式一:
import os
import glob
from datetime import datetime
import pandas as pd
files = glob.glob(os.path.join('../Desktop/201802/', '*.xlsx'))
datas = pd.DataFrame()
dates = []
for f in sorted(files):
data = pd.read_excel(f, index_col=0)
date = datetime.strptime(os.path.splitext(os.path.split(f)[1])[0], '%Y%m%d%H')
dates.append([date]*data.shape[0])
datas = datas.append(data)
datas.index = np.ravel(np.array(dates))
方式二:
dates = pd.date_range(datetime(2018, 2, 1, 0), datetime(2018, 2, 28, 23), freq='1h')
fpfas = [os.path.join(fp, '%d%02d%02d%02d.xlsx'%(date.year, date.month, date.day, date.hour)) for date in dates] alldata = pd.DataFrame()
for fpf in fpfas:
try:
data = pd.read_excel(fpf, index_col=0)
alldata = alldata.append(data)
except:
print('%s 缺失.'%fpf)
數(shù)據(jù)批量處理部分有很多的細(xì)節(jié)需要注意,關(guān)于選擇什么策略進(jìn)行批處理,有時(shí)候需要考慮到數(shù)據(jù)的存儲(chǔ)方式以及數(shù)據(jù)文件的一些特點(diǎn)。方式二的處理沒(méi)有太多需要說(shuō)的,主要注意一下方式一中的一些函數(shù)用法,后文不再貼入代碼,所有程序會(huì)上傳到github,后面會(huì)給出鏈接。
至此數(shù)據(jù)準(zhǔn)備完成,下面開(kāi)始進(jìn)行數(shù)據(jù)預(yù)處理。由于數(shù)據(jù)是以站點(diǎn)為單位觀測(cè),而且存在經(jīng)緯度信息,首先看一下站點(diǎn)的分布。注意:
1)在查看站點(diǎn)分布之前首先要確定已有的站點(diǎn)的大概在什么范圍,這樣便于判斷是否有站點(diǎn)經(jīng)緯度信息出現(xiàn)明顯錯(cuò)誤
2)對(duì)于有需要確定站點(diǎn)是否遷移的情況時(shí),要額外判斷單個(gè)站點(diǎn)名稱(chēng)經(jīng)緯度坐標(biāo)的唯一性
圖中可以看出大部分站點(diǎn)是非常集中的,而且由于事先已經(jīng)確定原始數(shù)據(jù)的站點(diǎn)非常集中,因此可以確定有些站點(diǎn)的經(jīng)緯度坐標(biāo)出現(xiàn)問(wèn)題,這部分就需要進(jìn)行確定是什么問(wèn)題(本例中經(jīng)緯度坐標(biāo)出錯(cuò)的站點(diǎn)原因是經(jīng)緯度坐標(biāo)顛倒了)。
修復(fù)了上述站點(diǎn)經(jīng)緯度錯(cuò)誤的問(wèn)題之后,接著分析原始數(shù)據(jù)中的各個(gè)變量值的分布以及數(shù)據(jù)缺失情況:
比如上圖中顯示風(fēng)速值的分布情況,可以看出大部分值分布在10 m/s以下,這說(shuō)明大部分?jǐn)?shù)據(jù)是正常的,而少量數(shù)據(jù)超過(guò)了 20 m/s,這部分?jǐn)?shù)據(jù)是否異常需要做進(jìn)一步的判斷。在進(jìn)一步判斷之前先確定數(shù)據(jù)缺失的情況。
大部分站點(diǎn)的數(shù)據(jù)僅缺少5個(gè)時(shí)刻的數(shù)據(jù),但是仍有10個(gè)站點(diǎn)的數(shù)據(jù)缺失比較嚴(yán)重。僅確定數(shù)據(jù)缺失多少還無(wú)法確定數(shù)據(jù)缺失是連續(xù)的還是某些單個(gè)時(shí)刻缺失,這需要畫(huà)出缺失較多的站點(diǎn)的數(shù)據(jù)缺失情況時(shí)間序列圖來(lái)確定(由于本例不需要關(guān)注這些,所以這部分沒(méi)有做。當(dāng)進(jìn)行數(shù)據(jù)挖掘,構(gòu)建算法時(shí)需要記進(jìn)行更為繁瑣的數(shù)據(jù)預(yù)處理)。
下一步就是進(jìn)行異常值檢測(cè),對(duì)于陸面監(jiān)測(cè)站來(lái)說(shuō),大多數(shù)情況下風(fēng)速低于20 m/s,當(dāng)出現(xiàn)雷雨大風(fēng)等極端天氣的時(shí)候風(fēng)速值會(huì)更大,但是風(fēng)速的變化是漸變的,因此除了判斷風(fēng)速是否出現(xiàn)異常大的值外,還需要判斷相鄰時(shí)刻風(fēng)速差值是否出現(xiàn)比較大的變化;而風(fēng)向的變化是比較難確定的,因此本例中僅檢查風(fēng)向是否出現(xiàn)小于0和大于360的情況。異常值檢測(cè)的部分在代碼中給出了。
下圖是對(duì)數(shù)據(jù)缺失的站點(diǎn)進(jìn)行了分級(jí),分為缺失超過(guò)50個(gè)時(shí)刻的站點(diǎn),缺失在5到50個(gè)時(shí)刻之間以及缺失少于5個(gè)時(shí)刻的站點(diǎn)的分布,填充等值線是地形分布。這部分僅在需要對(duì)站點(diǎn)地形分布進(jìn)行分析的時(shí)候才做,一般情況下可以不做。
說(shuō)明:由于種種原因,此次的數(shù)據(jù)無(wú)法公開(kāi),所以?xún)H提供部分代碼,在代碼文件中給出了一部分的解釋以及分析思路。
本例使用的工具有excel和python,使用excel進(jìn)行簡(jiǎn)單的時(shí)間序列分析,大部分的數(shù)據(jù)預(yù)處理使用python進(jìn)行處理。excel處理部分文中沒(méi)有提及。希望下次的數(shù)據(jù)分析能夠提供原始數(shù)據(jù)和完整代碼。
代碼鏈接:https://github.com/bugsuse/DataAnalysis/blob/master/%E6%B0%94%E8%B1%A1%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90--%E6%95%B0%E6%8D%AE%E9%A2%84%E5%A4%84%E7%90%86.ipynb
總結(jié)
以上是生活随笔為你收集整理的python气象数据分析_气象数据分析--数据预处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 双链表的基本操作---插入,删除,交,并
- 下一篇: python pip安装seaborn