python文本数据处理学习笔记详解


Posted in Python onJune 17, 2019

最近越发感觉到限制我对Python运用、以及读懂别人代码的地方,大多是在于对数据的处理能力。

其实编程本质上就是数据处理,怎么把文本数据、图像数据,通过python读入、切分等,变成一个N维矩阵,然后再带入别人的模型,bingo~跑出来一个结果。结果当然也是一个矩阵或向量的形式。

所以说,之所以对很多模型、代码束手无策,其实还是没有掌握好数据处理的“屠龙宝刀”,无法对海量数据进行“庖丁解牛”般的处理。因此,我想以一个别人代码中的一段为例,仔细琢磨文本数据处理的精妙之处,争取能够加深对这方面的运用与理解。

1) 问题描述

数据:某个区域181天内的访客数据,格式如下,第一列代表访客的名称,第二列代表这位访客在181天内到达这片区域的时刻:

python文本数据处理学习笔记详解

目的:将访客数据进行统计,并时间离散化,按照天 /周/小时处理为72624的三维矩阵。
也就是说,矩阵中的每一个值,代表该区域 周X、第几周、几点 的到访人数,如
[1,5,19]=100,代表第5周的周一晚上7点的人数为100。

2)难点

当然是对我的难点。

2.1)怎么按行统计

2.2)怎么进行时间离散化(存为天、周、时刻的矩阵)

3)代码

import time
import numpy as np
import sys
import datetime
import pandas as pd
import os
#用字典查询代替类型转换,可以减少一部分计算时间
date2position = {}
datestr2dateint = {}
str2int = {}
for i in range(182):
 date = datetime.date(day=1, month=10, year=2018)+datetime.timedelta(days=i)
 #print(i,":",date)
 date_int = int(date.__str__().replace("-", ""))
 date2position[date_int] = [i%7, i//7]
 datestr2dateint[str(date_int)] = date_int
#print(datestr2dateint)
#
for i in range(24):
 str2int[str(i).zfill(2)] = i
f=open("D:\BaiDuBigData19-URFC-master\\UrbanRegionFunctionClassification-master\data\\train_visit\\000000_008.txt")
#table = pd.read_csv(f, header=None,error_bad_lines=False)
table = pd.read_csv(f, header=None,sep='\t')

#print(table.shape)
#print(table.ix[1])
strings = table[1]
#print(strings)
init = np.zeros((7, 26, 24))
for string in strings:
 temp = []
 for item in string.split(','):
 temp.append([item[0:8], item[9:].split("|")])
 for date, visit_lst in temp:
 # x - 第几周
 # y - 第几天
 # z - 几点钟
 # value - 到访的总人数
 # print(visit_lst)
 print(date)
 x, y = date2position[datestr2dateint[date]]
 for visit in visit_lst: # 统计到访的总人数
  init[x][y][str2int[visit]] += 1
 #print(init[x][y][str2int[visit]])```

3.1)创建字典,时间离散化,节省时间

此处创建了三个字典,让我们看一下代码实现以及打印结果:

date2position = {}
datestr2dateint = {}
str2int = {}
for i in range(182):
 date = datetime.date(day=1, month=10, year=2018)+datetime.timedelta(days=i)
 #print(i,":",date)
 date_int = int(date.__str__().replace("-", ""))
 date2position[date_int] = [i%7, i//7]
 datestr2dateint[str(date_int)] = date_int
for i in range(24):
 str2int[str(i).zfill(2)] = i

打印一下 date2position:

python文本数据处理学习笔记详解

打印一下 datestr2dateint:

python文本数据处理学习笔记详解

打印str2int:

python文本数据处理学习笔记详解

可以看出,datestr2dateint是将str的日期,转换为了int的日期。
而date2position 才是计算出的每一个具体的日期,代表了第几周、第几天。
str2int代表了一天中的24个时刻。

3.2)读取文件,按行获取字符串

