龙空技术网

大数据时代之数据的获取和清洗

股海无涯2358 29

前言:

今天同学们对“php储存数据”都比较重视,同学们都想要知道一些“php储存数据”的相关内容。那么小编同时在网络上收集了一些有关“php储存数据””的相关资讯,希望我们能喜欢,看官们一起来了解一下吧!

前几天时间为了记录学习制作圆形玫瑰图,第一次在头条上用手机发了一点心得感受,之后有几个同学私信询问,为了统一解决大家的问题,我决定把这个过程从获取数据到绘图全过程,详细的写下来,方便大家参考,需要分几步,首先是获取数据,其次清洗处理数据,最后是绘图,因为我想把我认为重要的地方多说一点,让新手也能通过这几篇文章学会,亲身感受一下制作完成后的喜悦(复制代码和亲自敲的代码,你懂得;自己的孩子和别人家的孩子能一样吗),希望大家不要嫌我啰嗦。¶我是用python写的(python的好处这里就不赘述了),如果你是可爱的萌新,推荐你使用VS CODE作为工具来写代码,理由是1、免费,2、启动快,3、插件多,4、体积小,5、大厂出品,同时最好也安装上jupyter lab,二个软件齐活,下面正式开始前先介绍三个python中很重要的数据形式(我这样叫的),一定要记住:1、tuple,元组,用()表示,特点是不可变,不能修改,一结婚就是一辈子2、list,列表,用[]表示,特点是可变,分手、复合都允许,下同3、dict,字典,用{}表示;特点是可变这三个很重要!很重要!很重要!

# 导入需要的第三方库,作用自行搜索,安装命令pip install requestsimport requests# 下面二个是python自带的库,不用安装,一个是时间,一个是随机数import timeimport random
在此必须为网易点赞,理由一、免费提供数据下载,二、数据规整,不像有些装逼犯公司,把数据藏在字符串中,害人费眼首先打开网址

按照图片上的提示操作就行

上图这里的这个网址才是我们需要的

请求头中的内容,方框中的在这儿用就行,有的网站还需要带上cookie,灵活掌握吧

我们把这个网址复制下来,其中几个主要的参数已经在上图中说明了,其它的参数不动就行,也可以删减部分不需要的,比如LB、WB之类的

url = ';page=0&query=PLATE_IDS:hy009000&fields=NO,SYMBOL,NAME,PRICE,PERCENT,UPDOWN,FIVE_MINUTE,OPEN,YESTCLOSE,HIGH,LOW,VOLUME,TURNOVER,HS,LB,WB,ZF,PE,MCAP,TCAP,MFSUM,MFRATIO.MFRATIO2,MFRATIO.MFRATIO10,SNAME,CODE,ANNOUNMT,UVSNEWS&sort=PERCENT&order=desc&count=24&type=query'headers = {    'Host': 'quotes.money.163.com',    'Referer': ';,    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36'}html = requests.get(url=url, headers=headers)datas = html.json()
在用get请求数据时一定要带上headers这个参数,无论网站是否需要,都要养成这个好习惯,如果你直接就一个URL,有点一丝不挂赤裸着向别人借东西的感觉,不仅玷污了人家的眼睛,也亵渎了自己,尊重很重要!设想一下,假如有一人骑个破自行车用力撞开你家大门,并大喊一声“我来了!”,你心里是啥感觉?

请求头的格式基本都是这样子(在selenium中不是这种格式),因为返回给我们的是json格式的数据,所以在用datas接收时后面要加上json(),如果是字符串类型的是text

# 把得到的数据统一添加到列表中content = []# 提取列表中的数据,当然也可以用jsonpathfor data in datas['list'][:10]:    name = data['NAME']    percent = round(data['PERCENT']*100,2)  # 因为原始数据中是浮点类型    content.append(name + '\t' + str(percent) + '\t')    print(name, percent)

由于我们得到的是json数据,就是字典+列表,相互嵌套的,信息技术版块共有398支股票

,而我们只需要前后10个,所以在这儿用了[:10],这是python中切片式取值的方法,意思是取前10个数;字典的取值方法是key:value格式,这里我们只取其名称和涨跌幅,所以就data['NAME']和round(data['PERCENT']*100,2),round是向上取值的意思,第二个参数是决定留下几位小数,因为返回的数据是0.xxxxxx的浮点类型数据,正常咱们都是按百分比看的,所以*100,这一句代码就是为了符合我们日常的习惯;结果如下:

