首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫接受累加和复位

熊猫接受累加和复位
EN

Stack Overflow用户
提问于 2017-09-10 18:52:38
回答 1查看 1.7K关注 0票数 3

问题

我试图保持一个连续的时间戳(分钟频率)的运行总数。目前,我有一种方法来获取累积和,并在两列不匹配的条件下重置它,但这是使用for循环完成的。我在想,如果没有循环,是否有办法做到这一点。

代码

代码语言:javascript
复制
cb_arbitrage['shift'] = cb_arbitrage.index.shift(1, freq='T')

返回:

代码语言:javascript
复制
                        cccccccc     bbbbbbbb  cb_spread         shift
timestamp                                                                   
2017-07-07 18:23:00  2535.002000  2524.678462  10.323538 2017-07-07 18:24:00
2017-07-07 18:24:00  2535.007826  2523.297619  11.710207 2017-07-07 18:25:00
2017-07-07 18:25:00  2535.004167  2524.391000  10.613167 2017-07-07 18:26:00
2017-07-07 18:26:00  2534.300000  2521.838667  12.461333 2017-07-07 18:27:00
2017-07-07 18:27:00  2530.231429  2520.195625  10.035804 2017-07-07 18:28:00
2017-07-07 18:28:00  2529.444667  2518.782143  10.662524 2017-07-07 18:29:00
2017-07-07 18:29:00  2528.988000  2518.802963  10.185037 2017-07-07 18:30:00
2017-07-07 18:59:00  2514.403367  2526.473333  12.069966 2017-07-07 19:00:00
2017-07-07 19:01:00  2516.410000  2528.980000  12.570000 2017-07-07 19:02:00

然后我做以下几件事:

代码语言:javascript
复制
cb_arbitrage['shift'] = cb_arbitrage['shift'].shift(1)
cb_arbitrage['shift'][0] = cb_arbitrage.index[0]
cb_arbitrage['count'] = 0

返回:

代码语言:javascript
复制
                        cccccccc     bbbbbbbb  cb_spread               shift  count
timestamp                                                                          
2017-07-07 18:23:00  2535.002000  2524.678462  10.323538 2017-07-07 18:23:00      0
2017-07-07 18:24:00  2535.007826  2523.297619  11.710207 2017-07-07 18:24:00      0
2017-07-07 18:25:00  2535.004167  2524.391000  10.613167 2017-07-07 18:25:00      0
2017-07-07 18:26:00  2534.300000  2521.838667  12.461333 2017-07-07 18:26:00      0
2017-07-07 18:27:00  2530.231429  2520.195625  10.035804 2017-07-07 18:27:00      0
2017-07-07 18:28:00  2529.444667  2518.782143  10.662524 2017-07-07 18:28:00      0
2017-07-07 18:29:00  2528.988000  2518.802963  10.185037 2017-07-07 18:29:00      0
2017-07-07 18:59:00  2514.403367  2526.473333  12.069966 2017-07-07 18:30:00      0
2017-07-07 19:01:00  2516.410000  2528.980000  12.570000 2017-07-07 19:00:00      0

然后,用重置来计算累积和的循环:

代码语言:javascript
复制
count = 0
for i, row in cb_arbitrage.iterrows():

    if i == cb_arbitrage.loc[i]['shift']:
        count += 1
        cb_arbitrage.set_value(i, 'count', count)
    else:
        count = 1
        cb_arbitrage.set_value(i, 'count', count)

这给了我预期的结果:

代码语言:javascript
复制
                        cccccccc     bbbbbbbb  cb_spread               shift  count
timestamp                                                                          
2017-07-07 18:23:00  2535.002000  2524.678462  10.323538 2017-07-07 18:23:00      1
2017-07-07 18:24:00  2535.007826  2523.297619  11.710207 2017-07-07 18:24:00      2
2017-07-07 18:25:00  2535.004167  2524.391000  10.613167 2017-07-07 18:25:00      3
2017-07-07 18:26:00  2534.300000  2521.838667  12.461333 2017-07-07 18:26:00      4
2017-07-07 18:27:00  2530.231429  2520.195625  10.035804 2017-07-07 18:27:00      5
2017-07-07 18:28:00  2529.444667  2518.782143  10.662524 2017-07-07 18:28:00      6
2017-07-07 18:29:00  2528.988000  2518.802963  10.185037 2017-07-07 18:29:00      7
2017-07-07 18:59:00  2514.403367  2526.473333  12.069966 2017-07-07 18:30:00      1
2017-07-07 19:01:00  2516.410000  2528.980000  12.570000 2017-07-07 19:00:00      1
2017-07-07 21:55:00  2499.904560  2510.814000  10.909440 2017-07-07 19:02:00      1
2017-07-07 21:56:00  2500.134615  2510.812857  10.678242 2017-07-07 21:56:00      2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-10 19:20:06

您可以使用diff方法来查找当前行和前一行之间的差异。然后,您可以检查并查看此差值是否等于1分钟。从这里开始,有很多诡计来重置数据中的条纹。

我们首先取布尔级数的累积和,这使我们接近我们想要的。为了重置这个序列,我们将这个累积和序列乘以原始布尔值,因为False计算值为0。

代码语言:javascript
复制
s = cb_arbitrage.timestamp.diff() == pd.Timedelta('1 minute')
s1 = s.cumsum()
s.mul(s1).diff().where(lambda x: x < 0).ffill().add(s1, fill_value=0) + 1

0     1.0
1     2.0
2     3.0
3     4.0
4     5.0
5     6.0
6     7.0
7     1.0
8     1.0
9     1.0
10    2.0
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46144380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档