Не понимаю почему словарь в конце пустой
в datesAndPrices лежит следующие:
{'2019-01-01': 3869.47, '2019-01-02': 3941.2167, '2019-01-03': 3832.155, '2019-01-04': 3863.6267, '2019-01-05': 3835.5983}
Не пойму почему up_periods и down_periods пусты.
в up_periods должно быть примерно так:
up_periods = {
'1': [2019-01-01, 2019-01-02],
'2': [2019-01-03, 2019-01-04],
}
в down_periods наоборот должны быть дни с паданием цены.
тобишь в up_periods только те дни в которых значения цены больше предыдущей, down_periods ниже.
Мой код:
value = 0
up_periods = {}
# down_periods = {}
values = []
keyValues = list(datesAndPrices.keys());
pos = -1;
for j in sorted(datesAndPrices):
pos += 1;
if pos >= len(keyValues):
pos = len(keyValues)-1
if datesAndPrices[j] > value:
value = datesAndPrices[j];
values.append(j)
if datesAndPrices[keyValues[pos]] < value:
up_periods.update({"key": j, "prices": values.copy()})
values.clear()
print (up_periods)
Ответы (1 шт):
Для начала, up_periods оказывается не пустой, а содержит следующие значения:
{'key': '2019-01-05', 'prices': []}
Что вполне соответствует написанному: ключу "key" присваивается название последнего ключа из словаря datesAndPrice, значение которого меньше максимального в этом словаре, а ключу "prices" список с последними датами, когда цена была выше максимальной (то есть никогда)
Могу предложить такое решение:
value = 0
up_periods = {}
down_periods = {}
values = []
keyValues = list(datesAndPrices.keys())
pos = -1
index = 0
for j in sorted(datesAndPrices):
pos += 1
if pos >= len(keyValues):
pos = len(keyValues)-1
if datesAndPrices[j] > value:
value = datesAndPrices[j]
values.append(j)
if datesAndPrices[keyValues[pos]] < value:
value = datesAndPrices[j]
index += 1
up_periods.update({str(index): values.copy()})
values.clear()
values.append(keyValues[pos])
elif pos == len(keyValues)-1:
index += 1
up_periods.update({str(index): values.copy()})
print(up_periods)
Для down_periods, соответственно, то же самое, только ">" и "<" поменять местами.
Ещё, могу сказать, что у Вас не обрабатывается случай, когда цена в идущие подряд дни оказывается равна. Если такое развитие событий возможно в Вашем случае, рекомендую заменить ">" на ">=" или "<" на "<="
Объяснить Ваши ошибки могу так:
делая запись up_periods.update({"key": j, "prices": values.copy()}), Вы, видимо, предполагали, что j станет именем ключа, а values.copy() его значением, но на самом деле Вы создали два ключа: ключ с именем "key", которому присваивается значение j (а тут ещё нужно указать, что j у Вас - это не 1, 2, 3 и т.д., а имя ключа из sorted(datesAndPrices), являющееся датой) и ключ с именем "prices", значением которого становится values.copy().
Кроме того, Ваш value, то есть значение цены в прошлый день, обновлялось только в случае, если цена была выше него, а если ниже, то не обновлялся, поэтому таким образом у Вас отбиралась максимальная цена за период.