@Author :Runsen
这是接的一单Python数据分析的,文件我删了,找不到了,不好意思
文章目录
- 前言
- 干他
- 意外
- 再干他
- 反思
前言
大家好,我是润森。在很早之前,2020-03-29接到一个非常简单的单子,是重本大学大学生的作业,就是有test1和test2.csv
下图是test1的csv,数据比较多。
下图是test2的csv,数据比较少,一共12条数据。
他的要求是通过test1中的A列中有多个数据,使用A列中的F列减去对于的test2中的D列,再用A列中的G列减去对于的test2中的E列。
y
使用下面的计算,这里的
指的是test1列中的F列,
指的是test2列中的D列,
指的是test1列中的G列,
指的是test2列中的E列,
看上去很简单,我就定价50,抽70%,拿个35块钱混日子。
干他
一开始遇到一个必须解决的问题,就是test1和test2的匹配的问题,怎么拿到,
,
,
后来我想到了query来进行匹配的,这里的data1指的是test1的数据,a是我命令的columns,就是第一个。
query通过指定的匹配来增加对应的列,然后我就把多余的列删除,得到一个数据的结果
然后很轻松了计算出来了,在此我觉得我快马上完成,35块钱到手。
意外
意外发生了,他竟然隐瞒说有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, 搞定交货。
结果他是能跑,但跑了机构小时,才跑完几千数据,一直叫我优化代码,加快数据。
去你的,可能我小白,真的没有见过数据分析优化代码的,如果是爬虫,我开多线程就可以了。
反思
效率之所以慢,就是一个找一个id需要在几千万的中的数据遍历,你他妈还有找几万次,几千万乘以几万次,这程序不崩怪,就是加速也是使用数据集上读取加速,csv没有听过,就算加速也只能加速numpy的代码。
还叫我一万一万的读取,这不是一样吗?卧槽,我为了35还给人骂了。要怪就怪你老师有病,我太菜了,自己搞不出来,毕竟一个几千万的数据的csv也是第一次看见,这种情况,还不扔进hadoop,来跑分布式。他终于跑了一天,跑了几十M的答案交差了。