南凌科技 19.99初灵信息 19.98吴通控股 19.95兆日科技 16.15*ST邦讯 12.7赢时胜 12.56中嘉博创 10.12德生科技 10.03深南股份 10.0生 意 宝 9.98

添加到content列表中是如下的内容:

['南凌科技\t19.99\t', '初灵信息\t19.98\t', '吴通控股\t19.95\t', '兆日科技\t16.15\t', '*ST邦讯\t12.7\t', '赢时胜\t12.56\t', '中嘉博创\t10.12\t', '德生科技\t10.03\t', '深南股份\t10.0\t', '生 意 宝\t9.98\t']
至此已经基本上完成了数据的准备工作,下面就是要保存到文件中,由于我们只需要上涨和下跌前十名的数据,怎么获取这个数据呢?有的同学说全部下载保存后取最后10个,这样也可以,不过有点浪费,因为我们总共只需要前后共20条的数据,全部保存要17页398条数据(你也可以自己试着全部保存下来,当作练习了),为了减省节约,再说网易是一个有良心的网站,给我们提供了解决这个问题的途径,就是在网址中那个负责升降的order,你自己试试看能否发现?下面我们开始构造解决这个问题的方式,如果你有了更好的方法请一定要留言告诉我哟¶
# 我们在这儿封装一个函数,这样做的好处是便于批量处理数据,也有利于我们自己管理代码def parse_data(link, spe):    html = requests.get(url=link, headers=headers)# 这一句的意思是随机在0.5--1.2秒之间取值,在向服务器发送请求时的暂停时间,防止反爬    time.sleep(random.uniform(0.5, 1.2))    datas = html.json()# 这一句是提取返回的数据中的日期,方便我们在保存文件时写入文件名    datetime = datas['time'].split(' ')[0]    content = []    for data in datas['list'][:10]:        name = data['NAME']        percent = round(data['PERCENT']*100, 2)	  	# 主要是str(percent),由于Python中不允许字符串+数值混合,所以把浮点类型的转换成字符串类型        content.append(name + '\t' + str(percent) + '\t')    #  为了方便保存在这儿也给文件名构建一个字典    title = {'desc':f'{datetime}涨幅前十.csv', 'asc': f'{datetime}跌幅前十.csv'}        # 保存数据到本地    with open(title[spe], mode='w', encoding='utf-8') as f:        f.write(''.join(content))    print(title[spe])# 创建一个字典,解决涨跌前十的问题,dese是降序,是涨幅在前,asc是跌幅在前order = {1:'desc',2:'asc'}# 通过循环,先取涨幅前十名,再取跌幅前十名的数据for num in range(1, 3):    spe = order[num]	# 因为网址中间有变量,所以在前面用了f来格式化,也可以在网址后面写成.format(spe)    base_url = f';page=0&query=PLATE_IDS:hy009000&fields=NO,SYMBOL,NAME,PRICE,PERCENT,UPDOWN,FIVE_MINUTE,OPEN,YESTCLOSE,HIGH,LOW,VOLUME,TURNOVER,HS,LB,WB,ZF,PE,MCAP,TCAP,MFSUM,MFRATIO.MFRATIO2,MFRATIO.MFRATIO10,SNAME,CODE,ANNOUNMT,UVSNEWS&sort=PERCENT&order={spe}&count=24&type=query'   	 # 启动函数,并传入两个变量,这里link=base_url,spe=spe		parse_data(base_url,spe)# 结果2022-02-03涨幅前十.csv2022-02-03跌幅前十.csv
我们把获取数据的代码封装成一个函数后,有心的你也许发现原来用不了几行代码;第一篇数据的获取到此就结束了,俗话说,授人以鱼不如授人以渔,方法和过程都有了,随下来时可以练习一下,如果想把全部行业或者沪深两市4000多支的股票当日的数据保存到本地怎么办呢?留言告诉我你的思路吧;下一篇介绍下pandas处理数据的一些日常操作,学会就可以高效的处理工作中的90%左右的问题;有些同学可能会说,工作中会EXCEL就行了,这么说也对,但也不全对,因为excel在处理100行几列以内的数据时还可应对,数据量也大,比如几千行以上,就不说数十万行了,电脑配置一般的话能气死你,前提还需要你会数组和VBA,如果你只会正常的几个普通函数,如vlookup、sum、rank等等,只能说刚入门excel,pandas比excel强的可不是一星半点,具体的下篇细说。

标签: #php储存数据