2016-01-06 5 views
2

Речь идет о финансовых данных. У меня есть список из 70% процентилей возврата данных на 72 датах:сравнить элементы списка с элементами списка списков и условно создать новые списки

list = [0.11,0.12,...,0.125] 

Кроме того у меня есть список списков, который содержит 72 возвратов на разные даты для 500 компаний (= 500 списков и 72 записей в список):

list_of_lists = [[0.09,0.08,...,0.15],...,[0.1,0.34,...,0.01]] 

То, что я хочу сделать сейчас, это сравнить первую запись из моего списка (0.11) для всех записей в моем первом списке в списке списков. Если запись в первом списке превышает порог 0.11 (так в этом случае 0.15 выше), я хочу добавить этот номер в новый список. Затем я хочу сделать то же самое со второй записью в list (0.12), а второй - в list_of_lists. В конце концов, я в основном хочу получить 72 списка (или новый список списков), которые содержат доходности выше 70% процентиля.

+0

Вы говорите * 500 списков и 72 записей в списке *, это не должно по * 72 списков и 500 записей в списке *? –

+0

Не ответ, но я бы определенно предложил изучить библиотеку, например, например. [ 'Numpy'] (http://www.numpy.org/). –

ответ

2

Вы можете сделать это с помощью списка понимания я думаю:

thresholds = [0.11,0.12,0.125] 
quotes = [[0.09,0.08,0.15],[0.09,0.08,0.15],[0.1,0.34,0.01]] 
[filter(lambda x: x > thresholds[idx],qts) for idx,qts in enumerate(quotes)] 

Я сделал некоторые реальные списки из заданных единиц (опуская ...) таким образом, что это пример, который компилирует.

Список постижение работает следующим образом: мы перебрать qts от quotes (а также получить соответствующий индекс idx, который используется для получения порогового значения). Затем мы выполняем операцию filter на qts и допускаем только элементы, размер которых больше threshold[idx] (порог для этой временной метки).

Запуск этого с python дает:

$ python 
Python 2.7.9 (default, Apr 2 2015, 15:33:21) 
[GCC 4.9.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> thresholds = [0.11,0.12,0.125] 
>>> quotes = [[0.09,0.08,0.15],[0.09,0.08,0.15],[0.1,0.34,0.01]] 
>>> [filter(lambda x: x > thresholds[idx],qts) for idx,qts in enumerate(quotes)] 
[[0.15], [0.15], [0.34]] 

, который, кажется, что вы хотите.

EDIT В , это должно работать, а также, хотя фильтр «задержка»:

$ python3 
Python 3.4.3 (default, Mar 26 2015, 22:03:40) 
[GCC 4.9.2] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> thresholds = [0.11,0.12,0.125] 
>>> quotes = [[0.09,0.08,0.15],[0.09,0.08,0.15],[0.1,0.34,0.01]] 
>>> res=[filter(lambda x: x > thresholds[idx],qts) for idx,qts in enumerate(quotes)] 
>>> res[0] 
<filter object at 0x7f0d3fbc2be0> 
>>> list(res[0]) 
[0.15] 

Если вы хотите материализовать списки сразу, вы можете слегка изменить список понимание чтобы:

[list(filter(lambda x: x > thresholds[idx],qts)) for idx,qts in enumerate(quotes)] 

что приводит:

>>> [list(filter(lambda x: x > thresholds[idx],qts)) for idx,qts in enumerate(quotes)] 
[[0.15], [0.15], [0.34]] 
+0

Как применить это в python 3? Я получаю объект TypeError: «list» не может быть вызван. –

+0

@AlexanderEser: Я не получаю эту ошибку, см. Обновленный ответ. –

+0

теперь он работает. Спасибо! –

0

Вы можете использовать список понимание:

list = [4, 3, 2, 3, 4, 5] 
list_of_lists = [[6, 1, 3, 7, 2, 5], [1, 2, 6, 3, 8, 1], [1, 2, 3, 2, 7, 6]] 

above = [[ret for i, ret in enumerate(lst) if ret > list[i]] for lst in list_of_lists] 

[[6, 3, 7], [6, 8], [3, 7, 6]]

Это удалит все записи в списках в list_of_lists, которые меньше или равен соответствующему элементу list.

+0

OP хочет элементы подписок, которые больше, чем элемент _corresponding_ 'list'. –

+0

Хорошо, исправлено это. Я думаю, что это не было полностью ясно из вопроса. – karlson

3

Если я правильно понял ваш вопрос, у вас есть 500 списков из 72 значений и 72 пороговых значений.Вы хотите сравнить й значения каждый списка в пс пя значением вашего списка порогов. Другими словами, вы хотите перейти по столбцам. Это самый простой в первый transposelist_of_lists с использованием this one cool trick, так что каждый столбец list_of_lists становится строкой:

transposed = zip(*list_of_lists) 

Теперь мы можем работать со строками. Соедините каждый номер в списке порогов с соответствующей строкой в ​​transposed.

lists_with_thresholds = zip(list, transposed) 

Каждый элемент в lists_with_thresholds пара, содержащая точку среза и значения, которые мы хотим, чтобы сравнить его. Утки выстроены в ряд подряд; нам просто нужно найти значения во второй части пары, которые превышают соответствующую точку отсечки.

result = [] 
for threshold, values in lists_with_thresholds: 
    values_over_threshold = [] 
    for x in values: 
     if x > threshold: 
      values_over_threshold.append(x) 
    result.append(values_over_threshold) 

Или, хлюпающие вложенные for петли вверх в вложенным list comprehension:

result = [[x for x in values if x > threshold] 
      for threshold, values in zip(list, zip(*list_of_lists))] 

Эти две версии точно эквивалентны - они компилировать в тот же байт-код, для всех намерений и целей - но я как понимание списка лучше, потому что оно короче и имеет более функциональное ощущение.

+0

Это именно то, что я хотел. Спасибо! –

1

Я думаю, что это то, что вы хотите:

new_list = [] 
for i in lists_of_lists: 
    for j in i: 
     if j > list[0]: 
      new_list.append(j) 
+0

Хотя я думаю, что это работает, это модификаторы списка, но * не-pythonic *. Вот почему они придумали понимание списка. +1 все же;). –

+0

OP хочет элементы подписок, которые больше, чем элемент _corresponding_ в 'list', а не' list [0] '. Кроме того, это приведет к созданию плоского списка, тогда как OP хочет список списков. –

+0

Спасибо! Я сделал это так, потому что знал, что будет много ответов на список, а для новичков список comp сложнее читать (по крайней мере, для меня это было). И я думаю, неправильно понял OP .... – laserpython