标签归档:Python 数据分析

Python 使用tablib库快速导出数据

Tablib是一个Python的第三方数据导出模块,它支持以下文件格式的导出:

  • Excel
  • JSON
  • YAML
  • Pandas DataFrames
  • HTML
  • Jira
  • TSV
  • ODS
  • CSV
  • DBF

这个工具能做到的东西,Pandas都能做到,但是有时候Pandas实在是过重了,如果我们只想实现轻量数据的导出,而非上千万级别的数据导出,该工具更能体现它的优势。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装本文所需要的依赖模块:

pip install tablib

看到 Successfully installed xxx 则说明安装成功。

2.基本使用

这一块,官方文档已经有详细介绍,这里转载自xin053的翻译与介绍,有部分修改。

创建Dataset对象

import tablib
headers = ('first_name', 'last_name')
data = [
    ('John', 'Adams'),
    ('George', 'Washington')
]
data = tablib.Dataset(*data, headers=headers)

这样相当于构造了一张表:

first_namelast_name
JohnAdams
GeorgeWashington

其中最重要的就是Dataset对象,当然该对象的创建也可以不输入参数,直接

data = tablib.Dataset()

创建出一个Dataset对象,然后通过

data.headers = ['first_name', 'last_name']

设置表头,当然也可以使用

data.headers = ('first_name', 'last_name')

因为不管是用列表还是元组,tablib都会自动帮我们处理好,我们可以通过

data.append(['Henry', 'Ford'])

或者

data.append(('Henry', 'Ford'))

来向表中添加一条记录。

我们可以通过data.dict来查看目前表中的所有数据:

>>> data.dict
[OrderedDict([('First Name', 'John'), ('Last Name', 'Adams')]), OrderedDict([('First Name', 'George'), ('Last Name', 'Washington')]), OrderedDict([('First Name', 'Henry'), ('Last Name', 'Ford')])]

也可以通过print(data)显示更人性化的输出:

>>> print(data)
First Name|Last Name 
----------|----------
John      |Adams     
George    |Washington
Henry     |Ford 

Dataset属性

data.height输出当前记录(行)总数
data.width输出当前属性(列)总数

>>> print(data)
First Name|Last Name|age
----------|---------|---
John      |Adams    |90
Henry     |Ford     |83
>>> data.height
2
>>> data.width
3 

常用方法

详情可见官方文档:
https://tablib.readthedocs.io/en/stable/api/#tablib.Dataset.remove_duplicates

lpop(),lpush(row, tags=[]),lpush_col(col, header=None)
是对列的相关操作
pop(),rpop(),rpush(row, tags=[]),rpush_col(col, header=None)
是对行的相关操作
remove_duplicates() 去除重复的记录
sort(col, reverse=False) 根据列进行排序
subset(rows=None, cols=None) 返回子Dataset
wipe() 清空Dataset,包括表头和内容

新增列

>>> data.append_col((90, 67, 83), header='age')

这样表就变成了:

first_namelast_nameage
JohnAdams90
GeorgeWashington67
HenryFord83
>>> print(data)
First Name|Last Name |age
----------|----------|---
John      |Adams     |90
George    |Washington|67
Henry     |Ford      |83 

对记录操作

>>> print(data[:2])
[('John', 'Adams', 90), ('George', 'Washington', 67)]
>>> print(data[2:])
[('Henry', 'Ford', 83)]

对属性操作

>>> print(data['first_name'])
['John', 'George', 'Henry']

>>> print(data)
First Name|Last Name |age
----------|----------|---
John      |Adams     |90
George    |Washington|67
Henry     |Ford      |83
>>> data.get_col(1)
['Adams', 'Washington', 'Ford'] 

删除记录

>>> del data[1]
>>> print(data)
First Name|Last Name|age
----------|---------|---
John      |Adams    |90
Henry     |Ford     |83 

可见记录也是从0开始索引的

删除记录操作也支持切片

删除属性

del data['Col Name']

导入数据

imported_data = tablib.Dataset().load(open('data.csv').read())

导出数据

csv

