将对意大利北部沿海地区的气象数据进行分析与可视化。我们在实验过程中先会运用 Python 中 matplotlib 库的对数据进行图表化处理,然后调用 scikit-learn 库当中的的 SVM 库对数据进行回归分析,最终在图表分析的支持下得出我们的结论。

笔记来源

图灵教育《Python 数据分析实战》 第 2 章

知识点

  • matplotlib 库画出图像
  • scikit-learn 库对数据进行回归分析
  • numpy 库对数据进行切片

原理

气象数据是在网上很容易找到的一类数据。很多网站都提供以往的气压、气温、湿度和降雨量等气象数据。只需指定位置和日期,就能获取一个气象数据文件。这些测量数据是由气象站收集的。气象数据这类数据源涵盖的信息范围较广。数据分析的目的是把原始数据转化为信息,再把信息转化为知识,因此拿气象数据作为数据分析的对象来讲解数据分析全过程再合适不过。

待检验的假设:靠海对气候的影响

写作本章时,虽正值夏初,却已酷热难耐,住在大城市的人感受更为强烈。于是周末很多人到山村或海滨城市去游玩,放松一下身心,远离内陆城市的闷热天气。我常常想,靠海对气候有什么影响?这个问题可以作为数据分析的一个不错的出发点。我不想把本章写成科学类读物,只是想借助这样一种方式,让数据分析爱好者能够把所学用于实践,解决 “海洋对一个地区的气候有何影响” 这个问题。

研究系统:亚得里亚海和波河流域

既然已定义好问题,就需要寻找适合研究数据的系统,提供适合回答这个问题的环境。首先,需要找到一片海域供你研究。我住在意大利,可选择的海有很多,因为意大利是一个被海洋包围的半岛国家。为什么要把自己的选择局限在意大利呢?因为我们所研究的问题刚好和意大利人的一种典行为相关,也就是夏天我们喜欢躲在海边,以躲避内陆的酷热。我不知道在其他国家这种行为是否也很普遍,因此我只把自己熟悉的意大利作为一个系统进行研究。但是你可能会考虑研究意大利的哪个地区呢?上面说过,意大利是半岛国家,找到可研究的海域不是问题,但是如何衡量海洋对其远近不同的地方的影响?这就引出了一个大问题。意大利其实多山地,离海差不多远,可以彼此作为参照的内陆区域较少。为了衡量海洋对气候的影响,我排除了山地,因为山地也许会引入其他很多因素,比如海拔。

意大利波河流域这块区域就很适合研究海洋对气候的影响。这一片平原东起亚得里亚海,向内陆延伸数百公里(见图 9-1)。它周边虽不乏群山环绕,但由于它很宽广,削弱了群山的影响。此外,该区域城镇密集,也便于选取一组离海远近不同的城市。我们所选的几个城市,两个城市间的最大距离约为 400 公里。

第一步,选 10 个城市作为参照组。选择城市时,注意它们要能代表整个平原地区(见图 9-2)。

如图 9-2 所示,我们选取了 10 个城市。随后将分析它们的天气数据,其中 5 个城市在距海 100 公里范围内,其余 5 个距海 100~400 公里。

选作样本的城市列表如下:

  • Ferrara(费拉拉)
  • Torino(都灵)
  • Mantova(曼托瓦)
  • Milano(米兰)
  • Ravenna(拉文纳)
  • Asti(阿斯蒂)
  • Bologna(博洛尼亚)
  • Piacenza(皮亚琴察)
  • Cesena(切塞纳)
  • Faenza(法恩莎)

现在,我们需要弄清楚这些城市离海有多远。方法有多种。这里使用 TheTimeNow 网站提供的服务,它支持多种语言(见图 9-3)。

有了计算两城市间距离这样的服务,我们就可以计算每个城市与海之间的距离。

你可以选择海滨城市 Comacchio 作为基点,计算其他城市与它之间的距离(见图 9-2)。使用上述服务计算完所有距离后,得到的结果如表 9-1 所示。

开发准备

