当条件匹配

时间:2016-07-10 22:39:49

标签: python pandas

当某些条件匹配时,我尝试使用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_highdata['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

任何人都可以帮忙并展示一个好方法吗?

2 个答案:

答案 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_highdata['Last'] < IB_high都不可能与数据数据框中的行数具有相同的长度。

我会做这样的事情

data['IB_Low_Break'] = data['Last'].map(lambda i:  i < IB_low);