您的位置:首页 > 编程语言 > Python开发

利用Python进行数据分析系列之——数据格式转换

2016-11-04 01:43 405 查看
待我学有所成,结发与蕊可好。@夏瑾墨 by Jooey

需求:
OD_Matrix_Weekday_BusyHourAM.csv
转换成
OD_Matrix_Weekday_BusyHourAM.json


在数据可视化中,OD弦图要求以百分比的输入格式,也可以用具体的客流数值,但是需要修改一下绘图的js脚本。由于目前数据处理的结果主要是二维表形式的csv,与弦图要求的输入格式不一致,所以这里按照需求先进行额外的数据格式转换,OD_Matrix_Weekday_BusyHourAM.json 是站点之间的OD流量,这个例子json文件中每一行表示该站点到其他各个站点的客流占总客流的百分百,所以都是很小的数值。



json数据格式:二维数据,且每个数值为改站点对之间客流所占的百分百。

进行格式转换:从二维表–>二维数组



实现:下面讲方法:

#List.py    数据格式转换的python脚本
import sys  #导入系统相关的信息模块
import csv  #导入csv模块读取写入csv文件数据
myList = [([0] * 42) for i in range(42)]  #定义一个列表
x=0
y=0
sum = 0
with open(sys.argv[1]) as f:  #使用sys.argv[0]采集脚本名称
f_tsv = csv.reader(f, delimiter='\t')  #读取csv文件
headers = next(f_tsv)
for row in f_tsv:
x = int(row[0]) #使用下标访问myList列表的第1个字段
y = int(row[1]) #使用下标访问myList列表的第2个字段
if x > 30 :
x = x-10
if y > 30 :
y = y -10
myList[x-1][y-1]=row[2]
sum = sum + int(row[2])
#print ("%f",myList)

for i in range(42):
for j in range(42):
#myList[i][j]='{0:.10f}'.format(float(myList[i][j])/sum)
myList[i][j]=(float(myList[i][j])/sum) #输出浮点型
print myList


在同一文件路径下,执行以下命令完成数据转换:

python list.py OD_Matrix_Weekday_BusyHourAM.csv >OD_Matrix_Weekday_BusyHourAM.json


涉及的相关背景知识总结:

1.CSV模块是Python的内置模块,
Import csv


就可以调用,CSV模块主要就两个函数:csv.reader()——读取csv文件数据,csv.writer()——写入csv文件数据。csv产生的数据都是字符串类型的,它不会做任何其他类型的转换。

2. use “\t” for delimiter 进行分界

3. 数据结构的推导式(List comprehension),也叫列表的解析式。比如现在我有41个元素要装进列表中,普通的写法是这样的:

a=[]
for i in range(1,42):
a.append(i)


下面换成列表解析的方式来写:

a = [i in range(1,42)]


后者执行效率高,我们用
time clock()
方法,以浮点数计算的秒数返回当前的CPU时间。用来衡量不同程序的耗时,比time.time()更好用。但是这里有一点要注意,在不同的系统上含义不同。在UNIX系统上,它返回的是”进程时间”,它是用秒表示的浮点数(时间戳)。而在WINDOWS中,第一次调用,返回的是进程运行的实际时间。而第二次之后的调用是自第一次调用以后到现在的运行时间。(实际上是以WIN32上QueryPerformanceCounter()为基础,它比毫秒表示更为精确)

1.列表推导式的用法:

List=[item for item in iterable]
a=[i**2 for in range(1,10)]
b=[j+i for j in range(1,10)]
k=[n for n in range(1,10) if n % 2==0]
z=[letter.lower() for letter in 'ABCDEFGH']


2.字典推导式用法:

d={i:i+1 for in range(4)}
g={i:j for i,j in zip(range(1,6),'abcde')}
g={i:j.upper() for i,j in range(1,6),abcde''}


3.用来衡量比较这两种方式程序的耗时

import time
a=[]
t0=time.clock()
for i in range(1,2000000):
a.append(i)
print(time.clock() - t0,'seconds process time')

t0=time.clock()
b=[i for i in range(1,2000000)]
print(time.clock() - t0,'seconds process time')


得到结果:



参考资料

1.Python3-cookbook6.1 读写CSV数据

http://python3-cookbook.readthedocs.io/zh_CN/latest/c06/p01_read_write_csv_data.html

2.Python学习笔记——csv模块读写数据

http://www.360doc.com/content/14/0707/10/16740871_392565773.shtml

3.python: import csv file (delimiter “;” or “,”)

http://stackoverflow.com/questions/16312104/python-import-csv-file-delimiter-or
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息