案例1.求圆周率
思路:用积分的方法,求出半径为1的圆的面积,即为圆周率
f = lambda x:(1-x**2)**0.5 # 定义一个函数返回值为圆的面积
x = np.linspace(-1,1,100) # 定义边界,并分割100份
y = f(x)
plt.figure(figsize=(5,5)) # 设置图表大小
plt.plot(x,y) # 绘制一个半圆
plt.plot(x,-y)
import scipy.integrate as integrate # 调用积分函数
res,error = integrate.quad(f,-1,1) # 半径是1的圆形 面积 pi
print('圆周率是:',res*2,'误差是:',error*2)
案例2. 城市气候与离岸距离
1. 温度与离岸距离
1.1 导包
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
import sklearn
1.2 导入数据
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)
1.3 查看列数
ferrara.head()
1.4 去除没有用的列并重新生成索引
ferrara.drop('Unnamed: 0',axis=1,inplace=True)
1.5 最高温度
temps = np.array([ ferrara['temp'].max(),])
1.6 离岸距离
dists = np.array([ ferrara['dist'].iloc[0],])
1.7 散点图
plt.scatter(x=dists,y=temps)
1.8 简易版机器学习
思路: 分析散点图,查找规律,设置条件,机器拟合设定,指定一部分数据,机器预测其余数据,绘图
1.8.1 分析散点图
获取距离海洋近的城市的距离
获取距离海洋近的城市的温度
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.8.2 机器学习模型
支持向量机
from sklearn.svm import SVR
svr1 = SVR(kernel='linear')
svr2 = SVR(kernel='linear')
把数据给机器学习模型 让机器学习模型画线 去拟合这些点
svr1.fit(near_city_dists.reshape(-1,1),near_city_temps)
svr2.fit(far_city_dists.reshape(-1,1),far_city_temps)
1.8.3 已知数据
X_predict = np.linspace(near_city_dists.min(),near_city_dists.max(),100)
X2_predict = np.linspace(far_city_dists.min(),far_city_dists.max(),100)
1.8.4 预测数据
使用训练好的模型去预测
y_ = svr1.predict(X_predict.reshape(-1,1))
y2_ = svr2.predict(X2_predict.reshape(-1,1))
1.8.4 绘图
plt.scatter(x=dists,y=temps)
plt.plot(X_predict,y_)
plt.plot(X2_predict,y2_)
2. 风速与风向
2.1 简单绘图
plt.axes(polar=True)
ferrara['wind_deg']
用的是角度,极坐标用的是弧度,
360 = 2*np.pi,弧度/(2*np.pi)=角度/360,弧度=角度*np.pi/180
plt.bar(x=ferrara['wind_deg']*np.pi/180,height=ferrara['wind_speed'])
绘出的图有重叠现象,导致弧度不一致
2.2 升级版
2.2.1 将极坐标图份成8个单元,将数据分类
index = np.arange(0,360,360/8) # 角度值
index2 = np.arange(0,2*np.pi,2*np.pi/8) # 弧度制
2.2.2 筛选出有风的数据,即风速和风向都为True
ferrara.wind_speed[(ferrara.wind_deg>0)&(ferrara.wind_deg<45)]
2.2.3 风速求平均值
ferrara.wind_speed[(ferrara.wind_deg>0)&(ferrara.wind_deg<45)].mean()
2.2.4 得到各个角度的风速
# 按照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):
avg_speed = 0
speeds.append(avg_speed)
2.2.5绘图
plt.axes(polar=True)
plt.bar(x=index2,height=speeds)
2.3 终极版(函数封装)
def draw_polar(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)
draw_polar(ferrara.wind_deg,ferrara.wind_speed,'ferrara-deg-speed')
网友评论