Панды DataFrame.lookup - PullRequest
       3

Панды DataFrame.lookup

0 голосов
/ 01 октября 2018

Есть ли хороший пример, как использовать Pandas DataFrame.lookup

Да, я видел это, но не уверен, в чем смысл ... кажется, это просто выбор столбца цены: векторизованный поиск значений в pandas-dataframe

Итак, чтобы объяснить, что я имею в виду,

columns=['AAPL','GOOG','IBM','XOM']
index = ['2011-01-10','2011-01-13','2011-01-26','2011-02-02','2011-02-10','2011-03-03','2011-05-03','2011-06-03','2011-06-10','2011-08-01','2011-12-20']
prices = pd.DataFrame(columns=columns, index=index)
prices.iloc[0]=[339.441,614.219,142.781,71.571]
prices.iloc[1]=[342.642,616.698,143.922,73.083]
prices.iloc[2]=[340.823,616.507,155.743,75.895]
prices.iloc[3]=[341.294,612.006,157.934,79.467]
prices.iloc[4]=[351.425,616.445,159.325,79.689]
prices.iloc[5]=[356.406,609.564,158.736,82.192]
prices.iloc[6]=[345.147,533.893,167.847,82.004]
prices.iloc[7]=[340.428,523.082,160.978,78.196]
prices.iloc[8]=[323.039,509.511,159.149,76.848]
prices.iloc[9]=[393.261,606.779,176.281,76.671]
prices.iloc[10]=[392.462,630.378,184.142,79.973]

columns=['Date','direction','size','ticker','tradePrices']
orders = pd.DataFrame(columns=columns)
orders.loc[0] = ['2011-01-10','Buy',1500,'AAPL',339.44]
orders.loc[1] = ['2011-01-13','Sell',1500,'AAPL',342.64]
orders.loc[2] = ['2011-01-13','Buy',4000,'IBM',143.92]
orders.loc[3] = ['2011-01-26','Buy',1000,'GOOG',616.50]
orders.loc[4] = ['2011-02-02','Sell',4000,'XOM',79.46]
orders.loc[5] = ['2011-02-10','Buy',4000,'XOM',79.68]
orders.loc[6] = ['2011-03-03','Sell',1000,'GOOG',609.56]
orders.loc[7] = ['2011-03-03','Sell',2200,'IBM',158.73]
orders.loc[8] = ['2011-06-03','Sell',3300,'IBM',160.97]
orders.loc[9] = ['2011-05-03','Buy',1500,'IBM',167.84]
orders.loc[10] = ['2011-06-10','Buy',1200,'AAPL',323.03]
orders.loc[11] = ['2011-08-01','Buy',55,'GOOG',606.77]
orders.loc[12] = ['2011-08-01','Sell',55,'GOOG',606.77]
orders.loc[13] = ['2011-12-20','Sell',1200,'AAPL',392.46]

lookupValues = prices.lookup(orders.Date, orders.ticker)

Тогда результат будет

>>> prices
               AAPL     GOOG      IBM     XOM
2011-01-10  339.441  614.219  142.781  71.571
2011-01-13  342.642  616.698  143.922  73.083
2011-01-26  340.823  616.507  155.743  75.895
2011-02-02  341.294  612.006  157.934  79.467
2011-02-10  351.425  616.445  159.325  79.689
2011-03-03  356.406  609.564  158.736  82.192
2011-05-03  345.147  533.893  167.847  82.004
2011-06-03  340.428  523.082  160.978  78.196
2011-06-10  323.039  509.511  159.149  76.848
2011-08-01  393.261  606.779  176.281  76.671
2011-12-20  392.462  630.378  184.142  79.973
>>> orders
          Date direction  size ticker  prices
