Python 更多“;蟒蛇”;通过数组执行嵌套循环的方法?
下面的代码试图解决以下任务:“查找任何5天滚动窗口中超过1000天的最大价格变化” “任何5天滚动窗口”,我不仅仅指“t_I+5”,而是指“t_I+j”,其中“I”从1变化到1000,“j”从1变化到5 我曾尝试使用Numpy本机函数,但最终还是在内部迭代中使用了“for循环”。代码如下:Python 更多“;蟒蛇”;通过数组执行嵌套循环的方法?,python,numpy,Python,Numpy,下面的代码试图解决以下任务:“查找任何5天滚动窗口中超过1000天的最大价格变化” “任何5天滚动窗口”,我不仅仅指“t_I+5”,而是指“t_I+j”,其中“I”从1变化到1000,“j”从1变化到5 我曾尝试使用Numpy本机函数,但最终还是在内部迭代中使用了“for循环”。代码如下: prices = npr.random([1000,1])*1000 max_array = np.zeros([(prices.size-5),1]) for index, elem in np.nden
prices = npr.random([1000,1])*1000
max_array = np.zeros([(prices.size-5),1])
for index, elem in np.ndenumerate(prices[:-5,:]):
local_max = 0.0
for i in range(1,6,1):
price_return = prices[(index[0] + i),0] / elem
local_max = max(local_max, price_return)
max_array[index[0]] = local_max
global_max = np.amax(max_array)
我是否可以以某种方式消除内部for循环并使用Numpy矢量化(以某种方式)来代替
另外,我并不特别喜欢使用“index[0]”从通过调用返回变量“index”的tuple对象中提取当前循环的实际索引:
for index, elem in np.ndenumerate(prices[:-5,:]):
还可以导入吗?使用熊猫滚动窗口进行最小值和最大值 允许不使用for循环进行计算 灵感来自 结果(显示前10个元素) 输出(前10个元素)
“查找任何5天滚动窗口内1000天内的最大价格变化”。如果您明确地寻找一个5天的窗口,那么为什么需要内部循环呢?您只对每个窗口迭代的最小值和最大值之间的最大差值感兴趣。检查1-4天也没有好处,结果将是相同的。我不认为结果会是相同的。任何5天滚动窗口n内的最大变化不一定仅来自5天窗口的第一天和最后一天。我对任何5天窗口内任何两天之间可能发生的最大变化感兴趣。好的,我不清楚变化必须在连续两天内发生。非常感谢。因此,似乎Python中的高效编码归结为(除其他考虑因素外)有意识地为特定任务选择最合适的库?我觉得这有点令人沮丧,因为在C型语言中,学习如何有效地使用循环足以解决这类问题。在Python中,学习每个库几乎就像学习一种新的编码语言本身……所以说真的,学习高效的Python归根结底就是学习特定的库。@Jansteller--我用我当前答案的灵感来源更新了我的答案,以展示如何使它不那么令人沮丧。看看我们看到Python在stackoverflow的问答中位列前三。所以,我发现最好的方法是先看看类似的问题以前是否解决过。这将为我指出库和库中函数的最佳选项。再次感谢。顺便说一句,再看一眼,您建议的方法只返回滚动5天窗口内的最大值。然而,我对任何五天滚动窗口内任何两天之间的最大差异感兴趣。因此,在所有5天滚动窗口中,仍然需要从“1”到“5”的内部循环。@Jansteller——让我理解一下:如果价格=[6,2,3,4,5,1]。然后使用5天滚动窗口,maxs=[6,5]和min=[2,1],那么max change=[4,4]不是吗?这是正确的吗?如果是这样,答案就是这样。如果没有,你能解释一下最大值、最小值和最大变化值是多少吗?你是对的。我现在明白了,你的代码完成了任务!聪明的做法,我非常喜欢。
import pandas as pd
import numpy as np
# Generate Data
prices = np.random.random([1000,1])*1000
prices = prices.flatten()
# Pandas rolling window (max in 5 day period)
# Convert series back to numpy array
maxs = pd.Series(prices).rolling(5).max().dropna().to_numpy()
# Pandas rolling window (min in 5 day period)
# Convert series back to numpy array
mins = pd.Series(prices).rolling(5).min().dropna().to_numpy()
# Numpy subtraction to find max and min differnce
delta = maxs - mins
print('prices: ', prices[:10])
print('maxs: ', maxs[:10])
print('mins: ', mins[:10])
print('max-change: ', delta[:10])
prices: [416.67356904 244.29395291 325.50608035 102.67426207 794.36067353
318.22836941 113.48811096 898.87130071 303.06297351 285.80963998]
maxs: [794.36067353 794.36067353 794.36067353 898.87130071 898.87130071
898.87130071 898.87130071 898.87130071 828.87148828 828.87148828]
mins: [102.67426207 102.67426207 102.67426207 102.67426207 113.48811096
113.48811096 113.48811096 285.80963998 285.80963998 106.4036413 ]
max-change: [691.68641146 691.68641146 691.68641146 796.19703863 785.38318975
785.38318975 785.38318975 613.06166073 543.06184831 722.46784698]