解密大数据

作业-天气数据简单分析

2017-07-10  本文已影响1750人  pnjoe

天气数据简单分析-作业

天气数据简单分析

课堂作业

  • 使用本课所学的方法,在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
weather.jpg

数据观察

# 观察头部数据.  默认显示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()

但上图太混乱了.所有数据都夹杂上去.单位也不统一.
所以呢.心急吃不了热豆腐,慢慢来,单项输出分析吧 _

温度分析

# 全年温度折线图 X轴:日期  Y轴:温度  单位:华氏温标 F
weather.plot(y='TemperatureF', figsize=(18,8))
全年华氏温度折线图 单位: F

华氏温度的数据对我来说不是很敏感.平常用的是摄氏温度 ℃ .
那么可否把它转换成摄氏温度呢?

有了想法.那就行动吧.谷歌了一下.找到了换算公式.
{华氏温度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


能见度分析

# 全年 能见度 折线图
# 原单位英里Mile 换算成 公里Km
# 新增VisibilityKm列
weather['VisibilityKm'] = weather['VisibilityMiles'] * 1.61
weather.plot(y='VisibilityKm', figsize=(25,6))
全年能见度折线图 单位:KM
weather.VisibilityKm.plot(kind='kde')
全年能见度密度图表

能见度的气象学定义:大气透明度

  1. 能见度20-30公里 能见度极好 视野清晰
  2. 能见度15-20公里 能见度好 视野较清晰
  3. 能见度10-15公里 能见度一般
  4. 能见度5-10公里 能见度较差 视野不清晰
  5. 能见度1-5公里 轻雾 能见度差 视野不清晰
  6. 能见度0.3-1公里 大雾 能见度很差
  7. 能见度小于0.3公里 重雾 能见度非常差
  8. 能见度小于0.1公里 浓雾 能见度极度差
  9. 能见度不足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公里.比起北京强多了.


风速分析

# 全年 风速(MPH) 折线图
# 原单位:MPH(迈)英里每小时
# 换算一下成 公里每小时(km/h)   公式:1 mph = 1.609344 km/h,
# 新增列 WindSpeedKmh
weather['WindSpeedKmh'] = weather['WindSpeedMPH'] * 1.609344
weather.plot(y='WindSpeedKmh', figsize=(25,8))
全年风速折线图 单位:km/h
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月份的摄氏温度Celsius 绘图出来
Jan.plot(y='Celsius')
1月份的摄氏温度折线图
# 将2月份的湿度 用横向条形图(以宽度6,高度10) 绘图出来 
Feb.plot(y='Humidity', kind='barh', figsize=(6,10))
2月份的湿度 横向条形图
# 将3月份的海平面压力 用箱线图表示出来
Mar.plot(y='SeaLevelPressureIn', kind='box', figsize=(3,9))
3月份的海平面压力 箱线图
# 将4月份的可见度 用条形图表示出来 单位:英里
Apr.plot(y='VisibilityMiles', kind='bar', figsize=(9,3))
4月份的可见度 条形图

老师,这里的X轴上 日期后面为什么会自动带上时间.看上去好复杂哦.可否隐藏掉呢?

# 将5月份的华氏温TemperatureF 与 摄氏温度Celsius 绘图出来
May.plot(y=['Celsius','TemperatureF'])
5月份的华氏温TemperatureF 与 摄氏温度Celsius 折线图

7.13 更新

看了 @张利东 同学的作业. 学到了一个温差的指标. 忍不住要来更新一下.

# 新增一列温差数据.(当天温度与前一天温度数据的 差值 的绝对值 )
weather['TemperatureDiff'] = abs(weather['Celsius'] - weather['Celsius'].shift(1))
weather.plot(y='TemperatureDiff', figsize=(30,8))
weather.plot(y='TemperatureDiff',kind='density')
全年2天间湿度差 折线图
全年2天间湿度差 密度图
weather.plot(y='TemperatureDiff',kind='box', figsize=(3,8))
weather.TemperatureDiff.describe()
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
全年2天间湿度差 箱图
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这一栏 用饼形图表来呈现,该如何写函数.(自己心理是这么想的.用饼形图.可以直观看出,晴天,雨天,雪天...各占多少比例)

相关阅读:


上一篇下一篇

猜你喜欢

热点阅读