2016-04-04 13 views
1

Mit dem Pandas Datenframe konnte ich auf Bestandsdaten von Yahoo Finance zugreifen. Ich habe es geschafft, es monatlich zu organisieren, während ich versuche zu sehen, wie sich eine Aktie in einem bestimmten Monat über einen Zeitraum von mehreren Jahren entwickelt. Genauer gesagt, wie oft hat ein bestimmter Monat innerhalb des Zeitraums einen positiven Preisanstieg (Wenn der Preis im Dezember immer höher ist, möchte ich den Prozentsatz und die Anzahl der Vorkommen sehen). Ich benutze derzeit eine Aktie "MSFT" zu testen, aber im Idealfall würde es viel mehr analysieren. Mein Problem: Ich kann zu diesem Zweck nicht auf die Daten im Datenrahmen zugreifen. HierDaten in einem Pandas Dataframe isolieren/manipulieren

ist der Code:

from datetime import datetime 
import pandas_datareader.data as web 
import pandas as pd 
from pandas.tseries.offsets import CustomBusinessMonthBegin 

input_file = ['MSFT'] 
money_list = [] 

for ticker in input_file: 

    data = web.DataReader(ticker, "yahoo", datetime(2014,1,1), datetime(2015,12,31)) 

    monthly_data = data.index.to_period('M') 
    min_day_in_month_index = pd.to_datetime(data.set_index(monthly_data, append=True).reset_index(level=0).groupby(level=0)['Open'].min()) 
    custom_month_starts = CustomBusinessMonthBegin(calendar = min_day_in_month_index) 

    site_dict = {'Open':'first','High':'max','Low':'min','Close': 'last','Volume': 'sum','Adj Close': 'last'} 
    mthly_results = data.resample(custom_month_starts, how=site_dict) 

    month = { 0:'JAN', 1:'FEB', 2:'MAR', 3:'APR', 4:'MAY',5:'JUN', 6:'JUL', 7:'AUG', 8:'SEP', 9:'OCT',10:'NOV', 11:'DEC' } 

    print mthly_results 
+0

erhalten Sie einen Fehler? Wenn ja, was ist der Fehler? –

+0

@ Tadhg McDonald-Jensen Kein Fehler, kann es einfach nicht herausfinden. – RageAgainstheMachine

+0

Die Art, wie ich Ihre Frage verstehe, ist _ "Ich habe die Daten aus dem Internet richtig, ich manipulierte die Daten in die Form, die ich wollte, dann konnte ich nichts damit anfangen" _ das macht nicht viel Sinn. Was versuchst du konkret? –

Antwort

1

Der erste Teil Ihrer Frage stark vereinfacht werden kann. (Ihr Code ist übermäßig komplex).

Zuerst finden Sie das Minimum für jeden Monat. Dann verbinden Sie sich wieder in den ursprünglichen Datensatz. Sie haben jetzt den Tag, an dem das Minimum aufgetreten ist, sowie die anderen Spalten.

Der zweite Teil Ihrer Frage ist komplizierter. Um die Prozentzahl zu erhöhen und zu verringern, benötigen Sie ein wenig mehr Maschinen.

Ich habe eine Klasse hinzugefügt, um die Zunahmen und Abnahmen für einen bestimmten Monat zu verfolgen. Dann iteriere ich über alle Minima und finde die prozentuale Veränderung von Monat zu Monat. Dann drucken Sie es in einem schönen dataFrame.

from datetime import datetime 
import pandas.io.data as web 
import pandas as pd 

class MonthlyChange(object): 
    months = { 0:'JAN', 1:'FEB', 2:'MAR', 3:'APR', 4:'MAY',5:'JUN', 6:'JUL', 7:'AUG', 8:'SEP', 9:'OCT',10:'NOV', 11:'DEC' } 

    def __init__(self,month): 
     self.month = MonthlyChange.months[month-1] 
     self.sum_of_pos_changes=0 
     self.sum_of_neg_changes=0 
     self.total_neg=0 
     self.total_pos=0 
    def add_change(self,change): 
     if change < 0: 
      self.sum_of_neg_changes+=change 
      self.total_neg+=1 
     elif change > 0: 
      self.sum_of_pos_changes+=change 
      self.total_pos+=1 
    def get_data(self): 
     if self.total_pos == 0: 
      return (self.month,0.0,0,self.sum_of_neg_changes/self.total_neg,self.total_neg) 
     elif self.total_neg == 0: 
      return (self.month,self.sum_of_pos_changes/self.total_pos,self.total_pos,0.0,0) 
     else: 
      return (self.month,self.sum_of_pos_changes/self.total_pos,self.total_pos,self.sum_of_neg_changes/self.total_neg,self.total_neg) 


