Python条件赋值与EURUSD D1数据高低极值混合排序问题
问题1:Python条件赋值实现
针对你需要的条件赋值逻辑,这里有几种直观好用的实现方式,看你偏好哪种:
嵌套三元表达式:适合简单条件场景,一行就能搞定
X = Y if a == b else Z if b == c else None # 可根据需求设置其他默认值,比如0或者空字符串注意:如果两个条件同时满足(比如
a==b且b==c),会优先取第一个条件的结果Y。if-else语句:逻辑更清晰,适合后续可能扩展条件的情况
if a == b: X = Y elif b == c: X = Z else: X = None # 处理两个条件都不满足的情况字典映射(进阶):如果后续要加更多条件,这种方式更易维护
condition_map = { (a == b): Y, (b == c): Z } X = condition_map.get(True, None) # 找到第一个为True的条件对应值,默认返回None小提示:字典的键是布尔值,如果多个条件同时为True,只会取最后一个键为True的值,所以更适合互斥的条件场景。
问题2:生成按索引排序的peaks数组
你的需求是把高低极值点按索引排序后,对应取high或low的数值,这里有两种高效的实现方法:
方法1:列表推导式(直观易懂)
遍历排序后的idx,逐个判断当前索引属于max_idx还是min_idx,再取对应的值:
import numpy as np # 先把列表转成集合,提升查找速度(数据量大时更明显) max_set = set(max_idx) min_set = set(min_idx) peaks = np.array([hi.values[i] if i in max_set else lo.values[i] for i in idx])
方法2:Numpy向量化操作(高效)
利用Numpy的布尔索引批量处理,完全避免循环,大数据量下速度更快:
import numpy as np # 创建和idx长度匹配的空数组 peaks = np.zeros(len(idx)) # 找出idx中属于max_idx的位置 max_mask = np.isin(idx, max_idx) # 对应位置赋值hi的数值 peaks[max_mask] = hi.values[idx[max_mask]] # 剩余位置赋值lo的数值 peaks[~max_mask] = lo.values[idx[~max_mask]]
验证示例(用你给出的测试数据)
max_idx = [4, 31, 72, 97] min_idx = [18, 43, 67] idx = [4, 18, 31, 43, 67, 72, 97] high_peaks = np.array([1.10947, 1.14955, 1.10167, 1.13829]) low_peaks = np.array([1.07772, 1.0635 , 1.07263]) # 模拟hi和lo的values数组 hi_values = np.zeros(100) lo_values = np.zeros(100) for i, val in zip(max_idx, high_peaks): hi_values[i] = val for i, val in zip(min_idx, low_peaks): lo_values[i] = val # 用方法2生成peaks max_mask = np.isin(idx, max_idx) peaks = np.zeros(len(idx)) peaks[max_mask] = hi_values[idx[max_mask]] peaks[~max_mask] = lo_values[idx[~max_mask]] print(peaks) # 输出:[1.10947 1.07772 1.14955 1.0635 1.07263 1.10167 1.13829]
完全符合你期望的结果。
内容的提问来源于stack exchange,提问作者Elite Contest
相关产品推荐
相关产品推荐

