美文网首页
多思路解决数据分析问题

多思路解决数据分析问题

作者: 李美东 | 来源:发表于2019-01-18 23:53 被阅读0次

昨天朋友找我,让我帮我给她处理几个数据,然后就给了我原始数据的excel表格:

部分原始数据截图

下边来解释下,表格中数据含义。第一列‘序号’,自动生成,不用管;

A列,B列,数据为后边的列名,比如第一行数据,A的值为1,这个‘1’就是后边的列名为‘1’的数据,就是9,B的值为4,这个4就是后边列名为‘4’的数值,就是9;

‘I’列,这里暂时没用到,先不用管了;

需求,除了‘编号’、‘A’、‘B’、‘I’列,以及 ‘A’、‘B’ 对应数值所占用的列以外,在剩余的列中(这里是25列),每次随机取两列,计算出所有组合,把组合的列名以及列对应的数据导出。


好了 需求定了,下一步就是漫长的解决方案之路:

第一次,EXCEL直接解决,

 我分析了表格的数据,如果用Excel的随机函数,太麻烦(好像也实现不了),每一行的组合是 25x24=600 个可能的组合;生成的时候还要考虑第一个 和第二个取到的是否一样,这不现实,果断放弃;

第二次,mysql数据库工具直接处理:

正好之前下载了数据库工具,Navicat ,直接把数据导入,

Excel数据导入数据库

我思考了一下,其实现在要做的就是 从27列中,依次取两列,保证这两列不相同,同时也不是A、B两列中的数据即可;所以现在要做的就是循环取数据,这里有个很巧的地方是 要用的列名正好是数字,试了一下,SELECT `13` FROM `3D-澳利华-地表`; 嗯,是没有问题的;

搜索一列试试

接下来就是写循环语句,上网查了一下 原来是一个 存储过程,先查一行试试

 drop procedure if exists pppppp; 

delimiter //                                 

create procedure pppppp()                 

begin

  declare num int DEFAULT 1;                                           

     WHILE num < 10 DO

   SELECT num FROM `3D-澳利华-地表` LIMIT 1;

    SET num = num + 1;

 END WHILE; 

 COMMIT;

 end //

 CALL  pppppp(); 

存储过程

很显然,查到的结果不对,我想要的是是第N 行数据,这里返回的直接是 N。怀疑是 num这个 没有加反引号导致,再试

drop procedure if exists pppppp; 

delimiter //                                 

create procedure pppppp()                 

begin

  declare num int DEFAULT 1;                                           

     WHILE num < 27 DO

   SELECT `num` FROM `3D-澳利华-地表` LIMIT 1;

    SET num = num + 1;

 END WHILE; 

 COMMIT;

 end //

 CALL  pppppp(); 

存储过程

很显然 还是不对,问了相关朋友,让我试试`@num`,@`num`,均以失败告终;这第一步都都不通,剩下的都不用说了,放弃;

第三次,PHP导入

数据已经导入本地数据库,正好机器上有 PhpStorm,写代码导入数据;

public function eat(){

    $this->load->database();

    $error =$this->db->error();

    $query =$this->db->query('SELECT * FROM `3D-澳利华-地表`');

    if(!$query){

        echo 'database connect failed';

    } else {

        echo  json_encode($query->result());

    }

}

PHP代码

 浏览器 先看一下效果,

浏览器效果图

 有数据,但是仔细看,不太对,只取到了前四列,也就是列名不是数字的列,列名为数字的列一个没有,问了一下别人,说可能列名为数字,取数据的时候 集合的下标也是数字,所以取不到,朋友建议我改为字母,比如每个前边加A,‘1’变为‘A1’。

改,同时我把表名也改了,改为英文字母的,

数据库改列名后

再重新搜索,

public function eat(){

    $this->load->database();

    $error =$this->db->error();

    $query =$this->db->query('SELECT * FROM DIAOHUA');

    if(!$query){

        echo 'database connect failed';

    } else {

        echo  json_encode($query->result());

    }

}

PHP代码修改后

结果

浏览器显示

这回就没有问题了,数据都有。

本来是打算用php直接实现来的,奈何初学,玩不转,还是用自己熟悉的Objective-c来实现吧

直接上代码吧,获取到数据后的 数据分析实现,还是先拿一条数据实验:

