计算变长区间乘积的时间序列数据

2024-04-26 09:44:57 发布

您现在位置:Python中文网/ 问答频道 /正文

你知道吗 我有一些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

我想要实现的是在涨跌连续结束之前计算总价格变化,并将值存储在连续开始的行中。也就是说,我想要的是“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

考虑到这个专栏的“转折点”,我需要帮助继续我的探索(或者我们根本不需要这个“转折点”)。我非常确定我可以编写一个嵌套for循环,逐行遍历整个数据帧,计算我需要的内容并填充“TotalPriceChange”列,但是考虑到我计划在一个相当大的数据集上执行此操作(考虑几年的分钟或小时数据),我认为嵌套for循环将非常缓慢。你知道吗

因此,我只想和你们的专家核实一下,看看是否有任何有效的解决我的问题的办法,我不知道。任何帮助都将不胜感激!你知道吗

谢谢!你知道吗


Tags: 数据信息l1dffor价格loctimestamp
1条回答
网友
1楼 · 发布于 2024-04-26 09:44:57

您要查找的计算看起来像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

相关问题 更多 >