Python 如何使用列表的串行嵌套条件返回值?

Python 如何使用列表的串行嵌套条件返回值?,python,arrays,pandas,list,numpy,Python,Arrays,Pandas,List,Numpy,我试图在布尔列表中实现一个算法。它看起来像: price_list = [0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1] 假设它捕获股票的每日价格变化,例如0表示下跌,1表示价格上涨 考虑一个为期4天的区块。从第一天开始,如果价格下降(值0),则在第二天返回-1并出价1。如果价格上涨(值1),则在第二天返回1并出价2 在第二天,如果价格下降,在第三天返回-2并出价1。如果增加,则在第三天返回2并出价3 在第三天,如果价格下降,在第四天

我试图在布尔列表中实现一个算法。它看起来像:

price_list = [0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1]
假设它捕获股票的每日价格变化,例如
0
表示下跌,
1
表示价格上涨

考虑一个为期4天的区块。从第一天开始,如果价格下降(值
0
),则在第二天返回
-1
并出价
1
。如果价格上涨(值
1
),则在第二天返回
1
并出价
2

在第二天,如果价格下降,在第三天返回
-2
并出价
1
。如果增加,则在第三天返回
2
并出价
3

在第三天,如果价格下降,在第四天返回
-3
并出价
1
。如果增加,则在第四天返回
3
并出价
4

第四天,如果价格下跌,返回
-4
。如果增加,则返回
4
。无论哪种方式,第二天出价
1
。我们可以说,它完成了一个招标周期。这里的问题是,只有在价格上涨3天的情况下,才能完成或聚合,因此,无论第4天的结果如何,我们都会回到投标
1
。否则,第二天的投标将取决于前一天

将此规则应用于上述列表,返回列表将为:

price_list =  [ 0, 1, 1,  0, 1,  0, 1, 1, 1, 1,  0,  0,  0, 1, 1,  0,  0, 1]

return_list = [-1, 1, 3, -2, 1, -3, 1, 3, 2, 4, -1, -1, -1, 1, 3, -2, -1, 1]
编辑:得到一些关于我的代码的评论,也许是为了展示一些尝试。但它仍然没有完成(事实上,我认为我在这方面没有任何进展)

df_temp=pd.DataFrame({'price':np.random.randint(0,2,1000)})
df_temp['block']=df_temp['price'].groupby(df_temp['price'].diff().ne(0.cumsum()).transform('count'))
df_temp['block_shift']=df_temp['block'].移位(1)
df_temp['mask']=df_temp['block']==df_temp['block_shift']
df_temp['cs']=df_temp['mask'].cumsum()-df_temp['mask'].cumsum().where(~df_temp['mask']).ffill().fillna(0)+1
df_temp['block_2']=df_temp['block']
df_temp.loc[(df_temp['block']>4)和(df_temp['cs']4)和(df_temp['cs']%4!=0),'block_2']=df_temp['cs']%4
df_temp.loc[(df_temp['cs']>4)和(df_temp['cs']%4==0),'block_2']=4

试着在这里发布您的示例代码。您尝试实现算法的那一部分?@ HyryIk我的尝试是一堆IF条件,但它不起作用,我陷入中间,所以我不张贴它。需要吗?
df_temp = pd.DataFrame({'price' : np.random.randint(0, 2, 1000) })
df_temp['block'] = df_temp['price'].groupby(df_temp['price'].diff().ne(0).cumsum()).transform('count')
df_temp['block_shift'] = df_temp['block'].shift(1)
df_temp['mask'] = df_temp['block'] == df_temp['block_shift']
df_temp['cs'] = df_temp['mask'].cumsum() - df_temp['mask'].cumsum().where(~df_temp['mask']).ffill().fillna(0) + 1
df_temp['block_2'] = df_temp['block']
df_temp.loc[(df_temp['block'] > 4) & (df_temp['cs'] <= 4) , 'block_2'] = 4
df_temp.loc[(df_temp['cs'] > 4) & (df_temp['cs'] % 4 != 0) , 'block_2'] = df_temp['cs'] % 4
df_temp.loc[(df_temp['cs'] > 4) & (df_temp['cs'] % 4 == 0) , 'block_2'] = 4