基于两列中的匹配值的日期差异-熊猫

时间:2019-05-03 09:29:42

标签: python python-3.x pandas numpy data-science

我有一个数据框,我正在努力根据其他列创建一个列,我将分享示例数据的问题。

          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)。

2 个答案:

答案 0 :(得分:1)

使用locat的组合来找到目标命中的日期,然后减去这些日期。

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_valuesDate当时很简单。