【问题标题】:Display how long it has been since something doubled显示自某物翻倍以来已有多长时间
【发布时间】:2021-11-03 23:12:34
【问题描述】:

我读到了一个有趣的统计数据,自去年以来,股市在最短的休息时间内上涨了 100%(即翻了一番)——我正在寻找测试/复制这一说法。

以下数据来自 FRED(美联储数据存管处),适用于 WILL5000 指数,该指数可追溯到 1970 年,而标准普尔指数仅适用于 2011 年。

|日期 | WILL5000 | 50% | | 1970-12-31 00:00:00 | 1 | 0.5 | | 1971-01-01 00:00:00 |南 |南 | | 1971-01-04 00:00:00 |南 |南 | | 1971-01-05 00:00:00 |南 |南 | | 1971-01-06 00:00:00 |南 |南 | | ... | ... | ... | | 2021-07-21 00:00:00 | 216.54 | 108.27 | | 2021-07-22 00:00:00 | 216.68 | 108.34 | | 2021-07-23 00:00:00 | 218.84 | 109.42 | | 2021-07-26 00:00:00 | 219.32 | 109.66 | | 2021-07-27 00:00:00 | 218.07 | 109.035 |

我认为的一种方法是添加一个具有 WILL5000 索引值一半的列,然后使用代码搜索低于此级别的值(这将是 100% 移动),并记录从那以后已经过了多少天.

我似乎无法在任何地方找到如何做到这一点 - 我很想听听任何其他方法来实现它。

【问题讨论】:

    标签: python dataframe time-series data-science


    【解决方案1】:

    这个问题在你的系列中有O(n<sup>2</sup>) 步骤n 点。

    对于序列中的i<sup>th</sup> 点,您需要检查w<sub>j</sub> &gt;= 2w<sub>i</sub> 是否对应所有j &gt; i。在每种情况下满足您的要求的第一个j(如果有)处停下来。换句话说,将一个日期固定为基线,然后在所有未来日期中寻找加倍条件;为所有可能的基线日期执行此操作。

    在 Pandas 中,这意味着您必须 (i) 将数据框与自身交叉合并并将其过滤到“上三角”(即j &gt; i)部分,(ii) 找到第一次加倍i 上的每个组。

    这是完成工作的 Python+Pandas 代码:

    import numpy as np
    import pandas as pd
    
    # load your data --> construct synthetic df for this example
    np.random.seed(52)
    date_axis = pd.date_range('1970-01-01', '2021-01-01', freq='M')
    n = len(date_axis)
    raw_df = pd.DataFrame(data={'date': date_axis, 'ticker_value': 300.0 * np.random.rand(n)})
    
    # create n^2 df
    df = pd.merge(raw_df, raw_df, how='cross').sort_values(by=['date_x', 'date_y'])
    
    # restrict to upper triangle
    df = df.loc[df.date_y > df.date_x, :]
    
    # add a column to check if doubling condition is met
    df['is_at_least_double'] = (df.ticker_value_y >= 2.0 * df.ticker_value_x)
    
    # throw away values that don't meet the condition
    df = df.loc[df.is_at_least_double, :].drop(columns=['is_at_least_double'])
    
    # pick up the first value that satisfies the condition -- this is why we did the sort
    df = df.groupby('date_x').first().reset_index()
    
    # find intervals
    df['interval'] = df.date_y - df.date_x
    
    # find the smallest interval; tie-breaker is the one with the earliest base date
    df.sort_values(by=['interval', 'date_x'], inplace=True)
    solution = df.iloc[0]
    
    print(solution)
    

    cmets 解释了代码中的步骤。我建议在控制台中逐行运行它并检查中间结果以了解发生了什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多