2017-02-02 3 views
1

Ich habe Listen, die so aussehen, dass eine Menge Tickern und Werte und Daten hat:Wie finde ich heraus, ob eine Datetime in einer Liste schnell zwischen Daten in einer anderen Liste liegt (Python)?

values = [['NKE', 1, 2, datetime.datetime(2016, 2, 20)], ['AAPL', 1, 2, datetime.datetime(2016, 2, 1)],['AAPL', 3, 4, datetime.datetime(2016,4,2)]...] 

releasedates = [['AAPL', Q3, 2015, datetime.datetime(2015, 10,5)], ['AAPL', Q4,2015, datetime.datetime(2016, 2, 5)], ['AAPL', Q1, 2016, datetime.datetime(2016, 4, 9)] 

Releasedatum bezieht sich auf das Ende der Quartale für das Unternehmen. Ich möchte eine Liste haben, die alle Informationen in Werten in jeder Zeile enthält, aber auch zeigt, in welches Viertel die Information gehört. Also für die oben genannten Informationen das Endergebnis würde wie folgt aussehen:

values_releasedates = [...['AAPL',1,2, Q4, 2015], ['AAPL', 3,4, Q1, 2016]...] 

(Ich zeige nur AAPL hier, andere Unternehmen wie NKE von Werten auch dort sein würde, mit ihren eigenen Einträge)

Dieser Code funktioniert:

values_releasedates = [[ticker, a, b, quarter, year] for ticker, a, b, date in values for [ticker_1, quarter_1, year_1, date_1], [ticker_2, quarter_2, year_2, date_2] in zip(releasedates, releasedates[1:]) if date_1 < date < date_2 and ticker == ticker_1] 

aber dauert sehr lange. Ich dachte mir, dass ich vielleicht ein Wörterbuch erstellen könnte, das die Zeit irgendwie verkürzt, so dass, wenn ein NKE-Eintrag in den Werten erscheint, nur NKE-Releases angezeigt werden. Aber ich bin so ein Neuling, ich weiß nicht, wo ich anfangen soll.

+1

Sie versuchen, viel zu viel in einem einzigen Listenverständnis zu tun, und deshalb gibt es logische Fehler und Ineffizienzen in Ihrer Methode: Dies füllt zwischen Ticker AAPLQ1/Q2 alle Tickerdaten, die zwischen seinen Bereich fallen Ich bin ziemlich sicher, ist nicht deine Absicht. – TemporalWolf

+0

@TemporalWolf Wenn Sie sagen, dass ich möchte, dass alle Einträge von Werten mit AAPL-Tickern zwischen die korrekten zwei Anmeldedaten eingefügt werden, möchte ich, dass dies geschieht. Es könnte potenziell viel pro Quartal geben. Irgendwelche Gedanken, wie man das effizienter macht? (Ich habe meinen Code aktualisiert, um anzugeben, wo Ticker == Ticker_1) – user285884

+0

Ihr aktueller Code ist 'O (n * m)', wenn eine optimierte Version 'O (n + m)' wäre (vorausgesetzt, die Werte sind bereits nach sortiert Datum). Sie müssen das Listenverständnis auflösen, wie ich schon sagte. Brechen Sie beide Listen nach Ticker in Listen. Erstellen Sie dann für jeden Ticker den vierteljährlichen Bereich einmal für diesen Ticker und durchlaufen Sie dann beide Listen, bis Sie das Ende von 'values_by_ticker [ticker]' erreichen. – TemporalWolf

Antwort

0

Lassen Sie mich Ihnen in die richtige Richtung gestartet:

Pause beide Listen von Ticker:

# Example of values 
values_by_ticker = {} 
for value in values: 
    try: 
     values_by_ticker[value[0]].append(value) 
    except KeyError: 
     values_by_ticker[value[0]] = [value] 

Dann wird durch jeden Wert in values_by_ticker laufen, herauszufinden, wann sie hingehört:

result = [] 
for ticker in values_by_ticker: 
    release_index = 0 
    for value in ticker: 
     while True: 
      daterange = (rel_by_ticker[release_index], 
         rel_by_ticker[release_index + 1]) 
      if is_in_range(value[3], daterange): # Exercise left for the reader 
       result.append([value[0], 
           value[1], 
           value[2], 
           rel_by_ticker[release_index][1], 
           rel_by_ticker[release_index][1]]) 
       break 
      else: 
       release_index += 1 

Das ist O(n+m), nimmt an, dass beide Listen sortiert sind und nicht mit Fehlern umgehen (wie wenn Sie zum letzten Viertel für einen bestimmten Ticker kommen), aber es sollte weisen Sie in die richtige Richtung.

Ich habe auch nicht den zweiten Teil ausgeführt, so dass es möglicherweise Fehler gibt, aber die Logik sollte solide sein.

Verwandte Themen