作为一只萌新报名参加了阿里的天池大数据比赛,参加的这场比赛的题目是 预测商家未来14天的客流量 。由于第一次做ML/DM方面的比赛,所以上手需要学习不少新知识,比如读取数据这方面。
Pandas是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的,经常用于数据分析和科学计算领域。
不管参加天池大数据比赛或者是Kaggle,首先要做得都是从比赛提供的数据文件中将数据提取出来,即 提取数据。
为了更好的提取数据我不可避免的用到了Pandas,在这里我把用pandas提取csv表格数据的心得记录下来。
比赛地址:IJCAI-17 口碑商家客流量预测
提取过程
这一节里先不考虑导入数据库,只探讨如何用pandas提取数据。
1.数据文件
2.提取代码
#coding=utf8
import pandas
def Init():
print '正在提取商家数据……'
shop_info = pandas.read_csv(r'.\dataset\dataset\shop_info.txt',header=None,names=['shop_id','city_name','location_id','per_pay','score','comment_cnt','shop_level','cate_1_name','cate_2_name','cate_3_name'])
print shop_info.head(5)
print '正在提取支付数据……'
user_pay = pandas.read_csv(r'.\dataset\dataset\user_pay.txt', iterator=True,header=None,names=['user_id','shop_id','time_stamp'])
try:
df = user_pay.get_chunk(5)
except StopIteration:
print "Iteration is stopped."
print df
print '正在提取浏览数据……'
user_view = pandas.read_csv(r'.\dataset\dataset\user_view.txt',header=None,names=['user_id','shop_id','time_stamp'])
print user_view.head(5)
if __name__=='__main__':
Init()
pandas.read_csv()的参数说明:
header:指定某一行为列名,默认header=0,即指定第一行的所有元素名对应为每一列的列名。若header=None,则不指定列名行。
names:与header配合使用,若header=None,则可以使用该参数手动指定列名。
iterator:返回一个TextFileReader 对象,以便逐块处理文件。默认值为False。
3.运行结果
存入数据库
上一节探讨了如何提取数据,这一节我们探讨如何将数据导入到mysql数据库中。
观察上一节提取代码,你会发现user_pay的数据提取我使用了迭代提取的办法,这是因为user_pay的csv文件有2G大小。我使用的windows 32bit python,内存有限制,无法一次性读取这么大的数据集(会提示MemoryError)。
在这一节里,我要把数据都存入数据库,所以干脆都采用了迭代的方式,迭代的过程中执行sql将数据插入表中。
完整代码如下:
#coding=utf8
import pandas
import MySQLdb
def Init():
# 连接数据库
conn= MySQLdb.connect(
host='localhost',
port = 3306,
user='root',
passwd='1234',
db ='tianchi_1',
charset = 'utf8', # 不声明编码导入的数据会显示出错
)
cur = conn.cursor()
print '正在提取商家数据……'
shop_info = pandas.read_csv(r'.\dataset\dataset\shop_info.txt', iterator=True,chunksize=1,header=None,names=['shop_id','city_name','location_id','per_pay','score','comment_cnt','shop_level','cate_1_name','cate_2_name','cate_3_name'])
print '正在将数据导入到数据库……'
for i,shop in enumerate(shop_info):
# 用-1或者''代替空值NAN
shop = shop.fillna({'cate_1_name':'','cate_2_name':'','cate_3_name':''}) # 替换字符串空值
shop = shop.fillna(-1) # 替换整数空值
shop = shop.values[0] # Series类型转换成列表类型
#print shop
sql ="insert into shop_info (`shop_id`,`city_name`,`location_id`,`per_pay`,`score`,`comment_cnt`,`shop_level`,`cate_1_name`,`cate_2_name`,`cate_3_name`) values('%d','%s','%d','%d','%d','%d','%d','%s','%s','%s')"\
%(shop[0],shop[1],shop[2],shop[3],shop[4],shop[5],shop[6],shop[7],shop[8],shop[9])
cur.execute(sql)
print '%d / 2000'%(i+1)
conn.commit()
print '正在提取支付数据……'
user_pay = pandas.read_csv(r'.\dataset\dataset\user_pay.txt', iterator=True,chunksize=1,header=None,names=['user_id','shop_id','time_stamp'])
print '正在将数据导入到数据库……'
for i,user in enumerate(user_pay):
# 用-1代替空值NAN
user = user.fillna(-1) # 替换整数空值
user = user.values[0] # Series类型转换成列表类型
#print user
sql ="insert into user_pay (`user_id`,`shop_id`,`time_stamp`) values('%d','%d','%s')"\
%(user[0],user[1],user[2])
cur.execute(sql)
print '%d'%(i+1)
conn.commit()
print '正在提取浏览数据……'
user_view = pandas.read_csv(r'.\dataset\dataset\user_view.txt', iterator=True,chunksize=1,header=None,names=['user_id','shop_id','time_stamp'])
print '正在将数据导入到数据库……'
for i,user in enumerate(user_view):
# 用-1代替空值NAN
user = user.fillna(-1) # 替换整数空值
user = user.values[0] # Series类型转换成列表类型
#print user
sql ="insert into user_view (`user_id`,`shop_id`,`time_stamp`) values('%d','%d','%s')"\
%(user[0],user[1],user[2])
cur.execute(sql)
print '%d'%(i+1)
conn.commit()
if __name__=='__main__':
Init()
参考资料
原创声明
转载请注明:呓语 » Pandas读取csv表格数据 && 存入数据库