我有一个具有以下结构的DataFrame:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 3333 entries, 2000-01-03 00:00:00+00:00 to 2012-11-21 00:00:00+00:00
Data columns:
open 3333 non-null values
high 3333 non-null values
low 3333 non-null values
close 3333 non-null values
volume 3333 non-null values
amount 3333 non-null values
pct_change 3332 non-null values
dtypes: float64(7)
pct_change
列包含变更百分比数据。
给定上面DataFrame过滤的DatetimeIndex:
<class 'pandas.tseries.index.DatetimeIndex'>
[2000-03-01 00:00:00, ..., 2012-11-01 00:00:00]
Length: 195, Freq: None, Timezone: UTC
我想过滤每个日期条目,并返回pct_change
列低于0.015的第一行。
我想出了这个解决方案,但速度很慢:
stops = []
#dates = DatetimeIndex
for d in dates:
#check if pct_change is below -0.015 starting from date of signal. return date of first match
match = df[df["pct_change"] < -0.015].ix[d:][:1].index
stops.append([df.ix[d]["close"], df.ix[match]["close"].values[0]])
关于如何改善这一点的任何建议?
答案 0 :(得分:2)
您可能会发现将索引作为列提取并使用apply
和bfill
更快。
像这样:
df['datetime'] = df.index
df['stops'] = df.apply(lambda x: x['datetime']
if x['pct_change'] < -0.015
else np.nan,
axis=1)
df['stops'] = df['stops'].bfill()
答案 1 :(得分:2)
这个怎么样:
result = df[df.pct_change < -0.015].reindex(filtered_dates, method='bfill')
唯一的问题是,如果间隔不包含低于-0.015的值,它将从未来的间隔中检索一个。如果添加包含日期的列,则可以看到每行的来源,如果检索到的时间戳超过下一个“bin边缘”,则将行设置为NA。