定义好要研究的系统之后,我们就需要创建数据源,以获取研究所需的数据。上网浏览一番,你就会发现很多网站都提供世界各地的气象数据,其中就有 Open Weather Map,它的网址是 http://openweathermap.org/ (见图 9-4)。

该网站提供以下功能:在请求的 URL 中指定城市,即可获取该城市的气象数据。我们已经准备好了数据,不需要大家再去调用该网站的 API。 下面,就先下载气象数据。

网盘链接:https://pan.baidu.com/s/1AJRiv--ysy265_it_7s3Qg 提取码:jyue

这时候,我们通过 tree 命令应该能够再 WeatherData 中间看到 10 个城市的天气数据文件(以 .csv 结尾)

!apt-get install tree

!tree WeatherData/

导入相关包开始实验。

import numpy as np
import pandas as pd
import datetime

如果你想用本章的数据,需要加载写作本章时保存的 10 个 CSV 文件。

df_ferrara = pd.read_csv('WeatherData/ferrara_270615.csv')
df_milano = pd.read_csv('WeatherData/milano_270615.csv')
df_mantova = pd.read_csv('WeatherData/mantova_270615.csv')
df_ravenna = pd.read_csv('WeatherData/ravenna_270615.csv')
df_torino = pd.read_csv('WeatherData/torino_270615.csv')
df_asti = pd.read_csv('WeatherData/asti_270615.csv')
df_bologna = pd.read_csv('WeatherData/bologna_270615.csv')
df_piacenza = pd.read_csv('WeatherData/piacenza_270615.csv')
df_cesena = pd.read_csv('WeatherData/cesena_270615.csv')
df_faenza = pd.read_csv('WeatherData/faenza_270615.csv')

我们把这些数据读入内存,完成了实验准备的部分。

实验步骤

从数据可视化入手分析收集到的数据是常见的做法。前面讲过,matplotlib 库提供一系列图表生成工具,能够以可视化形式表示数据。数据可视化在数据分析阶段非常有助于发现研究系统的一些特点。

导入以下必要的库:

%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from dateutil import parser

温度数据分析

举例来说,非常简单的分析方法是先分析一天中气温的变化趋势。我们以城市米兰为例。

# 取出我们要分析的温度和日期数据
y1 = df_milano['temp']
x1 = df_milano['day'] # 把日期数据转换成 datetime 的格式
day_milano = [parser.parse(x) for x in x1] # 调用 subplot 函数, fig 是图像对象,ax 是坐标轴对象
fig, ax = plt.subplots() # 调整x轴坐标刻度,使其旋转70度,方便查看
plt.xticks(rotation=70) # 设定时间的格式
hours = mdates.DateFormatter('%H:%M') # 设定X轴显示的格式
ax.xaxis.set_major_formatter(hours) # 画出图像,day_milano是X轴数据,y1是Y轴数据,‘r’代表的是'red' 红色
ax.plot(day_milano ,y1, 'r')

执行上述代码,将得到如图 9-8 所示的图像。由图可见,气温走势接近正弦曲线,从早上开始气温逐渐升高,最高温出现在下午两点到六点之间,随后气温逐渐下降,在第二天早上六点时达到最低值。

我们进行数据分析的目的是尝试解释是否能够评估海洋是怎样影响气温的,以及是否能够影响气温趋势,因此我们同时来看几个不同城市的气温趋势。这是检验分析方向是否正确的唯一方式。因此,我们选择三个离海最近以及三个离海最远的城市。

# 读取温度和日期数据
y1 = df_ravenna['temp']
x1 = df_ravenna['day']
y2 = df_faenza['temp']
x2 = df_faenza['day']
y3 = df_cesena['temp']
x3 = df_cesena['day']
y4 = df_milano['temp']
x4 = df_milano['day']
y5 = df_asti['temp']
x5 = df_asti['day']
y6 = df_torino['temp']
x6 = df_torino['day'] # 把日期从 string 类型转化为标准的 datetime 类型
day_ravenna = [parser.parse(x) for x in x1]
day_faenza = [parser.parse(x) for x in x2]
day_cesena = [parser.parse(x) for x in x3]
day_milano = [parser.parse(x) for x in x4]
day_asti = [parser.parse(x) for x in x5]
day_torino = [parser.parse(x) for x in x6] # 调用 subplots() 函数,重新定义 fig, ax 变量
fig, ax = plt.subplots()
plt.xticks(rotation=70) hours = mdates.DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(hours) #这里需要画出三根线,所以需要三组参数, 'g'代表'green'
ax.plot(day_ravenna,y1,'r',day_faenza,y2,'r',day_cesena,y3,'r')
ax.plot(day_milano,y4,'g',day_asti,y5,'g',day_torino,y6,'g')

