【发布时间】:2019-07-23 08:20:01
【问题描述】:
因为我的last version 没有得到回复,所以用更具体的问题重新提出这个问题。
我正在尝试制作一个可导入的函数来对具有一系列(长期)时间历史的数据帧进行平稳小波变换。实际的理论并不重要(我什至可能没有完全正确地使用它),重要的部分是我将时间历史分解为块并使用multiprocessing.Pool 将它们提供给多个线程。
import pandas as pd
import numpy as np
import pywt
from multiprocessing import Pool
import functools
def swt_block(arr, level = 8, wvlt = 'haar'):
block_length = arr.shape[0]
if block_length == 2**level:
d = pywt.swt(arr, wvlt, axis = 0)
elif block_length < 2**level:
arr_ = np.pad(arr,
((0, 2**level - block_length), (0,0)),
'constant', constant_values = 0)
d = pywt.swt(arr_, wvlt, axis = 0)
else:
raise ValueError('block of length ' + str(arr.shape[0]) + ' too large for swt of level ' + str(level))
out = []
for lvl in d:
for coeff in lvl:
out.append(coeff)
return np.concatenate(out, axis = -1)[:block_length]
def swt(df, wvlt = 'haar', level = 8, processors = 4):
block_length = 2**level
with Pool(processors) as p:
data = p.map(functools.partial(swt_block, level = level, wvlt = wvlt),
[i.values for _, i in df.groupby(np.arange(len(df)) // block_length)])
data = np.concatenate(data, axis = 0)
header = pd.MultiIndex.from_product([list(range(level)),
[0, 1],
df.columns],
names = ['level', 'coef', 'channel'])
df_out = pd.DataFrame(data, index = df.index, colummns = header)
return df_out
我之前在一个独立的脚本中完成了此操作,因此如果第二个函数只是包装在 if __name__ == '__main__': 中的裸代码,则代码可以工作,并且如果我在末尾添加一个类似的块,则确实可以在脚本中工作脚本。但是,如果我导入甚至只是在解释器中运行上述内容,然后执行
df_swt = swt(df)
事情无限期地挂起。我确定这是multiprocessing 上的某种护栏,以防止我用线程做一些愚蠢的事情,但我真的不希望将这段代码复制到一堆其他脚本中。包括其他标签,以防它们以某种方式成为罪魁祸首。
【问题讨论】:
标签: python python-multiprocessing