2016-10-25 4 views
2

Ich berechne den Open-High-Low-Close (OHLC) von Daten für eine Dauer von jeweils 15 Minuten von 9:15 bis 15:30 Uhr und möchte die OHLC-Werte in einem Datenrahmen in jeder neuen Zeile speichern.Wie füge ich Zeilen in Pandas Dataframe inkrementell hinzu?

ohlc = pd.DataFrame(columns=('Open','High','Low','Close')) 
for row in ohlc: 
    ohlc.loc[10] = pd.DataFrame([[candle_open_price,candle_high_price,candle_low_price,candle_close_price]]) 

Aber ich bin nicht in der Lage einen Fehler zu tun, sagen immer:

ValueError: cannot set a row with mismatched columns 

Ich will nur ich schrittweise die EHTS- Daten jeder 15-minütigen Dauer speichern, die ich & put in Reihen berechnet haben des neuen EHTS- Datenrahmen


EDIT

import numpy as np 
import pandas as pd 
import datetime as dt 
import matplotlib as plt 
import dateutil.parser 

tradedata = pd.read_csv('ICICIBANK_TradeData.csv', index_col=False, 
       names=['Datetime','Price'], 
      header=0) 
tradedata['Datetime'] = pd.to_datetime(tradedata['Datetime']) 

first_trd_time = tradedata['Datetime'][0] 
last_time = dateutil.parser.parse('2016-01-01 15:30:00.000000') 

candle_time = 15; 
candle_number = 0 

while(first_trd_time < last_time): 
    candledata = tradedata[(tradedata['Datetime']>first_trd_time) & (tradedata['Datetime']<first_trd_time+dt.timedelta(minutes=candle_time))] 
first_trd_time = first_trd_time+dt.timedelta(minutes=candle_time) 

candle_open_price = candledata.iloc[0]['Price'] 
candle_open_time = candledata.iloc[0]['Datetime'] 
candle_close_price = candledata.iloc[-1]['Price'] 
candle_close_time = candledata.iloc[-1]['Datetime'] 
candle_high_price = candledata.loc[candledata['Price'].idxmax()]['Price'] 
candle_high_time = candledata.loc[candledata['Price'].idxmax()]['Datetime'] 
candle_low_price = candledata.loc[candledata['Price'].idxmin()]['Price'] 
candle_low_time = candledata.loc[candledata['Price'].idxmin()]['Datetime'] 

ohlc = pd.DataFrame(columns=('Open','High','Low','Close')) 
ohlc_data = pd.DataFrame() 

if(candle_number == 0): 
    ohlc = pd.DataFrame(np.array([[0, 0, 0, 0]]), columns=['Open', 'High', 'Low', 'Close']).append(ohlc, ignore_index=True) 
    candle_number = candle_number + 1 
    print "Zeroth Candle" 
else: 
    ohlc.ix[candle_number] = (candle_open_price,candle_open_price,candle_open_price,candle_open_price) 
    print "else part with incermenting candle_number" 
    candle_number = candle_number + 1 

print "first_trd_time" 
print first_trd_time 
print candle_number 

print "Success!" 

Dies ist mein Code-Fehler

ValueError: cannot set by positional indexing with enlargement 

Check here

+0

Was Ausgabe von 'df = pd.DataFrame ([[candle_open_price ist, candle_high_price, candle_low_price, candle_close_price]]) '' print (df) '? 'Dataframe' mit einer Zeile? Was ist "df.columns"? – jezrael

+1

Beachten Sie, dass das Hinzufügen von Zeilen zu einem Datenrahmen ineffizient ist, da für jede neue Größe ein ganz neuer Datenrahmen erstellt wird. – BrenBarn

Antwort

0

IIUC ist, dass Sie Datenrahmen für jede Zeile zur Liste der Datenrahmen dfs und dann concat sie df1 anfügen können: concat

ohlc = pd.DataFrame(columns=('Open','High','Low','Close')) 

dfs = [] 
for row in ohlc.iterrows(): 
    df = pd.DataFrame([candle_open_price,candle_high_price, 
         candle_low_price,candle_close_price]).T 
    dfs.append(df) 

df1 = pd.concat(dfs, ignore_index=True) 
print (df1) 

Dann zu Original DataFrameohlc:

df2 = pd.concat([ohlc,df1]) 
print (df2) 

Probe (zum Testen in jeder Iteration der Schleife hinzugefügt werden dieselben Daten):

#sample data 
candle_open_price = pd.Series([1.5,10], 
           name='Open', 
           index=pd.DatetimeIndex(['2016-01-02','2016-01-03'])) 
candle_high_price = pd.Series([8,9], 
           name='High', 
           index=pd.DatetimeIndex(['2016-01-02','2016-01-03'])) 
candle_low_price = pd.Series([0,12], 
           name='Low', 
           index=pd.DatetimeIndex(['2016-01-02','2016-01-03'])) 
candle_close_price = pd.Series([4,5], 
           name='Close', 
           index=pd.DatetimeIndex(['2016-01-02','2016-01-03'])) 

data = np.array([[1,2,3,5],[7,7,8,9],[10,8,9,3]]) 
idx = pd.DatetimeIndex(['2016-01-08','2016-01-09','2016-01-10']) 
ohlc = pd.DataFrame(data=data, 
        columns=('Open','High','Low','Close'), 
        index=idx) 
print (ohlc) 
      Open High Low Close 
2016-01-08  1  2 3  5 
2016-01-09  7  7 8  9 
2016-01-10 10  8 9  3 
dfs = [] 
for row in ohlc.iterrows(): 
    df = pd.DataFrame([candle_open_price,candle_high_price, 
         candle_low_price,candle_close_price]).T 
    #print (df) 
    dfs.append(df) 

df1 = pd.concat(dfs) 
print (df1) 
      Open High Low Close 
2016-01-02 1.5 8.0 0.0 4.0 
2016-01-03 10.0 9.0 12.0 5.0 
2016-01-02 1.5 8.0 0.0 4.0 
2016-01-03 10.0 9.0 12.0 5.0 
2016-01-02 1.5 8.0 0.0 4.0 
2016-01-03 10.0 9.0 12.0 5.0 

df2 = pd.concat([ohlc,df1]) 
print (df2) 
      Open High Low Close 
2016-01-08 1.0 2.0 3.0 5.0 
2016-01-09 7.0 7.0 8.0 9.0 
2016-01-10 10.0 8.0 9.0 3.0 
2016-01-02 1.5 8.0 0.0 4.0 
2016-01-03 10.0 9.0 12.0 5.0 
2016-01-02 1.5 8.0 0.0 4.0 
2016-01-03 10.0 9.0 12.0 5.0 
2016-01-02 1.5 8.0 0.0 4.0 
2016-01-03 10.0 9.0 12.0 5.0 
+0

Bitte überprüfen Sie mit dem bearbeiteten Code in der Frage. – Akshay

+1

Können Sie einige Beispieldaten hinzufügen? 5-6 Reihen. – jezrael

+1

Ich habe versucht mit der concat als auch aber einen Fehler für 'kann nicht ein NDframe-Objekt verketten ' – Akshay

Verwandte Themen