上述代码将生成如图 9-9 所示的图表。离海最近的三个城市的气温曲线使用红色,而离海最远的三个城市的曲线使用绿色。

如图 9-9 所示,结果看起来不错。离海最近的三个城市的最高气温比离海最远的三个城市低不少,而最低气温看起来差别较小。

我们可以沿着这个方向做深入研究,收集 10 个城市的最高温和最低温,用线性图表示气温最值点和离海远近之间的关系。

# dist 是一个装城市距离海边距离的列表
dist = [df_ravenna['dist'][0],
df_cesena['dist'][0],
df_faenza['dist'][0],
df_ferrara['dist'][0],
df_bologna['dist'][0],
df_mantova['dist'][0],
df_piacenza['dist'][0],
df_milano['dist'][0],
df_asti['dist'][0],
df_torino['dist'][0]
] # temp_max 是一个存放每个城市最高温度的列表
temp_max = [df_ravenna['temp'].max(),
df_cesena['temp'].max(),
df_faenza['temp'].max(),
df_ferrara['temp'].max(),
df_bologna['temp'].max(),
df_mantova['temp'].max(),
df_piacenza['temp'].max(),
df_milano['temp'].max(),
df_asti['temp'].max(),
df_torino['temp'].max()
] # temp_min 是一个存放每个城市最低温度的列表
temp_min = [df_ravenna['temp'].min(),
df_cesena['temp'].min(),
df_faenza['temp'].min(),
df_ferrara['temp'].min(),
df_bologna['temp'].min(),
df_mantova['temp'].min(),
df_piacenza['temp'].min(),
df_milano['temp'].min(),
df_asti['temp'].min(),
df_torino['temp'].min()
]

先把最高温画出来。

fig, ax = plt.subplots()
ax.plot(dist,temp_max,'ro')

结果如图 9-10 所示。

如图 9-10 所示,现在你可以证实,海洋对气象数据具有一定程度的影响这个假设是正确的(至少这一天如此)。进一步观察上图,你会发现海洋的影响衰减得很快,离海 60~70 公里开外,气温就已攀升到高位。

用线性回归算法得到两条直线,分别表示两种不同的气温趋势,这样做很有趣。我们可以使用 scikit-learn 库的 SVR 方法。

!注意:这段代码会跑比较久的时间,请耐心等待

from sklearn.svm import SVR

# dist1是靠近海的城市集合,dist2是远离海洋的城市集合
dist1 = dist[0:5]
dist2 = dist[5:10] # 改变列表的结构,dist1现在是5个列表的集合
# 之后我们会看到 nbumpy 中 reshape() 函数也有同样的作用
dist1 = [[x] for x in dist1]
dist2 = [[x] for x in dist2] # temp_max1 是 dist1 中城市的对应最高温度
temp_max1 = temp_max[0:5]
# temp_max2 是 dist2 中城市的对应最高温度
temp_max2 = temp_max[5:10] # 我们调用SVR函数,在参数中规定了使用线性的拟合函数
# 并且把 C 设为1000来尽量拟合数据(因为不需要精确预测不用担心过拟合)
svr_lin1 = SVR(kernel='linear', C=1e3)
svr_lin2 = SVR(kernel='linear', C=1e3) # 加入数据,进行拟合(这一步可能会跑很久,大概10多分钟,休息一下:) )
svr_lin1.fit(dist1, temp_max1)
svr_lin2.fit(dist2, temp_max2) # 关于 reshape 函数请看代码后面的详细讨论
xp1 = np.arange(10,100,10).reshape((9,1))
xp2 = np.arange(50,400,50).reshape((7,1))
yp1 = svr_lin1.predict(xp1)
yp2 = svr_lin2.predict(xp2)

