- 数据分析练习之城市气温分析
- 【练习1】准备数据和转换格式
- 【练习2】 创建一个“年”列的备份列,列名为“年_备份”。
- 【练习3】 删除数据集里面的“月”、“日”列。
- 【练习4】 创建一个新列“星期几”,里面存储对应日期的星期信息。
- 【练习5】 删除数据集里面“年_备份”为201的行(注意:删除行,非删除列,较难)。
- 【练习6】 查询New York City在2000年1月数据。
- 【练习7】 查询New York City在2000年1月到3月的数据。
- 【练习8】 查询New York City在2000年8月最后一天的数据(要求计算8月最后一天的日期)。
- 【练习9】 查询New York City在2000年第47周的数据。
- 【练习10】 查询New York City在2000年7月1号前后15天的数据(总共是31天数据)。
- 【练习11】 查询New York City在2000年7月1号所处周的整周数据(2000年7月1号是星期六,因此显示2000年6月26日至2000年7月2日之间数据,要求通过计算获取所在周的开始和结束日期)。
- 【练习12】 查询New York City在2000年7月1号所处周的工作日数据。
- 【练习13】 查询Paris在2020/1/1的记录。
- 【练习14】 查询Paris在2020/1/1的记录,只显示“日内平均气温”列。
- 【练习15】 查询Paris和New York City在2020/1/1的记录。
- 【练习16】 查询2020/1/1的所有记录。
- 【练习17】 查询2020/1/1的所有亚洲城市的记录。
- 【练习18】 查询London在2020/3/1到2020/4/1之间的所有数据。
- 【练习19】 查询London和Zurich在2019/5/3和2020/5/3的数据,只显示“日内平均气温”列。
- 【练习20】 使用reset_index()复原所有多级索引,并将“区域” “国家”“州”“城市”“日期”设置为多级索引,如图11所示。【练习21】—【练习31】基于图11所示的5级索引。
- 【练习21】 查询所有亚洲的城市记录。
- 【练习22】 查询所有亚洲城市在2020/5/1的记录。
- 【练习24】 查询France和US的所有城市在2020/4/7、2020/4/13、2020/5/3的记录。
- 【练习25】 查询US的Utah州、Iowa州在2018/11的所有记录。
- 【练习26】 将“日内平均气温”列的华氏温度转换为摄氏温度℃(转换公式为:C=(F-32)÷1.8)。
- 【练习27】 查询在2019/8/3气温高于35℃的所有Asia、Europe、North America城市记录。
- 【练习28】 查询Guangzhou在2019年气温位于25℃和35℃之间的所有记录。
- 【练习29】 查询2020/1/1气温低于0℃的Asia的城市记录。
- 【练习30】 查询Paris、London在2019/5/1及2020/1/1到2020/5/1的记录。
- 【练习31】 查询Paris和所有US城市在2019/5/1及2020/1/1到2020/5/1的记录。
- 【练习32】 查询Paris和所有US城市在2019/5/1及2020/1/1到2020/5/1的记录。
- 【练习33】 按“区域”进行排序。
- 【练习34】 按“区域”“国家”“州”进行排序。
- 【练习35】 按“区域”(升序)、“国家”(降序)、“州”(降序)进行排序。
- 【练习36】 查询“Asia”的最高气温。
- 【练习37】 查询“US”在2020年1月–3月的所有城市的平均气温。
- 【练习38】 查询全球2000–2010年的最高温度和最低气温。
- 【练习39】 查询“US”的“New York City”在2019年气温小于0度的日期的数量。
- 【练习40】 查询“Europe”的2019年最低气温及出现的城市和日期(仅限于2019年)。
- 【练习41】 查询2020/1/1最低气温及出现的城市。
- 【练习42】 查询“Beijing”市在2000年的平均气温。
- 【练习43】 查询“Beijing”市气温比2000年平均温度高的日期(仅限于2000年)的数量。
- 【练习44】 计算“Paris”市2019年7月的平均气温和2018年7月平均气温之差。
- 【练习45】 统计各国家的气温平均值。
- 【练习46】 统计各国家的气温平均值,并按照气温平均值降序显示。
- 【练习47】 按年统计各国家的年均气温平均值。
- 【练习48】 统计2019年美国各州的气温最高值、最低值、平均值。
- 【练习49】 查询2019年2月美国月均气温最低的5个州。
- 【练习50】 统计“Paris”市2000年每月的温差。和【练习50】 统计“Paris”市2000年每月的温差,并将统计数据列命名为“月均温差”。
- 【练习51】 统计美国California在2019年7月日均气温高于30℃的天数。
- 【练习52】 统计美国各州1995–2019期间月均气温高于20℃的的月份数量。
- 【练习53】 统计2019年美国California高温天数(日均气温高于30℃)大于15的月份及当月高温天数。
- 【练习54】 查询2017–2019年期间美国年均气温逐步升高(2019年均气温>2018年均气温>2017年均气温>2016年均气温)的州名。
- 【练习55】 按年统计1995–2019期间当年年均气温高于前一年年均气温高的国家数量(如:1996有72个国家年均气温比1995年高,1997年有42个国家年均气温比1996年高)。
数据分析练习之城市气温分析
数据分析的方法很多,参考答案仅供参考,你也可以使用更加简洁高效的方法实现相同的功能。
【练习1】准备数据和转换格式
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv('city_temperature.csv',dtype={'State':object})
# 温度转换
data['AvgTemperature'] =(data['AvgTemperature']-32)/1.8
data.query('City=="Guangzhou" and Month==7').groupby(by='Year')['AvgTemperature'].mean().sort_values(ascending=False)
data.query('City=="Guangzhou" and Month>=7 and Month<=9 and AvgTemperature>=32').groupby(by='Year')
['AvgTemperature'].count().sort_values(ascending=False)
data.columns= ["城市","地区","国家","州","月","日","年","平均温度"]
data['日期'] = data['年'].astype(str) + '/' +data['月'].astype(str) + '/' + data['日'].astype(str)
data['日期'] = pd.to_datetime(data['日期'], format='%Y/%m/%d',errors='coerce')
【练习2】 创建一个“年”列的备份列,列名为“年_备份”。
data['年_备份'] = data['年']
data.head()
【练习3】 删除数据集里面的“月”、“日”列。
data.drop(['月','日'], axis=1,inplace=True)
data.head()
【练习4】 创建一个新列“星期几”,里面存储对应日期的星期信息。
data['星期几'] = data['日期'].dt.dayofweek
data.head()
【练习5】 删除数据集里面“年_备份”为201的行(注意:删除行,非删除列,较难)。
data.drop(data[data['年_备份']==201].index,axis=0,inplace=True)
data
【练习6】 查询New York City在2000年1月数据。
data[ (data['城市'] == 'New York City') & (data['年']==2000) & (data['日期'].dt.month==1)]
【练习7】 查询New York City在2000年1月到3月的数据。
data[ (data['城市'] == 'New York City') & (data['年']==2000) & (data['日期'].dt.month>=1) & (data['日期'].dt.month<=3)]
【练习8】 查询New York City在2000年8月最后一天的数据(要求计算8月最后一天的日期)。
import datetime
from datetime import timedelta
data[ (data['城市'] == 'New York City') & (data['日期'] == pd.to_datetime('2000/9/1')-timedelta(days=1))]
【练习9】 查询New York City在2000年第47周的数据。
data[ (data['城市'] == 'New York City') & (data['年']==2000) & (data['日期'].dt.isocalendar().week==47)]
【练习10】 查询New York City在2000年7月1号前后15天的数据(总共是31天数据)。
data[ (data['城市'] == 'New York City') & (data['年'] == 2000) & (data['日期'] >= pd.to_datetime('2000/7/1')-pd.Timedelta(days=15))
& (data['日期'] <= pd.to_datetime('2000/7/1')+pd.Timedelta(days=15))]
【练习11】 查询New York City在2000年7月1号所处周的整周数据(2000年7月1号是星期六,因此显示2000年6月26日至2000年7月2日之间数据,要求通过计算获取所在周的开始和结束日期)。
current_dayofweek = pd.to_datetime('2000/7/1').dayofweek
current_dayofweek
week_begin = pd.to_datetime('2000/7/1') - pd.timedelta(days=current_dayofweek)
week_begin
week_end = pd.to_datetime('2000/7/1') + pd.timedelta(days=6-current_dayofweek)
week_end
data[ (data['城市'] == 'New York City') & (data['年'] == 2000) & (data['日期'] >= week_begin) & (data['日期'] <= week_end)]
【练习12】 查询New York City在2000年7月1号所处周的工作日数据。
weekofyear = pd.to_datetime('2000/7/1').weekofyear
data[(data['城市']=='New York City') & (data['日期'].dt.isocalendar().week == weekofyear)][:5]
data.set_index(['城市','日期'], inplace=True)
data.sort_index(level='城市', inplace=True)
data.head()
【练习13】 查询Paris在2020/1/1的记录。
data.loc[('Paris','2020/1/1'),]
【练习14】 查询Paris在2020/1/1的记录,只显示“日内平均气温”列。
data.loc[('Paris','2020/1/1'),'日内平均气温']
【练习15】 查询Paris和New York City在2020/1/1的记录。
data.loc[(['Paris','New York City'], '2020/1/1'), ]
【练习16】 查询2020/1/1的所有记录。
idx = pd.IndexSlice
index1 = slice(None)
index2 = '2020/1/1'
index = idx[index1, index2]
data.loc[index,]
【练习17】 查询2020/1/1的所有亚洲城市的记录。
idx = pd.IndexSlice
index1 = slice(None)
index2 = '2020/1/1'
index = idx[index1, index2]
data.loc[index,].query('区域=="Asia"')
【练习18】 查询London在2020/3/1到2020/4/1之间的所有数据。
idx = pd.IndexSlice
index1 = 'London'
index2 = slice('2020/3/1', '2020/4/1')
index = idx[index1, index2]
data.loc[index,]
【练习19】 查询London和Zurich在2019/5/3和2020/5/3的数据,只显示“日内平均气温”列。
idx = pd.IndexSlice
index1 = ['London', 'Zurich']
index2 = ['2019/5/3', '2020/5/3']
index = idx[index1, index2]
data.loc[index,'日内平均气温']
【练习20】 使用reset_index()复原所有多级索引,并将“区域” “国家”“州”“城市”“日期”设置为多级索引,如图11所示。【练习21】—【练习31】基于图11所示的5级索引。
data.reset_index(inplace=True)
data.head()
data.set_index(['区域','国家','州','城市','日期'],inplace=True)
data.sort_index(level='区域',inplace=True)
data.head()
【练习21】 查询所有亚洲的城市记录。
data.loc['Asia']
【练习22】 查询所有亚洲城市在2020/5/1的记录。
idx = pd.IndexSlice
index1 = 'Asia'
index2 = slice(None)
index3 = slice(None)
index4 = slice(None)
index5 = '2020/5/1'
index = idx[index1, index2,index3,index4,index5]
data.loc[index,'日内平均气温']
【练习24】 查询France和US的所有城市在2020/4/7、2020/4/13、2020/5/3的记录。
idx = pd.IndexSlice
index1 = slice(None)
index2 = ['France','US']
index3 = slice(None)
index4 = slice(None)
index5 = ['2020/4/7','2020/4/13','2020/5/3']
index = idx[index1, index2,index3,index4,index5]
data.loc[index,'日内平均气温']
【练习25】 查询US的Utah州、Iowa州在2018/11的所有记录。
idx = pd.IndexSlice
index1 = slice(None)
index2 = 'US'
index3 = ['Utah','Iowa']
index4 = slice(None)
index5 = '2018/11'
index = idx[index1, index2,index3,index4,index5]
data.loc[index,'日内平均气温']
【练习26】 将“日内平均气温”列的华氏温度转换为摄氏温度℃(转换公式为:C=(F-32)÷1.8)。
data['日内平均气温'] = (data['日内平均气温'] - 32) / 1.8
data.head()
【练习27】 查询在2019/8/3气温高于35℃的所有Asia、Europe、North America城市记录。
idx = pd.IndexSlice
index1 = ['Asia','Europe','North American']
index2 = slice(None)
index3 = slice(None)
index4 = slice(None)
index5 = '2019/8/3'
index = idx[index1, index2,index3,index4,index5]
data.loc[index,].query('日内平均气温>30')
【练习28】 查询Guangzhou在2019年气温位于25℃和35℃之间的所有记录。
idx = pd.IndexSlice
index1 = slice(None)
index2 = slice(None)
index3 = slice(None)
index4 = 'Guangzhou'
index5 = '2019'
index = idx[index1, index2,index3,index4,index5]
data.loc[index,].query('日内平均气温>=25 and 日内平均气温<=35')
【练习29】 查询2020/1/1气温低于0℃的Asia的城市记录。
idx = pd.IndexSlice
index1 = 'Asia'
index2 = slice(None)
index3 = slice(None)
index4 = slice(None)
index5 = '2020/1/1'
index = idx[index1, index2,index3,index4,index5]
data.loc[index,].query('日内平均气温<0')
【练习30】 查询Paris、London在2019/5/1及2020/1/1到2020/5/1的记录。
from datetime import date, timedelta
idx = pd.IndexSlice
index1 = slice(None)
index2 = slice(None)
index3 = slice(None)
index4 = ['Paris','London']
begin_date = date(2020,1,1)
end_date = date(2020,5,1)
index5 = pd.date_range(begin_date, end_date, freq='d')
index5 = index5.insert(0, '2019/5/1')
index = idx[index1, index2,index3,index4,index5]
data.loc[index,]
【练习31】 查询Paris和所有US城市在2019/5/1及2020/1/1到2020/5/1的记录。
from datetime import date, timedelta
idx = pd.IndexSlice
index1 = slice(None)
index2 = slice(None)
index3 = slice(None)
index4 = ['Paris','London']
begin_date = date(2020,1,1)
end_date = date(2020,5,1)
index5 = pd.date_range(begin_date, end_date, freq='d')
index5 = index5.insert(0, '2019/5/1')
index = idx[index1, index2,index3,index4,index5]
data.loc[index,]
【练习32】 查询Paris和所有US城市在2019/5/1及2020/1/1到2020/5/1的记录。
us_cities = data.reset_index().query('国家=="US"')['城市'].unique()
cities = np.append(['Paris'],us_cities)
from datetime import date, timedelta
idx = pd.IndexSlice
index1 = slice(None)
index2 = slice(None)
index3 = slice(None)
index4 = cities
begin_date = date(2020,1,1)
end_date = date(2020,5,1)
index5 = pd.date_range(begin_date, end_date, freq='d')
index5 = index5.insert(0, '2019/5/1')
index = idx[index1, index2,index3,index4,index5]
data.loc[index,]
【练习33】 按“区域”进行排序。
data.sort_values(by='区域')
【练习34】 按“区域”“国家”“州”进行排序。
data.sort_values(by=['区域','国家','州'])
【练习35】 按“区域”(升序)、“国家”(降序)、“州”(降序)进行排序。
data.sort_values(by=['区域','国家','州'], ascending=[True,False,False])
【练习36】 查询“Asia”的最高气温。
data.query('区域=="Asia"')['日内平均气温'].max()
【练习37】 查询“US”在2020年1月–3月的所有城市的平均气温。
data.query('国家=="US" and 年==2020 and 月>=1 and 月<=3')['日内平均气温'].mean()
【练习38】 查询全球2000–2010年的最高温度和最低气温。
data.query('年>=2000 and 年<=2010')['日内平均气温'].max()
data.query('年>=2000 and 年<=2010')['日内平均气温'].min()
【练习39】 查询“US”的“New York City”在2019年气温小于0度的日期的数量。
data.query('城市=="New York City" and 年==2019 and 日内平均气温<0')['日期'].count()
【练习40】 查询“Europe”的2019年最低气温及出现的城市和日期(仅限于2019年)。
europe_2019_min = data.query('区域=="Europe" and 年==2019')['日内平均气温'].min()
data.query('区域=="Europe" and 年==2019 and 日内平均气温==@europe_2019_min')[['城市','日期']]
【练习41】 查询2020/1/1最低气温及出现的城市。
world_min = data.query('日期=="2020/1/1"')['日内平均气温'].min()
world_min
data.query('日期=="2020/1/1" and 日内平均气温==@world_min')[['城市','日期']]
【练习42】 查询“Beijing”市在2000年的平均气温。
data.query('城市=="Beijing" and 年==2000')['日内平均气温'].mean()
【练习43】 查询“Beijing”市气温比2000年平均温度高的日期(仅限于2000年)的数量。
bj_min = data.query('城市=="Beijing" and 年==2000')['日内平均气温'].mean()
data.query('城市=="Beijing" and 年==2000 and 日内平均气温>@bj_min')['日期'].count()
【练习44】 计算“Paris”市2019年7月的平均气温和2018年7月平均气温之差。
data.query('城市=="Paris" and 年==2019 and 月==7')['日内平均气温'].mean()
data.query('城市=="Paris" and 年==2018 and 月==7')['日内平均气温'].mean()
data.query('城市=="Paris" and 年==2019 and 月==7')['日内平均气温'].mean() -data.query('城市=="Paris" and 年==2018 and 月==7')['日内平均气温'].mean()
【练习45】 统计各国家的气温平均值。
data.groupby(by='国家')['日内平均气温'].mean()
【练习46】 统计各国家的气温平均值,并按照气温平均值降序显示。
data.groupby(by='国家')['日内平均气温'].mean().sort_values()
【练习47】 按年统计各国家的年均气温平均值。
data.groupby(by=['年','国家'])['日内平均气温'].mean()
【练习48】 统计2019年美国各州的气温最高值、最低值、平均值。
data.query('国家=="US" and 年==2019').groupby(by='州').agg({'日内平均气温':[max, min, np.mean]})
【练习49】 查询2019年2月美国月均气温最低的5个州。
data.query('国家=="US" and 年==2019 and 月==2')[['州','日内平均气温']].groupby(by='州').mean().sort_values(by='日内平均气温')[:5]
【练习50】 统计“Paris”市2000年每月的温差。和【练习50】 统计“Paris”市2000年每月的温差,并将统计数据列命名为“月均温差”。
paris_max = data.query('城市=="Paris" and 年==2000')[['月','日内平均气温']].groupby(by='月').max()
paris_max
paris_min = data.query('城市=="Paris" and 年==2000')[['月','日内平均气温']].groupby(by='月').min()
paris_min
paris_max - paris_min
(paris_max - paris_min).rename({'日内平均气温':"月均温差"},axis=1)
【练习51】 统计美国California在2019年7月日均气温高于30℃的天数。
data.query('国家=="US" and 州=="California" and 年==2019 and 月==7 and 日内平均气温>30')['日期'].shape[0]
【练习52】 统计美国各州1995–2019期间月均气温高于20℃的的月份数量。
month_mean = data.query('国家=="US" and 年>=1995 and 年<=2019').groupby(by=['年','月'])['日内平均气温'].mean().reset_index()
month_mean
month_mean.query('日内平均气温>20').groupby(by='年')['月'].count()
【练习53】 统计2019年美国California高温天数(日均气温高于30℃)大于15的月份及当月高温天数。
def my_filter(x):
return (x['日期'].count())>15
grouped_data = data.query('州=="California" and 年==2019 and 日内平均气温>20').groupby(by=['城市','月'])
grouped_data.filter(my_filter).groupby(by=['城市','月']).agg({'日内平均气温':['count']})
data.query('州=="California" and 年==2019 and 日内平均气温>20').groupby(by=['城市','月']).count()
【练习54】 查询2017–2019年期间美国年均气温逐步升高(2019年均气温>2018年均气温>2017年均气温>2016年均气温)的州名。
def my_filter(x):
temp = x.groupby('年')['日内平均气温'].mean().values
if (all(temp[i] < temp[i+1] for i in range(len(temp)-1))):
return True
else:
return False
data.query('国家=="US" and 年>=2017 and 年<=2019').groupby(by=['州']).filter(my_filter)['州'].unique()
【练习55】 按年统计1995–2019期间当年年均气温高于前一年年均气温高的国家数量(如:1996有72个国家年均气温比1995年高,1997年有42个国家年均气温比1996年高)。
def my_apply(x):
x = x.reset_index().sort_values(by=['年'])
result = pd.DataFrame([x.iloc[i] for i in range(0, len(x)-1) if x.iloc[i, 2] < x.iloc[i+1, 2]])
return result.set_index('国家')
data.groupby(by=['国家','年']).agg({'日内平均气温':['mean']}).groupby(level=['国家'], as_index=False).apply(my_apply).reset_index().groupby(by=['年']).agg({'国家':['count']})