>>> data.csv
'First Name,Last Name,age\r\nJohn,Adams,90\r\nHenry,Ford,83\r\n'
>>> print(data.csv)
First Name,Last Name,age
John,Adams,90
Henry,Ford,83 
>> f = open('data.csv', 'w', encoding='utf-8')
>> f.write(data.csv)
>> f.close() 

这样便可成功将数据导出为csv文件。

json

>>> data.json
'[{"First Name": "John", "Last Name": "Adams", "age": 90}, {"First Name": "Henry", "Last Name": "Ford", "age": 83}]'
>>> print(data.json)
[{"First Name": "John", "Last Name": "Adams", "age": 90}, {"First Name": "Henry", "Last Name": "Ford", "age": 83}] 
>> f = open('data.json', 'w', encoding='utf-8')
>> f.write(data.json)
>> f.close()  

yaml

>>> data.yaml
'- {First Name: John, Last Name: Adams, age: 90}\n- {First Name: Henry, Last Name: Ford, age: 83}\n'
>>> print(data.yaml)
- {First Name: John, Last Name: Adams, age: 90}
- {First Name: Henry, Last Name: Ford, age: 83} 
>> f = open('data.yaml', 'w', encoding='utf-8')
>> f.write(data.yaml)
>> f.close()   

excel

>>> with open('people.xls', 'wb') as f:
...     f.write(data.xls) 

注意要以二进制形式打开文件

dbf

>>> with open('people.dbf', 'wb') as f:
...     f.write(data.dbf) 

高级使用

动态列

可以将一个函数指定给Dataset对象

import random

def random_grade(row):
    """Returns a random integer for entry."""
    return (random.randint(60,100)/100.0)

data.append_col(random_grade, header='Grade')

>>> data.yaml
- {Age: 22, First Name: Kenneth, Grade: 0.6, Last Name: Reitz}
- {Age: 20, First Name: Bessie, Grade: 0.75, Last Name: Monke} 

函数的参数row传入的是每一行记录,所以可以根据传入的记录进行更一步的计算:

def guess_gender(row):
	"""Calculates gender of given student data row."""
	m_names = ('Kenneth', 'Mike', 'Yuri')
	f_names = ('Bessie', 'Samantha', 'Heather')
	name = row[0]
	if name in m_names:
		return 'Male'
	elif name in f_names:
		return 'Female'
	else:
		return 'Unknown'
>>> data.yaml
- {Age: 22, First Name: Kenneth, Gender: Male, Last Name: Reitz}
- {Age: 20, First Name: Bessie, Gender: Female, Last Name: Monke}

tag

可以给记录添加tag,之后通过tag来过滤记录:

students = tablib.Dataset()
students.headers = ['first', 'last']
students.rpush(['Kenneth', 'Reitz'], tags=['male', 'technical'])
students.rpush(['Bessie', 'Monke'], tags=['female', 'creative'])
>>> students.filter(['male']).yaml
- {first: Kenneth, Last: Reitz}

3.举个小例子

现在有一个场景,我们需要将一份股票数据csv文件转化为json数据:

你只需要这样操作:

import tablib

data = tablib.Dataset().load(open('1.csv').read())

with open('data.json', 'w', encoding='utf-8') as f:
    f.write(data.json)

即可将其转化为json格式,它的特点在于轻量、简单。Pandas如果用来做这样的转化,则有些大材小用。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 数据分析与挖掘好帮手—Anaconda

用Python进行数据分析的时候,你会不会烦恼要安装那么多的模块?比如Pandas、Numpy、matplotlib、scipy等等,而当你接手的项目是由不同的Python版本编写的时候你又得下载那个Python版本,然后安装所需要的依赖,非常麻烦。

而使用Anaconda则能减少许多这样的烦恼,因为Anaconda具有以下特点:

1.自带180多个科学包,包括conda、numpy、scipy、pandas等。

2.极其方便的环境管理工具,可以创建**任意**版本的Python虚拟环境