然后绘图

# 限制了 x 轴的取值范围
fig, ax = plt.subplots()
ax.set_xlim(0,400) # 画出图像
ax.plot(xp1, yp1, c='b', label='Strong sea effect')
ax.plot(xp2, yp2, c='g', label='Light sea effect')
ax.plot(dist,temp_max,'ro')

这里 np.arange(10,100,10) 会返回 [10, 20, 30,..., 90],如果把列表看成是一个矩阵,那么这个矩阵是 1 9 的。这里 reshape((9,1)) 函数就会把该列表变为 9 1 的, [[10], [20], ..., [90]]。这么做的原因是因为 predict() 函数的只能接受一个 N 1 的列表,返回一个 1 N 的列表。

上述代码将生成如图 9-11 所示的图像。

如上所见,离海 60 公里以内,气温上升速度很快,从 28 度陡升至 31 度,随后增速渐趋缓和(如果还继续增长的话),更长的距离才会有小幅上升。这两种趋势可分别用两条直线来表示,直线的表达式为:y=ax+by=ax+b 其中 a 为斜率,b 为截距。

print(svr_lin1.coef_)  #斜率
print(svr_lin1.intercept_) # 截距
print(svr_lin2.coef_)
print(svr_lin2.intercept_)

你可能会考虑将这两条直线的交点作为受海洋影响和不受海洋影响的区域的分界点,或者至少是海洋影响较弱的分界点。

from scipy.optimize import fsolve

# 定义了第一条拟合直线
def line1(x):
a1 = svr_lin1.coef_[0][0]
b1 = svr_lin1.intercept_[0]
return a1*x + b1 # 定义了第二条拟合直线
def line2(x):
a2 = svr_lin2.coef_[0][0]
b2 = svr_lin2.intercept_[0]
return a2*x + b2 # 定义了找到两条直线的交点的 x 坐标的函数
def findIntersection(fun1,fun2,x0):
return fsolve(lambda x : fun1(x) - fun2(x),x0) result = findIntersection(line1,line2,0.0)
print("[x,y] = [ %d , %d ]" % (result,line1(result))) # x = [0,10,20, ..., 300]
x = np.linspace(0,300,31)
plt.plot(x,line1(x),x,line2(x),result,line1(result),'ro')

执行上述代码,将得到交点的坐标 [x,y]=[53,30][x,y]=[53,30] 并得到如图 9-12 所示的图表。

因此,你可以说海洋对气温产生影响的平均距离(该天的情况)为 53 公里。现在,我们可以转而分析最低气温。

# axis 函数规定了 x 轴和 y 轴的取值范围
plt.axis((0,400,15,25))
plt.plot(dist,temp_min,'bo')

在这个例子中,很明显夜间或早上 6 点左右的最低温与海洋无关。如果没记错的话,小时候老师教给大家的是海洋能够缓和低温,或者说夜间海洋释放白天吸收的热量。但是从我们得到情况来看并非如此。我们刚使用的是意大利夏天的气温数据,而验证该假设在冬天或其他地方是否也成立,将会非常有趣。

湿度数据分析

10 个 DataFrame 对象中还包含湿度这个气象数据。因此,你也可以考察当天三个近海城市和三个内陆城市的湿度趋势。

# 读取湿度数据
y1 = df_ravenna['humidity']
x1 = df_ravenna['day']
y2 = df_faenza['humidity']
x2 = df_faenza['day']
y3 = df_cesena['humidity']
x3 = df_cesena['day']
y4 = df_milano['humidity']
x4 = df_milano['day']
y5 = df_asti['humidity']
x5 = df_asti['day']
y6 = df_torino['humidity']
x6 = df_torino['day'] # 重新定义 fig 和 ax 变量
fig, ax = plt.subplots()
plt.xticks(rotation=70) # 把时间从 string 类型转化为标准的 datetime 类型
day_ravenna = [parser.parse(x) for x in x1]
day_faenza = [parser.parse(x) for x in x2]
day_cesena = [parser.parse(x) for x in x3]
day_milano = [parser.parse(x) for x in x4]
day_asti = [parser.parse(x) for x in x5]
day_torino = [parser.parse(x) for x in x6] # 规定时间的表示方式
hours = mdates.DateFormatter('%H:%M')
ax.xaxis.set_major_formatter(hours) #表示在图上
ax.plot(day_ravenna,y1,'r',day_faenza,y2,'r',day_cesena,y3,'r')
ax.plot(day_milano,y4,'g',day_asti,y5,'g',day_torino,y6,'g')

