[英]how to iterate over Pandas data frame and update based on previous rows
我有一些需要工作的代码,但是速度很慢。 我需要更新交易表和报价表。 基表是这样的:
+--------+-----------+----------+----------+--------+----------+
| Symbol | Timestamp | BidPrice | AskPrice | Price | Quantity |
+--------+-----------+----------+----------+--------+----------+
| MSFT | 9:00 | | | 46.98 | 140 |
| MSFT | 9:01 | | | 46.99 | 100 |
| MSFT | 9:02 | | | 47 | 400 |
| MSFT | 9:03 | | | 47 | 100 |
| MSFT | 9:04 | 46.87 | 46.99 | | |
| MSFT | 9:05 | | | 46.89 | 100 |
| MSFT | 9:06 | | | 46.95 | 600 |
| MSFT | 9:07 | 46.91 | 46.99 | | |
| MSFT | 9:08 | 46.91 | 46.97 | | |
| MSFT | 9:09 | | | 46.935 | 100 |
| MSFT | 9:10 | 46.89 | 46.96 | | |
| MSFT | 9:11 | | | 46.93 | 100 |
| MSFT | 9:12 | | | 46.91 | 100 |
+--------+-----------+----------+----------+--------+----------+
我需要为每个交易设置出价和价格(有价格,但没有出价/要价)。 因此,以bid = 46.8并要求= 47开始,设置值,然后在这些值更改时设置新值。 像这样:
+--------+-----------+----------+----------+--------+----------+
| Symbol | Timestamp | BidPrice | AskPrice | Price | Quantity |
+--------+-----------+----------+----------+--------+----------+
| MSFT | 9:00 | 46.8 | 47 | 46.98 | 140 |
| MSFT | 9:01 | 46.8 | 47 | 46.99 | 100 |
| MSFT | 9:02 | 46.8 | 47 | 47 | 400 |
| MSFT | 9:03 | 46.8 | 47 | 47 | 100 |
| MSFT | 9:04 | 46.87 | 46.99 | | |
| MSFT | 9:05 | 46.87 | 46.99 | 46.89 | 100 |
| MSFT | 9:06 | 46.87 | 46.99 | 46.95 | 600 |
| MSFT | 9:07 | 46.91 | 46.99 | | |
| MSFT | 9:08 | 46.91 | 46.97 | | |
| MSFT | 9:09 | 46.91 | 46.97 | 46.935 | 100 |
| MSFT | 9:10 | 46.89 | 46.96 | | |
| MSFT | 9:11 | 46.89 | 46.96 | 46.93 | 100 |
| MSFT | 9:12 | 46.89 | 46.96 | 46.91 | 100 |
+--------+-----------+----------+----------+--------+----------+
我反复遍历了行,但是对于112k行,这需要35秒。
for i, row in qts_trd.iterrows():
if np.isnan(row['Price']):
bid = row['BidPrice']
ask = row['AskPrice']
if np.isnan(row['BidPrice']):
qts_trd.at[i,'BidPrice'] = bid
qts_trd.at[i,'AskPrice'] = ask
我知道lambda函数的基础,将相同的函数应用于每一行。 我认为它更快,但是正如您所见,它会发生变化。 有没有更有效/快捷的方法来做到这一点?
这是Spyder中的Python 3.7。
使用method='ffill'
尝试pandas fillna()函数
所以:
qts_trd.BidPrice.fillna(method='ffill', inplace=True)
qts_trd.AskPrice.fillna(method='ffill', inplace=True)
以我的经验,它很快
编辑:
我只是意识到这不会填充您的第一个值,下面的代码将在顶部插入一行以进行填充,然后将其删除。
qts_trd.loc[-1] = ['', '', 46.8, 47, '', '']
qts_trd.index += 1
qts_trd.sort_index(inplace=True)
qts_trd.BidPrice.fillna(method='ffill', inplace=True)
qts_trd.AskPrice.fillna(method='ffill', inplace=True)
qts_trd.drop(0,0,inplace=True)
qts_trd.reset_index(drop=True, inplace=True)
编辑2.0 ...感谢@no_body的评论:
qts_trd.BidPrice.fillna(method='ffill', inplace=True).fillna(46.8)
qts_trd.AskPrice.fillna(method='ffill', inplace=True).fillna(47)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.