标题中的英文首字母大写比较规范,但在python实际使用中均为小写。
建议读者安装anaconda,这个集成开发环境自带了很多包。
作者推荐到2018年8月2日仍为最新版本的anaconda下载链接: https://pan.baidu.com/s/1pbzVbr1ZJ-iQqJzy1wKs0A 密码: g6ex
下面代码的开发环境为jupyter notebook,使用在jupyter notebook中的截图表示运行结果。
1.简介
Scipy是世界上著名的Python开源科学计算库,建立在Numpy上,它增加的功能包括数值积分、最优化、统计和一些专用函数。
Scipy函数库在Numpy库的基础上增加了众多的数学、科学以及工程计算中常用的库函数。例如线性代数、常微分方程数值求解、信号处理、图像处理、稀疏矩阵等等。
官网:https://www.scipy.org/
Scipy模块列表:
模块名 | 功能 |
---|---|
scipy.cluster | 向量量化 |
scipy.constants | 数学常量 |
scipy.ffpack | 快速傅里叶变换 |
scipy.integrate | 积分 |
scipy.interpolate | 插值 |
scipy.io | 数据输入输出 |
scipy.linalg | 线性代数 |
scipy.ndimage | N维图像 |
scipy.odr | 正交距离回归 |
scipy.optimize | 优化算法 |
scipy.signal | 信号处理 |
scipy.sparse | 稀疏矩阵 |
scipy.spatial | 空间数据结构和算法 |
scipy.special | 特殊数学函数 |
scipy/stats | 统计函数 |
2.jupyter简介
Jupyter notebook 有两种键盘输入模式。编辑模式,允许你往单元格中键入代码或者文本,这时的单元框线是绿色的。命令模式,键盘输入运行程序命令,这时的单元框是蓝色的。
命令 | 作用 |
---|---|
shift + Enter | 运行本单元格,然后选中下个单元格 |
ctrl + Enter | 运行本单元格 |
Alt + Enter | 运行本单元格,在其下插入新单元格 |
Y | 单元格转入Code状态 |
M | 单元格转入Markdown状态 |
A | 在上方插入新单元 |
B | 在下方插入新单元 |
X | 剪切选中的单元格 |
Shift + V | 在上方粘贴单元 |
3.保存和读取文件
from scipy import io
import numpy as np
a = np.arange(9).reshape(3,3)
io.savemat("a.mat",{'array':a})
data = io.loadmat('a.mat')
data,type(data)
上面一段代码的运行结果如下图所示:
从上面的结果可以看出,io.loadmat方法的返回值是字典dict。
练习
获取昨日排行第一的电影信息包含(电影名称、累计票房及上映天数),显示该电影自放映到昨日的所有累计票房线性趋势。提示:ts.day_boxoffice(‘日期’)方法获取单日电影票房数据
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
import datetime
from scipy import signal
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
def getDayList(day_number):
day_list = []
now_time = datetime.datetime.now()
for i in range(-int(day_number),0):
day = now_time + datetime.timedelta(days=i)
dayStr = day.strftime("%Y-%m-%d")
day_list.append(dayStr)
return day_list
def getMovieRecord(movieName):
df = ts.day_boxoffice()
day_number = df[df['MovieName']==movieName].MovieDay.values[0]
day_list = getDayList(day_number)
record_list = []
for day in day_list:
try:
movie_all = ts.day_boxoffice(day)
record = movie_all[movie_all['MovieName'] == movieName].copy()
record['date'] = day
record_list.append(record)
except Exception as e:
print(str(e))
return pd.concat(record_list).reset_index(drop=True)
def drawTrend(movieRecord):
x_ticks = [k[5:] for k in movieRecord['date'].values]
x = range(len(x_ticks))
y = movieRecord['BoxOffice'].values.astype('int')
plt.xticks(x, x_ticks)
plt.plot(x,y,label='走势图')
plt.scatter(x,y, color='r')
y2 = y - signal.detrend(y)
plt.plot(x,y2,label='潜在趋势图')
plt.ylim(0,50000)
movieName = movieRecord['MovieName'].values[0]
plt.title("《%s》电影上映后票房走势图" %movieName)
plt.xlabel('日期')
plt.ylabel('单日票房')
plt.legend()
plt.show()
if __name__ == "__main__":
movieName = ts.day_boxoffice().iloc[0]['MovieName']
movieRecord = getMovieRecord(movieName)
drawTrend(movieRecord)
运行结果如下图所示: