我想在下面的df上创建一个新列,一旦C> 55天高,它就会返回1。即使C <55天的高点直到C <20天的低点,随后的每一行也将显示1。我该怎么做?预先感谢
df = pd.DataFrame([
['2020-01-01 01:01:00', 7147.69, 7163.32, 7147.69],
['2020-01-01 01:02:00', 7158.31, 7163.32, 7147.69],
['2020-01-01 01:03:00', 7157.08, 7163.32, 7147.69],
['2020-01-01 01:04:00', 7157.01, 7163.32, 7147.69],
['2020-01-01 01:05:00', 7159.85, 7163.32, 7147.69],
['2020-01-01 01:06:00', 7161.29, 7163.32, 7147.69],
['2020-01-01 01:07:00', 7161.29, 7163.32, 7147.69],
['2020-01-01 01:08:00', 7161.28, 7162.03, 7147.69],
['2020-01-01 01:09:00', 7161.29, 7162.03, 7147.69],
], columns=['date', 'C', '55 day high', '20 day low'])
DataFrame:
C 55 day high 20 day low
date
2020-01-01 01:01:00 7147.69 7163.32 7147.69
2020-01-01 01:02:00 7158.31 7163.32 7147.69
2020-01-01 01:03:00 7157.08 7163.32 7147.69
2020-01-01 01:04:00 7157.01 7163.32 7147.69
2020-01-01 01:05:00 7159.85 7163.32 7147.69
2020-01-01 01:06:00 7161.29 7163.32 7147.69
2020-01-01 01:07:00 7161.29 7163.32 7147.69
2020-01-01 01:08:00 7161.28 7162.03 7147.69
2020-01-01 01:09:00 7161.29 7162.03 7147.69
答案 0 :(得分:0)
我想不出一种方法apply()
,但是您可以使用iterrows()
遍历带条件的行,输出结果列表,然后将其转换为新的数据框列。请注意,我已更改课程数据以模拟您描述的开始和结束条件:
import pandas as pd
df = pd.DataFrame([
['2020-01-01 01:01:00', 7147.69, 7163.32, 7147.69],
['2020-01-01 01:02:00', 7158.31, 7163.32, 7147.69],
['2020-01-01 01:03:00', 7164.08, 7163.32, 7147.69],
['2020-01-01 01:04:00', 7157.01, 7163.32, 7147.69],
['2020-01-01 01:05:00', 7159.85, 7163.32, 7147.69],
['2020-01-01 01:06:00', 7161.29, 7163.32, 7147.69],
['2020-01-01 01:07:00', 7161.29, 7163.32, 7147.69],
['2020-01-01 01:08:00', 7145.28, 7162.03, 7147.69],
['2020-01-01 01:09:00', 7161.29, 7162.03, 7147.69],
], columns=['date', 'C', '55 day high', '20 day low'])
new_col = []
state = 0
for row in df.iterrows():
if row[1]['C'] > row[1]['55 day high']:
state = 1
if row[1]['C'] < row[1]['20 day low']:
state = 0
new_col.append(state)
df['result'] = new_col
df
date C 55 day high 20 day low result
0 2020-01-01 01:01:00 7147.69 7163.32 7147.69 0
1 2020-01-01 01:02:00 7158.31 7163.32 7147.69 0
2 2020-01-01 01:03:00 7164.08 7163.32 7147.69 1
3 2020-01-01 01:04:00 7157.01 7163.32 7147.69 1
4 2020-01-01 01:05:00 7159.85 7163.32 7147.69 1
5 2020-01-01 01:06:00 7161.29 7163.32 7147.69 1
6 2020-01-01 01:07:00 7161.29 7163.32 7147.69 1
7 2020-01-01 01:08:00 7145.28 7162.03 7147.69 0
8 2020-01-01 01:09:00 7161.29 7162.03 7147.69 0
答案 1 :(得分:0)
这可以帮助您解决问题。不确定我的逻辑是否在这里,但希望这能使您更接近解决问题。
def logic(C,H,L):
if (C > H and C < L):
return(1)
if (C < L):
return(0)
else:
return(-1)
for C, H, L in df[['C', '55 day high', '20 day low']].itertuples(index=False):
print(logic(C,H,L)