Python高级--城市气候与海洋距离关系的研究

城市气候与海洋距离关系的研究

一、导入数据

数据可点击下载

ferrara1 = pd.read_csv('./data/ferrara_150715.csv')
ferrara2 = pd.read_csv('./data/ferrara_250715.csv')
ferrara3 = pd.read_csv('./data/ferrara_270615.csv')
ferrara = pd.concat([ferrara1,ferrara2,ferrara3],ignore_index=True)   #导入后将各表合并

torino1 = pd.read_csv('./data/torino_150715.csv')
torino2 = pd.read_csv('./data/torino_250715.csv')
torino3 = pd.read_csv('./data/torino_270615.csv')
torino = pd.concat([torino1,torino2,torino3],ignore_index=True) 

mantova1 = pd.read_csv('./data/mantova_150715.csv')
mantova2 = pd.read_csv('./data/mantova_250715.csv')
mantova3 = pd.read_csv('./data/mantova_270615.csv')
mantova = pd.concat([mantova1,mantova2,mantova3],ignore_index=True) 

milano1 = pd.read_csv('./data/milano_150715.csv')
milano2 = pd.read_csv('./data/milano_250715.csv')
milano3 = pd.read_csv('./data/milano_270615.csv')
milano = pd.concat([milano1,milano2,milano3],ignore_index=True) 

ravenna1 = pd.read_csv('./data/ravenna_150715.csv')
ravenna2 = pd.read_csv('./data/ravenna_250715.csv')
ravenna3 = pd.read_csv('./data/ravenna_270615.csv')
ravenna = pd.concat([ravenna1,ravenna2,ravenna3],ignore_index=True)

asti1 = pd.read_csv('./data/asti_150715.csv')
asti2 = pd.read_csv('./data/asti_250715.csv')
asti3 = pd.read_csv('./data/asti_270615.csv')
asti = pd.concat([asti1,asti2,asti3],ignore_index=True)

bologna1 = pd.read_csv('./data/bologna_150715.csv')
bologna2 = pd.read_csv('./data/bologna_250715.csv')
bologna3 = pd.read_csv('./data/bologna_270615.csv')
bologna = pd.concat([bologna1,bologna2,bologna3],ignore_index=True)

piacenza1 = pd.read_csv('./data/piacenza_150715.csv')
piacenza2 = pd.read_csv('./data/piacenza_250715.csv')
piacenza3 = pd.read_csv('./data/piacenza_270615.csv')
piacenza = pd.concat([piacenza1,piacenza2,piacenza3],ignore_index=True)

cesena1 = pd.read_csv('./data/cesena_150715.csv')
cesena2 = pd.read_csv('./data/cesena_250715.csv')
cesena3 = pd.read_csv('./data/cesena_270615.csv')
cesena = pd.concat([cesena1,cesena2,cesena3],ignore_index=True)

faenza1 = pd.read_csv('./data/faenza_150715.csv')
faenza2 = pd.read_csv('./data/faenza_250715.csv')
faenza3 = pd.read_csv('./data/faenza_270615.csv')
faenza = pd.concat([faenza1,faenza2,faenza3],ignore_index=True)

二、数据处理

1)常查看数据

ferrara.head()

    Unnamed: 0  temp    humidity    pressure    description dt  wind_speed  wind_deg    city    day dist
0   0   30.44   60  1011.0  moderate rain   1436863096  1.03    180.0   Ferrara 2015-07-14 10:38:16 47
1   1   31.40   58  1011.0  moderate rain   1436866685  1.54    135.0   Ferrara 2015-07-14 11:38:05 47
2   2   31.95   54  1011.0  moderate rain   1436870387  0.51    113.0   Ferrara 2015-07-14 12:39:47 47
3   3   32.06   50  1011.0  moderate rain   1436873989  2.06    90.0    Ferrara 2015-07-14 13:39:49 47
4   4   32.63   49  1010.0  moderate rain   1436877535  1.54    68.0    Ferrara 2015-07-14 14:38:55 47

这里我们可以将不需要的列删除

# drop 默认删除行 指定axis=1是删除列  inplace=True 将原数据也进行修改 

