Scipy入门

2018-09-10 09:57:49 浏览数 (1)

标题中的英文首字母大写比较规范,但在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.保存和读取文件

代码语言:javascript复制
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)

上面一段代码的运行结果如下图所示:

image.png

从上面的结果可以看出,io.loadmat方法的返回值是字典dict。

练习

获取昨日排行第一的电影信息包含(电影名称、累计票房及上映天数),显示该电影自放映到昨日的所有累计票房线性趋势。提示:ts.day_boxoffice(‘日期’)方法获取单日电影票房数据

代码语言:javascript复制
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)

运行结果如下图所示:

票房走势图.png

0 人点赞