Python Pandas-单个数据框中的多个算术运算

Jer*_*ril 0 python 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
Run Code Online (Sandbox Code Playgroud)

然后,我需要关闭前几天,因此我使用了该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
Run Code Online (Sandbox Code Playgroud)

现在我想计算每天增加的百分比,但是我所有的数据都是字符串形式的,所以我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)
Run Code Online (Sandbox Code Playgroud)

现在我的主要问题开始了,我想执行以下算术运算:

% increase = (New Number - Original Number) ÷ Original Number × 100.
Run Code Online (Sandbox Code Playgroud)

为了进行算术运算,我们需要具有浮点数据类型,并且我编写了一个代码来转换数据类型并计算利润,如下所示:

>>> 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
Run Code Online (Sandbox Code Playgroud)

我的代码可以正常工作,但是我怀疑还有没有比这更好的方法了?我可以正确进行类型转换吗?这是对单个操作使用多个算术运算的正确方法吗?谢谢您的帮助。

Psi*_*dom 5

pct_change()您可以使用一个函数来计算当前日期和前一天之间的百分比变化(请注意,NA这是由于我只能访问您的五行数据):

df['per'] = (df.close.replace({',':''}, regex=True).astype(float)
               .pct_change().shift(-1) * 100)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明