【问题标题】:Rolling over time series滚动时间序列
【发布时间】:2019-08-17 18:05:57
【问题描述】:

我正在处理股票数据。我有一组时间序列,如表所示。我想计算列 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         

【问题讨论】:

  • 您的代码看起来不错,只有 2 个 cmets:我认为第一行应该是 c=df['Direction'].unique()。而且您仍然缺少应该很容易在最后添加的(等于方向条件)。如果您添加一些我们可以运行来测试它的示例数据,会更容易提供帮助。
  • @ecortazar 请检查一下,我已经更新了更多示例数据,这正是我所需要的。列上的预期值是必需的。

标签: python-3.x pandas time-series


【解决方案1】:

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

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

已编辑:现在可以处理 Direction 列中的 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

【讨论】:

  • 顺便说一句,我得到这个错误 TypeError: must be str, not float
  • =IF(O16="Pos",SUMIF($O2:$O16,"Pos",$Q2:$Q16),"") -> 我在 excel 中使用这个公式来计算那些列。我希望你的解决方案也能做到这一点。另外,我不明白为什么它不连贯。如果我看到列中的值,则根据我使用的逻辑计算。
  • 您给出的解决方案是给出上述错误。我试图在 unique() 旁边添加 dropna() ,它给出了相同的答案,但它只能给出 pos_score 列,而对于下一个列,它给出了类似ValueError: cannot reindex from a duplicate axis 的错误。
  • @KSp 这些错误的动机如下:(1)Direction 列中有NaN(在运行之前我会确保数据是干净的)。 (2) Timestamp 列中有重复的日期。最后一个也可以在示例数据中观察到(例如,1/20/19 12:29 重复)。这将产生错误,因为滚动运算符在这种情况下定义不明确。请澄清这是否是您数据中的预期行为。
  • 确实你是完全正确的,方向列有 nan 值,但时间戳没有 nan 值。但肯定会被复制。所以我不能做任何计算?不放弃nan?如果您在此链接中看到我使用 nan 处理相同的数据,但该代码工作正常?stackoverflow.com/questions/55276372/…
猜你喜欢
  • 2012-10-25
  • 2021-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多