上述代码将生成如图 9-14 所示的图表。

乍看上去好像近海城市的湿度要大于内陆城市,全天湿度差距在 20% 左右。我们再来看一下湿度的极值和离海远近之间的关系,是否跟我们的第一印象相符。

# 获取最大湿度数据
hum_max = [df_ravenna['humidity'].max(),
df_cesena['humidity'].max(),
df_faenza['humidity'].max(),
df_ferrara['humidity'].max(),
df_bologna['humidity'].max(),
df_mantova['humidity'].max(),
df_piacenza['humidity'].max(),
df_milano['humidity'].max(),
df_asti['humidity'].max(),
df_torino['humidity'].max()
] plt.plot(dist,hum_max,'bo')

我们把 10 个城市的最大湿度与离海远近之间的关系做成图表,请见图 9-15。

# 获取最小湿度
hum_min = [
df_ravenna['humidity'].min(),
df_cesena['humidity'].min(),
df_faenza['humidity'].min(),
df_ferrara['humidity'].min(),
df_bologna['humidity'].min(),
df_mantova['humidity'].min(),
df_piacenza['humidity'].min(),
df_milano['humidity'].min(),
df_asti['humidity'].min(),
df_torino['humidity'].min()
]
plt.plot(dist,hum_min,'bo')

再来把 10 个城市的最小湿度与离海远近之间的关系做成图表,请见图 9-16。

由图 9-15 和图 9-16 可以确定,近海城市无论是最大还是最小湿度都要高于内陆城市。然而,在我看来,我们还不能说湿度和距离之间存在线性关系或者其他能用曲线表示的关系。我们采集的数据点数量(10)太少,不足以描述这类趋势。

风向频率玫瑰图

在我们采集的每个城市的气象数据中,下面两个与风有关:

  • 风力(风向)
  • 风速

分析存放每个城市气象数据的 DataFrame 就会发现,风速不仅跟一天的时间段相关联,还与一个介于 0~360 度的方向有关。

例如,每一条测量数据也包含风吹来的方向(图 9-17)。

为了更好地分析这类数据,有必要将其做成可视化形式,但是对于风力数据,将其制作成使用笛卡儿坐标系的线性图不再是最佳选择。 要是把一个 DataFrame 中的数据点做成散点图

plt.plot(df_ravenna['wind_deg'],df_ravenna['wind_speed'],'ro')

就会得到图 9-18 这样的图表,很显然该图的表现力也有不足。

要表示呈 360 度分布的数据点,最好使用另一种可视化方法:极区图。

首先,创建一个直方图,也就是将 360 度分为八个面元,每个面元为 45 度,把所有的数据点分到这八个面元中。

hist, bins = np.histogram(df_ravenna['wind_deg'],8,[0,360])
print(hist)
print(bins)

histogram() 函数返回结果中的数组 hist 为落在每个面元的数据点数量。[0 5 11 1 0 1 0 0]

返回结果中的数组 bins 定义了 360 度范围内各面元的边界。[0. 45. 90. 135. 180. 225. 270. 315. 360.]

要想正确定义极区图,离不开这两个数组。我们将创建一个函数来绘制极区图,其中部分代码在第 7 章已讲过。我们把这个函数定义为 showRoseWind(),它有三个参数:values 数组,指的是想为其作图的数据,也就是这里的 hist 数组;第二个参数 city_name 为字符串类型,指定图表标题所用的城市名称;最后一个参数 max_value 为整型,指定最大的蓝色值。

定义这样一个函数很有用,它既能避免多次重复编写相同的代码,还能增强代码的模块化程度,便于你把精力放到与函数内部操作相关的概念上。

