深度学习之 python pandas

Posted shichaog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习之 python pandas相关的知识,希望对你有一定的参考价值。

在数据科学领域,pandas是非常有用的工具,在数据科学细分领域大数据(通常和深度学习有关)这部分,本篇博客从pandas重要函数开始,到数据变换以及数据分析。pandas提供了数据变换、数据清理、数据可视化以及数据提取等主要数据处理功能。本篇使用的博客python版本是:

#!/usr/local/bin/python3
# Copyright 2022 shichaog

import platform
print(platform.python_version())
输入:
3.8.7

pandas基础

python中使用pandas需要import该模块,使用import pandas as pd,dataframe是pandas中最常用的一种数据格式,股票数据、超市百货商店交易数据等很多都可以用dataframe表示。dataframe的创建如下:

#!/usr/local/bin/python3
# Copyright 2022 shichaog

import pandas as pd

Speeds='Animal': ['Falcon', 'Falcon',
                              'Parrot', 'Parrot'],
                   'MaxSpeed': [380., 370.,  24., 23.0]

df = pd.DataFrame(Speeds)
print(df)
其输出是一张表,如下:
   Animal  MaxSpeed
0  Falcon     380.0
1  Falcon     370.0
2  Parrot      24.0
3  Parrot      23.0

上述代码中Speeds是一个字典,Animal 和MaxSpeed是key值,其后list是对应的value值,0,1,2,3是索引值,用于dataframe的索引,可以用于检索、查询、修改、删除等操作。
如果想获取一列值,则只需要dataframe名其后加中括号,中括号中写入列名就行,如下所示:

#!/usr/local/bin/python3
# Copyright 2022 shichaog

import pandas as pd

df = pd.DataFrame('Animal': ['Falcon', 'Falcon',
                              'Parrot', 'Parrot'],
                   'MaxSpeed': [380., 370.,  24., 23.0])
#下一行的等价写法是:print(df.MaxSpeed)
print(df['MaxSpeed'])
输出为:
0    380.0
1    370.0
2     24.0
3     23.0

pandas还可以增加列,筛选等操作:

#接上df
#增加一列
df['Size'] = [16., 60., 25., 40.]
print(df)
输出为:
   Animal  MaxSpeed  Size
0  Falcon     380.0  16.0
1  Falcon     370.0  60.0
2  Parrot      24.0  25.0
3  Parrot      23.0  40.0
#筛选过滤
print(df[df['Size'] >= 40.0])
输出为:
   Animal  MaxSpeed  Size
1  Falcon     370.0  60.0
3  Parrot      23.0  40.0

除了自己构建dataframe之外,还可以读入已有的一些文件格式,比如csv、xsl等,iris.csv是常用于深度学习的kaggle开源数据集iris数据集地址,使用pd.read_csv方法即可。pandas dataframe的基本用法如下:

#!/usr/local/bin/python3
# Copyright 2022 shichaog

import pandas as pd

iris = pd.read_csv('iris.csv')

#数据样本信息
print(iris.shape)
输出:
(150, 5)
#样本实例
print(iris.head(5))
print(iris.tail(5))
输出:
   sepallength  sepalwidth  petallength  petalwidth        class
0          5.1         3.5          1.4         0.2  Iris-setosa
1          4.9         3.0          1.4         0.2  Iris-setosa
2          4.7         3.2          1.3         0.2  Iris-setosa
3          4.6         3.1          1.5         0.2  Iris-setosa
4          5.0         3.6          1.4         0.2  Iris-setosa
     sepallength  sepalwidth  petallength  petalwidth           class
145          6.7         3.0          5.2         2.3  Iris-virginica
146          6.3         2.5          5.0         1.9  Iris-virginica
147          6.5         3.0          5.2         2.0  Iris-virginica
148          6.2         3.4          5.4         2.3  Iris-virginica
149          5.9         3.0          5.1         1.8  Iris-virginica

#数据类型
print(iris.dtypes)
输出:
sepallength    float64
sepalwidth     float64
petallength    float64
petalwidth     float64
class           object
dtype: object

#数据取子集,选择3,,4,,5三个行,行索引从0开始
print(iris.loc[3:5])
输出:
   sepallength  sepalwidth  petallength  petalwidth        class
3          4.6         3.1          1.5         0.2  Iris-setosa
4          5.0         3.6          1.4         0.2  Iris-setosa
5          5.4         3.9          1.7         0.4  Iris-setosa
#相比上面,增加了列,信息,列可以是列名,也可以是列所以,如果是是列索引值,则需要使用iloc
#下面两个作用等同,都是选取3行0列所在位置的值
print(iris.loc[3, 'sepallength'])
print(iris.iloc[3,0])
输出:
4.6
4.6

#数据导出为csv
iris.to_csv('iris-out.csv', index=False)

此外pandas还有对异常数据的一些处理方法,这放到后续小节。

