Python 熊猫:根据条件将数据帧中的值复制到多行
我需要分析pandas数据帧中的一个价格序列,以确定两个连续的较低低点的出现,这将创建一个我们称之为NLBL的价格水平。我可以用一个简单的条件(见下文)来实现这一点,但我需要的不是真值,而是前三个烛光的值。另外,我还需要将同一关卡再复制四次 以下是一些示例数据:Python 熊猫:根据条件将数据帧中的值复制到多行,python,pandas,Python,Pandas,我需要分析pandas数据帧中的一个价格序列,以确定两个连续的较低低点的出现,这将创建一个我们称之为NLBL的价格水平。我可以用一个简单的条件(见下文)来实现这一点,但我需要的不是真值,而是前三个烛光的值。另外,我还需要将同一关卡再复制四次 以下是一些示例数据: Date Time Open High Low Close datetime
Date Time Open High Low Close
datetime
2019-01-22 11:00:00 2019-01-22 11:00:00 2643.99 2647.47 2634.73 2634.73
2019-01-22 12:00:00 2019-01-22 12:00:00 2634.79 2638.55 2632.69 2635.94
2019-01-22 13:00:00 2019-01-22 13:00:00 2635.95 2636.35 2623.30 2631.93
2019-01-22 14:00:00 2019-01-22 14:00:00 2631.92 2632.29 2618.33 2622.66
2019-01-22 15:00:00 2019-01-22 15:00:00 2622.71 2632.90 2617.27 2625.49
2019-01-22 16:00:00 2019-01-22 16:00:00 2625.58 2633.81 2625.58 2633.81
2019-01-23 09:00:00 2019-01-23 09:00:00 2643.48 2652.44 2643.48 2650.97
2019-01-23 10:00:00 2019-01-23 10:00:00 2651.00 2653.19 2632.85 2634.47
2019-01-23 11:00:00 2019-01-23 11:00:00 2634.47 2638.55 2617.36 2617.46
2019-01-23 12:00:00 2019-01-23 12:00:00 2617.47 2627.43 2612.86 2627.31
2019-01-23 13:00:00 2019-01-23 13:00:00 2627.31 2631.70 2621.62 2629.92
2019-01-23 14:00:00 2019-01-23 14:00:00 2629.93 2635.26 2625.34 2629.21
2019-01-23 15:00:00 2019-01-23 15:00:00 2629.25 2639.22 2628.71 2636.61
2019-01-23 16:00:00 2019-01-23 16:00:00 2636.71 2639.54 2636.71 2638.60
2019-01-24 09:00:00 2019-01-24 09:00:00 2638.84 2641.03 2631.06 2636.14
2019-01-24 10:00:00 2019-01-24 10:00:00 2636.18 2647.20 2633.12 2640.49
2019-01-24 11:00:00 2019-01-24 11:00:00 2640.31 2645.37 2633.60 2644.08
2019-01-24 12:00:00 2019-01-24 12:00:00 2644.14 2644.42 2632.79 2634.31
2019-01-24 13:00:00 2019-01-24 13:00:00 2634.34 2635.16 2627.01 2633.62
2019-01-24 14:00:00 2019-01-24 14:00:00 2633.64 2638.47 2630.96 2637.04
2019-01-24 15:00:00 2019-01-24 15:00:00 2637.03 2643.21 2636.46 2642.66
2019-01-24 16:00:00 2019-01-24 16:00:00 2642.63 2643.10 2641.97 2641.99
2019-01-25 09:00:00 2019-01-25 09:00:00 2657.44 2663.57 2657.33 2661.64
2019-01-25 10:00:00 2019-01-25 10:00:00 2661.60 2671.61 2661.60 2669.49
2019-01-25 11:00:00 2019-01-25 11:00:00 2669.47 2670.50 2664.18 2669.13
2019-01-25 12:00:00 2019-01-25 12:00:00 2669.12 2672.38 2661.39 2664.88
2019-01-25 13:00:00 2019-01-25 13:00:00 2664.88 2668.49 2663.76 2667.93
2019-01-25 14:00:00 2019-01-25 14:00:00 2667.95 2669.12 2661.14 2665.27
2019-01-25 15:00:00 2019-01-25 15:00:00 2665.27 2666.52 2658.75 2663.06
2019-01-25 16:00:00 2019-01-25 16:00:00 2662.98 2664.74 2661.64 2664.14
我已经走了这么远:
min_data['NLBL'] = (min_data['Low'] < min_data['Low'].shift(1)) & (min_data['Low'].shift(1) < min_data['Low'].shift(2))
min_data['NLBL'] = min_data['NLBL'].shift(periods=1) # shifting downward as the trigger is valid after the close
print("\nResult:\n %s" % min_data.tail(30))
Result:
Date Time Open High Low Close \
datetime
2019-01-22 11:00:00 2019-01-22 11:00:00 2643.99 2647.47 2634.73 2634.73
2019-01-22 12:00:00 2019-01-22 12:00:00 2634.79 2638.55 2632.69 2635.94
2019-01-22 13:00:00 2019-01-22 13:00:00 2635.95 2636.35 2623.30 2631.93
2019-01-22 14:00:00 2019-01-22 14:00:00 2631.92 2632.29 2618.33 2622.66
2019-01-22 15:00:00 2019-01-22 15:00:00 2622.71 2632.90 2617.27 2625.49
2019-01-22 16:00:00 2019-01-22 16:00:00 2625.58 2633.81 2625.58 2633.81
2019-01-23 09:00:00 2019-01-23 09:00:00 2643.48 2652.44 2643.48 2650.97
2019-01-23 10:00:00 2019-01-23 10:00:00 2651.00 2653.19 2632.85 2634.47
2019-01-23 11:00:00 2019-01-23 11:00:00 2634.47 2638.55 2617.36 2617.46
2019-01-23 12:00:00 2019-01-23 12:00:00 2617.47 2627.43 2612.86 2627.31
2019-01-23 13:00:00 2019-01-23 13:00:00 2627.31 2631.70 2621.62 2629.92
2019-01-23 14:00:00 2019-01-23 14:00:00 2629.93 2635.26 2625.34 2629.21
2019-01-23 15:00:00 2019-01-23 15:00:00 2629.25 2639.22 2628.71 2636.61
2019-01-23 16:00:00 2019-01-23 16:00:00 2636.71 2639.54 2636.71 2638.60
2019-01-24 09:00:00 2019-01-24 09:00:00 2638.84 2641.03 2631.06 2636.14
2019-01-24 10:00:00 2019-01-24 10:00:00 2636.18 2647.20 2633.12 2640.49
2019-01-24 11:00:00 2019-01-24 11:00:00 2640.31 2645.37 2633.60 2644.08
2019-01-24 12:00:00 2019-01-24 12:00:00 2644.14 2644.42 2632.79 2634.31
2019-01-24 13:00:00 2019-01-24 13:00:00 2634.34 2635.16 2627.01 2633.62
2019-01-24 14:00:00 2019-01-24 14:00:00 2633.64 2638.47 2630.96 2637.04
2019-01-24 15:00:00 2019-01-24 15:00:00 2637.03 2643.21 2636.46 2642.66
2019-01-24 16:00:00 2019-01-24 16:00:00 2642.63 2643.10 2641.97 2641.99
2019-01-25 09:00:00 2019-01-25 09:00:00 2657.44 2663.57 2657.33 2661.64
2019-01-25 10:00:00 2019-01-25 10:00:00 2661.60 2671.61 2661.60 2669.49
2019-01-25 11:00:00 2019-01-25 11:00:00 2669.47 2670.50 2664.18 2669.13
2019-01-25 12:00:00 2019-01-25 12:00:00 2669.12 2672.38 2661.39 2664.88
2019-01-25 13:00:00 2019-01-25 13:00:00 2664.88 2668.49 2663.76 2667.93
2019-01-25 14:00:00 2019-01-25 14:00:00 2667.95 2669.12 2661.14 2665.27
2019-01-25 15:00:00 2019-01-25 15:00:00 2665.27 2666.52 2658.75 2663.06
2019-01-25 16:00:00 2019-01-25 16:00:00 2662.98 2664.74 2661.64 2664.14
NLBL
datetime
2019-01-22 11:00:00 True
2019-01-22 12:00:00 True
2019-01-22 13:00:00 True
2019-01-22 14:00:00 True
2019-01-22 15:00:00 True
2019-01-22 16:00:00 True
2019-01-23 09:00:00 False
2019-01-23 10:00:00 False
2019-01-23 11:00:00 False
2019-01-23 12:00:00 True
2019-01-23 13:00:00 True
2019-01-23 14:00:00 False
2019-01-23 15:00:00 False
2019-01-23 16:00:00 False
2019-01-24 09:00:00 False
2019-01-24 10:00:00 False
2019-01-24 11:00:00 False
2019-01-24 12:00:00 False
2019-01-24 13:00:00 False
2019-01-24 14:00:00 True
2019-01-24 15:00:00 False
2019-01-24 16:00:00 False
2019-01-25 09:00:00 False
2019-01-25 10:00:00 False
2019-01-25 11:00:00 False
2019-01-25 12:00:00 False
2019-01-25 13:00:00 False
2019-01-25 14:00:00 False
2019-01-25 15:00:00 False
2019-01-25 16:00:00 True
如果它在“NLBL”列中找到一个具有真值的行,它将向后计数三行,获取“High”值并用该值替换真值。然后将相同的“高”值复制到以下四行
但是,如果它发现一个新的TRUE,它将停止向前复制并使用新的高值
希望这是有意义的。感谢您的澄清,我很确定我理解了您的意思(尽管如果我理解正确,那么示例输出中会有一个小错误) 我的解决方案是:基本上添加一个helper列,将0替换为
NaN
(如果性能是一个严重问题,您可以查看map
,而不是replace
),并使用两种fillna
方法:
min_data['helper'] = min_data['High'].shift(3)
min_data.loc[min_data['NLBL'] == True, 'NLBL'] = min_data.loc[min_data['NLBL'] == True, 'helper']
min_data = min_data.drop(columns=['helper'])
min_data.NLBL = min_data.NLBL.replace(False, np.nan)
min_data['NLBL'] = min_data['NLBL'].fillna(method='ffill', limit=4)
min_data['NLBL'] = min_data['NLBL'].fillna(0)
你能澄清你所说的“Hight.Shift(3)-基本上是系列中的最高低点”是什么意思吗?你能发布期望的结果来帮助澄清上述评论吗?2再向前四次?好的,谢谢你的快速回复@我的意思是,它应该显示4行后面的高值,而不是真值。因此,对于具有16:00时间戳的最后一行,它将显示2668.49(13:00)高。希望这是有意义的。@Parfait-我已经添加了您要求的示例输出,并提供了更多的评论,希望这些评论能够澄清任何问题。提前感谢您的帮助。嗯……有了第一块数据,我无法用精确的代码重现您的第二块结果。点击这个按钮。一定要设置一个。这是一个非常棒和聪明的解决方案!!很好:-)很明显,loc电话是做重物的。我将更详细地研究这一部分,以了解您是如何做到这一点的。其余的是水晶。再次感谢。很高兴你喜欢它-如果你的问题得到解决,你可以标记绿色勾号:)我找到了。我喜欢使用loc为NLBL列创建掩码,然后将移位的高值指定给它。我试着用简单的比较,但效果不太好。你真的救了我一天,非常感谢/
min_data['helper'] = min_data['High'].shift(3)
min_data.loc[min_data['NLBL'] == True, 'NLBL'] = min_data.loc[min_data['NLBL'] == True, 'helper']
min_data = min_data.drop(columns=['helper'])
min_data.NLBL = min_data.NLBL.replace(False, np.nan)
min_data['NLBL'] = min_data['NLBL'].fillna(method='ffill', limit=4)
min_data['NLBL'] = min_data['NLBL'].fillna(0)