Разбиение чисел с использованием метода np.где со многими условиями

#python #pandas #numpy

Вопрос:

np.where Метод, который я написал, превращает цены (Закрытие) в единицы и нули. Один для подъема и ноль для падения. Мне нужно, чтобы этот метод разделил числа не только на единицы и нули, но и на 6,5,4,3,2,1,0,-1,-2,-3,-4,-5,-6 например, 6 для очень большой разницы в направлении вверх, 2 для небольшой разницы в направлении вверх, 0 для отсутствия разницы, -6 для очень большой разницы в направлении вниз и так далее. Как я могу это сделать?

Мой код:

 import pandas as pd df = pd.read_csv('AUDNZD_Candlestick_1_Hour_BID_12.12.2006-30.10.2021.csv') df = df.drop(columns=['Local time', 'Open', 'High', 'Low', 'Volume']) df['Price_Up'] = np.where(df['Close'].shift(1) gt; df['Close'] ,0,1) df  

Мой вывод:

Закрыть Price_Up
1.13895 1
1.13871 0
1.13772 0
1.13840 1

Комментарии:

1. выход намного больше, чем этот. Но это всего лишь образец.

2. сделайте deltaPrice = df[‘Закрыть’].iloc[1:] -df[‘Закрыть’].iloc[:-1] затем определите шкалу высокого и низкого. например, если вам нужна шкала от -6 до 6, и вы считаете, что большая дельта «1», то вы можете определить step=1/6 , а затем выполнить deltaPrice / шаг для последнего, заменить все значения higher than 6 на 6 и то же самое для значений ниже -6 ..

3. большое вам спасибо, сэр. могу ли я получить больше кода о том, как определить шкалу высокого и низкого (может быть, просто пример). я не очень хорошо разбираюсь в этих вещах. В любом случае, большое спасибо. @UlisesBussi

4. Я думаю pd.cut , что было бы простым решением, примененным к разнице столбцов, и определить, сколько ячеек вы хотите, а также метки, являющиеся числами, поэтому что-то вроде pd.cut(df['Close'].diff(), bins=13, labels=range(-6,7)) обратите внимание, что 0 не означает никакой разницы именно с помощью этого метода

5. @mathandlogic извините, я не смогу ответить в течение нескольких часов. может быть, 3… тогда я сделаю игрушечный пример! было бы здорово, если бы вы поместили вектор df[‘Закрыть’] со значениями (10 или 20? ) чтобы поиграть, предпочтительнее, если в значениях у вас есть весь диапазон (точка со значением 6 и другие с отрицательным значением), независимо от того, что это не реальные значения, просто дайте мне некоторое представление

Ответ №1:

Это было сложнее, чем я думал:

  1. Создайте вектор значений для работы (содержащий множество возможных изменений)
  2. Рассчитать разницу по индексу
  3. нарезать в бункерах
  4. построение графиков результатов
  5. и 2)
 import pandas as pd  import matplotlib.pyplot as plt # idk if i need this  import numpy as np #to be sure..    #this create values increasing and then decreasing spaning varios steps  positive_steps = np.arange(0,0.003,0.00005)  negative_steps = np.arange(0,-0.003,-0.00005)    values = 1   np.concatenate([positive_steps.cumsum(),  positive_steps.sum() negative_steps.cumsum()])      #create dataframe and get change column  df = pd.DataFrame(values, columns=['Close'])  df['Change'] = df['Close'].diff()  
 #maximun range maxRange = 0.003 span = 2*maxRange nDivs =12 #not counting 0 bc i will define special case for it  zero_tol = 0.0001 #special case theshold   scores = np.zeros(len(df)) for i, val in enumerate(df['Change'][1:],1):  if abs(val)lt;zero_tol: #tolerance for rank 0 is a small value  scores[i] = 0  else:  score= int(val*nDivs/span) #calculate score  if scoregt;nDivs/2: #saturation of scores bigger than 6  score = nDivs  elif scorelt;-nDivs/2: #saturation of smallers  score = -nDivs  scores[i] = score  #asignate score df['Score'] = scores  
  1. проверьте результаты
 plt.figure()  plt.subplot(3,1,1)  plt.plot(df['Close'])  plt.subplot(3,1,2)  plt.plot(df['Change'])  plt.subplot(3,1,3)  plt.plot(df['Score'])  

результаты сюжета


Редактировать

Вы можете получить аналогичный результат без использования такого большого количества кода np.digitize . Вам нужно будет определить свои ячейки, а затем вызвать функцию по df['Change']

 # optional you can define the bins the way you want or with an arange #bins= [-0.003,-0.002,-0.001, -0.0005,-0.0002, -0.0001, 0,  # 0.0001, 0.0002, 0.0005, 0.001, 0.002, 0.003] bins = np.arange(-0.003,0.003,span/nDivs) inds = np.digitize(df['Change'], bins,right=False) numpyScores = inds - 7  

Комментарии:

1. это действительно потрясающе. Это как раз то, что мне нужно. Еще раз большое вам спасибо.

2. Проверьте это, вы можете изменить span zero_tol или nDivs получить другие результаты. Сегодня (вот другой день) Я вижу это и думаю, что в какой-то библиотеке должно быть «квантование», чтобы получить тот же результат…

3. идеально!! Могу я спросить, как вы можете найти эти методы? @Ulises Bussi

4. какие методы? первый из них предложен мной (на этот раз я не проводил полного исследования, чтобы проверить, есть ли название для этого метода). Второй — это просто ussage из numpy.digitize

5. да, я знал это. Но все равно спасибо, вы замечательные люди 🙂