当某些条件匹配时,我尝试使用np.where或类似的方法创建数据框列:
此链接的pickle file是Im使用的数据段。这是我到目前为止使用的代码:
data = pd.read_pickle('data_df')
data
Open High Low Last Volume
Timestamp
2014-03-04 09:30:00 1783.50 1784.50 1783.50 1784.50 171
2014-03-04 09:31:00 1784.75 1785.75 1784.50 1785.25 28
2014-03-04 09:32:00 1785.00 1786.50 1785.00 1786.50 81
2014-03-04 09:33:00 1786.00 1786.00 1785.25 1785.25 41
2014-03-04 09:34:00 1785.00 1785.25 1784.75 1785.25 11
这些是我需要在np.where元素中使用的时间变量:
#Times
daystart = '9:30'
dayend = '16:14:59'
IB_end = '10:29:59'
IB_session = data.between_time(daystart,IB_end, include_start=True, include_end=True)
day_session = data.between_time(daystart,dayend, include_start=True, include_end=True)
这些是这些时间段的高低:
IB_high = IB_session['High'].rolling(window=1,freq='D').max()
IB_low = IB_session['Low'].rolling(window=1,freq='D').min()
我需要编写一个np.where语句或类似语句来创建显示的新列:
当data['Last'] > IB_high
或data['Last'] < IB_low
时,我的陈述需要确保每天只能发生其中一项。专栏中的简单1&#39; IB_High_Break&#39;或者&#39; IB_Low_Break&#39;需要标记这种情况。这最终将被用作进入交易的信号。
我试过用这个:
data['IB_High_Break'] = np.where(data['Last'] > IB_high,1, np.nan);
data['IB_Low_Break'] = np.where(data['Last'] < IB_low,1,np.nan);
但是收到错误ValueError: Series lengths must match to compare
。
任何人都可以帮忙并展示一个好方法吗?
答案 0 :(得分:1)
如果你有长度问题并且可以将数据放到同一个数组中,那就像这样做:...
>>> a = pd.Series(np.arange(10))
>>> b = pd.Series(np.arange(100,111))
>>> df = pd.DataFrame([a,b])
>>> df = df.T
>>> df.loc[4.5]=nan
>>> df.sort_index(inplace=True)
>>> df.interpolate(inplace=True)
>>> df
0 1
0.0 0.0 100.0
1.0 1.0 101.0
2.0 2.0 102.0
3.0 3.0 103.0
4.0 4.0 104.0
4.5 4.5 104.5
5.0 5.0 105.0
6.0 6.0 106.0
7.0 7.0 107.0
8.0 8.0 108.0
9.0 9.0 109.0
10.0 9.0 110.0
>>> df.loc[4.5,1]=0
>>> np.where(df[0]<df[1],1,np.nan)
array([ 1., 1., 1., 1., 1., nan, 1., 1., 1., 1., 1.,
1.])
>>> np.where(df[0]>df[1],1,np.nan)
array([ nan, nan, nan, nan, nan, 1., nan, nan, nan, nan, nan,
nan])
>>>
否则你需要做一些迭代......
答案 1 :(得分:0)
我想我曾经听说过,不应该在未知/不受信任的实体之间共享pickle文件,因为它不是一个安全的反序列化,所以这个答案只是基于浏览代码。
我认为你得到了pandas.Series长度不等,因为你的boolean创建了一个新的pandas系列,其长度等于符合你布尔值的行,因此data['Last'] > IB_high
和data['Last'] < IB_high
都不可能与数据数据框中的行数具有相同的长度。
我会做这样的事情
data['IB_Low_Break'] = data['Last'].map(lambda i: i < IB_low);