当某些条件匹配如下时,我正在尝试使用 np.where 或类似方法创建数据框列:
这个链接pickle file是我正在使用的数据的一部分。这是我到目前为止使用的代码:
data = pd.read_pickle('data_df')
数据:
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
我的声明需要确保每天只能发生其中一个。需要“IB_High_Break”或“IB_Low_Break”列中的简单 1 来标记这种情况的发生。这最终将用作进入交易的信号。
我试过用这个:
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
.
执行此操作的好方法是什么?
最佳答案
如果您对长度有疑问并且可以将数据放入同一个数组,请像这里那样做:...
>>> 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])
>>>
否则你需要做一些迭代......
关于python - 在条件匹配时使用 np.where 或类似方法创建数据框列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38297060/