Разница в датах на основе сопоставления значений в двух столбцах - Панды - PullRequest
1 голос
/ 03 мая 2019

У меня есть фрейм данных, я изо всех сил пытаюсь создать столбец, основанный на других столбцах, я поделюсь проблемой для образца данных.

          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 ]

1 голос
/ 03 мая 2019
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 и получил первую запись (это после того, как вы отсортировали ее, используя df.sort_values.

Если подмножество пусто, используйте Нет. В противном случае используйте Date. Days to hit target в этот момент довольно просто.

1 голос
/ 03 мая 2019

Используйте комбинацию 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)
...