为什么第2点的任意要加粗呢?其他的虚拟环境管理工具,如virtualenv是无法随意选择Python版本构建虚拟环境的,它们只能使用目前电脑上已有的Python版本构建虚拟环境。而Anaconda的环境管理工具则可以任意选择Python版本,它会自动下载相应的Python版本到虚拟环境中,免去用户自己手动下载安装Python的麻烦。

1.安装Anaconda

首先,前往Anaconda官方下载地址:
https://www.anaconda.com/distribution/#download-section

选择最新版本的Anaconda进行下载,要注意选择 64-Bit Graphical Installer. 当然这里指的只是Anaconda的默认Python版本,安装成功后,你可以创建任意版本的Python虚拟环境。

安装的过程中一路默认即可,不过如果是Windows用户,建议不要将Anaconda装在C盘,否则随着安装的包越来越多,会出现C盘空间不足的情况。

Windows用户注意:如果在 “Advanced Installation Options”中没有勾选“Add Anaconda to my PATH environment variable.”(添加Anaconda至我的环境变量),则无法在CMD或者powershell中使用conda命令,需要打开菜单中的 Anaconda Prompt 才能使用conda命令,因此请各位根据自己的情况选择勾不勾选。如果没勾选,但是后来又反悔了,可以通过配置环境变量来解决这个问题:

此处借用了别人的图,请注意路径要换成自己的路径。

相比之下,macOS系统就没有这么多繁琐的操作了,在终端(Terminal)中即可使用conda命令。

2.修改镜像源

这点很关键,由于conda默认镜像源是国外的,因此你 pip install 或者 conda install 安装模块的时候可能会等待非常久,如果你不想装个包比敲代码花费的时间还长,请一定要修改镜像源。

首先,在CMD(Windows)或Terminal(macOS)中,输入:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes

Windows用户前往目录 C:\Users<你的用户名> 下显示隐藏文件会看到配置文件.condarc .

macOS用户则是在 ~/.condarc 中,可以在终端中用 sudo open ~/.condarc 打开。

然后会看到文件内容类似:

channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
  - defaults
show_channel_urls: true

– defaults 就是原来的源,我们可以直接把它去掉(建议去掉),只用清华源。然后保存,重启终端即可。

3.使用及切换环境

到这里,我们就可以开始使用conda环境了,默认情况下,现在Python命令都是基于conda的,因此你的终端或CMD前都会带有(base)的字样:

如果没有的话,可能是你在安装的时候把 “Register Anaconda as my default Python 3.7”去掉了。没关系,我们也可以用以下命令切换环境,Windows下在CMD中使用:

activate base

可切换到Anaconda默认环境, macOS和Linux则是:

conda activate base

其实两者是一样的原理,均通过conda来控制环境的使用。因为Windows中,输入完activate base后,它会自动补全一句conda.bat activate base, 如下图所示​:

在base环境下,默认自带pandas等180+个科学工具包,因此如果没有特别的需求,在这个环境下进行数据分析的开发即可。

4.创建虚拟环境

理想情况下,一直在base环境下开发是美滋滋的,但有时候我们会遇到开发的项目需要特别的版本,甚至是上古时期的2.x版本,这个时候anaconda强大之处也体现出来了,比如我的项目是 old_git, 需要Python2.7版本:

conda create --name old_git python=2.7

这时候便创建了一个python2.7的环境,叫做old_git,通过调用

activate old_git
# macOS/Linux则输入: conda activate old_git 

即可切换到这个环境,不过注意,这个新的环境是没有自带180+个科学工具包的,你需要自行安装所需模块。

5.其他命令

最常用的是显示已创建环境:

conda info --envs

其次是删除环境:

conda remove --name 环境名 --all

(由于我这里环境都比较重要就不演示了)

最后是安装包:

conda install xxx

其实conda install 和 pip install 都能达到安装包的效果,区别在于,前者使用conda的镜像源,后者使用pip镜像源。一般而言,推荐pip install,因为包更全一点。

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

如何基于Paddle训练一个98%准确率的抑郁文本预测模型

Paddle是一个比较高级的深度学习开发框架,其内置了许多方便的计算单元可供使用,我们之前写过PaddleHub相关的文章:

1.Python 识别文本情感就这么简单

