天气数据简单分析-作业
天气数据简单分析课堂作业
- 使用本课所学的方法,在Jupyter Notebook中分析天气数据(数据将在小密圈发布)
- 将分析报告发布到简书--解密大数据专栏
本机环境
- Windows 7 64位 操作系统
- Anaconda Navigator 1.6.2
- Jupyter notobook 5.0.0
- Python 3.6.1
数据导入
- 模块导入
# 导入 pandas 模块 import pandas as pd # 设置直接显示图片 %matplotlib inline
文件导入
- 方法一:
csvfile = open('C:\\Users\\Administrator\\weatherdata.csv','r') weather = pd.read_csv(csvfile, parse_dates=True, index_col='Date') # parse_dates=True 意思是 将在数据中,所有关于时间的数据都解析成时间格式. # index_col='Date' 意思是将Date这列数据作为索引.
- 方法二:
# 上面导入文件两行代码也可合并写成下面一行代码. # (导入的文件必须在程序同个目录下,才可只写文件名,省略具体路径.) weather = pd.read_csv('weatherdata.csv', parse_dates=True, index_col='Date')
用 数据框(DataFrame)格式 显示天气数据
weather.jpgweather
数据观察
# 观察头部数据. 默认显示5行. # 如需显示多行,可以在 `head()` 的括号内填入您想要展示的行数.(前提是不要超过数据总行数) # 例如: weather.head(10) weather.head()
# 观察尾部数据. 默认显示5行. weather.tail()
数据的形状
# 行 列 weather.shape
(365, 7)
由此可以得知这是某地全年的天气数据
# 列 / 字段名 weather.column
Index(['TemperatureF', 'Humidity', 'SeaLevelPressureIn', 'VisibilityMiles','WindSpeedMPH', 'CloudCover', 'Events'], dtype='object')
由此可以数据的字段有:温度,湿度,海平面压力,能见度,风速,云量,气象活动.
# 索引 weather.index
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04', '2013-01-05', '2013-01-06', '2013-01-07', '2013-01-08', '2013-01-09', '2013-01-10', ... '2013-12-22', '2013-12-23', '2013-12-24', '2013-12-25', '2013-12-26', '2013-12-27', '2013-12-28', '2013-12-29', '2013-12-30', '2013-12-31'], dtype='datetime64[ns]', name='Date', length=365, freq=None)
数据总体信息
weather.info()
<class 'pandas.core.frame.DataFrame'> DatetimeIndex: 365 entries, 2013-01-01 to 2013-12-31 Data columns (total 7 columns): TemperatureF 365 non-null int64 Humidity 365 non-null int64 SeaLevelPressureIn 365 non-null float64 VisibilityMiles 365 non-null int64 WindSpeedMPH 365 non-null int64 CloudCover 365 non-null int64 Events 207 non-null object dtypes: float64(1), int64(5), object(1) memory usage: 22.8+ KB
数据的统计描述
weather.describe()
数据输出&分析
绘图(折线图)
# 刚学了绘图函数,迫不及待地就想出个图看看 # 在不加任何参数下,直接出图 weather.plot()
但上图太混乱了.所有数据都夹杂上去.单位也不统一.
所以呢.心急吃不了热豆腐,慢慢来,单项输出分析吧 _
温度分析
全年华氏温度折线图 单位: F# 全年温度折线图 X轴:日期 Y轴:温度 单位:华氏温标 F weather.plot(y='TemperatureF', figsize=(18,8))
华氏温度的数据对我来说不是很敏感.平常用的是摄氏温度 ℃ .
那么可否把它转换成摄氏温度呢?有了想法.那就行动吧.谷歌了一下.找到了换算公式.
{华氏温度F 换算成 摄氏温度℃}: ℃ = (F - 32) / 1.8因小白,暂时不会 在不动原数据框数据的前提下,运用公式直接换算 并在图表上呈现.
不过课堂上老师有教新增列的函数.那我不是可以新增一列摄氏温度的数据.
然后再图表展现这一列的数据呢.我来试一下吧.# 新增 Celsius 列. # 生成新的摄氏温度加到这张表格里. weather['Celsius'] = ( weather['TemperatureF'] - 32 ) / 1.8
全年摄氏度折线图 单位:℃weather.plot(y='Celsius', figsize=(20,8)) # 上面这行也可以这么写 # weather.Celsius.plot(figsize=(20,8))
换算成摄氏温度的图表,看上去顺眼点.
图表上可以明显看出6-8月份温度高(夏季) 12,1,2月份温度低(冬季)
可以推断出是北半球地区. 南半球季节划分是怎么样?
冬季会下雪, ... 可以推断出此地区是 在北温带weather.Celsius.plot(kind='kde') weather.Celsius.describe()
全年温度 密度图表# 运行结果 count 365.000000 mean 10.940639 std 10.091396 min -12.777778 25% 1.111111 50% 12.777778 75% 20.000000 max 26.666667 Name: Celsius, dtype: float64
此地全年最高温度为26.67℃, 最低温度为-12.78℃. 全年平均温度为10.94℃ 全年大部时间温度在20℃左右.次之是0℃左右. 可以推断出夏季不热,冬季满冷的. 像我长期住在中国广东.没见过雪.体质对抗不了强低温. 倘若我有意去此地旅游的话.可以选择夏季去.(夏季最高也才27℃,对我来说,很凉爽了.)
湿度分析
全年湿度折线图# 全年湿度折线图 weather.plot(y='Humidity', figsize=(25,6))
weather.Humidity.plot(kind='kde') weather.Humidity.describe()
全年湿度 密度表# 运行结果 count 365.000000 mean 71.178082 std 13.646380 min 34.000000 25% 63.000000 50% 72.000000 75% 82.000000 max 97.000000 Name: Humidity, dtype: float64
关于湿度指标.自己也不懂,特地问了一下度娘
最宜人的室内温湿度是:(95%的人在此范围内感到舒适) * 在冬天温度为20至25℃环境下,相对湿度为30%至80%; * 在夏天温度为23至30℃环境下,相对湿度为30%至60%。 * 在装有空调的室内,室温为20至25℃,湿度为40%至50%时,人会感到最舒适。 * 工作效率高的室温度:20℃,相对湿度应是40%至60%,此时,人的精神状态好,思维最敏捷。 * 室内相对湿度过小时,因上呼吸道粘膜的水分大量散失,人会感到口干、舌燥,甚至咽喉肿痛、声音嘶哑和鼻出血等,并易患感冒。 * 湿度高于65%会使人体呼吸系统和粘膜产生不适,免疫力下降。 * 所以,专家们研究认为,相对湿度上限值不应超过80%,下限值不应小于30%。
结论:健康的湿度环境是45%~65%,在这样的湿度条件下,人体感觉最舒适,各种病菌不易传播。
此地全年最高相对湿度为97%,最低相对湿度为34%,平均相对湿度为71.17%
从以上图表信息,可以看出.此地绝大部分时间湿度偏高.湿润气候. 估计全年雨雪天气占比不会少.
海平面压力分析
# 全年海平面气压 折线图 weather.plot(y='SeaLevelPressureIn', figsize=(25,6)) weather.SeaLevelPressureIn.describe()
全年海平面压力折线图count 365.000000 mean 30.062027 std 0.186156 min 29.450000 25% 29.930000 50% 30.070000 75% 30.180000 max 30.600000 Name: SeaLevelPressureIn, dtype: float64
全年 最高海平面气压值为30.6, 最低海平面气压值为29.45, 平均海平面气压值为30.06
能见度分析
全年能见度折线图 单位:KM# 全年 能见度 折线图 # 原单位英里Mile 换算成 公里Km # 新增VisibilityKm列 weather['VisibilityKm'] = weather['VisibilityMiles'] * 1.61 weather.plot(y='VisibilityKm', figsize=(25,6))
全年能见度密度图表weather.VisibilityKm.plot(kind='kde')
能见度的气象学定义:大气透明度
- 能见度20-30公里 能见度极好 视野清晰
- 能见度15-20公里 能见度好 视野较清晰
- 能见度10-15公里 能见度一般
- 能见度5-10公里 能见度较差 视野不清晰
- 能见度1-5公里 轻雾 能见度差 视野不清晰
- 能见度0.3-1公里 大雾 能见度很差
- 能见度小于0.3公里 重雾 能见度非常差
- 能见度小于0.1公里 浓雾 能见度极度差
- 能见度不足100米通常被认为为零
weather.VisibilityKm.plot(kind='box') weather.VisibilityKm.describe()
全年能见度箱图count 365.000000 mean 13.528411 std 3.157241 min 1.610000 25% 11.270000 50% 14.490000 75% 16.100000 max 16.100000 Name: VisibilityKm, dtype: float64
此地全年能见度, 最低1.61公里,最高16.1公里.平均13.53公里.
全年绝大部分能见度都超过10公里.比起北京强多了.
风速分析
全年风速折线图 单位:km/h# 全年 风速(MPH) 折线图 # 原单位:MPH(迈)英里每小时 # 换算一下成 公里每小时(km/h) 公式:1 mph = 1.609344 km/h, # 新增列 WindSpeedKmh weather['WindSpeedKmh'] = weather['WindSpeedMPH'] * 1.609344 weather.plot(y='WindSpeedKmh', figsize=(25,8))
全年风速密度图weather.plot(y='WindSpeedKmh',kind='kde')
weather.WindSpeedKmh.plot(kind='box') weather.WindSpeedKmh.describe()
全年风速 箱图count 365.000000 mean 11.618141 std 5.311174 min 1.609344 25% 8.046720 50% 11.265408 75% 14.484096 max 33.796224 Name: WindSpeedKmh, dtype: float64
来个表格,让风速数据有画面感.
风级 名称 风速(km/h) 陆地地面物象 海面波浪 0 无风 < 1 静,烟直上 平静 1 软风 1 - 5 烟示风向 微波峰无飞沫 2 轻风 6 - 11 感觉有风 小波峰未破碎 3 微风 12 - 19 旌旗展开 小波峰顶破裂 4 和风 20 - 28 吹起尘土 小浪白沫波峰 5 清风 29 - 38 小树摇摆 中浪折沫波峰 6 强风 39 - 49 电线有声 大浪白沫离峰 7 疾风 50 - 61 步行困难 破峰白沫成条 8 大风 62 - 74 折毁树枝 浪长高有浪花 9 烈风 75 - 88 小损房屋 浪峰倒卷 10 狂风 89 - 102 拔起树木 海浪翻滚咆哮 11 暴风 103 - 117 损毁重大 波峰全呈飞沫 12 台风 117 - 134 摧毁极大 海浪滔天 据以上多图表得出
- 最高风速 33.80km/h (5 级风);
- 最低风速 1.61km/h (1 级风);
- 平均风速 11.62km/h (3 级风);
- 此地2013年全年没有刮过台风,最高也就5级风. 绝大部分时间风速为8-15km/h(即2-3级风)
CloudCover分析
# 全年 云盖 折线图 weather.plot(y='CloudCover', figsize=(25,6)) weather.CloudCover.describe()
count 365.000000 mean 4.191781 std 2.647088 min 0.000000 25% 2.000000 50% 4.000000 75% 6.000000 max 8.000000 Name: CloudCover, dtype: float64
据以上图表得出
- 全年最高CloudCover为8;
- 最低CloudCover为0;
- 平均CloudCover为4.19.
切片练习
# 将十二个月份的天气数据切片成单独的月份数据 Jan=weather.loc[:'2013-01-31'] Feb=weather.iloc[31:31+28] Mar=weather.loc['2013-03-01':'2013-03-31'] Apr=weather.loc['2013-04-01':'2013-04-30'] May=weather.loc['2013-05-01':'2013-05-31'] Jun=weather.loc['2013-06-01':'2013-06-30'] Jul=weather.loc['2013-07-01':'2013-07-31'] Aug=weather.loc['2013-08-01':'2013-08-31'] Sep=weather.loc['2013-09-01':'2013-09-30'] Oct=weather.loc['2013-10-01':'2013-10-31'] Nov=weather.loc['2013-11-01':'2013-11-30'] Dec=weather.loc['2013-12-01':] # .loc 后面参数填 表格里的数值 # .iloc 后面参数填 数字索引 从0开始算,第一个就是0,第二个就是1,依此类推 # 如 2月1号. 就是第32条数据.它的数字索引就是31,不是32哦.因为第一个是0开始数. # 当以第一条数据开头的 即":"前为第一条数据时, 可以省略不写. # 当以最后一条数据结尾的 即":"后为最后一条数据时 可以省略不写.
1月份的摄氏温度折线图# 将1月份的摄氏温度Celsius 绘图出来 Jan.plot(y='Celsius')
2月份的湿度 横向条形图# 将2月份的湿度 用横向条形图(以宽度6,高度10) 绘图出来 Feb.plot(y='Humidity', kind='barh', figsize=(6,10))
3月份的海平面压力 箱线图# 将3月份的海平面压力 用箱线图表示出来 Mar.plot(y='SeaLevelPressureIn', kind='box', figsize=(3,9))
4月份的可见度 条形图# 将4月份的可见度 用条形图表示出来 单位:英里 Apr.plot(y='VisibilityMiles', kind='bar', figsize=(9,3))
老师,这里的X轴上 日期后面为什么会自动带上时间.看上去好复杂哦.可否隐藏掉呢?
5月份的华氏温TemperatureF 与 摄氏温度Celsius 折线图# 将5月份的华氏温TemperatureF 与 摄氏温度Celsius 绘图出来 May.plot(y=['Celsius','TemperatureF'])
7.13 更新
看了 @张利东 同学的作业. 学到了一个温差的指标. 忍不住要来更新一下.
全年2天间湿度差 折线图# 新增一列温差数据.(当天温度与前一天温度数据的 差值 的绝对值 ) weather['TemperatureDiff'] = abs(weather['Celsius'] - weather['Celsius'].shift(1)) weather.plot(y='TemperatureDiff', figsize=(30,8)) weather.plot(y='TemperatureDiff',kind='density')
全年2天间湿度差 密度图weather.plot(y='TemperatureDiff',kind='box', figsize=(3,8)) weather.TemperatureDiff.describe()
全年2天间湿度差 箱图count 364.000000 mean 2.741148 std 2.542770 min 0.000000 25% 1.111111 50% 2.222222 75% 3.888889 max 14.444444 Name: TemperatureDiff, dtype: float64
weather.TemperatureDiff[weather.TemperatureDiff > 8]
Date 2013-01-14 10.000000 2013-01-19 10.000000 2013-01-21 9.444444 2013-01-28 9.444444 2013-01-29 10.555556 2013-01-31 14.444444 2013-02-01 8.888889 2013-03-10 8.333333 2013-03-12 8.333333 2013-04-07 11.111111 2013-04-20 8.888889 2013-05-15 13.333333 2013-05-24 10.000000 2013-05-28 8.333333 2013-11-23 9.444444 2013-12-06 9.444444 2013-12-23 11.111111 2013-12-24 11.111111 Name: TemperatureDiff, dtype: float64
分析以上几个图表得知,此地全年(两天之间)温差如下:
- 最高温差14.44℃,
- 最低温差0℃.
- 平均温差2.74℃
- 绝大部分温度在1.5-4℃ 之间.
- 异常值有不少.有18个温差在8℃ 以上 主要也集中在冬季
结论
综合上述数据分析.最终分析结论有:
- 此数据表为某地2013年全年的气象数据,字段有('TemperatureF', 'Humidity', 'SeaLevelPressureIn', 'VisibilityMiles','WindSpeedMPH', 'CloudCover', 'Events')
- 全年平均温度为10.94℃; 平均空气相对湿度为71.17%; 平均海平面气压值为30.06;
平均能见度可达13.53公里;平均风速11.62km/h (3 级风);平均CloudCover为4.19;- 此地为北半球的北温带地区;
- 此地常年湿度大,雨雪天气不少;
- 此地能见度好.
- 此地2013年全年无台风灾害.常年微风.
- 此地常年两天间的温度差为4℃以下.但也有存在20来天特殊情况:两天之间温差在10℃左右.
- 此地夏季不热,温度18~25℃之间.温差小,能见度好,微风.(去此地旅游宜选在夏季).
疑问
- 2月份 4月份的图表,日期轴上的时间可否隐藏?
- 我想将Events这一栏 用饼形图表来呈现,该如何写函数.(自己心理是这么想的.用饼形图.可以直观看出,晴天,雨天,雪天...各占多少比例)
相关阅读:
- makdown教程:Markdown 语法说明 (简体中文版)
- pandas官方帮助文档:plot函数参数
网友评论