Как построить функцию, которая обнаруживает точки пересечения в 2 списках - PullRequest
0 голосов
/ 23 сентября 2018

У меня есть задание, я должен написать функцию, которая может определять точки пересечения в двух списках.Функция заключается в анализе финансовых данных.Так, например, у меня есть два списка цен (скользящие средние) в качестве входных данных, а в качестве выходных данных я хочу два отдельных списка, 1 с указанием, когда эти цены (скользящие средние) пересекаются (т.е. индекс времен), и 1, определяющий, какой список вышев точке пересечения (т. е. выше IndeX).У меня возникают проблемы с правильным синтаксисом, чтобы определить критерии выше на Python.Пока я ничего не написал, так как застрял.Кто-нибудь делал что-нибудь подобное, есть ли советы.

Дополнительная информация, назначение касается скользящих средних и проверки пересечения скользящих средних.Мне удалось написать функцию, которая обнаруживает скользящие средние, но я застрял в этой части.Извините за отсутствие кода и информации.Я почти уверен, что копирование, вставляющее все критерии назначения, здесь не рекомендуется, поэтому я попытался объяснить, в чем заключается моя проблема.

    Identify cross-over indices for two equal-length lists of prices (here: moving averages)

Parameters:
    prices1, prices2: lists of prices (ordered by time)

Returns:
    list of crossover points

Each item in the returned list is a list [time_index, higher_index], where:
    - time_index is the crossover time index (when it happends
    - higher_index indicates which price becomes higher at timeIndex: either 1 for first list or 2 for second list

There are no crossovers before both price lists have values that are not None.
You can start making comparisons from the point at which both have number values.

Example use:
>>> p1 = [1, 2, 4, 5]
>>> p2 = [0, 2.5, 5, 3]
>>> cross_overs(p1, p2)
[[1, 2], [3, 1]]
>>> p1 = [None, 2.5, 3.5, 4.5, 4.5, 3.5, 2.5, 1.5, 3.5, 3.5]
>>> p2 = [None, None, 3.0, 4.0, 4.333333333333333, 4.0, 3.0, 2.0, 3.0, 2.6666666666666665]
>>> cross_overs(p1, p2)
[[5, 2], [8, 1]]
"""

для первой части (т. Е. Идентифицировать, когда произошло пересечение, это то, что я пытался.вы видите, результат, который я получил, неверен.

def cross_overs(prices1, prices2):
    times_index = list(set(prices1).intersection(set(prices2)))
    print (times_index)

(input)
p1 = [1, 2, 4, 5]
p2 = [0, 2.5, 5, 3]
cross_overs(p1, p2)    

(output)
[5]

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018
>>> def crossovers(p1,p2):
...     a = []
...     high = True
...     for i in range(len(p1)):
...         if p1[i] is not None and p2[i] is not None:
...             if high and p1[i] < p2[i]:
...                 a.append([i,2])
...                 high = False
...             if not high and p1[i] > p2[i]:
...                 a.append([i,1])
...                 high = True
...     return a
... 
>>> 

Это решение может работать.

>>> p1 = [1, 2, 4, 5]
>>> p2 = [0, 2.5, 5, 3]
>>> 
>>> print(crossovers(p1,p2))
[[1, 2], [3, 1]]
>>> 
>>> p1 = [None, 2.5, 3.5, 4.5, 4.5, 3.5, 2.5, 1.5, 3.5, 3.5]
>>> p2 = [None, None, 3.0, 4.0, 4.333333333333333, 4.0, 3.0, 2.0, 3.0, 2.6666666666666665]
>>> print(crossovers(p1,p2))
[[5, 2], [8, 1]]
0 голосов
/ 23 сентября 2018

Вот решение с комментариями для объяснения процесса для вашей проблемы:

def cross_over(p1, p2):
    p1_none_index = 0
    p2_none_index = 0

    # Find indices of last occurences of None in both lists.
    try:
        p1_none_index = len(p1) - p1[::-1].index(None)
    except ValueError:
        pass

    try:
        p2_none_index = len(p2) - p2[::-1].index(None)
    except ValueError:
        pass

    # Take the maximum index of these indices.
    startingIndex = max(0, max(p1_none_index, p2_none_index))
    crossOvers = []

    #Take the difference of each pair.
    subtraction = [0] * startingIndex + [p1[i]-p2[i] for i in range(startingIndex,len(p1),1)]

    #Check using product, to track positive or negative sign changes in order to see if there is a crossover point.
    for i in range(1,len(subtraction),1):
        if subtraction[i] * subtraction[i-1] < 0:
            if subtraction[i] > 0:
                crossOvers.append([i,1])
            else:
                crossOvers.append([i,2])
    return crossOvers

Запуск его с предоставленными вами данными:

Первый:

p1 = [1, 2, 4, 5]
p2 = [0, 2.5, 5, 3]

crossOvers = cross_over(p1, p2)
print(crossOvers)

Результат:

[[1, 2], [3, 1]]

Секунда:

p1 = [None, 2.5, 3.5, 4.5, 4.5, 3.5, 2.5, 1.5, 3.5, 3.5]
p2 = [None, None, 3.0, 4.0, 4.333333333333333, 4.0, 3.0, 2.0, 3.0, 2.6666666666666665]

crossOvers = cross_over(p1, p2)
print(crossOvers)

Результат:

[[5, 2], [8, 1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...