python把文字矢量化_如何在Python中对这个峰值发现进行矢量化?

基本上我正在编写一个峰值发现功能,需要能够scipy.argrelextrema在基准测试中击败。这是我正在使用的数据的链接,以及代码:

如果此链接过期,则可以在dukascopy银行的在线历史数据下载程序中找到该数据。import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

data = pd.read_csv('EUR_USD.csv')

data.columns = ['Date', 'open', 'high', 'low', 'close','volume']

data.Date = pd.to_datetime(data.Date, format='%d.%m.%Y %H:%M:%S.%f')

data = data.set_index(data.Date)

data = data[['open', 'high', 'low', 'close']]

data = data.drop_duplicates(keep=False)

price = data.close.values

def fft_detect(price, p=0.4):

trans = np.fft.rfft(price)

trans[round(p*len(trans)):] = 0

inv = np.fft.irfft(trans)

dy = np.gradient(inv)

peaks_idx = np.where(np.diff(np.sign(dy)) == -2)[0] + 1

valleys_idx = np.where(np.diff(np.sign(dy)) == 2)[0] + 1

patt_idx = list(peaks_idx) + list(valleys_idx)

patt_idx.sort()

label = [x for x in np.diff(np.sign(dy)) if x != 0]

# Look for Better Peaks

l = 2

new_inds = []

for i in range(0,len(patt_idx[:-1])):

search = np.arange(patt_idx[i]-(l+1),patt_idx[i]+(l+1))

if label[i] == -2:

idx = price[search].argmax()

elif label[i] == 2:

idx = price[search].argmin()

new_max = search[idx]

new_inds.append(new_max)

plt.plot(price)

plt.plot(inv)

plt.scatter(patt_idx,price[patt_idx])

plt.scatter(new_inds,price[new_inds],c='g')

plt.show()

return peaks_idx, price[peaks_idx]

它基本上使用快速傅里叶变换(FFT)对数据进行平滑,然后使用导数找到平滑数据的最小和最大索引,然后在未平滑数据上找到相应的峰值。有时它找到的峰值由于某些平滑效应而不是主意,所以我运行这个for循环来搜索指定边界之间的每个索引的更高或更低的点l。我需要帮助矢量化这个for循环!我不知道该怎么做。如果没有for循环,我的代码会快50%scipy.argrelextrema,但for循环会减慢它的速度。因此,如果我能找到一种方法来对其进行矢量化,那么它将是一种非常快速,非常有效的替代方案scipy.argrelextrema。这两个图像分别表示没有for循环和循环的数据。1620

1620

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值