2.比PS还好用!Python 20行代码批量抠图

3.Python 20行代码检测人脸是否佩戴口罩

在这些文章里面,我们基于PaddleHub训练好的模型直接进行预测,用起来特别方便。不过,我并没提到如何用自己的数据进行训练,因此本文将弥补前几篇文章缺少的内容,讲解如何使用paddle训练、测试、推断自己的数据。

2023-04-26更新:

提供一个5W行的数据源,数据结构请自行组合:https://pythondict.com/download/%e8%b5%b0%e9%a5%ad%e5%be%ae%e5%8d%9a%e8%af%84%e8%ae%ba%e6%95%b0%e6%8d%ae/

2024-04-26更新:

很多同学要源代码和模型,下载地址:

【源代码+模型】基于Paddle训练一个98%准确率的抑郁文本预测

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

我们需要安装百度的paddlepaddle, 进入他们的官方网站就有详细的指引:
https://www.paddlepaddle.org.cn/install/quick

根据你自己的情况选择这些选项,最后一个CUDA版本,由于本实验不需要训练数据,也不需要太大的计算量,所以直接选择CPU版本即可。选择完毕,下方会出现安装指引,不得不说,Paddlepaddle这些方面做的还是比较贴心的(就是名字起的不好)

要注意,如果你的Python3环境变量里的程序名称是Python,记得将语句改为Python xxx,如下进行安装:

python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple

最后是安装paddlehub:

pip install -i https://mirror.baidu.com/pypi/simple paddlehub

然后为了用paddle的模型训练我们自己的数据,还需要下载他们的源代码:

git clone https://github.com/PaddlePaddle/models.git

比较大,大概400M。

2024-04-26更新:

很多同学要源代码和模型,下载地址:

【源代码+模型】基于Paddle训练一个98%准确率的抑郁文本预测

 

2. 数据预处理

这次实验,我使用了8000条走饭下面的评论和8000条其他微博的正常评论作为训练集,两个分类分别使用1000条数据作为测试集。

2.1 去重去脏

在这一步,我们需要先去除重复数据,并使用正则表达式@.* 和 ^@.*\n 去除微博@的脏数据。如果你是使用Vscode的,可以使用sort lines插件去除重复数据:

如果不是Vscode,请用Python写一个脚本,遍历文件,将每一行放入集合中进行去重。比较简单,这里不赘述啦。

正则表达式去除脏数据,我这里数据量比较少,直接编辑器解决了:

2.2 分词

首先,需要对我们的文本数据进行分词,这里我们采用结巴分词的形式进行:

然后需要在分词的结果后面使用\t隔开加入标签,我这里是将有抑郁倾向的句子标为0,将正常的句子标为1. 此外,还需要将所有词语保存起来形成词典文件,每个词为一行。

并分别将训练集和测试集保存为 train.tsv 和 dev.tsv, 词典文件命名为word_dict.txt, 方便用于后续的训练。

3.训练

下载完Paddle模型源代码后,进入 models/PaddleNLP/sentiment_classification文件夹下,这里是情感文本分类的源代码部分。

在开始训练前,你需要做以下工作:

1.将train.tsv、dev.tsv及word_dict.txt放入senta_data文件夹.

2.设置senta_config.json的模型类型,我这里使用的是gru_net:

3.修改run.sh相关的设置:

如果你的paddle是CPU版本的,请把use_cuda改为false。此外还有一个save_steps要修改,代表每训练多少次保存一次模型,还可以修改一下训练代数epoch,和 一次训练的样本数目 batch_size.

4.如果你是windows系统,还要新建一个save_models文件夹,然后在里面分别以你的每训练多少次保存一次的数字再新建文件夹。。没错,这可能是因为他们开发这个框架的时候是基于linux的,他们写的保存语句在linux下会自动生成文件夹,但是windows里不会。

好了现在可以开始训练了,由于训练启动脚本是shell脚本,因此我们要用powershell或git bash运行指令,Vscode中可以选择默认的终端,点击Select Default Shell后选择一个除cmd外的终端即可。

输入以下语句开始训练