def showRoseWind(values,city_name,max_value):
N = 8 # theta = [pi*1/4, pi*2/4, pi*3/4, ..., pi*2]
theta = np.arange(2 * np.pi / 16, 2 * np.pi, 2 * np.pi / 8)
radii = np.array(values)
# 绘制极区图的坐标系
plt.axes([0.025, 0.025, 0.95, 0.95], polar=True) # 列表中包含的是每一个扇区的 rgb 值,x越大,对应的color越接近蓝色
colors = [(1-x/max_value, 1-x/max_value, 0.75) for x in radii] # 画出每个扇区
plt.bar(theta, radii, width=(2*np.pi/N), bottom=0.0, color=colors) # 设置极区图的标题
plt.title(city_name, x=0.2, fontsize=20)

你需要修改变量 colors 存储的颜色表。这里,扇形的颜色越接近蓝色,值越大。定义好函数之后,调用它即可:

showRoseWind(hist,'Ravenna',max(hist))

运行上述函数,将得到如图 9-19 所示的极区图。

由图 9-19 可见,整个 360 度的范围被分成八个区域(面元),每个区域弧长为 45 度,此外每个区域还有一列呈放射状排列的刻度值。在每个区域中,用半径长度可以改变的扇形表示一个数值,半径越长,扇形所表示的数值就越大。为了增强图表的可读性,我们使用与扇形半径相对应的颜色表。半径越长,扇形跨度越大,颜色越接近于深蓝色。

从刚得到的极区图可以得知风向在极坐标系中的分布方式。该图表示这一天大部分时间风都吹向西南和正西方向。定义好 showRoseWind() 函数之后,查看其他城市的风向情况也非常简单。

hist, bin = np.histogram(df_ferrara['wind_deg'],8,[0,360])
print(hist)
showRoseWind(hist,'Ferrara', max(hist))

计算风速均值的分布情况

即使是跟风速相关的其他数据,也可以用极区图来表示。

定义 RoseWind_Speed 函数,计算将 360 度范围划分成的八个面元中每个面元的平均风速。

def RoseWind_Speed(df_city):
# degs = [45, 90, ..., 360]
degs = np.arange(45,361,45)
tmp = []
for deg in degs:
# 获取 wind_deg 在指定范围的风速平均值数据
tmp.append(df_city[(df_city['wind_deg']>(deg-46)) & (df_city['wind_deg']<deg)]
['wind_speed'].mean())
return np.array(tmp)

