数据处理 —— 出租车gps提取订单数据

1. 需求目的:

约5千万条出租车gps数据存储在mysql中,数据按照一定时间频率记录,想要获取出其中的订单数量。

(数据示例)
在这里插入图片描述

2. 思路分析

plate_number是车牌号,state=1表示车上有人。数据先按照车辆分组,然后按时间排序,最后选出连续的序列state=1作为一个订单

3. 实践

3.1 sql合并数据

由于数据在mysql中被分成了200+个表,有两种处理方式:

  1. 分别处理每个表获得每个车牌号数据,再按车牌号合并
  2. 先把表合并成大表,直接整体处理获得每个车牌号数据(used in my project

2021.10.30
需求:一天的出租车轨迹表被成了几百个表,需要将这些表合并
思路:读出这个数据库中所有的表名,循环将所有表合并到一个新表中(使用存储过程)
学习过程

  1. 两个表垂直拼接的方法
# 两个表之间的连接查询,但是会删除两个表中的重复数据`
select * from table union select * from table2
两个表之间的连接查询,不删除两个表中的重复数据`
select * from table union all select * from table2

comment:这样子写200+个句子不不现实,应该使用循环或者直接获取数据库中的表名

存储过程

DELIMITER $$

USE `taxigps`$$

DROP PROCEDURE IF EXISTS `test11`$$

CREATE DEFINER=`root`@`%` PROCEDURE `test11`()
BEGIN
        DECLARE stopflag INT DEFAULT 0;
        DECLARE tablename VARCHAR(64);
        -- 创建一个游标变量,declare 变量名 cursor ...
        DECLARE tablename_cur CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema='taxigps' AND table_name != 'taxi';
        -- 游标是保存查询结果的临时区域
        -- 游标变量username_cur保存了查询的临时结果,实际上就是结果集
        -- 当游标变量中保存的结果都查询一遍(遍历),到达结尾,将变量stopflag设置为1,用于循环中判断是否结束
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET stopflag=1;
 
        OPEN tablename_cur; -- 打卡游标
        FETCH tablename_cur INTO tablename; -- 游标向前走一步,取出一条记录放到变量username中
#        SELECT tablename,000;
        WHILE(stopflag=0) DO -- 如果游标还没有结尾,就继续
            BEGIN 
                -- 在用户名前门拼接 '_cur' 字符串
                SET @sql = CONCAT('insert into taxi SELECT * FROM ',tablename);
		PREPARE ss FROM @sql;
		EXECUTE ss;
                
                #INSERT INTO taxi SELECT * FROM trablename;
                FETCH tablename_cur INTO tablename;
            END;
        END WHILE; -- 结束循环
        CLOSE tablename_cur; -- 关闭游标
	END$$

DELIMITER ;

3.2 按车牌号分组

"""
@author:HY
@time:2021/10/31:14:51
"""
from threading import Thread
import threading
from time import sleep, ctime
import pandas as pd
import time
import pickle


def solve_file(name, file):
    for index, row in file.iterrows():
        date, taxi_time, _, plate_number, lng, lat, _, _, state, _ = row
        if plate_number in taxi_dic.keys():
            taxi_dic[plate_number][taxi_time] = state
        else:
            taxi_dic[plate_number] = {
   taxi_time: state}


df = pd.read_csv('test.csv', header=None, sep='\t')
# df = pd.read_csv('20160920_taxigps.csv', header=None, sep='\t')

line_num = len(df)
taxi_dic = {
   }
time1 = time.time()

thread_num = 1
for i in range(thread_num):
    i = i + 1
    exec('divide_file' + str(i) + '  = int(line_num * ' + str(i) + '  / thread_num)')
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值