@Author :Runsen

这是接的一单Python数据分析的,文件我删了,找不到了,不好意思


文章目录

  • 前言
  • 干他
  • 意外
  • 再干他
  • 反思


前言

大家好,我是润森。在很早之前,2020-03-29接到一个非常简单的单子,是重本大学大学生的作业,就是有test1和test2.csv

数据分析没有log 数据分析没有私活_数据分析

下图是test1的csv,数据比较多。

数据分析没有log 数据分析没有私活_数据分析_02

下图是test2的csv,数据比较少,一共12条数据。

数据分析没有log 数据分析没有私活_数据分析_03

他的要求是通过test1中的A列中有多个数据,使用A列中的F列减去对于的test2中的D列,再用A列中的G列减去对于的test2中的E列。
y
使用下面的计算数据分析没有log 数据分析没有私活_数据分析没有log_04,这里的数据分析没有log 数据分析没有私活_接单_05指的是test1列中的F列,数据分析没有log 数据分析没有私活_接单_06指的是test2列中的D列,数据分析没有log 数据分析没有私活_接单_07指的是test1列中的G列,数据分析没有log 数据分析没有私活_数据_08指的是test2列中的E列,

数据分析没有log 数据分析没有私活_数据分析没有log_09

看上去很简单,我就定价50,抽70%,拿个35块钱混日子。

干他

一开始遇到一个必须解决的问题,就是test1和test2的匹配的问题,怎么拿到数据分析没有log 数据分析没有私活_接单_05数据分析没有log 数据分析没有私活_接单_06数据分析没有log 数据分析没有私活_接单_07数据分析没有log 数据分析没有私活_数据_08

后来我想到了query来进行匹配的,这里的data1指的是test1的数据,a是我命令的columns,就是第一个。

数据分析没有log 数据分析没有私活_接单_14

query通过指定的匹配来增加对应的列,然后我就把多余的列删除,得到一个数据的结果

数据分析没有log 数据分析没有私活_数据_15

然后很轻松了计算出来了,在此我觉得我快马上完成,35块钱到手。

数据分析没有log 数据分析没有私活_接单_16

意外

意外发生了,他竟然隐瞒说有test1几千万条数据,test2几万条数据,不可能用query来进行匹配的,也就是我完成了几万条数据中的12条,我靠,开头怎么不说起请,我以为就是搞定这12条数据,35到手。

话说我是真的没有见过几千万条数据的csv,都快几百M以上,我觉得都有几g的内存,你能打开吗?

这老师真的变态,傻逼一个,几g的csv怎么处理啊啊,这坑爹的活,干嘛不丢进数据库啊啊。

再干他

技术我有,天下无敌,车怎么能翻,到手的35想跑?

既然query方法不行了,只好遍历判断了,想了半小时的,嗖的一声我就写完了,这样就不用写常常的00003E60F27C11E9C07422B6BC649DD3,代码如下。

import math
import pandas as pd
data1 = pd.read_csv("test1.csv",header = None)
data2 = pd.read_csv("test2.csv",header = None)
data2.columns = list("abcde")
data1.columns = list("abcdefgh")
result = []
id = []
def f(xi, xc):
    '''
    xi 是我们的列表
    xc 是我们固定值
    '''
    n = len(xi)
    sum = 0
    for i in xi:
        a = (i - xc) ** 2
        sum = sum + a
    return sum / n
def get_xi_xc(data1,data2):
    j = 0
    for i in data2['a']:
        print(i)
        data = data1[data1['a']==i]
        xc = data2.loc[j,'d']
        yc = data2.loc[j, 'e']
        xi = data.loc[:,'f'].values.tolist()
        yi = data.loc[:,'g'].values.tolist()
        a = math.sqrt(f(xi, xc) + f(yi, yc))
        result.append(a)
        id.append(i)
        j += 1
    return id,result

if __name__ == '__main__':
    data = pd.DataFrame()
    id, result = get_xi_xc(data1,data2)
    data["id"] = id
    data["result"] = result
    data.to_csv("result.csv")

运行下,OK, 搞定交货。

数据分析没有log 数据分析没有私活_数据分析没有log_17

结果他是能跑,但跑了机构小时,才跑完几千数据,一直叫我优化代码,加快数据。

去你的,可能我小白,真的没有见过数据分析优化代码的,如果是爬虫,我开多线程就可以了。

反思

效率之所以慢,就是一个找一个id需要在几千万的中的数据遍历,你他妈还有找几万次,几千万乘以几万次,这程序不崩怪,就是加速也是使用数据集上读取加速,csv没有听过,就算加速也只能加速numpy的代码。

还叫我一万一万的读取,这不是一样吗?卧槽,我为了35还给人骂了。要怪就怪你老师有病,我太菜了,自己搞不出来,毕竟一个几千万的数据的csv也是第一次看见,这种情况,还不扔进hadoop,来跑分布式。他终于跑了一天,跑了几十M的答案交差了。