【问题标题】:Using Pandas Series, Numpy Arrays and Python Lists efficiently [closed]有效地使用 Pandas 系列、Numpy 数组和 Python 列表 [关闭]
【发布时间】:2020-10-07 13:35:01
【问题描述】:

任务:我有一系列每日收盘价,我想实现以下目标: (i) 计算任意 5 天窗口内任意两天之间的最大百分比变化 (ii) 以 5 天滚动窗口为基础存储这些最大值 (iii) 计算所有 5 天滚动窗口中这些最大值的第 99 个百分位

相当简单的问题。我对 Python 很陌生,发现自己混合了 Python 列表、Numpy 数组和 Pandas 系列来实现上述目标,我确信这不是高效编码的正确方法。

问题:我在下面附上我的代码。有没有办法实现相同的目标,而不必为这个简单的任务使用多个对象(即一个 Pandas DataFrame,然后将其复制到一个 Numpy Array 中,用于修改 Python 列表,最终转换为熊猫系列)?另外,内循环可以通过原生Numpy或Pandas迭代方法(如ndenumerate)来实现,而不是通过索引循环吗?

#pd_prices is a Pandas DataFrame containing daily open, high, low, and close prices

#store just closing prices into a Numpy array
np_prices = np.array(pd_prices['close'])

my_max = [0] # Python list that will be appended

# loop through Numpy array using ndenumerate
for i, price in np.ndenumerate(np_prices):

    local_max = 0.0
    j = min(i[0],(np_prices.size - 6))
    for k in range(1,6,1):
        # compute local % change between two days within a 5-day window
        pct_change = (np_prices[j+k] / np_prices[j]) - 1
        # store max over the current 5-day window 
        local_max = max(local_max,abs(pct_change))

     # save max from current 5-day window into  list before computing max over next 5-day window
     my_max.append(local_max)

#in order to use Pandas quantile function, the list is converted to Pandas Series object
pd_maxes = pd.Series(my_max)
print(pd_maxes.quantile(0.99))

【问题讨论】:

  • 您能否提供更多有关维度的信息? np_pricesmy_max 有多大?您绝对可以在numpynp.quantile(my_max, .99, axis=?) 中完成所有操作。
  • 我投票结束这个问题,因为它属于codereview.stackexchange.com
  • @Mad Physicist:结束会转化为删除,还是只是结束进一步讨论?
  • @MadPhysicist 虽然这可能是未来 CR 的主题,但请不要以 Code Review 站点的存在作为关闭问题的理由。评估请求并使用需要关注(就像我在这里所做的那样)、主要基于意见等原因。然后你可以向 OP 提及它可以是如果是 on-topic,则发布在 Code Review 上。请参阅Does being on-topic at another Stack Exchange site automatically make a question off-topic for Stack Overflow?
  • 一个问题被关闭,在技术方面,意味着将无法发布新的答案,并且拥有 10,000 或更多声誉的用户可以在几天后将其删除。它本身不会导致问题被删除。

标签: python pandas numpy numpy-ndarray


【解决方案1】:

几个建议:

  1. 从列表中创建numpy 数组:

    my_max = np.vstack(my_max)
    可能是 hstack,不确定维度

  2. numpy 也用于分位数:

    print(np.quantile(my_max, 0.99, axis=?)
    同样,轴不确定基础数据`

  3. 如果您想从numpy 获取python 列表和stack 函数,并且您事先知道数组的大小,请使用:

    my_max = np.empty((rows, cols))

只需确保您实际初始化它们,使用np.zeros,具体取决于您的数据。

编辑(关于您的评论):

  1. 如果您想将每个元素除以下一个、第二个...等等,请使用矢量化:

    div = array[:-1] / array[1:]

    这将每个元素除以下一个元素,除了最后一个,因为在那里不可能。如果您想为第五个元素执行此操作,请将索引移动 5:

    div = array[:-5] / array[5:]

    您可以编写 5 次,也可以使用循环来循环该参数 n,但是,这比 2 个嵌套循环要快得多,因为它使用 numpys 内部向量化。

【讨论】:

  • 非常感谢!如果可以的话,还有一个问题:我在另一篇文章中被告知我不应该通过索引来遍历 Numpy 数组,而是通过 np.ndenumerate 方法。但是我需要逐渐计算百分比回报的内部循环呢: array[j] / array[j+k] 其中 k 从 1 到 5。似乎最有效的迭代方式就是通过直接索引和只在外循环上使用 np.ndenumerate?
猜你喜欢
  • 2019-01-08
  • 1970-01-01
  • 2021-11-28
  • 2018-02-24
  • 2021-11-21
  • 2020-09-06
  • 2022-10-15
  • 2017-09-30
  • 1970-01-01
相关资源
最近更新 更多