for ticker in ['MSFT'] : 

    data = web.DataReader(ticker, "yahoo", datetime(2014,1,1), datetime(2015,12,31)) 
    data['ymd'] = data.index 
    year_month = data.index.to_period('M') 
    data['year_month'] = year_month 
    first_day_of_months = data.groupby(["year_month"])["ymd"].min() 
    first_day_of_months = first_day_of_months.to_frame().reset_index(level=0) 
    last_day_of_months = data.groupby(["year_month"])["ymd"].max() 
    last_day_of_months = last_day_of_months.to_frame().reset_index(level=0) 
    fday_open = data.merge(first_day_of_months,on=['ymd']) 
    fday_open = fday_open[['year_month_x','Open']] 
    lday_open = data.merge(last_day_of_months,on=['ymd']) 
    lday_open = lday_open[['year_month_x','Open']] 

    fday_lday = fday_open.merge(lday_open,on=['year_month_x']) 
    monthly_changes = {i:MonthlyChange(i) for i in range(1,13)} 
    for index,ym, openf,openl in fday_lday.itertuples(): 
     month = ym.strftime('%m') 
     month = int(month) 
     diff = (openf-openl)/openf 
     monthly_changes[month].add_change(diff) 
    changes_df = pd.DataFrame([monthly_changes[i].get_data() for i in monthly_changes],columns=["Month","Avg Inc.","#Inc","Avg.Dec","#Dec"]) 
    print(changes_df) 

Erläuterung:

Der Code zuerst die Daten aus dem Web packt.

data = web.DataReader(ticker, "yahoo", datetime(2014,1,1), datetime(2015,12,31)) 

Die Daten sehen so aus.

Datum, Open, High, Low, Close, Volume, Adj Schließen

2014-10-29, 46.43,46.70,46.34,46.61,3027610,44.77

Dann wird es das Jahr und den Monat für jede Zeile in der Tabelle.

Dann fügt es eine neue Spalte in der Tabelle hinzu, die nur das Jahr und den Monat enthält.

data["year_month"] = year_month 

Die Daten sieht nun wie folgt

Datum, Open, year_month, ... (Rest Spalten)

2015-03-11, 42.31, 2015-03. ..

Als nächstes gruppieren wir uns auf die Spalte year_month. Dann finden wir den Mindestwert in der Spalte Offen für jeden Monat. Wir müssen eine Gruppe machen, weil wir alle Tage im Monat in einer Gruppe sammeln müssen, damit wir die min.

monthly_mins = data.groupby(["year_month"])["Open"].min() 

Jetzt haben wir alle monatlichen Minimum in einer einzigen Tabelle. Wir kennen den Tag, an dem das Minimum aufgetreten ist. Aber wir wissen nicht, was alle anderen Spalten sind. Also verbinden wir das wieder in die Haupttabelle und wir bekommen nur die monatlichen Minimums.

month_min_open_df = data.merge(monthly_mins,on=["year_month","Open"]) 
+0

Es funktioniert gut. Jetzt versuche ich, es durch alle Aktien auf dem Markt laufen zu lassen (diesen Teil kann ich tun) und zu identifizieren, welche Aktien einen bestimmten Monat haben, der beständig (zB: 100% der Monate Juni) gestiegen ist Die letzten 5 Jahre und drucken Sie den Börsenticker, den Monat und den durchschnittlichen Gewinn in eine CSV-Datei. Ich bin ziemlich neu im Codieren, deshalb bin ich ein wenig in deinem Code verloren. Danke – RageAgainstheMachine

+1

Gern geschehen. Soll ich den Code Schritt für Schritt erklären? – goCards

+0

Wenn Sie bereit sind, die Zeit zu verbringen, wäre das großartig! Sehr geschätzt! – RageAgainstheMachine