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

## 1.获取数据

```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.设置窗口获得每个窗口的突变位置

```    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)) ```

```    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实用宝典 (pythondict.com)