$ sh run.sh train

4.测试

恭喜你走到了这一步,作为奖励,这一步你只需要做两个操作。首先是将run.sh里的MODEL_PATH修改为你刚保存的模型文件夹:

我这里最后一次训练保存的文件夹是step_1200,因此填入step_1200,要依据自己的情况填入。然后一句命令就够了:

$ sh run.sh eval

然后就会输出损失率和准确率:

可以看到我的模型准确率大概有98%,还是挺不错的。

5.预测

我们随意各取10条抑郁言论和普通言论,命名为test.txt存入senta_data文件夹中,输入以下命令进行预测:

$ sh run.sh test

这二十条句子如下,前十条是抑郁言论,后十条是普通言论:

好 崩溃 每天 都 是 折磨 真的 生不如死
姐姐   我 可以 去 找 你 吗
内心 阴暗 至极 … …
大家 今晚 都 是因为 什么 没睡
既然 儿子 那么 好     那 就 别生 下 我 啊     生下 我 又 把 我 扔下     让 我 自生自灭     这算 什么
走饭 小姐姐 怎么办 我该 怎么办 每天 都 心酸 心如刀绞 每天 都 有 想要 死 掉 的 念头 我 不想 那么 痛苦 了
你 凭 什么 那么 轻松 就 说出 这种 话
一 闭上眼睛 脑子里 浮现 的 就是 他 的 脸 和 他 的 各种 点点滴滴 好 难受 睡不着 啊 好 难受 为什么 吃 了 这么 多 东西 还是 不 快乐 呢
以前 我 看到 那些 有手 有 脚 的 人 在 乞讨 我 都 看不起 他们   我 觉得 他们 有手 有 脚 的 不 应该 乞讨 他们 完全 可以 凭 自己 的 双手 挣钱   但是 现在 我 有 手 有 脚 我 也 想 去 人 多 的 地方 乞讨 … 我 不想 努力 了 …
熬过来 吧 求求 你 了 好 吗
是 在 说 我们 合肥 吗 ?
这歌 可以 啊
用 一个 更坏 的 消息 掩盖 这 一个 坏消息
请 尊重 他人 隐私 这种 行为 必须 严惩不贷
这个 要 转发
🙏 🙏 保佑 咱们 国家 各个 省 千万别 再有 出事 的 也 别 瞒报 大家 一定 要 好好 的 坚持 到 最后 加油
我 在家 比 在 学校 有钱   在家 吃饭 零食 水果 奶 都 是 我 妈 天天 给 我 买   每天 各种 水果   还 可以 压榨 我弟 跑腿   买 衣服 也 是   水乳 也 是   除了 化妆品 反正 现在 也 用不上   比 学校 的 日子 过得 好多 了
广西 好看 的 是 柳州 的 满城 紫荆花
加油 一起 共同 度过 这次 难关 我们 可以
平安 平安 老天 保佑

得到结果如下:

Final test result:
0 0.999999 0.000001
0 0.994013 0.005987
0 0.997636 0.002364
0 0.999975 0.000025
0 1.000000 0.000000
0 1.000000 0.000000
0 0.999757 0.000243
0 0.999706 0.000294
0 0.999995 0.000005
0 0.998472 0.001528
1 0.000051 0.999949
1 0.000230 0.999770
1 0.230227 0.769773
1 0.000000 1.000000
1 0.000809 0.999191
1 0.000001 0.999999
1 0.009213 0.990787
1 0.000003 0.999997
1 0.000363 0.999637
1 0.000000 1.000000

第一列是预测结果(0代表抑郁文本),第二列是预测为抑郁的可能性,第三列是预测为正常微博的可能性。可以看到,基本预测正确,而且根据这个分数值,我们还可以将文本的抑郁程度分为:轻度、中度、重度,如果是重度抑郁,应当加以干预,因为其很可能会发展成自杀倾向。

我们可以根据这个模型,构建一个自杀预测监控系统,一旦发现重度抑郁的文本迹象,即可实行干预,不过这不是我们能一下子做到的事情,需要随着时间推移慢慢改进这个识别算法,并和相关机构联动实行干预。

