美文网首页解密大数据
作业-天气数据简单分析

作业-天气数据简单分析

作者: pnjoe | 来源:发表于2017-07-10 21:00 被阅读1750次

    天气数据简单分析-作业

    天气数据简单分析

    课堂作业

    • 使用本课所学的方法,在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这一栏 用饼形图表来呈现,该如何写函数.(自己心理是这么想的.用饼形图.可以直观看出,晴天,雨天,雪天...各占多少比例)

    相关阅读:


    相关文章

      网友评论

        本文标题:作业-天气数据简单分析

        本文链接:https://www.haomeiwen.com/subject/ycpuhxtx.html