あなたの質問の最初の部分が大幅に簡略化することができます。 (あなたのコードは非常に複雑です)。
まず、各月の最小値がわかります。 その後、元のデータセットに再び参加します。 これで、最小の発生日と他の列が作成されました。
質問の2番目の部分は、よりトリッキーです。増減率を調べるには、もう少し機械が必要です。
ある月の増減を追跡するためのクラスを追加しました。 次に、すべての最小値を繰り返して、毎月の変化率を求めます。 それから素晴らしい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)
説明:
コードは、第一ウェブからデータをつかみます。
data = web.DataReader(ticker, "yahoo", datetime(2014,1,1), datetime(2015,12,31))
データは次のようになります。
日、オープン、高、低、閉じる、ボリューム、調整]閉じる
2014年10月29日、46.43,46.70,46.34,46.61,3027610,44.77
はそれから取得しますテーブルのすべての行の年と月。
year_month = data.index.to_period('M')
次に、年と月のみの新しい列をテーブルに追加します。
data["year_month"] = year_month
データは今、この
日、オープン、year_month、...(残りの列)
2015年3月11日、42.31、2015から03のように見えます。 ..
次は、year_monthの列をグループ化します。次に、毎月の列の最小値を見つけます。 私たちは分を取ることができるようにグループの中にすべての日を収集する必要があるので、グループバイをする必要があります。
monthly_mins = data.groupby(["year_month"])["Open"].min()
ここではすべての月間最小値を1つの表にまとめました。最低限の日がわかっています。 しかし、他のすべての列が何であるかはわかりません。 これを元のテーブルに戻して、毎月の最小値を取得します。
month_min_open_df = data.merge(monthly_mins,on=["year_month","Open"])
あなたがエラーを取得するのですか?もしそうなら、エラーは何ですか? –
@ Tadhg McDonald-Jensenエラーはありません。それを理解できません。私はあなたの質問を理解して – RageAgainstheMachine
方法は、「私が正しくウェブからのデータを持って、私はその後、私はそれで何もできなかった、私が望んでいたフォームにデータを操作する」_すべてのことあまり意味がありません_です。具体的に何をしようとしていますか? –