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

时间:2017-12-06 21:30:00

标签: python pandas time-series

我有一些时间序列数据,基本上包含有关价格变化的信息。例如,让我们说:

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

我想要实现的是在增加/减少条纹结束之前计算总体价格变化,并将值存储在条纹开始的行中。也就是说,我想要的是一个专栏' TotalPriceChange' :

   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

鉴于此专栏&#34;转向&#34;,我需要帮助继续我的任务(或者我们根本不需要这个&#34;转向&#34;根本)。我很确定我可以逐行编写一个嵌套的for循环遍历整个DataFrame,计算我需要的内容并填充列'TotalPriceChange&#39;但是考虑到我计划在相当大的范围内执行此操作数据集(想想几年的分钟或小时数据),我想嵌套的for循环会非常慢。

因此,我只是想和你的专家核实,看看我的问题是否有任何有效的解决方案,我不知道。任何帮助将不胜感激!

谢谢!

1 个答案:

答案 0 :(得分:0)

您正在寻找的计算看起来像是groupby / product操作。 要设置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列(模块化一点清理工作)为

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