Pythoni c способ найти следующее наибольшее число в массиве? - PullRequest
0 голосов
/ 28 февраля 2020

Допустим, у меня есть фрейм данных со столбцом цен закрытия и отдельный (не включенный в фрейм данных) список максимальных значений, например:

Closes      Max's
1           3
2           5
3           7
4           6
5           2
4
3
2
1

Что такое Pythoni c способ добавить еще один столбец в фрейм данных, где он захватывает следующее наибольшее число, сравнивая каждый рядом с числами в списке? Таким образом, ожидаемый результат будет:

Closes      Next_Biggest
1           2
2           3
3           5
4           5
5           6
4           5
3           5
2           3
1           2

Что-то псевдоподобное:

df['Next_Biggest'] = i where df['Closes'] > i and < i for i in Max's 

... или, может быть, отсортировать список Макса от наименьшего к наибольшему и затем каким-то образом l oop через каждое закрытие и сравнивайте по одному за раз, чтобы увидеть, меньше ли он текущего максимума, с которым он пытается сравнить? Помогите! Спасибо!

Ответы [ 3 ]

2 голосов
/ 28 февраля 2020

Одним из возможных решений (для небольших наборов данных) является поиск минимального значения всех значений в Max's, превышающих каждое значение в Closes:

closes = [1, 2, 3, 4, 5, 4, 3, 2, 1]
maxs = [3, 5, 6, 7, 2]
nextbig = [min([m for m in maxs if m > c]) for c in closes]
print(nextbig)

Вывод:

[2, 3, 5, 5, 6, 5, 5, 3, 2]

Более эффективной альтернативой будет вложенный l oop с использованием отсортированного списка Max's:

closes = [1, 2, 3, 4, 5, 4, 3, 2, 1]
maxs = [3, 5, 6, 7, 2]
nextbig = [c for c in closes]
maxs.sort()
for m in maxs:
    for i, c in enumerate(closes):
        if m > c and nextbig[i] == c:
            nextbig[i] = m
print(nextbig)

Вывод:

[2, 3, 5, 5, 6, 5, 5, 3, 2]
1 голос
/ 28 февраля 2020

Вот что-то с использованием выражений генератора, которые не должны иметь проблем с очень большими списками. Он в основном создает два генератора, один из которых циклически повторяет свою последовательность каждый раз, когда другой генератор продвигается один раз, и который (первый) завершает работу при первом обнаружении соответствующего условия. (Верхний ответ в приведенной ниже ссылке очень полезен)

def find_next_largest(closes, maxes):
    """Searches through one list trying to find the next largest value
    from another list."""
    maxes = sorted(maxes)
    foo = (i for i in closes)  #generator for closes, the very large list
    for x in range(len(closes)):
        test = next(foo)
        bar = next((test, val) for val in maxes if val > test) #see SO reference below
        yield bar

Для использования этой функции:

closes = [1,2,3,4,5,4,3,2,1]
maxes = [2,3,4,6,7]
zed = find_next_largest(closes, maxes)
result = []
while True:
    try:
        result.append(next(zed))
    except StopIteration:
        break

Это дает следующий результат:

[(1, 2), (2, 3), (3, 4), (4, 6), (5, 6), (4, 6), (3, 4), (2, 3), (1, 2)]

Основано главным образом на: Получите первый элемент из итерируемого, который соответствует условию

1 голос
/ 28 февраля 2020

Используйте вложенный l oop, например, так:

import pandas as pd
# example dataframe without maxs inside the frame
d = {'Closes': [1, 2, 3, 4, 5, 4, 3, 2, 1]}
# maxs as a list
maxs = [3,5,7,6,2]
# sort the list from least to greatest
maxs.sort()
# have a container for new column
nextBiggest = []
# set up data frame
dataFrame = pd.DataFrame(data=d)
# convert data frame object to a list
dList = dataFrame.values.tolist()
# using a nested loop, find next biggest and put into nextBiggest list
for element in dList:
    for value in element:
        for max in maxs:
            if max > value:
                nextBiggest.append(max)
                break
# add nextBiggest list as a column to the dataframe
dataFrame['Next Biggest'] = nextBiggest
# display results
print(dataFrame)

Выход:

   Closes  Next Biggest
0       1             2
1       2             3
2       3             5
3       4             5
4       5             6
5       4             5
6       3             5
7       2             3
8       1             2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...