【问题标题】:Creating a base 100 Index from time series that begins with a number of NaNs从以多个 NaN 开头的时间序列创建以 100 为底的索引
【发布时间】:2021-06-15 16:20:44
【问题描述】:

我有以下数据框(为简洁起见,返回的时间序列被截断):

import pandas as pd
import numpy as np

df = pd.DataFrame({'return':np.array([np.nan, np.nan, np.nan, 0.015, -0.024, 0.033, 0.021, 0.014, -0.092])})

我试图在第一次返回之前的最后一个 NaN 开始索引(即“base-100”) - 同时保持 100 值之前的 NaN - (考虑附加到现有数据框并用于绘图目的)。

我只有在返回向量中没有 NaN 时才找到创建所述索引的方法:

df['index'] = 100*np.exp(np.nan_to_num(df['return'].cumsum()))

任何想法 - 提前谢谢!

【问题讨论】:

  • 你能添加预期的输出吗?
  • 当然,它应该是这样的...... NaN, NaN, NaN, 100.0, 101.5, 99.1, 102.3, 104.5, 105.9, 96.2。

标签: pandas dataframe numpy cumsum exp


【解决方案1】:

如果你的初始数组是

zz = np.array([np.nan, np.nan, np.nan, 0.015, -0.024, 0.033, 0.021, 0.014, -0.092])

然后你可以像这样获得你想要的输出(尽管可能有更优化的方法来做到这一点):

np.concatenate((zz[:np.argmax(np.isfinite(zz))],
                100*np.exp(np.cumsum(zz[np.isfinite(zz)]))))

【讨论】:

    【解决方案2】:

    使用Series.isna,通过索引更改顺序并通过Series.idxmax获取最后一个NaN的索引:

    idx = df['return'].isna().iloc[::-1].idxmax()
    

    传递给DataFrame.loc,替换缺失值并使用累积和:

    df['return'] = df.loc[idx:, 'return'].fillna(100).cumsum()
    print (df)
        return
    0      NaN
    1      NaN
    2  100.000
    3  100.015
    4   99.991
    5  100.024
    6  100.045
    7  100.059
    8   99.967
    

    您可以将Series.isnaSeries.cumsum 一起使用并通过max 进行比较,然后将最后一个NaN 替换为Series.fillna 并最后使用累积和:

    s = df['return'].isna().cumsum()
    
    df['return'] = df['return'].mask(s.eq(s.max()), df['return'].fillna(100)).cumsum()
    print (df)
        return
    0      NaN
    1      NaN
    2  100.000
    3  100.015
    4   99.991
    5  100.024
    6  100.045
    7  100.059
    8   99.967
    

    【讨论】:

      猜你喜欢
      • 2016-07-09
      • 2021-06-05
      • 2020-05-12
      • 2021-01-19
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 2015-01-12
      • 2022-01-08
      相关资源
      最近更新 更多