栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何对使用其自身输出的滞后值的函数进行矢量化处理?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何对使用其自身输出的滞后值的函数进行矢量化处理?

我认为没有矢量化此操作的方法会比Python循环快得多。(至少,如果您只想使用Python,pandas和numpy,则不需要。)

但是,您可以通过简化代码来提高此操作的性能。您的实现使用

if
语句和许多Dataframe索引。这些是相对昂贵的操作。

这是对脚本的修改,其中包括两个功能:

add_signal_l(df)
add_lagged(df)
。第一个是您的代码,仅包装在一个函数中。第二个使用更简单的函数来达到相同的结果-
仍然是Python循环,但它使用numpy数组和按位运算符。

import numpy as npimport pandas as pdimport datetime#-----------------------------------------------------------------------# Create the test Dataframe# Data frame with input and desired output i column signal_ddf = pd.Dataframe({'condition_A':list('00001100000110'),        'condition_B':list('01110011111000'),        'signal_d':list('00001111111110')})colnames = list(df)df[colnames] = df[colnames].apply(pd.to_numeric)datelist = pd.date_range(pd.datetime.today().strftime('%Y-%m-%d'), periods=14).tolist()df['dates'] = datelistdf = df.set_index(['dates']) #-----------------------------------------------------------------------def add_signal_l(df):    # Solution using a for loop with nested ifs in column signal_l    df['signal_l'] = df['condition_A'].copy(deep = True)    i=0    for observations in df['signal_l']:        if df.ix[i,'condition_A'] == 1: df.ix[i,'signal_l'] = 1        else: # Signal previously triggered by condition_A # AND kept "alive" by condition_B:      if df.ix[i - 1,'signal_l'] & df.ix[i,'condition_B'] == 1:      df.ix[i,'signal_l'] = 1 else:     df.ix[i,'signal_l'] = 0       i = i + 1def compute_lagged_signal(a, b):    x = np.empty_like(a)    x[0] = a[0]    for i in range(1, len(a)):        x[i] = a[i] | (x[i-1] & b[i])    return xdef add_lagged(df):    df['lagged'] = compute_lagged_signal(df['condition_A'].values, df['condition_B'].values)

这是在IPython会话中运行的两个函数的计时比较:

In [85]: dfOut[85]:  condition_A  condition_B  signal_ddates        2017-06-09 0 0         02017-06-10 0 1         02017-06-11 0 1         02017-06-12 0 1         02017-06-13 1 0         12017-06-14 1 0         12017-06-15 0 1         12017-06-16 0 1         12017-06-17 0 1         12017-06-18 0 1         12017-06-19 0 1         12017-06-20 1 0         12017-06-21 1 0         12017-06-22 0 0         0In [86]: %timeit add_signal_l(df)8.45 ms ± 177 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)In [87]: %timeit add_lagged(df)137 µs ± 581 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

如您所见,

add_lagged(df)
速度更快。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/646490.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号