2015-08-27 2 views
0

У меня есть структура Panda DataFrame, и я хочу добавить к ней еще один столбец, но я не могу сделать это с добавлением, добавлением или вставкой.dataframe добавить новую колонку серии с данными

Я пытаюсь воспроизвести данные портфолио с помощью встроенной функции Panda, потому что этот сценарий не дает мне правильных данных, если период, который я запрашиваю, меньше чем 1,5 года, в то время как данные должны быть получены даже в течение двух дней, если я захочу. Так вот скрипт, который я хочу переписать:

import QSTK.qstkutil.qsdateutil as du 
import QSTK.qstkutil.tsutil as tsu 
import QSTK.qstkutil.DataAccess as da 

import datetime as dt 
import matplotlib.pyplot as plt 
import pandas as pd 

ls_symbols = ["AAPL", "GLD", "GOOG", "$SPX", "XOM"] 
dt_start = dt.datetime(2006, 1, 1) 
dt_end = dt.datetime(2010, 12, 31) 
dt_timeofday = dt.timedelta(hours=16) 
ldt_timestamps = du.getNYSEdays(dt_start, dt_end, dt_timeofday) 

c_dataobj = da.DataAccess('Yahoo') 
ls_keys = ['open', 'high', 'low', 'close', 'volume', 'actual_close'] 
ldf_data = c_dataobj.get_data(ldt_timestamps, ls_symbols, ls_keys) 
**d_data = dict(zip(ls_keys, ldf_data))** 

d_data = dict(zip(ls_keys, ldf_data)) является то, что я хочу повторить, потому что он не получает данные, которые я хочу, но мне нужно, чтобы выяснить способ для добавления нового столбца мой дикт. Вот мой сценарий:

from pandas.io.data import DataReader, DataFrame 
import QSTK.qstkutil.qsdateutil as du 
import QSTK.qstkutil.DataAccess as da 

import datetime as dt 

def get_historical_data(symbol, source, date_from, date_to): 
    global data_validator 
    symbol_data = {} 

    ls_keys = ['Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close'] 

    for key in ls_keys: 
     symbol_data[key] = DataFrame({}) 

    dataframe_open = DataFrame({}) 

    for item in symbol: 
     print 'Fetching data for:', item 
     current_data = DataReader(str(item), source, date_from, date_to) 
     dataframe_open = {item : current_data['Open']} 
     if len(symbol_data['Open'].columns) == 0: 
      symbol_data['Open'] = DataFrame(dataframe_open) 
     else: 
      **#i want to add the new column here but can't seem to do this.** 
      #symbol_data['Open'].loc[:item] = DataFrame(dataframe_open) 
      pass 
    return symbol_data 

P.S. Я называю FUNC с этими параметрами для испытательных целей:

test = get_historical_data(['SPY', 'DIA'], 'yahoo', datetime(2015,1,1), datetime(2015,1,31))

ответ

0

ли следующую помощь? Еще не проверял, но должен работать в принципе ... Просто поместите данные в массивы равной длины и постройте кадр данных из этого.

def get_historical_data(symbols=[], source=None, date_from=None, date_to=None): 
    global data_validator 
    symbol_data = {} 

    ls_keys = ['Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close'] 
    data = [] 
    for item in ls_keys: 
     data.append(DataReader(str(item), source, date_from, date_to) 
    symbol_dataframe=DataFrame(data=data, columns=ls_keys) 
    #symbol_dataframe = DataFrame() 
    #for key in ls_keys: 
    # symbol_data[key] = DataFrame({}) 

    #dataframe_open = DataFrame({}) 

    #for item in symbols: 
    ''' print 'Fetching data for:', item 
     current_data = DataReader(str(item), source, date_from, date_to) 
     dataframe_open = {item : current_data['Open']} 
     #print(dataframe_open) 
     if len(symbol_data['Open'].columns) == 0: 
      symbol_data['Open'] = DataFrame(dataframe_open) 
     else: 
      #i want to add the new column here but can't seem to do this.** 
      symbol_data['Open'] = DataFrame(dataframe_open) 
      symbol_data.head() 
    ''' 
    return symbol_dataframe 
+0

Спасибо, я видел ваше сообщение слишком поздно. Возможно, это работает, но я сделал обходной путь, чтобы на самом деле сначала создать DataFrame, а затем программно заполнить данные во всех столбцах, и таким образом я избежал необходимости добавления нового столбца. –

Смежные вопросы