Панды - Как сравнить два последовательных ряда столбца - PullRequest
0 голосов
/ 09 января 2019

Я хочу найти процентную разницу двух последовательных строк столбца, а если разница больше 10 процентов, я хочу вернуть первое значение. Например, в приведенных ниже данных я хочу найти процентную разницу между df.close [0] и df.close [1], и если разница больше 10, тогда я хочу, чтобы значение df.close [0] было равно df.close [1], если разница меньше 10, тогда я хочу сохранить те же значения для df.close [0] и df.close [1], как это сделать =?

           1. open  2. high   3. low  4. close  5. volume
date                                                      
2000-01-03  41.7917  42.5000  40.8333   41.2500  2006460.0
2000-01-04  41.0833  41.0833  38.2500   39.2917  3392856.0
2000-01-05  37.2083  37.2083  34.0000   34.5500  4344624.0
2000-01-06  34.5000  36.3333  34.5000   35.6708  2219904.0
2000-01-07  39.1667  43.2500  38.6667   43.2500  7155936.0

Я попробовал приведенный ниже код, но, похоже, не работает:

def percentage_diff(x):
  if (abs((x[0]-x[1]/x[0])*100)>10):
    return x[0]
  else:
    return x[1]

df.close = pd.rolling_apply(df['close'], 2, percentage_diff)

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Используя приведенную ниже функцию, я смог решить проблему.

def percentage_diff(x):
  per = (abs((x[0] - x[1]))/x[1] *100)
  if (per > 30):
    return min(x[0], x[1])
  else:
    return x[0]

В моем исходном вопросе я возвращал x [0] или x [1], если процентное расхождение было больше 10, это просто сместило значение в следующую строку и на самом деле не удалило анамолию

def percentage_diff(x):
  if (abs((x[0]-x[1]/x[0])*100)>10):
    return x[0]
  else:
    return x[1]

df.close = pd.rolling_apply(df['close'], 2, percentage_diff)
0 голосов
/ 09 января 2019

Кажется, что вы хотите заменить значение x[0] значением x[1] для случаев, когда процентная разница между двумя значениями (x[0]-x[1])/x[0])*100 составляет менее 10%. Не очень понятно, хотите ли вы вернуть x или только элемент x.

def percentage_diff(x):
    if (abs((x[0]-x[1])/x[0])*100) > 10:
        return x #or return x[0] if that is what you really want.
    else:
        x[0] = x[1]
        return x #or return x[1] if that is what you really want.
print(percentage_diff([1,1,3,4,54,9])) #the percentage difference between 1 and 1 is less than 10%
print(percentage_diff([1,2,3,4,54,9])) #the percentage difference between 1 and 2 is more than 10%

Вот вывод для вышеуказанного кода:

>>> [1, 1, 3, 4, 54, 9]
>>> [1, 2, 3, 4, 54, 9]

И чтобы применить функцию к pandas DataFrame, вам нужно сделать:

df['close'] = df.close.apply(percentage_diff)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...