2016-04-04 9 views
1

pandasデータフレームの使用yahoo financeから在庫データにアクセスできました。私は月単位でそれを整理することができました。私は、株式が何年にもわたって何年に渡って行われているかを見ようとしています。具体的には、ある月がその期間内にプラスの価格上昇を何回行ったか(価格が常に12月の月に上がった場合、%と発生回数が表示されます)。私は現在、テスト用に1つの在庫「MSFT」を使用していますが、理想的にはより多くを分析します。私の問題:私はこの目的のためにデータフレーム内のデータにアクセスできないようです。ここでpandasデータフレームでのデータの分離/操作

はコードです:

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

あなたがエラーを取得するのですか?もしそうなら、エラーは何ですか? –

+0

@ Tadhg McDonald-Jensenエラーはありません。それを理解できません。私はあなたの質問を理解して – RageAgainstheMachine

+0

方法は、「私が正しくウェブからのデータを持って、私はその後、私はそれで何もできなかった、私が望んでいたフォームにデータを操作する」_すべてのことあまり意味がありません_です。具体的に何をしようとしていますか? –

答えて

1

あなたの質問の最初の部分が大幅に簡略化することができます。 (あなたのコードは非常に複雑です)。

まず、各月の最小値がわかります。 その後、元のデータセットに再び参加します。 これで、最小の発生日と他の列が作成されました。

質問の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"]) 
+0

うまく動作します。中:(6月のヶ月の100%EX)今、私はそれは、市場内のすべての株式を介して実行(この部分は私が行うことができます)と上がったり下り、一貫している特定の月を持っている株式を識別するために取得しようとしています過去5年間、株式ティッカー、月、および平均利益をcsvファイルに印刷します。私はあなたのコードで少し失われているので、かなり新しいコーディングです。ありがとうございました – RageAgainstheMachine

+1

あなたは大歓迎です。コードをステップごとに説明してほしいですか? – goCards

+0

あなたが時間を費やしたいなら、それは素晴らしいでしょう!とても有難い! – RageAgainstheMachine