在for循环内创建的索引中的新列

时间:2014-04-18 00:25:24

标签: python numpy pandas indexing

我正在努力创造一些能够衡量股票日内和下跌天数的东西,其价格比前一天更高或更低。这显示为1,用于“结束日”'并且对于“下降日”而言为-1。我对这部分感到满意​​。

我想要一些关于如何在多个股票上运行此函数的帮助/解释,以便最终得到不同列中的每个股票的数组,并且每天在不同的行中。

理想情况下,初始列中包含日期。

这是我迄今为止产生个股的原因。我已经尝试了一些* args和代码循环到函数中,但是没有任何有意义的东西。

import datetime
import pandas as pd
import numpy as np
import datetime
import pandas.io.data
from pandas import Series, DataFrame

ticker = 'aapl'
begin = datetime.datetime(2013, 1, 1)
finish = datetime.datetime(2013, 1, 15)

# Start Workings
def adcount (begin, finish,ticker):
    dat = pd.io.data.get_data_yahoo(ticker, start=begin,  end=finish)
    close = dat.columns[3]
    close1 = np.ma.fix_invalid(dat[close].shift(1))
    close0 = dat[close].shift(0)
    count = 0
    for f, b in zip(close1, close0):
        if b > f:
            count = 1
        else:
            count = -1
        print count
adcount(begin,finish,ticker)

非常感谢任何帮助/想法

1 个答案:

答案 0 :(得分:0)

您可以直接使用numpy.sign对系列进行符号计算,而不是遍历每个项目。这是基于Pandas 0.13 docs的Yahoo样本。如果您使用的是旧版本,则可能需要对其进行调整才能使用该版本。

import numpy as np
import pandas as pd
import pandas.io.data as web
from datetime import datetime as dt

def get_stock_data(ticker, start, end):
    return web.DataReader(ticker, 'yahoo', start, end)

def get_returns(stock_history):
    base = stock_history['Close']
    shifted = base.shift(1)
    return (base - shifted)[1:]

start = dt(2013, 1, 1)
end = dt(2013, 1, 15)

tickers = ['AAPL', 'XOM', 'MMM']

data = {}
for t in tickers:
    history = get_stock_data(t, start, end)
    data[t] = get_returns(history).apply(np.sign)

print(pd.DataFrame(data))

>>>         AAPL  MMM  XOM
Date                      
2013-01-03    -1   -1   -1
2013-01-04    -1    1    1
2013-01-07    -1    1   -1
2013-01-08     1    1    1
2013-01-09    -1    1   -1
2013-01-10     1    1    1
2013-01-11    -1   -1    1
2013-01-14    -1    1   -1
2013-01-15    -1    1   -1