DataPrame Python pandas добавляет элемент к предыдущим значениям строки и создает новый столбец - PullRequest
0 голосов
/ 11 сентября 2018

введите описание изображения здесь

Volume = [-1 -2 0 1 3 -1 -2 -1 -2 2 -2 -1 0]

Net_rate = [1 0 0 1 0 1 2 3 0 0 1 0]

У меня есть кадр данных Pandas 'Volume', и мне нужно создать столбец 'Net_rate'.

Алгоритмический расчет такой:

если громкость [i] * громкость [i-1]> 0 затем Net_rate [i-1] +1 иначе 0

Я попробовал следующий код, но возвращает ошибку:

def f_DataSlider(df, input, n, name):
    """Calculate the moving average for the given data.

    :param df: pandas.DataFrame
    :param n: 
    :return: pandas.DataFrame
    """
    Slider = pd.Series(df[input].shift(n), name=str(name))
    df = df.join(Slider)
    return df

data = f_DataSlider(data, 'Volume', 1, 'Volume_1')

mask2 = (data['Volume']*dfohlc['Volume_1'])>0
dfohlc.loc[mask2, 'Net_rate'] = dfohlc['Net_rate'].shift(-1)+1
dfohlc.loc[~mask2, 'Net_rate'] = 1

Как мне его кодировать? Может ли кто-нибудь помочь мне, пожалуйста?

1 Ответ

0 голосов
/ 11 сентября 2018

Использование numba

Вы можете использовать numba здесь, просто убедитесь, что сначала pip install numba.Этот параметр медленнее, чем параметр cumsum, но он помогает продемонстрировать, как будет выглядеть алгоритм для этой проблемы.

Настройка

from numba import njit

Создание логической серии с использованием shift:

s = df.Volume.mul(df.Volume.shift(-1)).gt(0).tolist()

@njit
def increment(s):
    rate = [int(s[0]>0)]
    for idx, el in enumerate(s[1:]):
        if el:
            rate.append(rate[idx]+1)
        else:
            rate.append(0)
    return rate

increment(s)

[1, 0, 0, 1, 0, 1, 2, 3, 0, 0, 1, 0, 0]

Использование cumsum и groupby:

s = df.Volume.mul(df.Volume.shift(-1)).gt(0).astype(int)

s.groupby(s.ne(s.shift()).cumsum()).cumsum()

0     1
1     0
2     0
3     1
4     0
5     1
6     2
7     3
8     0
9     0
10    1
11    0
12    0
Name: Volume, dtype: int32

Пояснение

Мы можем использовать shift для проверки Volume[i] * Volume[i-1]:

df.Volume.mul(df.Volume.shift(-1))

0     2.0
1    -0.0
2     0.0
3     3.0
4    -3.0
5     2.0
6     2.0
7     2.0
8    -4.0
9    -4.0
10    2.0
11   -0.0
12    NaN
Name: Volume, dtype: float64

Мы можем взять эту серию и проверить, что она больше чем 0:

df.Volume.mul(df.Volume.shift(-1)).gt(0).astype(int)

0     1
1     0
2     0
3     1
4     0
5     1
6     1
7     1
8     0
9     0
10    1
11    0
12    0
Name: Volume, dtype: int32

Теперь вы можете увидеть структурувыходных данных становится ясным, но нам нужно увеличивать на основе последовательных диапазонов 1, что мы можем сделать, используя трюк groupby для группировки последовательных значений, и взять cumsum.

...