Isolating/manipulating 数据在 pandas 数据框中
Isolating/manipulating data in a pandas Dataframe
使用 pandas 数据框,我能够从雅虎财经访问股票数据。我设法每月组织一次,因为我试图查看一只股票在多年期间的给定月份的表现。具体来说,给定月份在该期间内有多少次价格上涨(如果价格在 12 月份总是上涨,我希望看到出现的百分比和次数)。我目前正在使用一只股票 'MSFT' 进行测试,但理想情况下它会分析更多。我的问题:为此,我似乎无法访问数据框中的数据。
代码如下:
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
你的问题的第一部分可以大大简化。 (您的代码过于复杂)。
首先,您找到每个月的最小值。
然后你重新加入到原始数据集中。
您现在有了最小值出现的日期以及其他列。
你问题的第二部分比较棘手。要找到增加和减少的百分比,您需要更多的机器。
我添加了一个 class 来跟踪给定月份的增减。
然后我遍历所有最小值并找到每个月的百分比变化。
然后将其打印在一个漂亮的数据框中。
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
然后获取 table 中每一行的年份和月份。
year_month = data.index.to_period('M')
然后它会在 table 中添加一个只有年份和月份的新列。
data["year_month"] = year_month
现在的数据是这样的
日期,开放,year_month,...(其余列)
2015-03-11, 42.31, 2015-03 ...
接下来我们对 year_month 列进行分组。然后我们在每个月的 Open 列中找到最小值。
我们需要做一个 groupby 因为需要将一个月中的所有天数收集到一个组中,这样我们就可以取最小值。
monthly_mins = data.groupby(["year_month"])["Open"].min()
现在我们在单个 table 中获得了所有月度最低值。我们知道最小值发生的那一天。
但我们不知道所有其他列是什么。
因此,我们将其加入到主 table 中,我们只得到每月的最小值。
month_min_open_df = data.merge(monthly_mins,on=["year_month","Open"])
使用 pandas 数据框,我能够从雅虎财经访问股票数据。我设法每月组织一次,因为我试图查看一只股票在多年期间的给定月份的表现。具体来说,给定月份在该期间内有多少次价格上涨(如果价格在 12 月份总是上涨,我希望看到出现的百分比和次数)。我目前正在使用一只股票 'MSFT' 进行测试,但理想情况下它会分析更多。我的问题:为此,我似乎无法访问数据框中的数据。
代码如下:
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
你的问题的第一部分可以大大简化。 (您的代码过于复杂)。
首先,您找到每个月的最小值。 然后你重新加入到原始数据集中。 您现在有了最小值出现的日期以及其他列。
你问题的第二部分比较棘手。要找到增加和减少的百分比,您需要更多的机器。
我添加了一个 class 来跟踪给定月份的增减。 然后我遍历所有最小值并找到每个月的百分比变化。 然后将其打印在一个漂亮的数据框中。
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
然后获取 table 中每一行的年份和月份。
year_month = data.index.to_period('M')
然后它会在 table 中添加一个只有年份和月份的新列。
data["year_month"] = year_month
现在的数据是这样的
日期,开放,year_month,...(其余列)
2015-03-11, 42.31, 2015-03 ...
接下来我们对 year_month 列进行分组。然后我们在每个月的 Open 列中找到最小值。 我们需要做一个 groupby 因为需要将一个月中的所有天数收集到一个组中,这样我们就可以取最小值。
monthly_mins = data.groupby(["year_month"])["Open"].min()
现在我们在单个 table 中获得了所有月度最低值。我们知道最小值发生的那一天。 但我们不知道所有其他列是什么。 因此,我们将其加入到主 table 中,我们只得到每月的最小值。
month_min_open_df = data.merge(monthly_mins,on=["year_month","Open"])