У меня есть следующий набор данных игрушек:

import pandas as pd
from StringIO import StringIO

# read the data
df = pd.read_csv(StringIO("""
    Date         Return
    1/28/2009   -0.825148
    1/29/2009   -0.859997
    1/30/2009   0.000000
    2/2/2009    -0.909546
    2/3/2009    0.000000
    2/4/2009    -0.899110
    2/5/2009    -0.866104
    2/6/2009    0.000000
    2/9/2009    -0.830099
    2/10/2009   -0.885111
    2/11/2009   -0.878320
    2/12/2009   -0.881853
    2/13/2009   -0.884432
    2/17/2009   -0.947781
    2/18/2009   -0.966414
    2/19/2009   -1.016344
    2/20/2009   -1.029667
    2/23/2009   -1.087432
    2/24/2009   -1.050808
    2/25/2009   -1.089594
    2/26/2009   -1.121556
    2/27/2009   -1.105873
    3/2/2009    -1.205019
    3/3/2009    -1.191488
    3/4/2009    -1.059311
    3/5/2009    -1.135962
    3/6/2009    -1.147031
    3/9/2009    -1.117328
    3/10/2009   -1.009050"""), sep="\s+").reset_index()

Мои цели:

А) найти наиболее отрицательное значение в столбце «Возврат»

Б) найти дату появления этого значения

C) затем «подойдите» к столбцу «Return», чтобы найти первый экземпляр определенного значения (в данном случае 0,000000).

Г) найти дату, связанную со значением, возвращенным на шаге "с"

Результаты, которые я ищу:

А) -1.20519

Б) 2 марта 2009 г.

В) 0,000000

Г) 6 февраля 2009 г.

Я могу найти «а» с помощью следующего кода:

max_dd = df['Maximum_Drawdown'].min()

Чтобы получить «b», я попытался использовать следующий код:

df.loc[df['Return'] == max_dd, 'Date']

Но сообщение об ошибке гласит:

KeyError: 'Date'

Примечание: в этом примере с игрушкой можно заставить работать "b", но фактические данные выдают сообщение об ошибке. Вот фактический код, используемый для импорта данных из файла CSV:

df = pd.read_csv(FILE_NAME, parse_dates=True).reset_index()

df.set_index('Date', inplace = True)  <<--- this is causing the problem
0
equanimity 30 Май 2019 в 03:10

2 ответа

Лучший ответ

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

import pandas as pd
from io import StringIO

# read the data
df = pd.read_csv(StringIO("""
    Date         Return
    1/28/2009   -0.825148
    1/29/2009   -0.859997
    1/30/2009   0.000000
    2/2/2009    -0.909546
    2/3/2009    0.000000
    2/4/2009    -0.899110
    2/5/2009    -0.866104
    2/6/2009    0.000000
    2/9/2009    -0.830099
    2/10/2009   -0.885111
    2/11/2009   -0.878320
    2/12/2009   -0.881853
    2/13/2009   -0.884432
    2/17/2009   -0.947781
    2/18/2009   -0.966414
    2/19/2009   -1.016344
    2/20/2009   -1.029667
    2/23/2009   -1.087432
    2/24/2009   -1.050808
    2/25/2009   -1.089594
    2/26/2009   -1.121556
    2/27/2009   -1.105873
    3/2/2009    -1.205019
    3/3/2009    -1.191488
    3/4/2009    -1.059311
    3/5/2009    -1.135962
    3/6/2009    -1.147031
    3/9/2009    -1.117328
    3/10/2009   -1.009050"""), sep="\s+").reset_index()

# a) find the most negative value in the "Return" column
min_value = df["Return"].min()
print("The minimum value in the dataset is: {}".format(min_value))

# b) find the date that this minimum value occurred at
min_value_date = df.iloc[df["Return"].idxmin(), :]["Date"]
print("The minimum value in the dataset occurred on: {}".format(min_value_date))

# c) find the first instance of a specified value in the dataset closest to this
# minimum value with an index less than the minimum value index
found_value = 0
found_indices = df.index[df["Return"] == found_value].tolist()
found_correct_index = -1
for index in found_indices:
    if index > df["Return"].idxmin():
        break
    previous_index = index

found_correct_index = previous_index
try:
    print("The value searched for is {0} and it is found in the index of {1}.".format(found_value, found_correct_index))
except:
    print("The value searched for of {0} was not found in the dataset.".format(found_value))

# d) find the date associated with that value
found_value_date = df.iloc[found_correct_index, :]["Date"]
print("The date associated with that found value of {0} is {1}.".format(found_value, found_value_date))
1
finianoneill 30 Май 2019 в 03:37

Отфильтруйте ваш фрейм данных для всех строк, меньших, чем минимальное значение в Return, а также Return равен нулю, чем показать последнее значение.

df.loc[(df.index < df.Return.idxmin()) & (df['Return'] == 0), "Date"].tail(1)
2
run-out 30 Май 2019 в 01:07