首页 > 解决方案 > 滚动时间序列

问题描述

我正在处理股票数据。我有一组时间序列,如表所示。我想计算列 score_pos、score_Neg 和 score_Nut。这些列背后的想法是找出 score_pos 的(正变化)*(过去 15 分钟的得分), score_neg 的(负变化)*(过去 15 分钟的得分)和(中性变化)*(过去 15 分钟的得分) score_Nut。

例如:如果我们花时间(12.15 到 12.30),我需要检查 12.30 的时间,看看那个方向是 Pos 或 Neg 还是 Nut。这意味着如果方向是正向或负向或中性。在第 16 行中,我们可以看到 score_Pos 为 5,因为此时方向为正,并且我正在计算直到此时的正数总数。这是目标。接下来我为每一行做。对于这一行,我将检查这一行的前 15 分钟,即 (3:17)。

我尝试了以下代码来计算这些列。

co=df.Direction[df.Direction=='Pos'].dropna()
for c in co:
    df[c] = df['Direction'].eq(c).rolling('15min').sum()
df.loc[:df.index[0] + pd.Timedelta(15*60, unit="s"), cols] = np.nan

此代码无法按预期工作。我不确定如何以更好的方式计算它。

row      Timestamp     Direction  score   score_pos   score_Neg  score_Nut

 1    1/20/19 12:15    
 2    1/20/19 12:17    Pos        564.8
 3    1/20/19 12:17    Nut         
 4    1/20/19 12:18    Neg        -4.7
 5    1/20/19 12:19    Neg        -17.3
 6    1/20/19 12:20    Pos         4.9
 7    1/20/19 12:21    Neg        -0.02
 8    1/20/19 12:22    Neg        -3.50
 9    1/20/19 12:23    Pos         62.43
 10   1/20/19 12:24    Neg        -4.6
 11   1/20/19 12:25    Pos         2.8
 12   1/20/19 12:26    Neg         3.4
 13   1/20/19 12:27    Neg        -0.7
 14   1/20/19 12:29    Neg         8.07
 15   1/20/19 12:29    Neg        -0.73                 -19.8
 16   1/20/19 12:30    Nut         0                              0
 17   1/20/19 12:31    Pos        -2.6          67.52         
 18   1/20/19 12:32    Neg        -0.2                  -20.0
 19   1/20/19 12:33    Pos         5.2          72.76         

标签: python-3.xpandastime-series

解决方案


您的问题的解释或您粘贴的示例存在问题,因为它们不连贯。

这是我对您在文本中描述的内容的建议。

编辑:这现在处理方向列中的 NaN(它忽略它们)。并在时间戳列中重复值。

df = df.set_index('Timestamp')

for state in df['Direction'].dropna().unique():
    df.loc[df['Direction'] == state, 'score_' + state] = df.loc[df['Direction'] == state,'score'].fillna(0).rolling('15T').sum()

new_columns = 'score_' + df['Direction'].dropna().unique()
df.loc[:df.index[0] + pd.DateOffset(minutes=14), new_columns] = np.nan

推荐阅读