Pandas Timeseries数据 - 在不同长度的间隔内计算产品



我有一些时间表数据,这些数据基本上包含有关价格变化的信息。例如,假设:

df = pd.DataFrame(columns = ['TimeStamp','PercPriceChange'])
df.loc[:,'TimeStamp']=[1457280,1457281,1457282,1457283,1457284,1457285,1457286]
df.loc[:,'PercPriceChange']=[0.1,0.2,-0.1,0.1,0.2,0.1,-0.1]

使DF看起来像

     TimeStamp  PercPriceChange
0    1457280              0.1
1    1457281              0.2
2    1457282             -0.1
3    1457283              0.1
4    1457284              0.2
5    1457285              0.1
6    1457286             -0.1

我要实现的是在增加/减少条纹结束之前计算总价格变化,并将其值存储在条纹启动的行中。也就是说,我想要的是" TotalPraceChange"列:

   TimeStamp   PercPriceChange               TotalPriceChange   
0    1457280              0.1             1.1 * 1.2  - 1 = 0.31
1    1457281              0.2                         0
2    1457282             -0.1                        -0.1
3    1457283              0.1           1.1 * 1.2 * 1.1  - 1 = 0.452
4    1457284              0.2                         0
5    1457285              0.1                         0
6    1457286             -0.1                        -0.1

我可以使用以下内容来识别起点:

df['turn'] = 0
df['PriceChange_L1'] = df['PercPriceChange'].shift(periods=1, freq=None, axis=0)
df.loc[ df['PercPriceChange'] * df['PriceChange_L1'] < 0, 'turn' ] = 1 

获得

    TimeStamp   PercPriceChange             turn
0    1457280              0.1          NaN or 1?
1    1457281              0.2             0
2    1457282             -0.1             1
3    1457283              0.1             1
4    1457284              0.2             0
5    1457285              0.1             0
6    1457286             -0.1             1

鉴于此列"转",我需要继续进行任务(或者我们根本不需要这个"转弯")。我很确定我可以通过行编写一个嵌套的循环,通过行进行整个数据帧,计算我的需求并填充列" totalPriceChange",但是鉴于我计划在相当大的数据集上进行此操作(请考虑一下Minute或者几年的小时数据),我想嵌套的陆路真的很慢。

因此,我只是想与您的专家联系,以查看我不知道我的问题是否有任何有效的解决方案。任何帮助将不胜感激!

谢谢!

您正在寻找的计算看起来像GroupBy/产品操作。要设置GroupBy操作,我们需要为每行分配一个group值。取出turn列的累积总和给出了所需的结果:

df['group'] = df['turn'].cumsum()
# 0    0
# 1    0
# 2    1
# 3    2
# 4    2
# 5    2
# 6    3
# Name: group, dtype: int64

现在我们可以将TotalPriceChange列(Modulo稍加清理工作)定义为

df['PercPriceChange_plus_one'] = df['PercPriceChange']+1
df['TotalPriceChange'] = df.groupby('group')['PercPriceChange_plus_one'].transform('prod') - 1

import pandas as pd
df = pd.DataFrame({'PercPriceChange': [0.1, 0.2, -0.1, 0.1, 0.2, 0.1, -0.1],
                   'TimeStamp': [1457280, 1457281, 1457282, 1457283, 1457284, 1457285, 1457286]})
df['turn'] = 0
df['PriceChange_L1'] = df['PercPriceChange'].shift(periods=1, freq=None, axis=0)
df.loc[ df['PercPriceChange'] * df['PriceChange_L1'] < 0, 'turn' ] = 1 
df['group'] = df['turn'].cumsum()
df['PercPriceChange_plus_one'] = df['PercPriceChange']+1
df['TotalPriceChange'] = df.groupby('group')['PercPriceChange_plus_one'].transform('prod') - 1
mask = (df['group'].diff() != 0)
df.loc[~mask, 'TotalPriceChange'] = 0
df = df[['TimeStamp', 'PercPriceChange', 'TotalPriceChange']]
print(df)

产生

   TimeStamp  PercPriceChange  TotalPriceChange
0    1457280              0.1             0.320
1    1457281              0.2             0.000
2    1457282             -0.1            -0.100
3    1457283              0.1             0.452
4    1457284              0.2             0.000
5    1457285              0.1             0.000
6    1457286             -0.1            -0.100

最新更新