asti.drop('Unnamed: 0',axis=1,inplace=True)
bologna.drop('Unnamed: 0',axis=1,inplace=True)
cesena.drop('Unnamed: 0',axis=1,inplace=True)
faenza.drop('Unnamed: 0',axis=1,inplace=True)
ferrara.drop('Unnamed: 0',axis=1,inplace=True)
mantova.drop('Unnamed: 0',axis=1,inplace=True)
milano.drop('Unnamed: 0',axis=1,inplace=True)
piacenza.drop('Unnamed: 0',axis=1,inplace=True)
ravenna.drop('Unnamed: 0',axis=1,inplace=True)
torino.drop('Unnamed: 0',axis=1,inplace=True)

三、展示 最高温度 与 离海远近 的关系

分析:最高温度可以对“temp”这一列求最大值
我们直接创建多维数组来保存这些数据
离海的远近:实际情况这是一个不变的值i,我们只需取其中一个即可

# 温度
temps = np.array([
    ferrara['temp'].max(),
    torino['temp'].max(),
    mantova['temp'].max(),
    milano['temp'].max(),
    ravenna['temp'].max(),
    asti['temp'].max(),
    bologna['temp'].max(),
    piacenza['temp'].max(),
    cesena['temp'].max(),
    faenza['temp'].max(),
])
# 按照城市的排序 放着各个城市的最高温度
temps

array([33.43, 34.69, 34.18, 34.81, 32.79, 34.31, 33.85, 33.92, 32.81,
       32.74])
# dist
dists = np.array([
    ferrara['dist'].iloc[0],
    torino['dist'].iloc[0],
    mantova['dist'].iloc[0],
    milano['dist'].iloc[0],
    ravenna['dist'].iloc[0],
    asti['dist'].iloc[0],
    bologna['dist'].iloc[0],
    piacenza['dist'].iloc[0],
    cesena['dist'].iloc[0],
    faenza['dist'].iloc[0],
])
# 按照各个城市的顺序 放着各个城市的海洋的距离
dists

array([ 47, 357, 121, 250,   8, 315,  71, 200,  14,  37], dtype=int64)

根据这两组数据分析关系

plt.scatter(x=dists,y=temps)

这里写图片描述

由图可以得出两组数据的关系为: 距离海洋越远,最高温度越高

四、使用支持向量机 计算回归参数

分别以100公里和50公里为分界点,划分为离海近和离海远的两组数据
使用支持向量机计算回归参数

svm support vector machine 支持向量机
可以用来处理分类问题classification 也 可以用来处理回归问题regression

1)导包

from sklearn.svm import SVR

2)创建支持向量机模型

# 使用内核 kernel  这里使用线型的 'linear'
svr1 = SVR(kernel='linear')
svr2 = SVR(kernel='linear')

用这两个模型去预测线性回归

3)获取并处理数据,分为两部分进行预测

# near_city <100
# far_city >50
# 获取距离海洋近的城市的距离
# 获取距离海洋近的城市的温度

near_city_dists = dists[dists<100]  # 距离小于100的城市的到海洋的距离
near_city_temps = temps[dists<100]  # 距离小于100的城市的最高温度

far_city_dists = dists[dists>50]  # 距离大于50的城市的到海洋的距离
far_city_temps = temps[dists>50]  # 距离大于50的城市的最高温度

注意这里需要将数据形状转换为支持向量机可接纳的形状

支持向量机模型的数据:
是二维的 每个样本是一行 样本的各个特征是各个列

# -1行1列表示 只有一列,行有多少自己计算
near_city_dists.reshape(-1,1)

4)给定训练数据,去拟合支持向量机模型

svr1.fit(near_city_dists.reshape(-1,1),near_city_temps)
svr2.fit(far_city_dists.reshape(-1,1),far_city_temps)

# 返回:
SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma='auto',
  kernel='linear', max_iter=-1, shrinking=True, tol=0.001, verbose=False)

5)使用训练好的模型去预测

(1)预测数据

