Удалить цены в зависимости от даты - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть форма фрейма данных 3000 x 120. Каждый столбец представляет дневные цены акций для тикера.Во 2-й строке каждого столбца указывается дата продажи или ожидаемой продажи акций.(например)

               AAPL         GOOGLE         IBM
**Sell date.  2017/APRIL/01.  2021/FEB/03.   2015/MAR/3**

2019/jan/02  5             4              3
2019/jan/03. 4             4              4
2019/jan/04. 4             4              5
2019/jan/05  3             5              2 
2012/Mar/03  10            20             22

Как вы можете видеть, df содержит цены на акции после даты продажи акции - я хочу удалить (или заменить на 0 значение) ценовые данные, которые появляются после даты продажи, сохраняя при этом кадр.Учитывая размер df, лучше НЕ делать это вручную!

Это то, что я пробовал до сих пор, но получаю сообщение об ошибке "ValueError: Lengths должны совпадать"

var = dftest2.columns

x = int
for v in var:
    if dftest2.index <= dftest2.iloc[0]:
        x = x       
    else:
        0

Это то, как df должен выглядеть

               AAPL         GOOGLE         IBM
**Sell date.  2017/APRIL/01.  2021/FEB/03.   2015/MAR/3**

2019/jan/02  0             4              0
2019/jan/03. 0             4              0
2019/jan/04. 0             4              0
2019/jan/05  0             5              0 
..........
..........
2012/Mar/03  10            20             22

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Я не уверен, понял ли я ваше беспокойство, но позвольте мне попытаться помочь.Прежде всего убедитесь, что ваши даты отформатированы как datetime.date или datetime.datetime (он же dt.date или dt.datetime).Это необходимо для сравнения с другой датой.

Запустите следующий код и посмотрите, ищите ли вы:

# Dataframe Example
df = pd.DataFrame(
    {'Test': [dt.date(2016,1,1),1,2,3],
    'Test2': [dt.date(2017,1,3),0,2,4],
    'Test3': [dt.date(2029,4,22),1,2,3],
    'Test4': [dt.date(2034,3,1),0,2,4]}
    )

df.index =  [dt.date(2019,1,1),dt.date(2019,1,2),dt.date(2019,1,3),dt.date(2019,1,4)]

display(df)

# Delete Column Test3 and Test4, because the dates in df.Test3[0] and df.Test4[0] are in the future

for i in df:
    if df[i][0] > dt.date.today():
        df = df.drop(columns=i)

display(df)

Вывод:

    Test    Test2   Test3   Test4
2019-01-01  2016-01-01  2017-01-03  2029-04-22  2034-03-01
2019-01-02  1   0   1   0
2019-01-03  2   2   2   2
2019-01-04  3   4   3   4


Test    Test2
2019-01-01  2016-01-01  2017-01-03
2019-01-02  1   0
2019-01-03  2   2
2019-01-04  3   4
0 голосов
/ 20 сентября 2019

Если ваши даты отформатированы правильно, этот код должен вам помочь:

# Dataframe Example
df = pd.DataFrame(
    {'Test': [dt.date(2016,1,1),1,2,3],
    'Test2': [dt.date(2017,1,3),1,2,4],
    'Test3': [dt.date(2029,4,22),1,2,3],
    'Test4': [dt.date(2034,3,1),1,2,4]}
    )

df.index =  [dt.date(2019,1,1),dt.date(2019,1,2),dt.date(2019,1,3),dt.date(2019,1,4)]

display(df)


for i in df:
    for j in arange(1, len(df)):
        if df[i][0] < df.index[j]:
            df[i][j] = 0

display(df)

Вывод:

        Test    Test2   Test3   Test4
2019-01-01  2016-01-01  2017-01-03  2029-04-22  2034-03-01
2019-01-02  1   1   1   1
2019-01-03  2   2   2   2
2019-01-04  3   4   3   4


Test    Test2   Test3   Test4
2019-01-01  2016-01-01  2017-01-03  2029-04-22  2034-03-01
2019-01-02  0   0   1   1
2019-01-03  0   0   2   2
2019-01-04  0   0   3   4

Если нет, вот пример того, как выполнить преобразование строкправильно:

# Dataframe Example
df = pd.DataFrame(
    {'Test': ['2016/JAN/2',1,6],
     'Test2': ['2017/APR/19',2,5],
     'Test3': ['2029/MAY/03', 3,4]
    })

df.index =  ['Sell Date',dt.date(2019,1,1),dt.date(2019,1,2)]

display(df)

months = pd.DataFrame({'Month': ['JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC']})

newdf = pd.DataFrame(df)

for i in df:
    for j in range(len(months)):
        if df[i][0][5:5+3] == months.Month[j]:
            newdf[i][0] = newdf[i][0].replace(newdf[i][0][5:5+3],str(j+1))
            newdf[i][0] = datetime.datetime.strptime(newdf[i][0], "%Y/%m/%d").date()
            break

display(newdf)

# Delete Column

for i in df:
    for j in arange(1, len(newdf)):
        if newdf[i][0] < newdf.index[j]:
            newdf[i][j] = 0

display(newdf)

Вывод:

    Test    Test2   Test3
Sell Date   2016/JAN/2  2017/APR/19 2029/MAY/03
2019-01-01  1   2   3
2019-01-02  6   5   4
Test    Test2   Test3
Sell Date   2016-01-02  2017-04-19  2029-05-03
2019-01-01  1   2   3
2019-01-02  6   5   4
Test    Test2   Test3
Sell Date   2016-01-02  2017-04-19  2029-05-03
2019-01-01  0   0   3
2019-01-02  0   0   4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...