-(void)dealData{

    int count=1;

        NSDictionary * dic =[self.dataArray objectAtIndex:0];

        int keyCount=dic.allKeys.count;

        for(int i=0;i

            for(int j=0;j

                if(i!=j){

                    NSString * iKey =dic.allKeys[i];

                    NSString * jKey =dic.allKeys[j];

                    id a = dic[@"A"];

                    id b = dic[@"B"];

                    NSString * aValue =[NSString stringWithFormat:@"A%@",a];

                    NSString * bValue =[NSString stringWithFormat:@"A%@",b];

                    if([iKey isEqualToString:@"A"]||[iKey isEqualToString:@"B"]||[iKey isEqualToString:@"I"]||[iKey isEqualToString:@"序号"]||[iKey isEqualToString:aValue]||[iKey isEqualToString:bValue]||[jKey isEqualToString:@"A"]||[jKey isEqualToString:@"B"]||[jKey isEqualToString:@"I"]||[jKey isEqualToString:@"序号"]||[jKey isEqualToString:aValue]||[jKey isEqualToString:bValue]){

                    }

                    else{

                        id iValue = dic[iKey];

                        id jValue = dic[jKey];

                        NSLog(@"%i A:%@ B:%@ M:%@ N:%@ %@ %@ \n",count,a,b,[iKey stringByReplacingOccurrencesOfString:@"A" withString:@""],[jKey stringByReplacingOccurrencesOfString:@"A" withString:@""],iValue,jValue);

                        count = count+1;

                    }

                }

            }

        }

}

ios代码

控制台输出结果:

打印台结果

正好600条,应该是没有问题的。

下一步就是导出,上网查到最简单的就是 控制台输出为日志:

 NSString *homeDir = NSHomeDirectory();

    NSLog(@"%@",homeDir);

    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

    NSString *documentDirectory =[paths objectAtIndex:0];

    NSString *fileName =[NSString stringWithFormat:@"dr.log"];//注意不是NSData!

    NSString *logFilePath =[documentDirectory stringByAppendingPathComponent:fileName];

    //先删除已经存在的文件

    NSFileManager *defaultManager =[NSFileManager defaultManager];

    [defaultManager removeItemAtPath:logFilePath error:nil];

    //将log输入到文件

    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stdout);

    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr);

iOS代码

再运行:

控制台输出

输出也没有问题,问了一下,最后想要的还是excel表格数据,重新导出:

-(void)createXLSFile {

    //创建存放XLS文件数据的数组

    NSMutableArray  *xlsDataMuArr =[[NSMutableArray alloc]init];

    //第一行内容

    [xlsDataMuArr addObject:@"num"];

    [xlsDataMuArr addObject:@"A"];

    [xlsDataMuArr addObject:@"B"];

    [xlsDataMuArr addObject:@"M"];

    [xlsDataMuArr addObject:@"N"];

    [xlsDataMuArr addObject:@"MValue"];

    [xlsDataMuArr addObject:@"NValue"];

    int columnCount = xlsDataMuArr.count;

    //加入数据;

    int count=1;

    //        NSDictionary * dic =[self.dataArray objectAtIndex:0];

    for(NSDictionary * dic in self.dataArray){

        int keyCount=dic.allKeys.count;

        for(int i=0;i

            for(int j=0;j

                if(i!=j){

                    NSString * iKey =dic.allKeys[i];

                    NSString * jKey =dic.allKeys[j];

                    id a = dic[@"A"];

                    id b = dic[@"B"];

                    NSString * aValue =[NSString stringWithFormat:@"A%@",a];

                    NSString * bValue =[NSString stringWithFormat:@"A%@",b];

                    if([iKey isEqualToString:@"A"]||[iKey isEqualToString:@"B"]||[iKey isEqualToString:@"I"]||[iKey isEqualToString:@"序号"]||[iKey isEqualToString:aValue]||[iKey isEqualToString:bValue]||[jKey isEqualToString:@"A"]||[jKey isEqualToString:@"B"]||[jKey isEqualToString:@"I"]||[jKey isEqualToString:@"序号"]||[jKey isEqualToString:aValue]||[jKey isEqualToString:bValue]){

                    }

                    else{

                        id iValue = dic[iKey];

                        id jValue = dic[jKey];

                        NSLog(@"%i A:%@ B:%@ M:%@ N:%@ %@ %@ \n",count,a,b,[iKey stringByReplacingOccurrencesOfString:@"A" withString:@""],[jKey stringByReplacingOccurrencesOfString:@"A" withString:@""],iValue,jValue);

                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%i",count]];

                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%@",a]];

                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%@",b]];

                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%@",[iKey stringByReplacingOccurrencesOfString:@"A" withString:@""]]];

                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%@",[jKey stringByReplacingOccurrencesOfString:@"A" withString:@""]]];

                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%@",iValue]];

                        [xlsDataMuArr addObject:[NSString stringWithFormat:@"%@",jValue]];

                        count = count+1;

                    }

                }

            }

        }

    }

    //把数组拼接成字符串,连接符是 \t(功能同键盘上的tab键)

    NSString *fileContent =[xlsDataMuArr componentsJoinedByString:@"\t"];

    //字符串转换为可变字符串,方便改变某些字符

    NSMutableString *muStr =[fileContent mutableCopy];

    //新建一个可变数组,存储每行最后一个\t的下标(以便改为\n)

    NSMutableArray *subMuArr =[NSMutableArray array];

    for(int i = 0;i < muStr.length;i ++){

        NSRange range =[muStr rangeOfString:@"\t" options:NSBackwardsSearch range:NSMakeRange(i,1)];

        if(range.length == 1){

            [subMuArr addObject:@(range.location)];

        }

    }

    //替换末尾\t

    for(NSUInteger i = 0;i < subMuArr.count;i ++){

        if(i > 0 &&(i%columnCount == 0)){

            [muStr replaceCharactersInRange:NSMakeRange([[subMuArr objectAtIndex:i-1]intValue],1)withString:@"\n"];

        }

    }

    //文件管理器

    NSFileManager *fileManager =[[NSFileManager alloc]init];

    //使用UTF16才能显示汉字;如果显示为#######是因为格子宽度不够,拉开即可

    NSData *fileData =[muStr dataUsingEncoding:NSUTF16StringEncoding];

    //文件路径

    NSString *path = NSHomeDirectory();

    NSString *filePath =[path stringByAppendingPathComponent:@"/Documents/export.xls"];

    NSLog(@"文件路径:\n%@",filePath);

    //生成xls文件

    [fileManager createFileAtPath:filePath contents:fileData attributes:nil];

}

