Python Pandas — несколько арифметических операций в одном фрейме данных

#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