#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:
Это было сложнее, чем я думал:
- Создайте вектор значений для работы (содержащий множество возможных изменений)
- Рассчитать разницу по индексу
- нарезать в бункерах
- построение графиков результатов
- и 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
- проверьте результаты
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. да, я знал это. Но все равно спасибо, вы замечательные люди 🙂