iOS 代码1 iOS代码2 iOS代码3

最后结果:

最后结果

340x600 = 204000数据也没有问题。

整个过程就是这样的,有点坎坷,整体来说还是比较顺利的。做完之后的感觉就是,嗯,好久没有遇到这么有意思的问题了,再就是遇到问题,不要轻易说放弃,一条路走不通,还有其他道路可以走,思路要灵活,多变,善于借助各种开发工具。平时应该广泛涉猎,各个技术层面多少都要看一点,关键时候还是可以派上用场的。

相关文章

  • 多思路解决数据分析问题

    昨天朋友找我,让我帮我给她处理几个数据,然后就给了我原始数据的excel表格: 下边来解释下,表格中数据含义。第一...

  • 练习笔记

    练习200个基本数据机构及算法问题 解答思路: 分析问题的解决方案; 设计解决问题的方法及结构; 设计使用的算法及...

  • 数据问题分析思路

    近两天遇到一个问题,vivo手机的广告推送点击率低于其它的机型,为什么呢? 在国内手机市场中,最主流的机型为华为、...

  • 2.1系统性分析问题SGCS

    任何时候,我们都要面对和解决无数问题,拥有一套正确分析问题,解决问题的思路至关重要。本文阐述系统性分析问题的思路,...

  • 在线教育描述性统计分析报告

    确定分析思路 在进行数据分析之前,先确定本次分析思路,具体如下 一、提出问题 二、理解数据数据来源:https:/...

  • 数据分析思路从哪来

    成都科多大数据助你起航! 对于数据分析,很多人都发愁分析思路的问题,经常面对一堆数据没有思路。其实这个问题可以从两...

  • 088:找亮点解决问题法

    常规解决问题的思路:发现问题,分析问题,找到背后的原因,解决问题。 另一个解决问题的思路:不找根本原因,找亮点。 ...

  • 数据分析之分析问题和解决问题的思路

    RT 第一步 定义问题 1.首先,要搞清问题的实质,准确、完整、真实地表达问题。 2.其次,要弄清楚为什么要解决这...

  • 2021-08-07

    ####关于备份 1、数据多备份,包括原始数据,分析过程中的结果文件,原始数据应多备几份 2、分析思路需整理备份

  • 数据挖掘,如何操作?(编号99---1000天计划)

    数据挖掘,最重要的,就是思路。 要想清楚5W2H: 1W. 做分析要解决什么问题(Why),即:原因(Why)——...

网友评论

      本文标题:多思路解决数据分析问题

      本文链接:https://www.haomeiwen.com/subject/rsyodqtx.html