pandas数据计算

数据类型转换

这里以nasa的行星数据为例,

#!/usr/local/bin/python3
# Copyright 2022 shichaog

import pandas as pd

planets = pd.read_csv('planets.csv')

print(planets.head(3))
输出
            method  number  orbital_period  mass  distance  year
0  Radial Velocity       1         269.300  7.10     77.40  2006
1  Radial Velocity       1         874.774  2.21     56.95  2008
2  Radial Velocity       1         763.000  2.60     19.84  2011

print(planets.dtypes)
输出
method             object
number              int64
orbital_period    float64
mass              float64
distance          float64
year                int64
dtype: object

#获取均值,所有结果都是浮点数
print(planets.mean())
输出
number               1.785507
orbital_period    2002.917596
mass                 2.638161
distance           264.069282
year              2009.070531
dtype: float64

#整数除以浮点数,结果是浮点数
print(planets['number'][0]/planets['mass'][0])
输出
0.14084507042253522

#使用astype强制类型转换,将整数类型转换为浮点数类型
print(planets['number'][0].astype(float))
输出
1.0
#强制类型转换,将浮点数转换为整数
print(planets['mass'][0].astype(int))
输出
7
planets['year'][0].astype(str)
输出
‘2006’

planets['year_dt'] = pd.to_datetime(planets['year'], format='%Y')
print(planets['year_dt'])
输出
0      2006-01-01
1      2008-01-01
2      2011-01-01
3      2007-01-01
4      2009-01-01
          ...    
1030   2006-01-01
1031   2007-01-01
1032   2007-01-01
1033   2008-01-01
1034   2008-01-01
Name: year_dt, Length: 1035, dtype: datetime64[ns]

字符串类型

在pandas中,.str是字符串的存取器,其提供了大量的字符串操作方法。

#!/usr/local/bin/python3
# Copyright 2022 shichaog

import pandas as pd

names = pd.Series([' github; Shichaog','csdn; Shichaog'])

#字符串替换,将;替换成/
names = names.str.replace(';','/')
print(names)

#字符串长度获取
print(names.str.len())

#删除字符串前的前导空格
names = names.str.strip()
print(names)
print(names.str.len())

#字符串大小写转换,.lower是大写转小写
names = names.str.upper()
print(names)

#按;分割series为list
names = names.str.split('; ')
print(names)

#::-1是list索引方法
names = pd.Series([i[::-1] for i in names])
print(names)

#jion方法连接单词
names = [' '.join(i) for i in names]
print(names)

日期数据处理

#!/usr/local/bin/python3
# Copyright 2022 shichaog

import pandas as pd

#构建日期period_range生成日期series,第一个参数是起始日期,第二个参数生成频率
daterange = pd.period_range('1/1/2020', freq='30d', periods=4)
date_df = pd.DataFrame(data=daterange,columns=['sample date'])
print(date_df)
输出:
  sample date
0  2020-01-01
1  2020-01-31
2  2020-03-01
3  2020-03-31

#日期差异,使用diff,period是比较周期,在股票趋势派交易中常会比较均线和股价的上下穿关系,也常用到diff
date_df['date difference'] = date_df['sample date'].diff(periods=1)
print(date_df)
输出:
  sample date date difference
0  2020-01-01             NaT
1  2020-01-31     <30 * Days>
2  2020-03-01     <30 * Days>
3  2020-03-31     <30 * Days>

#查询该月第一天
date_df['first of month'] = date_df['sample date'].values.astype('datetime64[M]')
print(date_df)
输出:
  sample date date difference first of month
0  2020-01-01             NaT     2020-01-01
1  2020-01-31     <30 * Days>     2020-01-01
2  2020-03-01     <30 * Days>     2020-03-01
3  2020-03-31     <30 * Days>     2020-03-01

#数据类型
print(date_df.dtypes)
输出:
sample date           period[30D]
date difference            object
first of month     datetime64[ns]
dtype: object

date_df['sample date'] = date_df['sample date'].dt.to_timestamp()
print(date_df.dtypes)
输出:
sample date        datetime64[ns]
date difference            object
first of month     datetime64[ns]
dtype: object

#数据相减
date_df['sample date'] - date_df['first of month']
date_df['sample date'] - date_df['date difference']
date_df['sample date'] - pd.Timedelta('30 d')

#使用dt获取更多属性
date_df['sample date'].dt.day_name()

错误数据处理

未经过清理的数据会有错误、缺失等,据统计,通常在数据清理在整个项目中通常需要花费80%-90%时间,pandas和python提供了一些数据清理方法,可以大大节省数据清理所需的时间

数值错误

对于数值类的数据,如成交量之类,有数值丢失、数值错误以及数据重复三种类型错误可能发生。
pandas.isnull可用于判别数据缺失的情况,如下的array使用nan初始化时是一个缺失的值,这时可以使用该方法判断。