注意到文本的分隔符为\t(区分用户名与到访信息的分割),于是采用

f=open("D:\BaiDuBigData19-URFC-master\\UrbanRegionFunctionClassification-master\data\\train_visit\\000000_008.txt")
#table = pd.read_csv(f, header=None,error_bad_lines=False)
table = pd.read_csv(f, header=None,sep='\t')

然后用strings读取到访信息,也就是table的第二列:

strings = table[1]

3.3)切分字符串

首先,strings为:

python文本数据处理学习笔记详解

可以看到每一行string,为一个用户的到访记录,循环读取。其中,不同日期的到访是用“,”隔开,故要使用:

for string in strings:
 temp = []
 for item in string.split(','):

item就可以分开每一个日期的到访记录了:

python文本数据处理学习笔记详解

其后,使用temp列表,每一行存储日期和时刻。
如第一个item为 20181221&09|10|11|12|13|14|15
日期为 item[0:8],
时刻之间使用分隔符“|”隔开,故可以通过item[9:].split("|")得到。

temp.append([item[0:8], item[9:].split("|")])

打印一下temp为:

python文本数据处理学习笔记详解

所以需要用两个数据分别存储日期,以及时刻。
首先用来转换成 周、天、时刻的72624矩阵(根据前面的转换函数)
其后根据这个矩阵,统计每一个位置的访客数量

for date, visit_lst in temp:
 # x - 第几周
 # y - 第几天
 # z - 几点钟
 # value - 到访的总人数
 # print(visit_lst)
 #print(date)
 x, y = date2position[datestr2dateint[date]]
 for visit in visit_lst: # 统计到访的总人数
  init[x][y][str2int[visit]] += 1

这一段代码很短,但着实是整个时间离散化实现的精髓所在。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中利用Pandas库处理大数据的简单介绍
Apr 07 Python
PyCharm 常用快捷键和设置方法
Dec 20 Python
python实现kNN算法
Dec 20 Python
Python判断文件和字符串编码类型的实例
Dec 21 Python
flask入门之文件上传与邮件发送示例
Jul 18 Python
Python2 Selenium元素定位的实现(8种)
Feb 25 Python
15行Python代码实现网易云热门歌单实例教程
Mar 10 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
使用Python matplotlib作图时,设置横纵坐标轴数值以百分比(%)显示
May 16 Python
浅析PyCharm 的初始设置(知道)
Oct 12 Python
使用Python实现音频双通道分离
Dec 25 Python
python spilt()分隔字符串的实现示例
May 21 Python
python3+PyQt5 实现Rich文本的行编辑方法
Jun 17 #Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 #Python
python3+PyQt5 数据库编程--增删改实例
Jun 17 #Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 #Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
Jun 17 #Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
Jun 17 #Python
对PyQt5中树结构的实现方法详解
Jun 17 #Python
You might like
php中如何使对象可以像数组一样进行foreach循环
2013/08/09 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
两个listbox实现选项的添加删除和搜索
2013/03/01 Javascript
js相册效果代码(点击创建即可)
2013/04/16 Javascript
node+express+jade制作简单网站指南
2014/11/26 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
Avalonjs双向数据绑定与监听的实例代码
2017/06/23 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
JavaScript中的null和undefined用法解析
2019/09/30 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
Vue组件间数据传递的方式(3种)
2020/07/13 Javascript
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
对python的输出和输出格式详解
2018/12/08 Python
Python实现定时执行任务的三种方式简单示例
2019/03/30 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
Windows 下更改 jupyterlab 默认启动位置的教程详解
2020/05/18 Python
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
运动会解说词200字
2014/02/06 职场文书
学生周末回家住宿长期请假条
2014/02/15 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
化工专业自荐书
2014/06/16 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
三严三实心得体会范文
2014/10/13 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
2015年公司工作总结
2015/04/25 职场文书
开学第一周值周总结
2015/07/16 职场文书
服装店员工管理制度
2015/08/07 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python