我有一个数据框,我正在努力根据其他列创建一个列,我将分享示例数据的问题。
Date Target1 Close
0 2018-05-25 198.0090 188.580002
1 2018-05-25 197.6835 188.580002
2 2018-05-25 198.0090 188.580002
3 2018-05-29 196.6230 187.899994
4 2018-05-29 196.9800 187.899994
5 2018-05-30 197.1375 187.500000
6 2018-05-30 196.6965 187.500000
7 2018-05-30 196.8750 187.500000
8 2018-05-31 196.2135 186.869995
9 2018-05-31 196.2135 186.869995
10 2018-05-31 196.5600 186.869995
11 2018-05-31 196.7700 186.869995
12 2018-05-31 196.9275 186.869995
13 2018-05-31 196.2135 186.869995
14 2018-05-31 196.2135 186.869995
15 2018-06-01 197.2845 190.240005
16 2018-06-01 197.2845 190.240005
17 2018-06-04 201.2325 191.830002
18 2018-06-04 201.4740 191.830002
我想创建另一列(针对每个观察值)(例如,称为days_to_hit_target),以作为接近匹配(或越过特定日期的目标)的天数差异,然后计算天数差异并将其放入列days_to_hit_target。
这个想法是,假设今天在2018-05-25的收盘价为188.58,所以,我想获取达到这个目标(198.0090)的日期,此日期即将在2018-06-04进行。 ,该位置已接近首次观察的目标(198.0090),该目标将被馈入该列的第一次观察(days_to_hit_target)。
答案 0 :(得分:1)
使用loc
和at
的组合来找到目标命中的日期,然后减去这些日期。
df['TargetDate'] = 'NA'
for i, row in df.iterrows():
t = row['Target1']
d = row['Date']
targdf = df.loc[df['Close'] >= t]
if len(targdf)>0:
targdt = targdf.at[0,'Date']
df.at[i,'TargetDate'] = targdt
else:
df.at[i,'TargetDate'] = '0'
df['Diff'] = df['Date'].sub(df['TargetDate'], axis=0)
答案 1 :(得分:1)
import pandas as pd
csv = pd.read_csv(
'sample.csv',
parse_dates=['Date']
)
csv.sort_values('Date', inplace=True)
def find_closest(row):
target = row['Target1']
date = row['Date']
matches = csv[
(csv['Close'] >= target) &
(csv['Date'] > date)
]
closest_date = matches['Date'].iloc[0] if not matches.empty else None
row['days to hit target'] = (closest_date - date).days if closest_date else None
return row
final = csv.apply(find_closest, axis=1)
很难测试,因为没有目标出现在最后。但是这个想法很简单。细分原始框架,使date
在当前行日期之后,并且Close
大于或等于Target1
并获得第一个条目(这是在您使用{进行了排序之后{1}}。
如果子集为空,请使用无。否则,请使用df.sort_values
。 Date
当时很简单。