【问题标题】:Pandas Dataframe for Stock % change股票百分比变化的熊猫数据框
【发布时间】:2016-12-21 20:24:57
【问题描述】:

我喜欢创建一个 pandas df 来跟踪每日、每周、每月和每年的库存变化百分比。 这是输出我希望输出的样子:

stock	Close	Daily	WTD	MTD	YTD
0	IWM	137.960007	0.847956	0.847956	5.337105	25.406785
1	IBM	167.600006	0.551964	0.551964	4.867976	23.280625

这是用于生成它的代码。我是 python 和熊猫的新手。有没有更好的方法来做到这一点。另外,我是手动输入日期,能不能自动生成。

import pandas as pd
from datetime import datetime, timedelta
from pandas_datareader import data,wb


start = datetime(2016, 1, 1)
end = datetime.today()

m_start = datetime(2016, 12, 1)

w_start = datetime(2016, 12, 19)

d_start = end - timedelta(days=2)


labels = ['stock','Close','Daily','WTD','MTD','YTD']

dat = []

for ticker in ticker_list:
    prices = data.DataReader(ticker, 'yahoo', start, end)
    closing_prices = prices['Close']
    change = 100 * (closing_prices[-1] - closing_prices[0]) / closing_prices[0]
    
    #get the monthly % gain
    m_price = data.DataReader(ticker, 'yahoo', m_start, end)
    m_close = m_price['Close']
    m_change = 100 * (m_close[-1] - m_close[0]) / m_close[0]

    #get the weekly % gain
    w_price = data.DataReader(ticker, 'yahoo', w_start, end)
    w_close = w_price['Close']
    w_change = 100 * (w_close[-1] - w_close[0]) / w_close[0]

    #get the Daily % gain
    d_price = data.DataReader(ticker, 'yahoo', d_start, end)
    d_close = d_price['Close']
    d_change = 100 * (d_close[-1] - d_close[0]) / d_close[0]
    
    dat.append((ticker,closing_prices[-1],d_change,w_change,m_change,change))
    

df2 = pd.DataFrame.from_records(dat,columns=labels)
df2

非常感谢任何改进此代码的帮助。

谢谢

【问题讨论】:

  • ticker_list = {'IWM': 'IWM', 'IBM': 'IBM'}

标签: python pandas stock


【解决方案1】:

我相信这会让你到达那里

tickers = ['IWM', 'IBM']
df_list = []
for ticker in tickers:
    prices = data.DataReader(ticker, 'yahoo', '2016')['Close']

    # get all timestamps for specific lookups
    today = prices.index[-1]
    yest= prices.index[-2]
    start = prices.index[0]
    week = today - pd.tseries.offsets.Week(weekday=0)
    month = today - pd.tseries.offsets.BMonthBegin()

    # calculate percentage changes
    close = prices[today]
    daily =  (close - prices[yest]) / prices[yest] * 100
    wtd = (close - prices[week]) / prices[week] * 100
    mtd = (close - prices[month]) / prices[month] * 100
    ytd = (close - prices[start]) / prices[start]* 100

    # create temporary frame for current ticker
    df = pd.DataFrame(data=[[ticker, close, daily, wtd, mtd,  ytd]], 
                      columns=['stock', 'Close', 'Daily', 'WTD', 'MTD', 'YTD'])
    df_list.append(df)

# stack all frames
pd.concat(df_list)

输出

  stock       Close     Daily       WTD       MTD        YTD
0   IWM  137.960007  0.847956  0.847956  5.337105  25.406785
0   IBM  167.600006  0.551964  0.551964  4.867976  23.280625

【讨论】:

  • 感谢..这项工作。还有一个快速的问题。对于迄今为止的 quartar,我添加了以下内容,但它重新运行月初而不是季度开始。 ** 季度 = 今天 - pd.tseries.offsets.BQuarterBegin() ** 我做错了什么
  • 您必须添加startmonth=1。在这里查看问题github.com/pandas-dev/pandas/issues/8435
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 2023-01-02
  • 2021-08-17
  • 2018-12-23
相关资源
最近更新 更多