Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python无循环设置值_Python_Pandas_Dataframe - Fatal编程技术网

Python无循环设置值

Python无循环设置值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个时间序列数据帧,其中有1或0(真/假)。我编写了一个函数,它循环遍历所有行,其中的值为1。给定名为n_hold的用户定义整数参数,我将从初始行向前设置值1到n行 例如,在下面的数据框中,我将循环到行2016-08-05。如果n_hold=2,则我将2016-08-08和2016-08-09也设置为1: 2016-08-03 0 2016-08-04 0 2016-08-05 1 2016-08-08 0 2016-08-09 0 2016-08-10

我有一个时间序列数据帧,其中有1或0(真/假)。我编写了一个函数,它循环遍历所有行,其中的值为1。给定名为
n_hold
的用户定义整数参数,我将从初始行向前设置值1到n行

例如,在下面的数据框中,我将循环到行
2016-08-05
。如果
n_hold=2
,则我将
2016-08-08
2016-08-09
也设置为1:

2016-08-03    0
2016-08-04    0
2016-08-05    1
2016-08-08    0
2016-08-09    0
2016-08-10    0
然后将生成
df

2016-08-03    0
2016-08-04    0
2016-08-05    1
2016-08-08    1
2016-08-09    1
2016-08-10    0
我的问题是,这是运行10秒的数千次和我目前的解决方案,我循环的行有一个和子集是太慢了。我想知道是否有任何解决上述问题的办法,这是真的很快

这是我的(慢速)解决方案,
x
是初始信号数据帧:

n_hold = 2
entry_sig_diff = x.diff()
entry_sig_dt = entry_sig_diff[entry_sig_diff == 1].index
final_signal = x * 0
for i in range(0, len(entry_sig_dt)):
    row_idx = entry_sig_diff.index.get_loc(entry_sig_dt[i])

    if (row_idx + n_hold) >= len(x):
        break

    final_signal[row_idx:(row_idx + n_hold + 1)] = 1

答案完全更改,因为使用连续的
1
值时工作方式不同:

说明

%timeit (orig(x))
24.8 ms ± 653 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit x.where(x.ne(x.shift()) & (x == 1)).ffill(limit=n_hold).fillna(0, downcast='int')
1.36 ms ± 12.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
解决方案首先使用链式布尔掩码删除每个连续的
1
,方法是将(不等于
!=
)与to
NaN
s进行比较,然后使用
limit
参数向前填充
ffill
,最后替换
0
返回:

n_hold = 2
s = x.where(x.ne(x.shift()) & (x == 1)).ffill(limit=n_hold).fillna(0, downcast='int')
计时和比较输出:

np.random.seed(123)
x = pd.Series(np.random.choice([0,1], p=(.8,.2), size=1000))
x1 = x.copy()
#print (x)


def orig(x):
    n_hold = 2
    entry_sig_diff = x.diff()
    entry_sig_dt = entry_sig_diff[entry_sig_diff == 1].index
    final_signal = x * 0
    for i in range(0, len(entry_sig_dt)):
        row_idx = entry_sig_diff.index.get_loc(entry_sig_dt[i])

        if (row_idx + n_hold) >= len(x):
            break

        final_signal[row_idx:(row_idx + n_hold + 1)] = 1
    return final_signal

#print (orig(x))

计时

%timeit (orig(x))
24.8 ms ± 653 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit x.where(x.ne(x.shift()) & (x == 1)).ffill(limit=n_hold).fillna(0, downcast='int')
1.36 ms ± 12.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

你能展示一下你的允许完整性的方法吗?熊猫中有没有一个函数可以吐出我使用的数据帧,这样我就可以把它发布在这里,这样你们就可以使用它了?我记得我做过一次,但忘了它在R或Python中是否比简单循环快?@user1234440-我希望如此,最好测试一下。或者,如果添加您的解决方案,我可以添加计时。@user1234440-不幸的是,解决方案有点复杂,添加了新的解决方案、解释和计时。