0   2011-01-10       Buy  1500   AAPL  339.44
1   2011-01-13      Sell  1500   AAPL  342.64
2   2011-01-13       Buy  4000    IBM  143.92
3   2011-01-26       Buy  1000   GOOG  616.50
4   2011-02-02      Sell  4000    XOM   79.46
5   2011-02-10       Buy  4000    XOM   79.68
6   2011-03-03      Sell  1000   GOOG  609.56
7   2011-03-03      Sell  2200    IBM  158.73
8   2011-06-03      Sell  3300    IBM  160.97
9   2011-05-03       Buy  1500    IBM  167.84
10  2011-06-10       Buy  1200   AAPL  323.03
11  2011-08-01       Buy    55   GOOG  606.77
12  2011-08-01      Sell    55   GOOG  606.77
13  2011-12-20      Sell  1200   AAPL  392.46
>>> prices.lookup(orders.Date, orders.ticker)
array([339.441, 342.642, 143.922, 616.507,  79.467,  79.689, 609.564,
       158.736, 160.978, 167.847, 323.039, 606.779, 606.779, 392.462])

Я мог бы просто использовать "loc", чтобы получить только столбец "price" из "orders":

>>> orders.loc[:,['prices']]
    prices
0   339.44
1   342.64
2   143.92
3   616.50
4    79.46
5    79.68
6   609.56
7   158.73
8   160.97
9   167.84
10  323.03
11  606.77
12  606.77
13  392.46

Вопрос в том, какой смысл в DataFrame.lookup?И должно быть правильное использование?

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Спасибо Вен , теперь я вижу смысл, мы добавляем "streetPrices" (от "цены" ) до "заказов" :

orders['streetPrices'] = prices.lookup(orders.Date, orders.ticker)

>>> orders
          Date direction  size ticker  tradePrices  streetPrices 
0   2011-01-10       Buy  1500   AAPL  339.44    339.441
1   2011-01-13      Sell  1500   AAPL  342.64    342.642
2   2011-01-13       Buy  4000    IBM  143.92    143.922
3   2011-01-26       Buy  1000   GOOG  616.50    616.507
4   2011-02-02      Sell  4000    XOM   79.46     79.467
5   2011-02-10       Buy  4000    XOM   79.68     79.689
6   2011-03-03      Sell  1000   GOOG  609.56    609.564
7   2011-03-03      Sell  2200    IBM  158.73    158.736
8   2011-06-03      Sell  3300    IBM  160.97    160.978
9   2011-05-03       Buy  1500    IBM  167.84    167.847
10  2011-06-10       Buy  1200   AAPL  323.03    323.039
11  2011-08-01       Buy    55   GOOG  606.77    606.779
12  2011-08-01      Sell    55   GOOG  606.77    606.779
13  2011-12-20      Sell  1200   AAPL  392.46    392.462
>>> 

Вопрос все еще,

orders['streetPrices'] = prices.lookup(orders.Date, orders.ticker)

Arg1 = orders.Date = цены DataFrame index

Arg2 = orders.ticker =цены DataFrame столбцы

Можно ли иметь несколько каскадных индексов?

Спасибо

0 голосов
/ 01 октября 2018

Ожидаемый вывод был включен в кадр данных order исходного сообщения, можно предположить, что есть столбец нет price, если это так, используйте lookupхороший способ получить это значение

orders['price']= prices.lookup(orders.Date, orders.ticker)

Также вы можете использовать loc или цикл здесь

orders.apply(lambda x : prices.loc[x['Date'],x['ticker']],axis=1)
Out[116]: 
0     339.44
1     342.64
2     143.92
3     616.50
4      79.46
5      79.68
6     609.56
7     158.73
8     160.97
9     167.84
10    323.03
11    606.77
12    606.77
13    392.46
dtype: float64

[prices.loc[x,y] for x , y in zip(orders.Date,orders.ticker)]
Out[118]: 
[339.44,
 342.64,
 143.92,
 616.5,
 79.46,
 79.68,
 609.56,
 158.73,
 160.97,
 167.84,
 323.03,
 606.77,
 606.77,
 392.46]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...