求助:用python获取天气预报

Python048

求助:用python获取天气预报,第1张

# 获取温度、湿度、风力等

WEATHER_URL_A = "http://www.weather.com.cn/data/sk/%s.html"

# 获取天气状况、最大/小温度等

WEATHER_URL_B = "http://www.weather.com.cn/data/cityinfo/%s.html"

# 获取未来7天天气数据

WEATHER_URL_C = "http://www.weather.com.cn/weather/%s.shtml"

URL里%s指城市对应的代码。详细参考:

http://www.cnblogs.com/toosuo/p/3868004.html

不过这篇文章里有的接口已经不能用了。

上面我给的三个URL里,前两个直接返回json格式数据;第三个返回是一个页面,需要自己从页面里提取想要的信息。

使用到了urllib库和bs4。bs4提供了专门针对html的解析功能,比用RE方便许多。

# coding : UTF-8import sys

reload(sys)

sys.setdefaultencoding( "utf-8" )from bs4 import BeautifulSoupimport csvimport urllibdef get_html(url):

html = urllib.urlopen(url)return html.read()def get_data(html_text):

final = []

bs = BeautifulSoup(html_text, "html.parser")

body = bs.body

data = body.find('div', {'id': '7d'})

ul = data.find('ul')

li = ul.find_all('li')for day in li:

temp = []

date = day.find('h1').string

temp.append(date)

inf = day.find_all('p')

temp.append(inf[0].string,)if inf[1].find('span') is None:

temperature_highest = None

else:

temperature_highest = inf[1].find('span').string

temperature_highest = temperature_highest.replace('C', '')

temperature_lowest = inf[1].find('i').string

temperature_lowest = temperature_lowest.replace('C', '')

temp.append(temperature_highest)

temp.append(temperature_lowest)

final.append(temp)return finaldef write_data(data, name):

file_name = namewith open(file_name, 'a') as f:

f_csv = csv.writer(f)

f_csv.writerows(data)if __name__ == '__main__':

html_doc = get_html('http://www.weather.com.cn/weather/101190401.shtml')

result = get_data(html_doc)

write_data(result, 'weather.csv')print result12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

运行结果保存在csv文件中,如下:

28日(今天),小雨,,13℃29日(明天),小雨转阴,15℃,12℃30日(后天),多云,19℃,14℃31日(周一),小雨,16℃,14℃1日(周二),阴转多云,16℃,10℃2日(周三),多云转晴,17℃,10℃3日(周四),多云转晴,18℃,11℃1234567

近年来,我国的环境问题比较严重,很多城市出现了雾霾天气,当然也有很多城市空气依旧清新,为了研究具体的空气环境城市分布,我们采用了假设检验以及线性回归的思想对AQI(空气质量指数)进行分析和预测,其中AQI的值越大,表示空气质量越差,AQI值越小,表明空气质量越好。

1.列出空气质量优秀/较差的五个城市

2.全国空气质量分布情况

3.临海城市和内陆城市的空气质量对比

4.影响空气指数的因素

5.空气质量均值验证

City 城市名

AQI 空气质量指数

Precipitation 降雨量

GDP 城市生产总值

Temperature 温度

Longitude 经度

Latitude 纬度

Altitude 海拔高度

PopulationDensity 人口密度

Coastal 是否沿海

GreenCoverageRate 绿化覆盖率

Incineration(10,000ton) 焚烧量(10000吨)

在进行数据分析之前,我们对数据集进行观察并对其中的缺失值、重复值、异常值进行处理

我们发现降雨量数据中包含了4个缺失值,为了保证数据的精确,我们查一下降雨量的数据分布

很明显的呈现右偏分布,因此采用平均数来替代缺失值并不妥,我们这里用中位数来代替

GDP属性中检测出8条异常值,我们这里采取用极端值替换的方式,将异常值替换成最大值

数据集处理完毕之后,我们开始进行数据分析

按照AQI降序排列,选出排名前五以及后五的城市,进行可视化,结果如下

结论:空气质量较好的城市为韶关市、南平市、梅州市、基隆市、三明市,空气质量堪忧的城市分别为焦作市、锦州市、保定市、朝阳市、北京市

这里我们将AQI指数分为六个等级,并根据等级统计全国空气质量的等级情况

我们再用散点图绘制下全国的空气质量分布

结论:我国城市的空气质量集中在一级、二级和三级,高污染城市比例较低;从地理位置来看,西部城市空气质量优于东部城市,南部城市优于北部城市。

根据上面的结论我们发现,仿佛临海城市的空气质量普遍高于内陆地区,那么这个结论是否是真的呢?还需要进一步验证。

首先,我们来统计下不同地理环境的城市数量

第二步,绘制临海和内陆城市的AQI分布图

我们发现内陆城市AQI集中分布在50-100区间内,而沿海城市AQI集中分布在0-50区间,在此样本中,沿海的AQI分布低于内陆城市,但是这毕竟是样本,无法推测出总体分布情况,还需进一步探测。

第三步,统计AQI均值并绘制分布密度图

第四步,差异检验,查看内陆沿海AQI均值分布是否显著

我们先假设内陆城市和沿海城市的平均值相同

结果得出支持的概率为0.006,远低于0.05,因此我们否定原假设,选择备择假设,即内陆城市和沿海城市的平均值不相同

结论:经过分析,我们发现有超过99%的概率可以证明临海城市空气质量优于内陆城市的空气质量。

为了探究影响空气质量的具体因素,我们需要计算出两个变量之间的相关系数,以此进行判断,这里采用热力图进行可视化操作。

结论:从显示结果看出,AQI主要受降雨量和纬度的影响,其中降雨量越多,空气质量越好(0.4);纬度越低,空气质量越好(-0.55)

当然,从整个图片来看,也能发现很多变量之间的关系,比如GDP与焚烧量的正相关系数达到了0.9,温度与纬度的负相关系数达到了-0.81等。

传闻空气质量均值在71左右,这个消息是否是准确的呢?我们进行一次验证。

首先计算样本的均值

结果显示为75.334

那么总体的均值是否为71呢?这里先假设总体的均值为71,进行t检验

结论:可以看出,偏离均值1.81倍的标准差,而且p值大于0.05,我们接受原假设(即空气质量均值在71左右)另外,我们还可以计算出在置信度为95%时,空气质量均值的置信区间为70-80。