这里 df_city[(df_city['wind_deg']>(deg-46)) & (df_city['wind_deg'] 获取的是风向大于 deg-46度和风向小于deg` 的数据。

RoseWind_Speed() 函数返回一个包含八个平均风速值的 NumPy 数组。该数组将作为先前定义的 showRoseWind() 函数的第一个参数,这个函数是用来绘制极区图的。

showRoseWind(RoseWind_Speed(df_ravenna),'Ravenna',max(hist))

图 9-21 所示的风向频率玫瑰图表示风速在 360 度范围内的分布情况。

实验总结

本章主要目的是演示如何从原始数据获取信息。其中有些信息无法给出重要结论,而有些信息能够验证假设,增加我们对系统状态的认识,而找出这种信息也就意味着数据分析取得了成功。

Python——气象数据分析的更多相关文章

  1. 利用Python进行数据分析(12) pandas基础: 数据合并

    pandas 提供了三种主要方法可以对数据进行合并: pandas.merge()方法:数据库风格的合并: pandas.concat()方法:轴向连接,即沿着一条轴将多个对象堆叠到一起: 实例方法c ...

  2. 利用Python进行数据分析(5) NumPy基础: ndarray索引和切片

    概念理解 索引即通过一个无符号整数值获取数组里的值. 切片即对数组里某个片段的描述. 一维数组 一维数组的索引 一维数组的索引和Python列表的功能类似: 一维数组的切片 一维数组的切片语法格式为a ...

  3. 利用Python进行数据分析(9) pandas基础: 汇总统计和计算

    pandas 对象拥有一些常用的数学和统计方法.   例如,sum() 方法,进行列小计:   sum() 方法传入 axis=1 指定为横向汇总,即行小计:   idxmax() 获取最大值对应的索 ...

  4. 利用Python进行数据分析(8) pandas基础: Series和DataFrame的基本操作

    一.reindex() 方法:重新索引 针对 Series   重新索引指的是根据index参数重新进行排序. 如果传入的索引值在数据里不存在,则不会报错,而是添加缺失值的新行. 不想用缺失值,可以用 ...

  5. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍

    一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目的是为了数据分析.它提供了大量高级的数据结构和对数据处理的方法. pandas 有两个主要的数据结构 ...

  6. 利用Python进行数据分析(4) NumPy基础: ndarray简单介绍

    一.NumPy 是什么 NumPy 是 Python 科学计算的基础包,它专为进行严格的数字处理而产生.在之前的随笔里已有更加详细的介绍,这里不再赘述. 利用 Python 进行数据分析(一)简单介绍 ...

  7. 《利用python进行数据分析》读书笔记 --第一、二章 准备与例子

    http://www.cnblogs.com/batteryhp/p/4868348.html 第一章 准备工作 今天开始码这本书--<利用python进行数据分析>.R和python都得 ...

  8. 利用python进行数据分析之绘图和可视化

    matplotlib API入门 使用matplotlib的办法最常用的方式是pylab的ipython,pylab模式还会向ipython引入一大堆模块和函数提供一种更接近与matlab的界面,ma ...

  9. 利用Python进行数据分析——Numpy基础:数组和矢量计算

    利用Python进行数据分析--Numpy基础:数组和矢量计算 ndarry,一个具有矢量运算和复杂广播能力快速节省空间的多维数组 对整组数据进行快速运算的标准数学函数,无需for-loop 用于读写 ...

随机推荐

  1. datetime使用

      通过当前日期,获取最近第一个周五.第二个周五.每季度末最后一个周五 def get_current_week(self, symbol: str, start_date: datetime): i ...

  2. Linux终端命令行的常用快捷键

    history 显示命令历史列表 ↑(Ctrl+p) 显示上一条命令 ↓(Ctrl+n) 显示下一条命令 !num 执行命令历史列表的第num条命令 !! 执行上一条命令 !?string? 执行含有 ...

  3. java课程课后作业190502之单词统计

    自己想的方法一直都不是很好,但是又一直忘了改自己的算法,只能硬着头皮接着用自己以前的老方法了 第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后 ...

  4. 安装双系统(win8+ubuntu16)

    一.参考网址 1.windows10安装ubuntu双系统教程(绝对史上最详细) 2.安装Windows+Ubuntu双系统 二.注意细节 1.怎么看自己电脑是MBR还是UEFI:win+r输入msi ...

  5. Swift - UISplitViewController

    https://blog.csdn.net/weixin_43704791/article/details/86424080 2019年01月13日 AppDelegate中: func applic ...

  6. SQL注入类型

    本文转自:https://www.cnblogs.com/cui0x01/p/6322826.html Sql注入_类型 1.sql注入 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询 ...

  7. scala def方法时等号和括号使用说明笔记

    scala定义方法时会指定入参和返回类型(无返回类型时对应Unit,即java和C中的void模式). 1.有入参,有返回类型时,scala具有类型推导功能,以下两种表达方式效果一样.但根据scala ...

  8. Teamviewer 退出时设置不锁屏

    在pc端teamviewer登录同伴的机器时,页面最上端会出现一个工具栏,如图: 点击"动作"  ---〉"锁定" 取消打钩 "在会话结束时锁定&qu ...

  9. Mac OS/Windows好用软件分享

    下软件全部为破解版,仅供参考学习用,如涉及商业. 请支持正版!谢谢 全部为本人亲测过 看上哪个留言发给你!   直接全分享上来会有人居心不良!

  10. HTML5 可缩放矢量图形(2)—SVG基础

    参考文档——权威 SVG常识 渲染顺序——后来居上:越后面的元素越可见 单位——可以指定,也可以不指定,默认px,其他:em.%.cm.mm... SVG画布——绘制图像的区域,无限大 SVG视窗—— ...