我有2个包含数据的df,索引是日期
dfcarry = {'EUR3m3m': [1.5, 0.6, 1.7, 1.5, -1.2],
'EUR6m3m': [2.0, 1.2, 1.3, 0.6, -1.7],
'EUR6m3m3m': [1.3, 1.0, -1.4, 0.5, np.nan]}
dfcarry = pd.DataFrame(dfcarry, index=['26-09-2016','25-09-2016','24-09-2016','23-09-2016'])
和
dfflags = {'EUR3m3m': [1, 0, 1, 1, -1],
'EUR6m3m': [1, 1, 1, 0, -1],
'EUR6m3m3m': [1, 1, -1, 0, 0]}
dfflags = pd.DataFrame(dfflags, index=['26-09-2016','25-09-2016','24-09-2016','23-09-2016'])
现在,我要做的是将数字总和的 abs 值限制为1,因此对于任何给定的日期,我在同一方向上最多只能有2个标志,即1抵消了-1:
if abs(sum(dfflags['26-09-2016'])) > 1:
then convert one of the flags to zero
然后,我要去除的整数是相应的绝对(进位)数最小的值。如果我们有太多1,我们将舍弃进位号最少的1。如果我们的标志中有太多的-1,我们将摆脱一个-1的进位数字最高(最小-ve)
在我的随身携带的df中,我有一些nan(故意)。
我该怎么做?
因此请注意,对于第一个日期“ 2016年9月26日”,预期输出为1,保持为600万欧元3m,因为我将1对应于最高进位绝对值(因此,我保持进位= 2.0,并摆脱进位= 1.5和1.3)。
总体预期输出为
dfflags = {'EUR3m3m': [0, 0, 1, 1, 0],
'EUR6m3m': [1, 1, 1, 0, -1],
'EUR6m3m3m': [0, 0, -1, 0, 0]}
谢谢
答案 0 :(得分:0)
编辑:考虑了Coldsteel指出的标志的ABS总和
n = 2 #how many flags can be maximum equal to 1
df = abs(dfflags) * dfcarry
for col in df.columns: #for each column, set the flags
if sum(dfflags[col]) > n:
n_new = n + 2 * len(dfflags[dfflags[col] == -1])
threshold = min(df[col].nlargest(n=n_new))
df[col] = np.where(df[col] >= threshold,1,0)
else:
df[col] = abs(dfflags[col])
dfflags = dfflags[df == 1].fillna(0) #apply the 'filter df' to the dfflags, only keeping the top n 1 in each column
结果
_________ EUR3m3m EUR6m3m EUR6m3m3m
26-09-2016 0.0 1.0 0.0
25-09-2016 0.0 0.0 1.0
24-09-2016 1.0 1.0 -1.0
23-09-2016 1.0 0.0 0.0
22-09-2016 0.0 0.0 0.0
悬而未决的问题:按给定值或绝对值对进位进行排序?