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"])
erhalten Sie einen Fehler? Wenn ja, was ist der Fehler? –
@ Tadhg McDonald-Jensen Kein Fehler, kann es einfach nicht herausfinden. – RageAgainstheMachine
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? –