#python #pandas
#python #pandas
Вопрос:
Я анализирую данные фондового рынка, и мне удалось получить только открытые, высокие, низкие, закрытые и объем. Теперь я хотел рассчитать процентное увеличение за каждый день, используя Pandas. Ниже приведен мой фрейм данных:
>>> df.head()
date open high low close volume
0.0 Aug 18, 2016 1,250.00 1,294.85 1,250.00 1,293.25 1,312,905
1.0 Aug 17, 2016 1,240.00 1,275.00 1,235.05 1,243.85 1,704,985
2.0 Aug 16, 2016 1,297.00 1,297.95 1,206.65 1,237.10 3,054,180
3.0 Aug 12, 2016 1,406.25 1,406.25 1,176.75 1,276.40 8,882,899
4.0 Aug 11, 2016 1,511.85 1,584.50 1,475.00 1,580.00 1,610,322
Затем мне нужно было закрыть предыдущие дни, поэтому я использовал shift
метод и выглядит следующим образом:
>>> df['pre_close'] = df['close'].shift(-1)
>>> df.head()
date open high low close volume
0.0 Aug 18, 2016 1,250.00 1,294.85 1,250.00 1,293.25 1,312,905
1.0 Aug 17, 2016 1,240.00 1,275.00 1,235.05 1,243.85 1,704,985
2.0 Aug 16, 2016 1,297.00 1,297.95 1,206.65 1,237.10 3,054,180
3.0 Aug 12, 2016 1,406.25 1,406.25 1,176.75 1,276.40 8,882,899
4.0 Aug 11, 2016 1,511.85 1,584.50 1,475.00 1,580.00 1,610,322
pre_close
0.0 1,243.85
1.0 1,237.10
2.0 1,276.40
3.0 1,580.00
4.0 1,510.05
Теперь я хотел рассчитать процентное увеличение за каждый день, но все мои данные были в строке, поэтому я заменил commas
на ''
и выглядит следующим образом:
>>> df.dtypes
date object
open object
high object
low object
close object
volume object
tomm_close object
dtype: object
>>> df = df.replace({',': ''}, regex=True)
Теперь начинается моя основная проблема, я хотел выполнить следующую арифметическую операцию:
% increase = (New Number - Original Number) ÷ Original Number × 100.
И для выполнения арифметических операций нам нужно иметь тип данных с плавающей запятой, и я написал код, который преобразует тип данных и вычисляет прибыль, и выглядит следующим образом:
>>> df['per']=((df['close'].astype(float)
.sub(df['pre_close'].astype(float), axis=0))
.div(df['close'].astype(float),axis=0))
.mul(float(100))
>>> df.head()
date open high low close volume pre_close
0.0 Aug 18 2016 1250.00 1294.85 1250.00 1293.25 1312905 1243.85
1.0 Aug 17 2016 1240.00 1275.00 1235.05 1243.85 1704985 1237.10
2.0 Aug 16 2016 1297.00 1297.95 1206.65 1237.10 3054180 1276.40
3.0 Aug 12 2016 1406.25 1406.25 1176.75 1276.40 8882899 1580.00
4.0 Aug 11 2016 1511.85 1584.50 1475.00 1580.00 1610322 1510.05
per
0.0 3.819834
1.0 0.542670
2.0 -3.176784
3.0 -23.785647
4.0 4.427215
Мой код работает правильно, но я сомневаюсь, есть ли лучший способ, чем этот? Правильно ли я выполняю преобразование типов и правильно ли это использовать несколько арифметических операций для одной операции?
Спасибо за помощь.
Ответ №1:
Существует pct_change()
функция для вычисления процентного изменения между текущим днем и предыдущим днем, которую вы можете использовать (обратите NA
внимание, что это связано с тем, что у меня есть доступ только к пяти строкам ваших данных):
df['per'] = (df.close.replace({',':''}, regex=True).astype(float)
.pct_change().shift(-1) * 100)
Комментарии:
1. Что, если я хочу вычислить изменение с
open
помощью, как я могу это сделать? Насколько высоко он открылся с предыдущего закрытия. Не могли бы вы помочь?2. Я бы подумал о том, чтобы сделать что-то вроде этого:
df[['open', 'high', 'low', 'close', 'volume']] = df[['open', 'high', 'low', 'close', 'volume']].replace({',':''}, regex = True).astype(float); (df.open.shift(-1) - df.close)/df.close
Сначала очистить данные, а затем вычислить разницу, чтобы минимизировать код.3. Большое вам спасибо
Ответ №2:
Если вы хотите выполнять какие-либо арифметические операции, вы можете сделать это легко с помощью этого способа:
for col in df.columns:
if i == 'date':
pass
else:
df[col] = pd.to_numeric(df[col], errors = 'coerce')
и тогда арифметические операции можно легко выполнить, просто используя арифметические операторы, в вашем случае
df['per'] = ((df['close'] - df['pre_close'])/df['close']) * 100