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每次处理固定个数的字符的方法总结
Jan 29 Python
python二叉树遍历的实现方法
Nov 21 Python
python简单分割文件的方法
Jul 30 Python
详解python之简单主机批量管理工具
Jan 27 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
Nov 21 Python
python spyder中读取txt为图片的方法
Apr 27 Python
Python3简单爬虫抓取网页图片代码实例
Aug 26 Python
Django REST Framework之频率限制的使用
Sep 29 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
Dec 13 Python
根据tensor的名字获取变量的值方式
Jan 04 Python
python+requests接口自动化框架的实现
Aug 31 Python
如何基于Python和Flask编写Prometheus监控
Nov 25 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实现小型站点广告管理(修正版)
2006/10/09 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
2021/03/09 PHP
JS的IE和Firefox兼容性集锦
2006/12/11 Javascript
javascript css float属性的特殊写法
2008/11/13 Javascript
将函数的实际参数转换成数组的方法
2010/01/25 Javascript
js不能跳转到上一页面的问题解决方法
2013/03/01 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
JS动态修改iframe高度和宽度的方法
2015/04/01 Javascript
javascript解析xml实现省市县三级联动的方法
2015/07/25 Javascript
jQuery+CSS3实现四种应用广泛的导航条制作实例详解
2016/09/17 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
d3.js实现简单的网络拓扑图实例代码
2016/11/06 Javascript
JS中from 表单序列化提交的代码
2017/01/20 Javascript
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
微信小程序实现之手势锁功能实例代码
2018/07/19 Javascript
解决node-sass偶尔安装失败的方法小结
2018/12/05 Javascript
学习node.js 断言的使用详解
2019/03/18 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
浅谈实现在线预览PDF的几种解决办法
2020/08/10 Javascript
vue组件实现移动端九宫格转盘抽奖
2020/10/16 Javascript
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
[01:10:27]DOTA2-DPC中国联赛正赛 SAG vs XG BO3 第二场 3月5日
2021/03/11 DOTA
python查找指定具有相同内容文件的方法
2015/06/28 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
Speedo速比涛德国官方网站:世界领先的泳装品牌
2019/08/26 全球购物
长辈证婚人证婚词
2014/01/09 职场文书
诚信承诺书范文
2014/03/27 职场文书
运动会方队口号
2014/06/07 职场文书
初中优秀学生评语
2014/12/29 职场文书
遗愿清单观后感
2015/06/09 职场文书
python数字转对应中文的方法总结
2021/08/02 Python