- 水知識圖譜-資料處理腳本
- 需求
- 規格
- 設計
- V0.1
- V0.0.2
- 開發思路
- OpenDataMgr 簡單說明
- V0.0.1
- V 未來
- 實作
- 驗證
- Bug & Issue
- 測試
- 釋出
- 環境需求
- 安裝
- 研究
- google sheet programming
- Water Knowledge Graph opendata class - interactive mode
- usage manual
- python Panda 參考
- usage example
- pandasql
- 使用技巧
- 可能的問題
- 資料查詢的練習
- Q: 裡面有水質資料嗎? 查一下水盒子怎麼佈比較好? 然後管場域的是哪些機關?
- Q: 查詢計畫書跟預算的開放資料?
- Library
- 參考
需求
規格
設計
V0.1
V0.0.2
V0.0.1
V 未來
實作
驗證
Bug & Issue
測試
釋出
環境需求
安裝
研究
SELECT DISTINCT ?river ?riverLabel ?destLabel ?length WHERE {
?river wdt:P17 wd:Q865;
wdt:P31 wd:Q4022.
OPTIONAL {?river wdt:P403 ?dest.}
OPTIONAL {?river wdt:P2043 ?length.}
SERVICE wikibase:label { bd:serviceParam wikibase:language "zh". }
}
ORDER BY DESC(?length)
google sheet programming
Water Knowledge Graph opendata class - interactive mode
# start and setup
(base) wuulong-pro:script wuulong$ python
Python 3.7.1 (default, Dec 14 2018, 13:28:58)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from codes.opendata import *
['"https://data.gov.tw/datasets/export/csv?type=dataset&order=pubdate&qs=&uid=', 'opendata_list.csv']
[nan, 'db.csv']
DataMgr inited for interactive used
dMgr,odMgr,ldMgr,od_df,ld_df,rivercode_df,river_df,colname_df,term_df variable ready
>>> from codes.opendata import *
>>> odMgr = OpenDataMgr()
>>> odMgr.od_df.columns
Index(['資料集名稱', '服務分類', '檔案格式', '資料下載網址', '編碼格式', '資料集類型', '資料集描述', '主要欄位說明',
'提供機關', '更新頻率', '授權方式', '相關網址', '計費方式', '提供機關聯絡人姓名', '提供機關聯絡人電話',
'上架日期', '詮釋資料更新時間', '備註', 'df'],
dtype='object')
>>> did1=22223
>>> odMgr.od_df.loc[did1]
資料集名稱 河川流量測站站況
服務分類 公共資訊
檔案格式 JSON;CSV;XML
資料下載網址 https://data.wra.gov.tw/Service/OpenData.aspx?...
編碼格式 UTF-8;UTF-8;UTF-8
資料集類型 b01
資料集描述 本資料集主要描述水利署所屬流量站之基本資料,有助於了解流量站的相關內容。 資料集中包括包括測...
主要欄位說明 AffiliatedBasin;AffiliatedSubsidiaryBasin;Affi...
提供機關 經濟部水利署
更新頻率 即時
授權方式 政府資料開放授權條款-第1版
相關網址 https://data.wra.gov.tw/WraStandardWrisp/Query...
計費方式 免費
提供機關聯絡人姓名 蔡斐毓 先生
提供機關聯絡人電話 02-37073091
上架日期 2017/09/12 15:49
詮釋資料更新時間 2019/05/01 14:56
備註 NaN
df AffiliatedBasin AffiliatedSubsidiaryBasi...
Name: 22223, dtype: object
>>> odMgr.get_dataset(did1)
True
>>> df1 = odMgr.od_df['df'][did1]
>>> df1.columns
Index(['AffiliatedBasin', 'AffiliatedSubsidiaryBasin',
'AffiliatedSubSubsidiaryBasin', 'AlertLevel1', 'AlertLevel2',
'AlertLevel3', 'BasinIdentifier', 'BrittlenessStatus',
'CarDriveDistanceInHours', 'CityElectricitySupplyStatus',
'ConstructionManagement', 'CrossRiverStructuresNameOfEquipment',
'DataCollectionFrequecy', 'DataSubmitted', 'DrainageArea',
'DrainageStatus', 'EcologicalEnvironmentMonitoring',
'ElevationOfWaterLevelZeroPoint', 'EnglishAddress', 'EnglishgRiverName',
'EnglishName', 'EquipmentStatus',
'EquipmentStatusOnCrossRiverStructures', 'FloodPreventionPurpose',
'HighSedimentStatus', 'HydroFacilityManagement',
'HydrologicalMonitoringPurpose', 'LightningStatus', 'LocationAddress',
'LocationByTWD67_XY', 'LocationByTWD97_XY', 'MaintainCycle',
'NoPeriodicalDataSubmissionReason', 'NormalObservationType',
'ObervationItems', 'ObservationMethod', 'ObservationReason',
'ObservationStatus', 'ObservatoryIdentifier', 'ObservatoryName',
'OnSiteDataCollection', 'OtherRequirement',
'RealTimeDataDeliveryFrequency',
'RealTimeDataDeliveryFrequencyInFloodDefenceTime', 'Remarks',
'ReplaceStatus', 'RiverName', 'RiverSectionDepositionAndErosionChange',
'SetDate', 'ShortObservationType', 'SolarPotentialDemage',
'SolarStatus', 'StealStatus', 'StraightRiverStatus', 'SubsidenceStatus',
'SunLightCoverageStatus', 'SunshineStatus', 'TideStatus', 'TownName',
'TransmissionEquipment', 'UpStreamReservoirStatus',
'VerticalDatumSource', 'WalkDistanceInHours', 'WaterDrawStatus',
'WaterResourceDistrictIdentifier', 'WaterResourceNumber',
'WirelessTransmissionType'],
dtype='object')
>>> df1.loc[0]
AffiliatedBasin 1140
AffiliatedSubsidiaryBasin NaN
AffiliatedSubSubsidiaryBasin NaN
AlertLevel1 NaN
AlertLevel2 NaN
AlertLevel3 NaN
BasinIdentifier 1140H001
BrittlenessStatus NaN
CarDriveDistanceInHours NaN
CityElectricitySupplyStatus NaN
ConstructionManagement NaN
CrossRiverStructuresNameOfEquipment NaN
DataCollectionFrequecy NaN
DataSubmitted NaN
DrainageArea 335.29
DrainageStatus 2
EcologicalEnvironmentMonitoring NaN
ElevationOfWaterLevelZeroPoint 68800
EnglishAddress Yufeng T.Jianshi H. Hsinchu H.
EnglishgRiverName Dahan River
EnglishName YU FENG
EquipmentStatus NaN
EquipmentStatusOnCrossRiverStructures NaN
FloodPreventionPurpose NaN
HighSedimentStatus 2
HydroFacilityManagement NaN
HydrologicalMonitoringPurpose NaN
LightningStatus NaN
LocationAddress 新竹縣尖石鄉玉峰村
LocationByTWD67_XY 279345.50 2727961.80
...
ObservationStatus 現存
ObservatoryIdentifier 19
ObservatoryName 玉峰(馬利哥灣)
OnSiteDataCollection NaN
OtherRequirement NaN
RealTimeDataDeliveryFrequency NaN
RealTimeDataDeliveryFrequencyInFloodDefenceTime NaN
Remarks NaN
ReplaceStatus NaN
RiverName 大漢溪
RiverSectionDepositionAndErosionChange 5
SetDate NaN
ShortObservationType NaN
SolarPotentialDemage NaN
SolarStatus NaN
StealStatus NaN
StraightRiverStatus 2
SubsidenceStatus NaN
SunLightCoverageStatus NaN
SunshineStatus NaN
TideStatus 2
TownName NaN
TransmissionEquipment NaN
UpStreamReservoirStatus 2
VerticalDatumSource 5
WalkDistanceInHours NaN
WaterDrawStatus 2
WaterResourceDistrictIdentifier 10
WaterResourceNumber 11
WirelessTransmissionType NaN
Name: 0, Length: 67, dtype: object
>>> did2=22227
>>> odMgr.get_dataset(did2)
True
>>> df1[df1['RiverName']=='蘭陽溪']['ObservatoryName']
105 牛鬥(1)
106 蘭陽大橋
107 家源橋
110 北成橋
111 牛鬥(3)
Name: ObservatoryName, dtype: object
>>> df2[df2['RiverName']=='蘭陽溪']['ObservatoryName']
739 牛鬥(1)
740 牛鬥(2)
741 圓山
742 天送埤
744 蘭陽大橋
745 南興
749 壯圍提尾
750 獨立山
751 壯圍
752 家源橋
757 北成橋
758 牛鬥(3)
Name: ObservatoryName, dtype: object
>>> stations = list(df1[df1['RiverName']=='蘭陽溪']['ObservatoryName'])
>>> stations.extend(list(df2[df2['RiverName']=='蘭陽溪']['ObservatoryName']))
>>> set(stations)
{'壯圍提尾', '牛鬥(2)', '獨立山', '牛鬥(1)', '牛鬥(3)', '家源橋', '蘭陽大橋', '南興', '壯圍', '圓山', '天送埤', '北成橋'}
>>> odf = odMgr.od_df
>>> odf.groupby('提供機關')['資料集名稱'].count()
提供機關
中國輸出入銀行 18
中央存款保險股份有限公司 16
中央研究院 21
中央警察大學 12
...
高雄市鳥松區公所 4
高雄市鹽埕區公所 2
高雄榮民總醫院 3
高雄高等行政法院 56
Name: 資料集名稱, Length: 723, dtype: int64
>>> riverlist = ['濁水溪','淡水河']
>>> df = pd.DataFrame(riverlist, columns = ["RiverName"])
>>> df
RiverName
0 濁水溪
1 淡水河
>>> merge_df = pd.merge(df, df1, left_on='RiverName',right_on='RiverName', how='left')
>>> merge_df[['RiverName','ObservatoryName']]
RiverName ObservatoryName
0 濁水溪 彰雲橋
1 濁水溪 玉峰橋
2 濁水溪 溪州大橋
3 濁水溪 寶石橋
4 濁水溪 南雲大橋
5 淡水河 覽勝橋
history:
from codes.opendata import *
odMgr = OpenDataMgr()
river_df = odMgr.get_riverlist()
did1=22227
df1=odMgr.get_dataset(did1)
merge_df = pd.merge(river_df, df1, left_on='Name',right_on='RiverName', how='left')
merge_df[['RiverName','ObservatoryName']]
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
df1[df1.isna().any(axis=1)] # 秀出 有 nan 的那些行內容
cur=df1[['RiverName','ObservatoryName','AffiliatedBasin']]
cur=df1[['RiverName','ObservatoryName']]
merge_df1 = pd.merge(river_df, cur.dropna(), left_on='Name',right_on='RiverName', how='left',left_index=True).dropna()
#concat_df = pd.concat([river_df, cur.dropna()], join="inner")
cur.dtypes
cur = cur.astype({'AffiliatedBasin': str})
merge_df = merge_df1[['Name','ObservatoryName','AffiliatedBasin']]
merge_df.groupby('Name')['ObservatoryName'].count()
merge_df.sort_values(by=['col1'])
merge_df.groupby('Name')['ObservatoryName'].count().sort_values(ascending=False)
group_df = merge_df.groupby('Name')['ObservatoryName'].apply(lambda x: ','.join(x)) #河上有哪些站
group_df.sort_index(ascending=True)
#
rivercode_df = odMgr.get_dataset(22228) #河川代碼
od_df[['主要欄位說明']].values # to array
>>> type(od_df[['主要欄位說明']].ix[:,0])
<class 'pandas.core.series.Series'>
od_df[['主要欄位說明']].ix[:,0].str.split(pat = ";")
wra=od_df[od_df['提供機關']=='經濟部水利署']
desc=wra[['資料集名稱','主要欄位說明']]
desc=desc.dropna()
colname_df = pd.DataFrame(desc['主要欄位說明'].str.split(';').tolist(), index=desc['資料集名稱']).stack()
colname_df = colname_df.reset_index([0, '資料集名稱'])
colname_df.columns = ['資料集名稱', 'Colname']
colname_groupby_df = colname_df.groupby('Colname')['資料集名稱'].apply(lambda x: ','.join(x)) #colname 被哪些 dataset 用到
colname_df.to_csv(index=False)
export_csv = colname_df.to_csv ('output/out.csv', index = None, header=True)
like_df = od_df[od_df['資料集名稱'].str.contains('登山')]
df[df['A'].str.contains("hello")]
ignore_df=term_df['欄位忽略詞'].dropna().reset_index([0],'欄位忽略詞')
#欄位 count > 5, 不是忽略詞
colname_groupby_df = colname_df.groupby('Colname')['資料集名稱'].count().sort_values(ascending=False)
freq_df = colname_groupby_df[colname_groupby_df>=5]
mon_list = list(set(freq_df.index) - set(ignore_df.values))
mon_s = pd.Series(mon_list)
dot_df=colname_df[colname_df['Colname'].isin(mon_s.values)]
myprint = lambda row: "\"%s\" -> \"%s\";" %(row[1],row[0])
print(dot_df.apply(myprint, axis=1).to_string(index=False))
odMgr.gen_col_tree(False,5)
pandasql
使用技巧
可能的問題
BasinIdentifier;BasinName;EnglishBasinName;EnglishSubsidiaryBasinName;EnglishSubSubsidiaryBasinName;EnglishSubSubSubsidiaryBasinName;GovernmentUnitIdentifier;Remarks;SubsidiaryBasinIdentifier;SubsidiaryBasinName;SubSubsidiaryBasinIdentifier;SubSubsidiaryBasinName;SubSubSubsidiaryBasinIdentifier;SubSubSubsidiaryBasinName
資料查詢的練習
#89036 重要河川水質概況
#6078 河川水質監測資料 ,有測站位置
#72351 河川水質監測站位置圖 ,KML
#6701 河川水質季監測資料
#6395 水庫水質監測點基本資料
#8820 水庫水質監測站位置圖
#6345 水庫水質監測資料
#37221 環保專案摘要資料_水質保護
欄位說明
AffiliatedBasin(測站所屬流域,主流)、AffiliatedSubsidiaryBasin(測站所屬之流域,支流 備註:測站因位於主流上故未填寫支流名稱。)、AffiliatedSubSubsidiaryBasin(測站所屬之流域,次支流 備註:測站因位於主流或支流上故未填寫次支流名稱。)、AlertLevel1(一級警戒水位高,一級警戒水位高[m] 備註:部分測站並未指定一級警戒水位高。)、AlertLevel2(二級警戒水位高,二級警戒水位高[m] 備註:部分測站並未指定二級警戒水位高。)、AlertLevel3(三級警戒水位高,三級警戒水位高[m] 備註:部分測站並未指定三級警戒水位高。)、BasinIdentifier(流域編號)、BrittlenessStatus(是否易受天災破壞)、CarDriveDistanceInHours(所需車程,單程,小時)、CityElectricitySupplyStatus(測站有市電供電)、ConstructionManagement(工程施工管理)、CrossRiverStructuresNameOfEquipment(設置之橋樑或構造物名稱,設置之橋樑或構造物名稱 備註:部分測站因選址問題並非位於特定橋梁或構造物上,故無法填寫。)、DataCollectionFrequecy(現場收集資料之頻率,日)、DataSubmitted(水文資料是否定期送水文組彙整)、DrainageArea(集水面積)、DrainageStatus(測站上游是否有放水點)、EcologicalEnvironmentMonitoring(生態環境監測)、ElevationOfWaterLevelZeroPoint(水尺零點標高)、EnglishAddress(英文站址)、EnglishgRiverName(河川英文名稱)、EnglishName(英文站名)、EquipmentStatus(設備型態)、EquipmentStatusOnCrossRiverStructures(是否設置於跨河構造物)、FloodPreventionPurpose(防汛用途)、HighSedimentStatus(是否為高含砂量河段)、HydroFacilityManagement(水利設施管理)、HydrologicalMonitoringPurpose(水文觀測用途)、LightningStatus(測站是否易遭雷擊)、LocationAddress(中文站址)、LocationByTWD67_XY(TM2度分帶67XY坐標)、LocationByTWD97_XY(TM2度分帶97XY坐標)、MaintainCycle(現場巡邏或維護之頻率,日)、NoPeriodicalDataSubmissionReason(水文資料無定期送水文組彙整原因)、NormalObservationType(正常觀測之性質)、ObervationItems(觀測項目)、ObservationMethod(觀測方式)、ObservationReason(觀測原因)、ObservationStatus(觀測現況)、ObservatoryIdentifier(站號)、ObservatoryName(中文站名)、OnSiteDataCollection(是否有人工現場收集資料)、OtherRequirement(特定計畫或特定需求)、RealTimeDataDeliveryFrequency(即時資料傳送頻率,平時)、RealTimeDataDeliveryFrequencyInFloodDefenceTime(即時資料傳送頻率,防汛時)、Remarks(備註)、ReplaceStatus(是否有暫時取代之測站)、RiverName(河川中文名稱)、RiverSectionDepositionAndErosionChange(測站斷面沖淤變化)、SetDate(設站日期)、ShortObservationType(短期觀測的原因)、SolarPotentialDemage(設站地點太陽能板可能易遭外力破壞)、SolarStatus(測站有太陽能供電)、StealStatus(是否易受人為破壞或竊盜)、StraightRiverStatus(是否位於平直河段)、SubsidenceStatus(是否位於容易地層下陷地區)、SunLightCoverageStatus(設站點陽光易受遮蔽)、SunshineStatus(日照是否充足)、TideStatus(是否感潮)、TownName(鄉鎮名稱)、TransmissionEquipment(是否有傳輸設備)、UpStreamReservoirStatus(上游引蓄水)、VerticalDatumSource(基準高程之引測來源)、WalkDistanceInHours(所需步行路程,單程,小時)、WaterDrawStatus(測站上游是否有引水點)、WaterResourceDistrictIdentifier(水資源分區編號)、WaterResourceNumber(水資源分區編號)、WirelessTransmissionType(無線傳輸方式)
#大腸桿菌群 在哪個河流測
array(['東港溪', '鹽水溪', '朴子溪', '阿公店溪', '二仁溪', '高屏溪', '曾文溪', '急水溪', '港口溪',
'知本溪', '利嘉溪', '太平溪', '卑南溪', '保力溪', '四重溪', '楓港溪', '枋山溪', '率芒溪',
'林邊溪'], dtype=object)
流域編碼 --> 水位站-->流量站-->水質(流量站 環保署共站 不定期冊水質)
1140 淡水河 ---> 1140H001 玉峰 -->1140H001 玉峰 --->-->1140H001 玉峰
有水位站 不一定有流量站
但有流量監測一定會有水位站
Library
參考