X_predict = np.linspace(near_city_dists.min(),near_city_dists.max(),100)  #从最进的城市到最远的城市(小于50的),取100个
X_predict
X2_predict = np.linspace(far_city_dists.min(),far_city_dists.max(),100)  #从最进的城市到最远的城市(大于100的),取100个
X2_predict

(2)用训练好的模型去预测svr1.predict(预测数据)

# 使用训练好的模型去预测
#这里预测出来的命名方式一般为  Y_ , y2_
y_ = svr1.predict(X_predict.reshape(-1,1))
y2_ = svr2.predict(X2_predict.reshape(-1,1))

注意这里的数据也需要注意数据形状reshape(-1, 1)

6)将原数据与预测出的数据展示

plt.scatter(x=dists,y=temps)
plt.plot(X_predict,y_)
plt.plot(X2_predict,y2_)

这里写图片描述

五、细分极坐标绘图

风速与风向的关系
根据不同的风向,风速不同 这里我们研究ferrara的

1)使用散点图绘制

ferrara['wind_deg']  # 风向
ferrara['wind_speed']  # 风速
plt.scatter(x=ferrara['wind_deg'],y=ferrara['wind_speed'])

这里写图片描述

2)使用柱状图绘制

ferrara['wind_deg']  # 风向
ferrara['wind_speed']  # 风速
plt.bar(x=ferrara['wind_deg'],height=ferrara['wind_speed'])

这里写图片描述

3)使用极坐标绘制

ferrara['wind_deg']  # 风向
ferrara['wind_speed']  # 风速
# ferrara['wind_deg']用的是角度
# 极坐标用的是弧度
# 360 = 2*np.pi
# 弧度/(2*np.pi)=角度/360
# 弧度=角度*np.pi/180
plt.axes(polar=True)
plt.bar(x=ferrara['wind_deg']*np.pi/180,height=ferrara['wind_speed'])  #将角度转换为弧度后绘制

这里写图片描述

4)将极坐标的角度细分绘制

因为极坐标中的最大值会覆盖其他的值,所谓我们为了数据准确,我们将圆取1/8区域内的平均值来绘制

(1)将角度分为8份

index = np.arange(0,360,360/8)  #将角度分为8份
index

array([  0.,  45.,  90., 135., 180., 225., 270., 315.])

(2)按照index的范围 去wind_speed里面取值 并求平均值

speeds = []
for i in index[:]:
    # print(i,'-',i+45)  #这个是角度的范围
    # (ferrara.wind_deg>i)&(ferrara.wind_deg<i+45) 这个是条件
    # ferrara.wind_speed[条件] 就可以把符要求的值取出
    avg_speed = ferrara.wind_speed[(ferrara.wind_deg>i)&(ferrara.wind_deg<i+45)].mean()
    #print(avg_speed)
    if np.isnan(avg_speed):   #因为数据中没有 315-360的值  我们判断返回的数据是否含有nan
        avg_speed = 0
    speeds.append(avg_speed)

speeds

[1.4625000000000001,
 2.064285714285714,
 1.297,
 2.3966666666666665,
 1.5533333333333335,
 1.6166666666666665,
 0.51,
 0]

(3)绘制极坐标(玫瑰)图

index2 = np.arange(0,2*np.pi,2*np.pi/8) #极坐标的 x 为分8份的弧度
index2

plt.axes(polar=True)
plt.bar(x=index2,height=speeds)

这里写图片描述

六、将上面步骤写成函数

def draw_polar(A,B,title):     #参数: 要分析的两组数据 A B  画布的标题 title
    speeds = []
    index = np.arange(0,360,360/8)
    for i in index[:]:
        avg_speed = B[(A>i)&(A<i+45)].mean()
        #print(avg_speed)
        if np.isnan(avg_speed):
            avg_speed = 0
        speeds.append(avg_speed)

    plt.figure(figsize=(8,8))            #设置画布的大小
    plt.axes(polar=True)                 #绘制极坐标图
    index2 = np.arange(0,2*np.pi,2*np.pi/8)  
    plt.bar(x=index2,height=speeds)
    plt.title(title)                      # 设置标题名

1)展示米兰 风速 和 风向 的关系以及 湿度 和 风向 的关系

这里写图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值