有没有办法从条件 True/False 中 return 浮点数或整数
Is there a way to return float or integer from a conditional True/False
n_level = range(1, steps + 2)
steps
是用户输入,使用多索引数据帧
df = {'crest': [754, 755, 762, 785], 'trough': [752, 725, 759, 765], 'L1T': [761, 761, 761, 761], 'L2T': [772, 772, 772, 772], 'L3T': [783, 783, 783, 783], 'L4T': [794, 794, 794, 794], 'L1M': [740, 740, 740, 740], 'L2M': [729, 729, 729, 729], 'L3M': [718, 718, 718, 718], 'L4T': [707, 707, 707, 707]}
for i in n_level:
if df['Crest'] >= df[f'L{i}T']:
df['Marker'] = i
elif df['Trough'] <= df[f'L{i}M']:
df['Marker'] = -i
else:
df['Marker'] = 0
我希望使用 col 标记低于 df
df = {'crest': [754, 755, 762, 785], 'trough': [752, 725, 759, 765], 'L1T': [761, 761, 761, 761], 'L2T': [772, 772, 772, 772], 'L3T': [783, 783, 783, 783], 'L4T': [794, 794, 794, 794], 'L1M': [740, 740, 740, 740], 'L2M': [729, 729, 729, 729], 'L3M': [718, 718, 718, 718], 'L4T': [707, 707, 707, 707], 'Marker': [0, -2, 1, 3]},
if 语句返回 True 或 False,使用它我们可以将其转换为第 i 个值 (+/-)
我需要的是另一个 col df['Marker'],它将测量波峰或波谷是否穿过 L{i}T 或 L{i}M,如果在低谷的情况下出现波峰和突破
这可以使用二进制搜索轻松实现,有很多应用方法(NumPy,二分法)。
我会推荐图书馆对分。
为波峰添加了 Buu,为波谷添加了 See,以便编码和区分段。你可以选择任何东西
def marker_up(row):
n_row = [row[col] for col in columns if "Buu" in col]
n_high = row['Crest']
if n_high in n_row:
q = bs.bisect_left(n_row, n_high)
q = max(0, q)
return q
else:
q_mod = bs.bisect_left(n_row, n_high)
q_mod -= 1
q_mod = max(0, q_mod)
return q_mod
Marker_up = df.apply(marker_up, axis=1)
def marker_down(row):
n_row = [row[col] for col in columns if "See" in col]
n_low = row['Trough']
if n_low in n_row:
q = bs.bisect_left(n_row, n_low)
q = q - len(n_row)
return q
else:
q_mod = bs.bisect_left(n_row, n_low)
q_mod = q_mod - len(n_row)
return q_mod
Marker_down = df.apply(marker_down, axis=1)
df['Marker'] = Marker_up + Marker_down
return df
如果你的 df 很大,请不要使用 iloc、dict 或 iterrrows。矢量化形式将有助于 运行 更快地编写代码。
你能用 Numpy searchsorted
该列表应该是该行的值数组。
df['Marker'] = np.searchsorted(df['Crest'], list)
n_level = range(1, steps + 2)
steps
是用户输入,使用多索引数据帧
df = {'crest': [754, 755, 762, 785], 'trough': [752, 725, 759, 765], 'L1T': [761, 761, 761, 761], 'L2T': [772, 772, 772, 772], 'L3T': [783, 783, 783, 783], 'L4T': [794, 794, 794, 794], 'L1M': [740, 740, 740, 740], 'L2M': [729, 729, 729, 729], 'L3M': [718, 718, 718, 718], 'L4T': [707, 707, 707, 707]}
for i in n_level:
if df['Crest'] >= df[f'L{i}T']:
df['Marker'] = i
elif df['Trough'] <= df[f'L{i}M']:
df['Marker'] = -i
else:
df['Marker'] = 0
我希望使用 col 标记低于 df
df = {'crest': [754, 755, 762, 785], 'trough': [752, 725, 759, 765], 'L1T': [761, 761, 761, 761], 'L2T': [772, 772, 772, 772], 'L3T': [783, 783, 783, 783], 'L4T': [794, 794, 794, 794], 'L1M': [740, 740, 740, 740], 'L2M': [729, 729, 729, 729], 'L3M': [718, 718, 718, 718], 'L4T': [707, 707, 707, 707], 'Marker': [0, -2, 1, 3]},
if 语句返回 True 或 False,使用它我们可以将其转换为第 i 个值 (+/-)
我需要的是另一个 col df['Marker'],它将测量波峰或波谷是否穿过 L{i}T 或 L{i}M,如果在低谷的情况下出现波峰和突破
这可以使用二进制搜索轻松实现,有很多应用方法(NumPy,二分法)。 我会推荐图书馆对分。
为波峰添加了 Buu,为波谷添加了 See,以便编码和区分段。你可以选择任何东西
def marker_up(row):
n_row = [row[col] for col in columns if "Buu" in col]
n_high = row['Crest']
if n_high in n_row:
q = bs.bisect_left(n_row, n_high)
q = max(0, q)
return q
else:
q_mod = bs.bisect_left(n_row, n_high)
q_mod -= 1
q_mod = max(0, q_mod)
return q_mod
Marker_up = df.apply(marker_up, axis=1)
def marker_down(row):
n_row = [row[col] for col in columns if "See" in col]
n_low = row['Trough']
if n_low in n_row:
q = bs.bisect_left(n_row, n_low)
q = q - len(n_row)
return q
else:
q_mod = bs.bisect_left(n_row, n_low)
q_mod = q_mod - len(n_row)
return q_mod
Marker_down = df.apply(marker_down, axis=1)
df['Marker'] = Marker_up + Marker_down
return df
如果你的 df 很大,请不要使用 iloc、dict 或 iterrrows。矢量化形式将有助于 运行 更快地编写代码。
你能用 Numpy searchsorted 该列表应该是该行的值数组。
df['Marker'] = np.searchsorted(df['Crest'], list)