#python #pandas #timestamp #trading
Вопрос:
У меня есть база данных с 1-минутными записями торговых данных, включая данные об открытии, Максимуме, Минимуме и закрытии. Я хотел бы создать функцию, которая отбрасывает определенные метки времени, чтобы сохранить только 30 миллионов записей. Однако значения этой временной метки необходимо обновить, чтобы отразить новый период.
Я работал со следующим кодом, но с ним есть проблема:
def time_stamp(minutes):
Start_stamp=1609459200000
End_stamp=1622505540000
Interval=60000*minutes
list_stamp=np.arange(Start_stamp, End_stamp 1, Interval).tolist()
for i in range(minutes,End_stamp,minutes):
df.loc[i,'High']=df['High'].loc[-minutes:].max()
df.loc[i,'Low']=df.loc[-minutes:,'Low'].min()
df.loc[i,'Open']=df.loc[-minutes:,'Close']
df.drop(df.loc[~df['t'].isin(list_stamp)].index, inplace=True)
return df
time_stamp(30)
Ошибка значения: Несовместимый индексатор с серией
У кого-нибудь есть для меня несколько советов? Спасибо!
Ответ №1:
Есть гораздо более похожий на панд способ сделать это.
Без образца данных мне пришлось его сделать. Вот код для этого:
#Make the data
index = pd.date_range('1/1/2000',periods=60*24,freq='T')
df = pd.DataFrame(np.random.rand(60*24,2),columns = ['open','close'],index=index)
df = df 1 # doing this to avoid possiblity of negative values in next steps
df['high'] = df.apply(lambda row: row.max() np.random.random(),axis=1)
df['low'] = df.apply(lambda row: row.min() - np.random.random(),axis=1)
состояние df на данный момент (глава(10)
,open,close,high,low
2000-01-01 00:00:00,1.5236619202496442,1.151985535527245,1.7477467456279827,0.3031985970254675
2000-01-01 00:01:00,1.7567707020541863,1.844917989219291,2.3157262902092053,0.781678343968321
2000-01-01 00:02:00,1.4329459219698644,1.5715643667517165,2.2800512080007325,0.4385068358774301
2000-01-01 00:03:00,1.6278939890163286,1.4967963857419173,2.4514762537932637,0.7483790156969329
2000-01-01 00:04:00,1.7696997962274348,1.7981539004095517,2.1609841398138325,1.4423796609201727
2000-01-01 00:05:00,1.3156416756165012,1.6792424542358473,2.6725022251661867,1.263416934678443
2000-01-01 00:06:00,1.4611709821585714,1.3417705793465275,1.7269143465983203,0.6447125825749427
2000-01-01 00:07:00,1.1353922264378535,1.3576210147951089,1.8826801353270626,0.49493624242983736
2000-01-01 00:08:00,1.6827074173849588,1.2127513631592481,2.4320709664997366,1.015161578142598
2000-01-01 00:09:00,1.277323428018112,1.379928215762615,2.1107247913266804,0.7283856978040806
Тогда мы сможем сделать то, что вам нужно сделать (обратите внимание, что метка времени-это индекс).
df.повторите выборку «повторите выборку» временного ряда с выбранной вами частотой. Я использовал 30 минут, как указано в вопросе.
.agg позволяет нам делать то, что вы хотите -> выберите первую дату открытия, последнее закрытие, самый высокий максимум и самый низкий минимум:
df = df.resample('30T').agg({'open': 'first', 'close': 'last','high':'max','low':'min'})
конечный результат:
,open,close,high,low
2000-01-01 00:00:00,1.5236619202496442,1.9399515432326182,2.7830658255264904,0.11963392810868156
2000-01-01 00:30:00,1.3507487064130956,1.943836375991639,2.8756089239367886,0.18513880795935822
2000-01-01 01:00:00,1.3521982535896768,1.3917486576623297,2.8566136804896236,0.1750201985909
2000-01-01 01:30:00,1.0429129450145977,1.653875051452551,2.903310168048458,0.12223652926377937
2000-01-01 02:00:00,1.724667336487399,1.3501859745845943,2.7883533771155182,0.10617913875428453
2000-01-01 02:30:00,1.0951747626878743,1.9314727636907452,2.704938040638077,0.2811809746810251
2000-01-01 03:00:00,1.2706302627630148,1.7120392033624894,2.909430407567025,0.11251041513367666
2000-01-01 03:30:00,1.2979020670054455,1.1065439262276353,2.7908377681443057,0.3071618087183765
2000-01-01 04:00:00,1.2146422040399025,1.3758650428561257,2.906605257212037,0.2757186485567582
2000-01-01 04:30:00,1.2791605232157812,1.3337224908227947,2.968804134958828,0.1021661248014647
Комментарии:
1. Спасибо, что ответили! Я получил пару советов из вашего ответа, но я хотел бы сохранить метку времени UNIX, как в примере.