#!/usr/local/bin/python3
# Copyright 2022 shichaog
>>>array = np.array([[1, np.nan, 3], [4, 5, np.nan]])
>>>array
array([[ 1., nan,  3.],
       [ 4.,  5., nan]])
>>>pd.isna(array)
array([[False,  True, False],
       [False, False,  True]])
>>>index = pd.DatetimeIndex(["2017-07-05", "2017-07-06", None,
                          "2017-07-08"])
>>>index
DatetimeIndex(['2017-07-05', '2017-07-06', 'NaT', '2017-07-08'],
              dtype='datetime64[ns]', freq=None)
>>>pd.isna(index)
array([False, False,  True, False])
>>>df = pd.DataFrame([['ant', 'bee', 'cat'], ['dog', None, 'fly']])
>>>df
     0     1    2
0  ant   bee  cat
1  dog  None  fly
>>>pd.isna(df)
       0      1      2
0  False  False  False
1  False   True  False

此外也可以使用dropna()等方法去掉非数值的行/列,或者fillna()方法设置为某个值。

异常值

这种类型的值是超出了正常范围,比如cpu的使用率、汽车速度、人类的身高、体重等数据都是有一个合理范围的,这比较符合统计学里的正太分布。


#!/usr/local/bin/python3
# Copyright 2022 shichaog
import pandas as pd
#这里的1000和1.0是两个异常值
df = pd.DataFrame('Animal': ['Falcon', 'Falcon','Falcon', 'Falcon', 'Falcon',
                              'Parrot', 'Parrot', 'Parrot', 'Parrot', 'Parrot'],
                   'MaxSpeed': [380., 370., 330., 1000, 320, 24., 26., 23.0, 1.0, 25.0])
#查看数据统计信息
print(df.groupby('Animal').describe())
输出:
       MaxSpeed                                                       
          count   mean         std    min    25%    50%    75%     max
Animal                                                                
Falcon      5.0  480.0  291.804729  320.0  330.0  370.0  380.0  1000.0
Parrot      5.0   19.8   10.568822    1.0   23.0   24.0   25.0    26.0

#统计样本数
print(df['Animal'].value_counts())
输出
Falcon    5
Parrot    5

#见下图所绘制
pd.pivot(df, columns='Animal').plot(subplots=True)

#通过以下句子筛选错误值
print(df.query('Animal=="Falcon" & ( MaxSpeed > 400.)'))

从上图可以看到明显有两个值远远超出了平均值,这种值往往需要预先处理掉再训练模型。

apply & map

pandas dataframe值修改时可以通过apply以及map等函数提供的方法,这类的方法的好处是不再需要使用其它语言类似for/loop之类的语句。

#!/usr/local/bin/python3
# Copyright 2022 shichaog

import pandas as pd

#read in apple stock info
apple_df = pd.read_csv('../AAPL Historical Data.csv')
该df的输出如下,其是一个股票的daily交易信息,包括日期、收盘价、开盘价以及成交量和换手率等。
            Date   Price    Open    High     Low    Vol. Change %
0   Jul 19, 2022  151.00  147.98  151.20  146.92  82.15M    2.67%
1   Jul 18, 2022  147.07  150.84  151.54  146.74  77.54M   -2.06%
2   Jul 15, 2022  150.17  149.78  150.86  148.20  76.26M    1.15%
3   Jul 14, 2022  148.47  144.08  148.95  143.25  78.14M    2.05%
4   Jul 13, 2022  145.49  142.99  146.45  142.12  71.19M   -0.25%
5   Jul 12, 2022  145.86  145.76  148.45  145.05  77.59M    0.68%
6   Jul 11, 2022  144.87  145.67  146.64  143.78  63.31M   -1.48%
7   Jul 08, 2022  147.04  145.26  147.55  145.00  64.30M    0.47%
8   Jul 07, 2022  146.35  143.29  146.55  143.28  65.73M    2.40%
9   Jul 06, 2022  142.92  141.35  144.12  141.08  73.55M    0.96%
10  Jul 05, 2022  141.56  137.77  141.61  136.93  70.95M    1.89%
11  Jul 01, 2022  138.93  136.04  139.04  135.66  71.05M    1.62%
12  Jun 30, 2022  136.72  137.25  138.37  133.77  98.63M   -1.80%
13  Jun 29, 2022  139.23  137.46  140.67  136.67  65.98M    1.30%
14  Jun 28, 2022  137.44  142.13  143.42  137.32  66.75M   -2.98%
15  Jun 27, 2022  141.66  142.70  143.49  140.96  70.21M    0.00%
16  Jun 24, 2022  141.66  139.90  141.91  深度学习之 python pandas

CP2003-Python做深度学习之Caffe设计实战

零基础入门到精通:Python大数据与机器学习之Pandas-数据操作

深度学习之 Python3基础

深度学习之 Python3基础

深度学习之 Python3基础 上