【问题标题】:Isolating/manipulating data in a pandas Dataframe隔离/操作熊猫数据框中的数据
【发布时间】:2017-03-27 01:16:33
【问题描述】:

使用 pandas 数据框,我能够访问来自 yahoo Finance 的股票数据。我设法按月组织它,因为我试图查看股票在多年期间给定月份的表现。具体来说,给定月份在此期间有多少次价格出现正增长(如果价格在 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

【问题讨论】:

  • 您是否收到错误消息?如果是这样,错误是什么?
  • @Tadhg McDonald-Jensen 没有错误,只是想不通。
  • 我理解你的问题的方式是“我从网络上正确获取了数据,我将数据处理成我想要的形式,然后我无法用它做任何事情” i> 这没有多大意义。你具体想做什么?
  • 我似乎无法在数据框中(或任何其他月份)隔离一月的所有月份。
  • 我想获取每个月的类型(1 月、2 月等),看看每个月在 2 年的时间范围内的表现。

标签: python pandas dataframe yahoo


【解决方案1】:

您问题的第一部分可以大大简化。 (您的代码过于复杂)。

首先,您找到每个月的最小值。 然后您重新加入原始数据集。 您现在有了最小值发生的日期以及其他列。

您问题的第二部分更棘手。要找到增加和减少的百分比,您需要更多的机器。

我添加了一个类来跟踪给定月份的增加和减少。 然后我遍历所有最小值并找到每个月的百分比变化。 然后将其打印到一个不错的数据帧中。

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

数据现在看起来像这样

日期、开放、年月、...(其余列)

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

接下来我们在 year_month 列上进行分组。然后我们在每个月的 Open 列中找到最小值。 我们需要做一个 groupby 因为需要将一个月中的所有天数收集到一个组中,以便我们可以取最小值。

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

现在,我们在一个表格中列出了所有月度最低要求。我们知道最小值发生的那一天。 但我们不知道所有其他列是什么。 所以我们把它加入到主表中,我们只得到每月的最小值。

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

【讨论】:

  • 不客气。要我一步一步解释代码吗?
  • 我可以从中得到 + 答案吗?好的,它在我的待办事项清单上。
  • 您将列表中的第一个月与哪个月份进行比较?
  • 我能做到。但目前它比较了 1 月的低点和 2 月的低点
  • 对不起,我以为我以前修过这个。给你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多