Python广告数据挖掘与分析实战
上QQ阅读APP看书,第一时间看更新

3.2.2 数据加载

要进行数据分析,首先要获取数据。Pandas提供了一些常用的数据加载功能,并且能将其他格式的数据默认转换为以DataFrame数据框的形式呈现,表3-3所示为常用的数据读取函数。

表3-3 常用的数据读取函数的对比说明

1.read_csv/read_table函数

Pandas中的read_csv函数和read_table函数很类似,区别在于read_csv函数中默认分隔符为逗号,而read_table函数中默认分隔符为制表符(tab)。read_csv和read_table函数中均有很多参数,可以在数据读取时加以说明,如表3-4所示。

接下来我们来看一个简单的广告数据样例,以下是广告用户画像数据的前几行,可以发现每行都是以逗号分隔的。


20200107,华为手机,android,19~25岁,F
20200107,苹果手机,iOS,26~35岁,M
20200107,小米手机,android,26~35岁,M
20200107,魅族手机,android,26~35岁,M
20200107,VIVO手机,android,0~18岁,F
20200107,VIVO手机,android,26~35岁,F
20200107,苹果手机,iOS,26~35岁,F
20200107,小米手机,android,36~45岁,F

表3-4 read_csv和read_table函数中重要的参数及说明

使用read_csv函数将其加载为DataFrame数据格式,并打印出前5行。


In [37]: df2 = pd.read_csv('ex2.csv')

In [38]: df2.head()
Out[38]:
   20200107    华为手机  android  19~25岁  F
0  20200107    苹果手机      iOS  26~35岁  M
1  20200107    小米手机  android  26~35岁  M
2  20200107    魅族手机  android  26~35岁  M
3  20200107   VIVO手机  android   0~18岁  F
4  20200107   VIVO手机  android  26~35岁  F

当然也可以使用read_table函数来读取,只要指定参数seq=‘,’即可。


In [39]: df2 = pd.read_table('ex2.csv',sep = ',')

In [40]: df2.head()
Out[40]:
   20200107    华为手机  android  19~25岁  F
0  20200107    苹果手机      iOS  26~35岁  M
1  20200107    小米手机  android  26~35岁  M
2  20200107    魅族手机  android  26~35岁  M
3  20200107   VIVO手机  android   0~18岁  F
4  20200107   VIVO手机  android  26~35岁  F

仔细观察后,我们发现这个文件是没有列标题的(在数据文件默认列标题的情况下,会以第一行数据为列标题),在pd.read_csv函数中可以通过names参数来指定各列列名。


In [43]: df2 = pd.read_csv('ex2.csv', names=[
    ...:                   'Date', 'Phone_type', 'System', 'Age', 'Sex'])

In [44]: df2.head()
Out[44]:
       Date Phone_type   System     Age Sex
0  20200107    华为手机  android  19~25岁   F
1  20200107    苹果手机      iOS  26~35岁   M
2  20200107    小米手机  android  26~35岁   M
3  20200107     魅族手机  android  26~35岁   M
4  20200107   VIVO手机  android   0~18岁   F

对于其中的Date列(表示日期),我们可以在加载时将其解析为时间格式:


In [45]: df2 = pd.read_csv('ex2.csv', parse_dates=[0], names=[
    ...:                   'Date', 'Phone_type', 'System', 'Age', 'Sex']
In [46]: df2.head()
Out[46]:
        Date   Phone_type   System     Age Sex
0 2020-01-07       华为手机  android  19~25岁   F
1 2020-01-07       苹果手机      iOS  26~35岁   M
2 2020-01-07       小米手机  android  26~35岁   M
3 2020-01-07       魅族手机  android  26~35岁   M
4 2020-01-07      VIVO手机  android   0~18岁   F

类似地,可以参照表3-4中的参数说明使用函数中的其他参数,具体根据自己的实际情况定义即可。


In [47]: df2 = pd.read_csv('ex3.csv', sep='\t', names=[
    ...:                   'Date', 'Phone_type', 'System', 'Age', 'Sex'],
    ...:                   parse_dates=[0], skiprows=[1, 3, 5],
    ...:                   index_col=3, nrows=4, encoding='utf8')

In [48]: df2
Out[48]:

    Age        Date  Phone_type   System    Sex
26~35岁  2020-01-07     苹果手机      iOS      M
26~35岁  2020-01-07     魅族手机  android      M
26~35岁  2020-01-07    VIVO手机  android      F

2.read_excel函数

read_excel函数主要用于加载xls或xlsx格式的文件,它的参数与read_csv\read_table的参数基本相同,同样包括header、index_col、nrows等。不同的是read_excel函数中用于指定文件所在路径的参数为io,同时多了一个sheetname参数,用于指定需要加载Excel文件中的哪个sheet数据,如下所示:


In [49]: df3 = pd.read_excel('ex3.xlsx',sheetname=0)

In [50]: df3.head()
Out[50]:
       Date   Phone_type   System     Age   Sex
0  20200107       华为手机  android  19~25岁   F
1  20200107       苹果手机      iOS  26~35岁   M
2  20200107       小米手机  android  26~35岁   M
3  20200107       魅族手机  android  26~35岁   M
4  20200107      VIVO手机  android   0~18岁   F 

sheetname=0表示读取Excel文件中的第一个sheet中的数据。

3.read_sql函数

在实际工作中,我们的数据一般都是存放在数据库中的(广告行业中的数据通常如此),只有少部分数据是保存在本地的文件中。这就要求Python需支持直接提取数据库中数据的函数。以连接MySQL数据库为例,Pandas提供了read_sql函数以轻松加载MySQL数据库中的任意表数据,但需要用到pymysql和sqlalchemy工具包,这两个工具包可以直接通过pip install pymysql和pip install sqlalchemy命令安装。

下面我们尝试将本地MySQL数据库中的数据加载到DataFrame中:


In [51]: import pymysql

In [52]: from sqlalchemy import create_engine

In [53]: DB_USER = 'root'

In [54]: DB_PASS = ****

In [55]: DB_HOST = '127.0.0.1'

In [56]: DB_PORT = 3306

In [57]: DATABASE = 'firstdb'

In [58]: connect_info = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(
    ...:     DB_USER, DB_PASS, DB_HOST, DB_PORT, DATABASE)

In [59]: engine = create_engine(connect_info)

In [60]: sql_cmd = "SELECT * FROM customer"

In [61]: df = pd.read_sql(sql=sql_cmd, con=engine)

In [62]: df
Out[62]:
   id first_name      surname  id2
0   1     YVonns        clegg    0
1   2     johnny  chaks-chaka    0
2   3    winston       powers    0
3   4  partricis     mankunkn    0

可以看到,本地MySQL数据库中的文件也轻松加载进来了。