Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更多“;蟒蛇”;通过数组执行嵌套循环的方法?_Python_Numpy - Fatal编程技术网

Python 更多“;蟒蛇”;通过数组执行嵌套循环的方法?

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

下面的代码试图解决以下任务:“查找任何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.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]