我们的文章到此就结束啦,如果你希望我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

Python 百度指数突变值检测

百度指数是一款非常好用的工具,通过它我们能知道某些关键词在过去的一些日子里的热度变化趋势并能够对这些数据进行分析。如果能用得好百度指数,我们将能产出巨大的价值。

你可以通过关注文章下方的公众号(Python实用宝典),回复 百度指数突变点 获得本文所有的源代码。

今天的教程主要是来教大家如何找出百度指数中突变值的位置,如图所示画框框的部分:

30天数据 突变区域

30天的数据流中很容易通过人工的方法找到突变数据的位置,但如果是180天呢?这可就不好通过人工的方法找了:

180天数据

如何使用Python自动找出这180天里的突变点呢?由于这里涉及到了对时间序列的突变点的检测,我们可以使用一种叫 Pettitt突变点检测 算法

1.获取数据

通过开发者工具找到数据接口,结果发现其接口返回来的数据进行了加密:

看起来就很像字符串替换,如果要从头开始解密的话需要做一些对比工作(把源数据和该加密数据放一起进行比较)或者直接看前端源代码 。由于这里不是今天要讲的重点内容,我直接使用了他人的开源项目: 百度指数爬虫 。你可以通过关注文章最下方的公众号(Python实用宝典),回复 百度指数突变点 获得本文所有的源代码。

将爬取到的数据,按照关键词存放到数组中,你可以很轻易地修改我的代码增加/减少关键词。如下:

from get_index import BaiduIndex

if __name__ == "__main__":
    keywords = ['区块链']
    results = {'区块链':[]}
    baidu_index = BaiduIndex(keywords, '2019-05-04', '2019-11-04')
    for index in baidu_index.get_index():
        if index['type'] == 'all':
            results[index['keyword']].append(index['index'])
    print(results)

2.突变点算法

Pettitt突变点检测 算法是用R语言写的,实现其实很简单。作者并没有说为什么这么做,而是给了几个数学公式,我们只需要跟着做即可。

代码如下:

def pettitt(data):
    data = np.array(data)
    n = data.shape[0]
    k = range(n)
    dataT = pd.Series(data)
    r = dataT.rank()
    Uk = [2*np.sum(r[0:x])-x*(n + 1) for x in k]
    Uabs = list(np.abs(Uk))
    U = np.max(Uabs)
    K = Uabs.index(U)
    p = 2 * np.exp((-6 * (U**2))/(n**3 + n**2))
    if p <= 0.5:
        # 显著
        result = 'yes'
    else:
        # 不显著
        result = 'no'
    return K, result 

我们只需要将数据放入该函数,就能得到这段数据的突变点(一个),由于它只能找出一段数据里的一个突变点,而我们需要获得的是多个突变点,因此还得设置一个移动窗口,获得每个窗口中的突变位置。

3.设置窗口获得每个窗口的突变位置

将数据设为30天一个窗口,检测每个窗口中的突变值:

    length = len(results['区块链'])
    locations = []
    for i in range(0, length, 1):
        pos, result = pettitt(results['区块链'][i:i+29])
        if result == 'yes':
            locations.append(pos+i)
    print(set(locations)) 

结果如下:

这样看实在是不好看出什么,用matplotlib可视化一下:

    print(results)
    plt.plot(range(len(results['区块链'])), [int(i) for i in results['区块链']])
    for i in locations:
        plt.plot(i,int(results['区块链'][i]),'ks')
    my_y_ticks = np.arange(0, 250000, 50000)
    #显示范围为0至25000,每5000显示一刻度
    plt.yticks(my_y_ticks)
    plt.show()

结果:

说实话,不太满意这个结果,有两个比较明显的两个突变点竟然没找出来。除开这两个突变点不说,整体上看,这个检测方法的效果还可以。

文章到此就结束啦, 你可以通过关注文章下方的公众号(Python实用宝典),回复 百度指数突变点 获得本文所有的源代码。

如果你喜欢今天的Python 教程,请持续关注Python实用宝典,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们会耐心解答的!

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典