我正计算从9:15到15:30每15分钟持续一段时间内的开 - 高 - 低 - 收盘(OHLC)数据,并希望将OHLC值存储在每个新行的数据框中。 / p>
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]])
但我无法说出错误:
ValueError: cannot set a row with mismatched columns
我想逐步存储我计算过的每15分钟持续时间的OHLC数据&放入新的ohlc数据帧的行
修改
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!"
这是我的代码错误
ValueError: cannot set by positional indexing with enlargement
答案 0 :(得分:0)
IIUC您可以将每行的DataFrames附加到DataFrames dfs
列表,然后concat
将它们追加到df1
:
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)
然后concat
改为原始DataFrame
ohlc
:
df2 = pd.concat([ohlc,df1])
print (df2)
示例(用于在循环的每次迭代中测试添加相同的数据):
#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