Получение количества строк до самой высокой даты от pandas - PullRequest
0 голосов
/ 21 июня 2020

У меня есть df, как показано ниже. Я хочу создать столбец dayshigh. В этом столбце будет отображаться количество строк до самой высокой даты.

date        high
05-06-20    1.85
08-06-20    1.88
09-06-20    2
10-06-20    2.11
11-06-20    2.21
12-06-20    2.17
15-06-20    1.99
16-06-20    2.15
17-06-20    16
18-06-20    9
19-06-20    14.67

должно выглядеть так:

date        high    dayshigh
05-06-20    1.85    nan
08-06-20    1.88    1
09-06-20    2       2
10-06-20    2.11    3
11-06-20    2.21    4
12-06-20    2.17    0
15-06-20    1.99    0
16-06-20    2.15    1
17-06-20    16      8
18-06-20    9       0
19-06-20    14.67   1

с использованием приведенного ниже кода, но каким-то образом показывающим ошибку:

df["DaysHigh"] = np.repeat(0, len(df))
for i in range(0, len(df)):
    for j in range(df["DaysHigh"][i].index, len(df)):
        if df["high"][i] > df["high"][i-1]:
            df["DaysHigh"][i] = df["DaysHigh"][i-1] + 1
        else:
            df["DaysHigh"][i] = 0

В какой момент я делаю не так? Спасибо

Ответы [ 3 ]

1 голос
/ 21 июня 2020

Максимальное число дней для 17-06-20 должно быть 2 вместо 8? Если это так, вы можете использовать уже написанный здесь код. Ниже я вношу три изменения:

  1. начиная с i с 1 вместо 0, чтобы не пытаться получить доступ к -1-му элементу
  2. удаление l oop поверх j ( не кажется необходимым)
  3. использование lo c для установки значений вместо df ["high"] [i] - вы увидите, что это должно устранить предупреждения о копиях и срезах.

Сохранение первой строки такой же, как и раньше,

for i in range(1, len(df)):
    if df["high"][i] > df["high"][i-1]:
        df.loc[i,"DaysHigh"] = df["DaysHigh"][i-1] + 1
    else:
        df.loc[i,"DaysHigh"] = 0
0 голосов
/ 21 июня 2020

процедура

  1. Используйте pandas .shift (), чтобы создать столбец для следующей строки результатов сравнения.
  2. вычислить совокупную сумму созданных столбцов
  3. удалить столбцы, если они не нужны
df['tmp'] = np.where(df['high'] >= df['high'].shift(), 1, np.NaN)
df['dayshigh'] = df['tmp'].groupby(df['tmp'].isna().cumsum()).cumsum()
df.drop('tmp', axis=1, inplace=True)

df
    date    high    dayshigh
0   05-06-20    1.85    NaN
1   08-06-20    1.88    1.0
2   09-06-20    2.00    2.0
3   10-06-20    2.11    3.0
4   11-06-20    2.21    4.0
5   12-06-20    2.17    NaN
6   15-06-20    1.99    NaN
7   16-06-20    2.15    1.0
8   17-06-20    16.00   2.0
9   18-06-20    9.00    NaN
10  19-06-20    14.67   1.0
0 голосов
/ 21 июня 2020

Ну, думаю, да, вот мое решение:

df["DaysHigh"] = np.repeat(0, len(df))
for i in range(0, len(df)):
#for i in range(len(df)-1000, len(df)): 
    for j in reversed(range(i)):
        if df["high"][i] > df["high"][j]:
            df["DaysHigh"][i] = df["DaysHigh"][i] + 1
        else:
            break

print(df)
date        high    dayshigh
05-06-20    1.85    nan
08-06-20    1.88    1
09-06-20    2.00    2
10-06-20    2.11    3
11-06-20    2.21    4
12-06-20    2.17    0
15-06-20    1.99    0
16-06-20    2.15    1
17-06-20    16.00   8
18-06-20    9.00    0
19-06-20    14.67   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...