Обновление значений в DataFrame на основе критериев с расчетом - PullRequest
0 голосов
/ 13 апреля 2020

Конечная цель заключается в том, что я пытаюсь изменить необработанные данные о ценах на акции в результате разделения акций на 20: 1.

Из raw_data Я извлек соответствующие ticker ('IPL') и date (<'2008-10-01') с использованием приведенного ниже кода: </p>

raw_data[(raw_data['ticker'] =='IPL') & (raw_data['date']<'2008-10-01')]

Ниже приведен кадр данных результата:

     ticker    date      open   high    low      close  volume     return
687     IPL 2008-01-02  117.00  118.48  116.81  117.16  150971.0    NaN
2146    IPL 2008-01-03  117.16  123.82  116.80  120.96  240929.0    0.032434
3617    IPL 2008-01-04  123.06  127.24  120.20  125.60  329834.0    0.038360
5156    IPL 2008-01-07  125.60  126.21  121.61  121.63  266578.0    -0.031608
6731    IPL 2008-01-08  119.70  121.93  118.75  119.58  362860.0    -0.016854
... ... ... ... ... ... ... ... ...
259572  IPL 2008-09-10  126.00  130.50  125.10  129.00  1046421.0   -0.030075
260940  IPL 2008-09-11  133.50  134.55  131.82  132.50  599706.0    0.027132
262251  IPL 2008-09-12  136.00  142.00  134.03  139.01  475591.0    0.049132
263608  IPL 2008-09-15  139.00  143.00  135.50  139.93  390052.0    0.006618
264980  IPL 2008-09-16  136.00  137.40  131.11  132.00  489557.0    -0.056671

Я попытался выполнить итерацию для петли и .loc[] но я полностью застрял.

Я также попробовал следующее с & и and:

for i, row in raw_data.iterrows():
    close_val = ['close']
    if raw_data[(raw_data['ticker'] =='IPL') and (raw_data['date']<'2008-10-01')]:
        close_val = ['close'] * 0.05
    df.at[i,'close'] = close_val

Но я получаю следующую ошибку:

"ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."

По сути, мне нужно умножить все цены open, high, low, close до 2008-09-17 на 0,05 и разделить volume на 0,05.

1 Ответ

0 голосов
/ 14 апреля 2020

Pandas является умным и позволяет обрабатывать столбцы DataFrame (т.е. серии) как векторы. Поэтому, если вы умножаете столбец на число, pandas будет умножать каждую строку в этом столбце на это число. Это работает даже с целыми кадрами данных, поэтому вы можете выбрать любой подкадр, который вам нравится (например, путем индексации со списком имен столбцов), и просто умножить на скалярное число следующим образом (при условии, что в кадре данных указаны интересующие вас даты, извлеченные из необработанных данных). называется df).

df[['open', 'high', 'low', 'close']] = 0.05 * df[['open', 'high', 'low', 'close']]
df['volume'] = 20 * df['volume']
df

Результат:

        ticker  date        open    high    low     close   volume      return
687     IPL     2008-01-02  5.850   5.9240  5.8405  5.8580  3019420.0   NaN
2146    IPL     2008-01-03  5.858   6.1910  5.8400  6.0480  4818580.0   0.032434
3617    IPL     2008-01-04  6.153   6.3620  6.0100  6.2800  6596680.0   0.038360
5156    IPL     2008-01-07  6.280   6.3105  6.0805  6.0815  5331560.0   -0.031608
6731    IPL     2008-01-08  5.985   6.0965  5.9375  5.9790  7257200.0   -0.016854
...
259572  IPL     2008-09-10  6.300   6.5250  6.2550  6.4500  20928420.0  -0.030075
260940  IPL     2008-09-11  6.675   6.7275  6.5910  6.6250  11994120.0  0.027132
262251  IPL     2008-09-12  6.800   7.1000  6.7015  6.9505  9511820.0   0.049132
263608  IPL     2008-09-15  6.950   7.1500  6.7750  6.9965  7801040.0   0.006618
264980  IPL     2008-09-16  6.800   6.8700  6.5555  6.6000  9791140.0   -0.056671
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...