Как добавить новый столбец путем поиска данных в кадре данных временного ряда Pandas - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть данные временного ряда Pandas.У него есть минутные данные для акций за 30 дней.Я хочу создать новый столбец с указанием цены акции в 6 часов утра для этого дня, например, для всех строк на 1 января, я хочу новый столбец с ценой в полдень 1 января и для всех строк на 2 января, Я хочу новую колонку с ценой в полдень 2 января и т. Д.

Existing timeframe:
Date   Time   Last_Price   Date   Time   12amT
1/1/19 08:00  100          1/1/19 08:00  ?
1/1/19 08:01  101          1/1/19 08:01  ?
1/1/19 08:02  100.50       1/1/19 08:02  ?
...
31/1/19 21:00 106         31/1/19 21:00  ?

Я использовал этот хак, но он очень медленный, и я предполагаю, что есть более быстрый и простой способ сделать это.

for lab, row in df.iterrows() :
    t=row["Date"]
    df.loc[lab,"12amT"]=df[(df['Date']==t)&(df['Time']=="12:00")]["Last_Price"].values[0]

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Я не уверен, почему у вас есть два столбца DateTime, я создал собственный пример, чтобы продемонстрировать:

ind = pd.date_range('1/1/2019', '30/1/2019', freq='H')
df = pd.DataFrame({'Last_Price':np.random.random(len(ind)) + 100}, index=ind)

def noon_price(df):
    noon_price = df.loc[df.index.hour == 12, 'Last_Price'].values
    noon_price = noon_price[0] if len(noon_price) > 0 else np.nan
    df['noon_price'] = noon_price
    return df

df.groupby(df.index.day).apply(noon_price).reindex(ind)

reindex по умолчанию будет заполнять строки каждого дня noon_price.

Чтобы добавить столбец с ценой на следующий день *1009* на следующий день, вы можете shift столбец на 24 строки вниз, например:

df['T+1'] = df.noon_price.shift(-24)
0 голосов
/ 14 февраля 2019

Один из способов сделать это - использовать groupby с pd.Grouper:

Для панд 24.1 +

df.groupby(pd.Grouper(freq='D'))[0]\
  .transform(lambda x: x.loc[(x.index.hour == 12) & 
                             (x.index.minute==0)].to_numpy()[0])

Старые панды использовать:

 df.groupby(pd.Grouper(freq='D'))[0]\
   .transform(lambda x: x.loc[(x.index.hour == 12) &
                              (x.index.minute==0)].values[0])

MVCE:

df = pd.DataFrame(np.arange(48*60), index=pd.date_range('02-01-2019',periods=(48*60), freq='T'))

df['12amT'] = df.groupby(pd.Grouper(freq='D'))[0].transform(lambda x: x.loc[(x.index.hour == 12)&(x.index.minute==0)].to_numpy()[0])

Выход (напор):

                    0  12amT
2019-02-01 00:00:00  0    720
2019-02-01 00:01:00  1    720
2019-02-01 00:02:00  2    720
2019-02-01 00:03:00  3    720
2019-02-01 00:04:00  4    720
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...