精华内容
下载资源
问答
  • 总体来说,我们需要先对天气网中的天气数据进行爬取,保存为csv文件,并将这些数据进行可视化分析展示。 拆解需求,大致可以整理出我们需要分为以下几步完成: 通过爬虫获取中国天气网7.20-7.21的降雨数据,包括...

    前言

    今天我们分享一个小案例,获取天气数据,进行可视化分析,带你直观了解天气情况!

    一、核心功能设计

    总体来说,我们需要先对中国天气网中的天气数据进行爬取,保存为csv文件,并将这些数据进行可视化分析展示。

    拆解需求,大致可以整理出我们需要分为以下几步完成:

    1. 通过爬虫获取中国天气网7.20-7.21的降雨数据,包括城市,风力方向,风级,降水量,相对湿度,空气质量
    2. 对获取的天气数据进行预处理,分析河南的风力等级和风向,绘制风向风级雷达图
    3. 根据获取的温度和湿度绘制温湿度相关性分析图,进行温度、湿度对比分析。
    4. 根据获取的各城市的降雨量,可视化近24小时的每小时时段降水情况
    5. 绘制各城市24小时的累计降雨量

    二、实现步骤

    1. 爬取数据

    首先我们需要获取各个城市的降雨数据,通过对中国天气网网址分析发现,城市的天气网址为:http://www.weather.com.cn/weather/101180101.shtml。

    在这里插入图片描述

    根据对数据分析,返回的json格式数据,不难发现:

    • 101180101就是代表城市编号
    • 7天的天气预报数据信息在div标签中并且id=“7d”
    • 日期、天气、温度、风级等信息都在ul和li标签

    网页结构我们上面已经分析好了,那么我们就可以来动手爬取所需要的数据了。获取到所有的数据资源之后,可以把这些数据保存下来。

    请求网站:

    天气网的网址:http://www.weather.com.cn/weather/101180101.shtml。如果想爬取不同的地区只需修改最后的101180101地区编号,前面的weather代表是7天的网页。

    def getHTMLtext(url):
    	"""请求获得网页内容"""
    	try:
    		r = requests.get(url, timeout = 30)
    		r.raise_for_status()
    		r.encoding = r.apparent_encoding
    		print("Success")
    		return r.text
    	except:
    		print("Fail")
    		return" "
    

    在这里插入图片描述

    处理数据:

    采用BeautifulSoup库对刚刚获取的字符串进行数据提取。获取我们需要的风力方向,风级,降水量,相对湿度,空气质量等。

    def get_content(html,cityname):
    	"""处理得到有用信息保存数据文件"""
    	final = []  							 # 初始化一个列表保存数据
    	bs = BeautifulSoup(html, "html.parser")  # 创建BeautifulSoup对象
    	body = bs.body
    	data = body.find('div', {'id': '7d'})    # 找到div标签且id = 7d
    	# 下面爬取当天的数据
    	data2 = body.find_all('div',{'class':'left-div'})
    	text = data2[2].find('script').string
    	text = text[text.index('=')+1 :-2]		 # 移除改var data=将其变为json数据
    	jd = json.loads(text)
    	dayone = jd['od']['od2']				 # 找到当天的数据
    	final_day = []						     # 存放当天的数据
    	count = 0
    	for i in dayone:
    		temp = []
    		if count <=23:
    			temp.append(i['od21'])				 # 添加时间
    			temp.append(cityname+'市')			# 添加城市
    			temp.append(i['od22'])				 # 添加当前时刻温度
    			temp.append(i['od24'])				 # 添加当前时刻风力方向
    			temp.append(i['od25'])				 # 添加当前时刻风级
    			temp.append(i['od26'])				 # 添加当前时刻降水量
    			temp.append(i['od27'])				 # 添加当前时刻相对湿度
    			temp.append(i['od28'])				 # 添加当前时刻控制质量
    # 			print(temp)
    			final_day.append(temp)
    			data_all.append(temp)
    		count = count +1
    	# 下面爬取24h的数据
    	ul = data.find('ul')                     # 找到所有的ul标签
    	li = ul.find_all('li')                   # 找到左右的li标签
    	i = 0                                    # 控制爬取的天数
    	for day in li:                          # 遍历找到的每一个li
    	    if i < 7 and i > 0:
    	        temp = []                        # 临时存放每天的数据
    	        date = day.find('h1').string     # 得到日期
    	        date = date[0:date.index('日')]  # 取出日期号
    	        temp.append(date)
    	        inf = day.find_all('p')          # 找出li下面的p标签,提取第一个p标签的值,即天气
    	        temp.append(inf[0].string)
    
    	        tem_low = inf[1].find('i').string  	# 找到最低气温
    
    	        if inf[1].find('span') is None:  	# 天气预报可能没有最高气温
    	            tem_high = None
    	        else:
    	            tem_high = inf[1].find('span').string  # 找到最高气温
    	        temp.append(tem_low[:-1])
    	        if tem_high[-1] == '℃':
    	        	temp.append(tem_high[:-1])
    	        else:
    	        	temp.append(tem_high)
    
    	        wind = inf[2].find_all('span')		# 找到风向
    	        for j in wind:
    	        	temp.append(j['title'])
    
    	        wind_scale = inf[2].find('i').string # 找到风级
    	        index1 = wind_scale.index('级')
    	       	temp.append(int(wind_scale[index1-1:index1]))
    	        final.append(temp)
    	    i = i + 1
    	return final_day,final
    

    城市的天气数据拿到了,同理我们可以根据不同的地区编号获取河南省各个地级市的天气数据。

    Citycode = { "郑州": "101180101",
                 "新乡": "101180301",
                 "许昌": "101180401",
                 "平顶山": "101180501",
                 "信阳": "101180601",
                 "南阳": "101180701",
                 "开封": "101180801",
                 "洛阳": "101180901",
                 "商丘": "101181001",
                 "焦作": "101181101",
                 "鹤壁": "101181201",
                 "濮阳": "101181301",
                 "周口": "101181401",
                 "漯河": "101181501",
                 "驻马店": "101181601",
                 "三门峡": "101181701",
                 "济源": "101181801",
                 "安阳": "101180201"}
    citycode_lists = list(Citycode.items())
    for city_code in citycode_lists:
        city_code = list(city_code)
        print(city_code)
        citycode = city_code[1]
        cityname = city_code[0]
        url1 = 'http://www.weather.com.cn/weather/'+citycode+ '.shtml'    # 24h天气中国天气网
    	html1 = getHTMLtext(url1)
    	data1, data1_7 = get_content(html1,cityname)		# 获得1-7天和当天的数据
    

    存储数据:

    def write_to_csv(file_name, data, day=14):
    	"""保存为csv文件"""
    	with open(file_name, 'a', errors='ignore', newline='') as f:
    		if day == 14:
    			header = ['日期','城市','天气','最低气温','最高气温','风向1','风向2','风级']
    		else:
    			header = ['小时','城市','温度','风力方向','风级','降水量','相对湿度','空气质量']
    		f_csv = csv.writer(f)
    		f_csv.writerow(header)
    		f_csv.writerows(data)
    write_to_csv('河南天气.csv',data_all,1)
    
    

    这样我们就可以把全省的各个地级市天气数据保存下来了。

    在这里插入图片描述

    2. 风向风级雷达图

    统计全省的风力和风向,因为风力风向使用极坐标的方式展现比较清晰,所以我们采用极坐标的方式展现一天的风力风向图,将圆分为8份,每一份代表一个风向,半径代表平均风力,并且随着风级增高,蓝色加深。

    def wind_radar(data):
    	"""风向雷达图"""
    	wind = list(data['风力方向'])
    	wind_speed = list(data['风级'])
    	for i in range(0,24):
    		if wind[i] == "北风":
    			wind[i] = 90
    		elif wind[i] == "南风":
    			wind[i] = 270
    		elif wind[i] == "西风":
    			wind[i] = 180
    		elif wind[i] == "东风":
    			wind[i] = 360
    		elif wind[i] == "东北风":
    			wind[i] = 45
    		elif wind[i] == "西北风":
    			wind[i] = 135
    		elif wind[i] == "西南风":
    			wind[i] = 225
    		elif wind[i] == "东南风":
    			wind[i] = 315
    	degs = np.arange(45,361,45)
    	temp = []
    	for deg in degs:
    		speed = []
    		# 获取 wind_deg 在指定范围的风速平均值数据
    		for i in range(0,24):
    			if wind[i] == deg:
    				speed.append(wind_speed[i])
    		if len(speed) == 0:
    			temp.append(0)
    		else:
    			temp.append(sum(speed)/len(speed))
    	print(temp)
    	N = 8
    	theta = np.arange(0.+np.pi/8,2*np.pi+np.pi/8,2*np.pi/8)
    	# 数据极径
    	radii = np.array(temp)
    	# 绘制极区图坐标系
    	plt.axes(polar=True)
    	# 定义每个扇区的RGB值(R,G,B),x越大,对应的颜色越接近蓝色
    	colors = [(1-x/max(temp), 1-x/max(temp),0.6) for x in radii]
    	plt.bar(theta,radii,width=(2*np.pi/N),bottom=0.0,color=colors)
    	plt.title('河南风级图--Dragon少年',x=0.2,fontsize=16)
    	plt.show()
    

    结果如下:
    在这里插入图片描述

    观察可以发现,当天的东北风最多,平均风级达到了1.75级。

    3. 温湿度相关性分析

    我们可以分析温度和湿度之间是否存在关系,为了更加清楚直观地验证,可以使用离散点plt.scatter()方法将温度为横坐标、湿度为纵坐标,每个时刻的点在图中点出来,并且计算相关系数。

    def calc_corr(a, b):
    	"""计算相关系数"""
    	a_avg = sum(a)/len(a)
    	b_avg = sum(b)/len(b)
    	cov_ab = sum([(x - a_avg)*(y - b_avg) for x,y in zip(a, b)])
    	sq = math.sqrt(sum([(x - a_avg)**2 for x in a])*sum([(x - b_avg)**2 for x in b]))
    	corr_factor = cov_ab/sq
    	return corr_factor
    
    
    def corr_tem_hum(data):
    	"""温湿度相关性分析"""
    	tem = data['温度']
    	hum = data['相对湿度']
    	plt.scatter(tem,hum,color='blue')
    	plt.title("温湿度相关性分析图--Dragon少年")
    	plt.xlabel("温度/℃")
    	plt.ylabel("相对湿度/%")
    	# plt.text(20,40,"相关系数为:"+str(calc_corr(tem,hum)),fontdict={'size':'10','color':'red'})
    	plt.show()
    	print("相关系数为:"+str(calc_corr(tem,hum)))
    

    结果如下:

    在这里插入图片描述
    观察可以发现,一天的温度和湿度具有强烈的相关性,呈负相关。当温度较低时,空气中水分含量较多,湿度自然较高,而温度较高时,水分蒸发,空气就比较干燥,湿度较低。

    4. 24小时内每小时时段降水

    from pyecharts import options as opts
    from pyecharts.charts import Map,Timeline
    #定义一个timeline和map的组合图
    def timeline_map(data):
        tl = Timeline().add_schema(play_interval =300,height=40,is_rewind_play=False,orient = "horizontal",is_loop_play = True,is_auto_play=False)#设置播放速度、是否循环播放等参数
        for h in time_line_final:
            x =data[data["小时"]==h]['城市'].values.tolist() #选取指定城市
            y=data[data["小时"]==h]['降水量'].values.tolist() #选取时间的降水量
            map_shape = (
                Map()
                .add("{}h时降水量(mm)".format(h),[list(z) for z in zip(x, y)],"河南") #打包输入地区及对应降水量数据
                .set_series_opts(label_opts=opts.LabelOpts("{b}")) #配置系列参数,{b}为显示地区数据
                .set_global_opts(
                    title_opts=opts.TitleOpts(title="河南省降雨分布--Dragon少年"), #全局参数中设置标题
                    visualmap_opts=opts.VisualMapOpts(max_=300,  #设置映射配置项的最大值
                                                      is_piecewise=True, #设置是否为分段显示
                                                      pos_top = "60%", #映射配置项距图片上部的距离
                                                      pieces=[
                                                            {"min": 101, "label": '>100ml', "color": "#FF0000"},  # 分段指定颜色及名称
                                                            {"min": 11, "max": 50, "label": '11-50ml', "color": "#FF3333"},
                                                            {"min": 6, "max": 10, "label": '6-10ml', "color": "#FF9999"},
                                                            {"min": 0.1, "max": 5, "label": '0.1-5ml', "color": "#FFCCCC"}])
            ))
            tl.add(map_shape, "{}h".format(h)) #将不同日期的数据加入到timeline中
        return tl
    timeline_map(data).render("rainfall.html")
    

    效果如下:

    在这里插入图片描述

    观察可以发现,7.20当天大部分地区均有雨,7月20日17时-18时一小时的降水量达到了201.9mm。

    4. 24小时累计降雨量

    from pyecharts import options as opts
    from pyecharts.charts import Map,Timeline
    #定义一个timeline和map的组合图
    time_line_final = list(data1['小时'].iloc[0:24])
    def timeline_map(data1):
        tl = Timeline().add_schema(play_interval =200,height=40,is_rewind_play=False,orient = "horizontal",is_loop_play = True,is_auto_play=True)#设置播放速度、是否循环播放等参数
        for h in time_line_final:
            x =data1[data1["小时"]==h]['城市'].values.tolist() #选取指定城市
            y=data1[data1["小时"]==h]['降水量'].values.tolist() #选取时间的降水量
            map_shape1 = (
                Map()
                .add("{}h时累计降水量(mm)".format(h),[list(z) for z in zip(x, y)],"河南") #打包输入地区及对应降水量数据
                .set_series_opts(label_opts=opts.LabelOpts("{b}")) #配置系列参数,{b}为显示地区数据
                .set_global_opts(
                    title_opts=opts.TitleOpts(title="河南省累计降雨分布--Dragon少年"), #全局参数中设置标题
                    visualmap_opts=opts.VisualMapOpts(max_=300,  #设置映射配置项的最大值
                                                      is_piecewise=True, #设置是否为分段显示
                                                      pos_top = "60%", #映射配置项距图片上部的距离
                                                      pieces=[
                                                            {"min": 251, "label": '特大暴雨', "color": "#800000"},  # 分段指定颜色及名称
                                                            {"min": 101, "max": 250, "label": '暴雨', "color": "#FF4500"},
                                                            {"min": 51, "max": 100, "label": '暴雨', "color": "#FF7F50"},
                                                            {"min": 25, "max": 50, "label": '大雨', "color": "#FFFF00"},
                                                            {"min": 10, "max": 25, "label": '中雨', "color": "#1E90FF"},
                                                            {"min": 0.1, "max": 9.9, "label": '小雨', "color": "#87CEFA"}])
            ))
            tl.add(map_shape1, "{}h".format(h)) #将不同日期的数据加入到timeline中
        return tl
    timeline_map(data1).render("rainfalltoall_1.html")
    

    效果如下:

    在这里插入图片描述

    至此,天气数据分析可视化就完成啦~

    今天我们就到这里,明天继续努力!
    在这里插入图片描述
    若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。

    创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

    Dragon少年 | 文

    如果本篇博客有任何错误,请批评指教,不胜感激 !

    展开全文
  • python爬取股票数据

    千次阅读 2017-12-13 11:10:48
    pip install tushare,爬取银行股票数据数据进行初步进行整理,用今日的收盘减去昨天的收盘值定义value表示涨跌,并绘图直观表示最近的股票走势图。其实也可以直接根据pchange>0来标签分类的 -_-import tushare as...

    pip install tushare,爬取银行股票数据

    对数据进行初步进行整理,用今日的收盘减去昨天的收盘值定义value表示涨跌,并绘图直观表示最近的股票走势图。其实也可以直接根据pchange>0来标签分类的 -_-

    import tushare as ts
    import pandas as pd 
    import pandas as pd
    #获取中国银行历史数据
    df_CB=ts.get_hist_data('601988', start='2015-01-01', end='2017-11-01')
    #保存到本地
    df_CB.to_csv('G:\\Project\\data\\CB.csv', sep=',' ,index=True)
    #读取数据
    df_CB=pd.read_csv(r'G:\\Project\\data\\CB.csv',encoding='gbk')
    
    #将日期作为index,顺序排列
    df_CB = df_CB.set_index('date')
    df_CB = df_CB.sort_index()
    #每天的开盘价,收盘价,交易量,价格变化,10天、20天的均价
    print df_CB.head()
            open  high  close   low      volume  price_change  p_change  \
    

    date
    2015-01-05 4.18 4.50 4.42 4.18 23084548.0 0.27 6.51
    2015-01-06 4.38 4.74 4.56 4.28 23127260.0 0.14 3.17
    2015-01-07 4.46 4.64 4.54 4.44 15485755.0 -0.02 -0.44
    2015-01-08 4.55 4.57 4.33 4.31 14892726.0 -0.21 -4.63
    2015-01-09 4.28 4.76 4.47 4.23 22776194.0 0.14 3.23

              ma5   ma10   ma20       v_ma5      v_ma10       v_ma20  turnover  
    

    date
    2015-01-05 4.036 3.862 3.736 20236083.4 20700121.8 18068874.18 1.13
    2015-01-06 4.184 3.964 3.791 21016213.4 21901637.0 18406099.90 1.13
    2015-01-07 4.322 4.029 3.838 20103937.2 19875380.1 18223578.34 0.76
    2015-01-08 4.400 4.090 3.867 19874622.2 18551524.5 18027645.85 0.73
    2015-01-09 4.464 4.180 3.901 19873296.6 19332925.8 18291454.08 1.11

    #value表示涨跌,表示今日的收盘减去昨天的收盘
    value = pd.Series(df_CB['close']-df_CB['close'].shift(1),\
                      index=df_CB.index)
    #第一个值为NaN,将其后向填充
    value = value.bfill()
    #差值大于0表示涨,置位1
    value[value>=0]=1 
    value[value<0]=0 
    df_CB['Value']=value
    #后向填充空缺值
    df_CB=df_CB.fillna(method='bfill')
    df_CB=df_CB.astype('float64')
    print df_CB.head()
            open  high  close   low      volume  price_change  p_change  \
    

    date
    2015-01-05 4.18 4.50 4.42 4.18 23084548.0 0.27 6.51
    2015-01-06 4.38 4.74 4.56 4.28 23127260.0 0.14 3.17
    2015-01-07 4.46 4.64 4.54 4.44 15485755.0 -0.02 -0.44
    2015-01-08 4.55 4.57 4.33 4.31 14892726.0 -0.21 -4.63
    2015-01-09 4.28 4.76 4.47 4.23 22776194.0 0.14 3.23

              ma5   ma10   ma20       v_ma5      v_ma10       v_ma20  \
    

    date
    2015-01-05 4.036 3.862 3.736 20236083.4 20700121.8 18068874.18
    2015-01-06 4.184 3.964 3.791 21016213.4 21901637.0 18406099.90
    2015-01-07 4.322 4.029 3.838 20103937.2 19875380.1 18223578.34
    2015-01-08 4.400 4.090 3.867 19874622.2 18551524.5 18027645.85
    2015-01-09 4.464 4.180 3.901 19873296.6 19332925.8 18291454.08

            turnover  Value  
    

    date
    2015-01-05 1.13 1.0
    2015-01-06 1.13 1.0
    2015-01-07 0.76 0.0
    2015-01-08 0.73 0.0
    2015-01-09 1.11 1.0

    #绘图
    %matplotlib inline
    Data = df_CB[['open','close','ma5','ma10','ma20']]
    Data=Data.astype(float)
    Data.plot()
    Data.ix['2016-01-01':'2017-01-01'].plot()


    2016一年的

    #同理获取中国工商银行等其他银行历史数据
    df_gongshang=ts.get_hist_data('601398', start='2015-01-01', end='2017-11-01')
    
    df_gongshang.to_csv('G:\\Project\\data\\gongshang.csv', sep=',' ,index=True)
    df_gongshang=pd.read_csv(r'G:\\Project\\data\\gongshang.csv',encoding='gbk')
    print df_gongshang.tail()
           date  open  high  close   low      volume  price_change  p_change  \
    

    685 2015-01-09 4.82 5.15 4.88 4.74 9915904.0 0.05 1.03
    686 2015-01-08 5.05 5.07 4.83 4.80 6920490.5 -0.21 -4.17
    687 2015-01-07 5.00 5.10 5.04 4.95 8105967.5 -0.06 -1.18
    688 2015-01-06 5.00 5.36 5.10 4.95 14975615.0 0.04 0.79
    689 2015-01-05 4.93 5.15 5.06 4.90 13658517.0 0.19 3.90

       ma5   ma10   ma20       v_ma5      v_ma10      v_ma20  turnover  
    

    685 4.982 4.818 4.628 10715298.8 9210890.05 8513672.29 0.37
    686 4.980 4.763 4.614 10832707.4 8843879.40 8431188.07 0.26
    687 4.956 4.728 4.600 10841814.8 8930133.55 8525606.67 0.30
    688 4.870 4.695 4.571 10993154.7 9866091.80 8553582.62 0.56
    689 4.774 4.626 4.533 9339578.6 8973967.90 8094866.02 0.51

    #将日期作为index,顺序排列
    df_gongshang = df_gongshang.set_index('date')
    df_gongshang = df_gongshang.sort_index()
    #print df_gongshang.tail()
    #绘图
    Data_gs = df_gongshang[['close','ma10','ma20']]
    Data_gs=Data_gs.astype(float)
    Data_gs.plot()
    Data_gs.ix['2016-01-01':'2017-01-01'].plot()

    工商银行
    这里写图片描述

    展开全文
  • python 3.6 pycharm requests csv time 相关模块pip安装即可 目标网页 分析网页 一切的一切都在图里 找到数据了,直接请求网页,解析数据,保存数据 请求网页 import requests url = '...
  • 这篇文章主要介绍了基于Python爬取股票数据过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 基本环境配置 python 3.6 pycharm requests csv time...

    这篇文章主要介绍了基于Python爬取股票数据过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    基本环境配置

    • python 3.6
    • pycharm
    • requests
    • csv
    • time

    相关模块pip安装即可

    目标网页

    分析网页

    一切的一切都在图里

    找到数据了,直接请求网页,解析数据,保存数据

    请求网页

    import requests
    
    url = 'https://xueqiu.com/service/v5/stock/screener/quote/list'
    
    response = requests.get(url=url, params=params, headers=headers, cookies=cookies)
    
    html_data = response.json()

    解析数据

    data_list = html_data['data']['list']
    
    for i in data_list:
    
    dit = {}
    
    dit['股票代码'] = i['symbol']
    
    dit['股票名字'] = i['name']
    
    dit['当前价'] = i['current']
    
    dit['涨跌额'] = i['chg']
    
    dit['涨跌幅/%'] = i['percent']
    
    dit['年初至今/%'] = i['current_year_percent']
    
    dit['成交量'] = i['volume']
    
    dit['成交额'] = i['amount']
    
    dit['换手率/%'] = i['turnover_rate']
    
    dit['市盈率TTM'] = i['pe_ttm']
    
    dit['股息率/%'] = i['dividend_yield']
    
    dit['市值'] = i['market_capital']
    
    print(dit)

    保存数据 

    import csv
    
    f = open('股票数据.csv', mode='a', encoding='utf-8-sig', newline='')
    
    csv_writer = csv.DictWriter(f, fieldnames=['股票代码', '股票名字', '当前价', '涨跌额', '涨跌幅/%', '年初至今/%', '成交量', '成交额', '换手率/%', '市盈率TTM', '股息率/%', '市值'])
    
    csv_writer.writeheader()
    
    csv_writer.writerow(dit)
    
    f.close()

     我建立了一个Python学习圈子:1156465813。在彼此的沟通可以我们可以得到很多学习经验,积累知识,群内有2020最新的python学习资料,大家可以一起讨论问题,共同进步。

    展开全文
  • Python应用实战代码-python爬取股票最新数据并用excel绘制树状图
  • Python爬取所有股票数据并进行数据分析

    万次阅读 多人点赞 2019-04-13 14:47:41
    一、背景:作为一个程序员,总喜欢在股市里面晃荡,无奈总是当成韭菜收割了。每一次都是卖涨买跌,处处碰壁。...于是,开始编写了爬取股票数据并进行数据分析的程序。 二、环境:Anaconda3.3 python3.7.1 ...

    一、背景:作为一个程序员,总喜欢在股市里面晃荡,无奈总是当成韭菜收割了。每一次都是卖涨买跌,处处碰壁。但是作为一个有一定阅历的程序员本能告诉自己,只要掌握了大量的股票数据,就可以在信息渠道落后的情况下,分析出机构大概率的在布局哪些股票,从而在机构拉涨停之前,提前进入分一杯羹。于是,开始编写了爬取股票数据并进行数据分析的程序。

    二、环境:Anaconda3.3     python3.7.1   

    三、目标:爬取所有股票每天每一分钟的数据,并且进行数据分析

    四、最终效果图:

                                                                                 爬虫结果图

                                                                               数据展示图

     

     

     

    五、程序代码解析(源代码下载地址及数据库文章底部会提供):

    1、把所有股票的基本信息都保存在一个mysql数据库中gp.sql,总过三千六百多条,如下图:

    2、获取股票当天所有的数据get_gp_detail.py:

    import pymysql
    import numpy as np
    import sys
    import json
    import urllib.request
    import urllib
    import os
    import time
    #连接数据库
    db = pymysql.connect(host='127.0.0.1',user='root',password='root',db='gp_db',port=3306)
    #获取cursor
    cursor = db.cursor()# 使用 execute() 方法执行 SQL,如果表存在则删除  
    sql = "select * from gp"  
    cursor.execute(sql)  
    print("SELECT OK")
    #all_gp = cursor.fetchmany(1)
    all_gp = cursor.fetchall()     #从数据库中获取所有股票的基本信息数据
    arr = np.array(all_gp)      #转化为numpy数据格式
    
    now = int(time.time()) 
    #转换为其他日期格式,如:"%Y-%m-%d %H:%M:%S" 
    timeStruct = time.localtime(now) 
    strTime = time.strftime("%Y-%m-%d", timeStruct) 
    gp_count = 1        #股票当天所有数据的保存编号
    def mkdir(path):    #股票保存路径函数	
        folder = os.path.exists(path) 	
        if not folder:                   #判断是否存在文件夹如果不存在则创建为文件夹		
            os.makedirs(path)            #makedirs 创建文件时如果路径不存在会创建这个路径		
            print(path) 	
    def getData(url):   #函数——从接口中获取单只股票当天每分钟的数据
        content = ""
        try:        #网络会偶发出现奔溃情况,为了保证不中断和保证数据齐全,休息5秒重新执行
            response = urllib.request.urlopen(url)
            content = response.read().decode('utf-8')
        except:
            print("发生网络异常")
            time.sleep(5)
            return getData(url)
        if content != "":
            return content
        else:
            print("内容为空")
            return getData(url)
    def csv_create(path, msg):     #函数——将单只股票的数据保存进指定文件夹  
        file = open(path,'w')             
        file.write(msg) 
        print("文件"+path+"创建成功")
        file.close() 
    def tranformToCSV(content,filepath):        #函数——将下载的数据转换为csv数据,以便读取
        content = content.replace("(","").replace(")","")
        json_str = json.loads(content)
        a_str = json_str.get("data")
        a_time = json_str.get("info").get("time")
        a_date = str(a_time).split(" ")
        mkdir(filepath)
        array_str = np.array(a_str)
        csv_str = "time,first,second,third,fourth\n"    #time为当天时间点,first为该分钟股票价格
        for item in array_str:
            item = str(item)
            items = item.split(",")
            itemss = (str(items[0])).split(" ")
            items0 = itemss[1]
            csv_str += '"'+items0+'",'+items[1]+','+items[2]+','+items[3]+','+items[4]+'\n'
        csv_create(filepath+"/"+a_date[0]+".csv",csv_str)
    
    for item in arr:
        url = "http://pdfm.eastmoney.com/EM_UBG_PDTI_Fast/api/js?rtntype=5&id="+item[3]+item[1]+"&type=r&iscr=false"
        data = getData(url)
        item2 = item[2].replace("*","")
        tranformToCSV(data,"D://gp/"+str(gp_count)+"、"+item2+item[3])     #股票信息的保存路径是(D://pg/序号+股票名字+股票代号/日期.csv)
        gp_count = gp_count+1;
        # 使用 DebugLog
        
    db.commit()
    db.close()

    get_gp_detail.py程序正确运行之后,D盘中将会出现我们所需要的数据,如下图:

     

     

    3、对数据进行简单呈现plt_show.py:

     

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    o=open('D:/gp/1045、广州港601228/2019-04-01.csv')
    table = pd.read_csv(o)
    plt.plot(table['time'], table['first'])
    plt.rcParams['figure.figsize'] = (30.0, 20.0)
    
    plt.show()
    pd.to_numeric(table["first"],errors="ignore")
    #print(table["first"])
    max = np.argmax(table["first"],axis=1)
    min = np.argmin(table["first"],axis=0)
    wave_price = table["first"][max]-table["first"][min]
    wave_price_rate = wave_price/table["first"][0]
    final_wave_price = table["first"][240]-table["first"][0]
    final_wave_price_rate = final_wave_price/table['first'][0]
    print("最大值"+str(table["first"][max]))
    print("最小值"+str(table["first"][min]))
    print("波动区间"+str(wave_price))
    print("波动幅度%.2f%%"% (wave_price_rate * 100))
    print("最终价格差距"+str(final_wave_price))
    print('最终价格幅度%.2f%%' % (final_wave_price_rate * 100))

    效果图:

    4、对所有股票数据进行简单的筛选和分析,筛选出2019-04-12,当天下午两点到三点之间,突然拉伸超过3%的所有股票并且保存进数据库find_feature.py:

     

    import pymysql
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    #连接数据库
    db = pymysql.connect(host='127.0.0.1',user='root',password='root',db='gp_db',port=3306)
    #获取cursor
    cursor = db.cursor()
    time = "2019-04-12"
    def find_feature(path,name,gpid):
        o=open(path)
        table = pd.read_csv(o)
        table['time'] = pd.to_datetime(table["time"])
        table = table.set_index('time',drop=False)     #排序之后,日期会是当前日期加上时间
        table = table["2019-04-12 14:00:00":"2019-04-12 15:00:00"]
        #print(table)
        if(table['first'].empty):
            return
        try:
            #print(table['first'])
            max = np.argmax(table["first"])
            min = np.argmin(table["first"])
            
            wave_price = table["first"][max]-table["first"][min]
            final_wave_price = table["first"][60]-table["first"][0]
            wave_price_rate = 0
            final_wave_price_rate = 0
            if table["first"][0] != 0:
                wave_price_rate = wave_price/table["first"][0]
                final_wave_price_rate = final_wave_price/table['first'][0]
            if  final_wave_price_rate > 0.03:
                print(name+gpid)
                print("波动幅度%.2f%%"% (wave_price_rate * 100))
                print('最终价格幅度%.2f%%' % (final_wave_price_rate * 100))
                cursor.execute('insert into special_gp(gpfeature,gpname,gpid,gptime) values(%s,%s,%s,%s)',(1,str(gp_count)+"、"+name,gpid,time))
        except:
            pass
    
    sql = "select * from gp"  
    cursor.execute(sql)  
    print("SELECT OK")
    #all_gp = cursor.fetchmany(1)
    all_gp = cursor.fetchall()
    arr = np.array(all_gp)
    gp_count = 1
    
    for item in arr:
        item2 = item[2].replace("*","")
        path = "D://gp/"+str(gp_count)+"、"+item2+item[3]+"/"+time+".csv"
        find_feature(path,item2,item[3])
        gp_count = gp_count+1;
    db.commit()
    db.close()
    

    效果图:

    以上即为股票当天数据爬取及数据分析,注意:每天股票的详细数据必须在第二天开市之前进行抓取,否则便再也抓取不到。

    csdn下载地址:https://download.csdn.net/download/mldan/11111439

    demo大师下载地址:http://www.demodashi.com/demo/15238.html

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 使用python爬取股票信息,并分析相关数据

    万次阅读 多人点赞 2020-03-24 16:04:50
    考虑到Python pandas包在金融量化分析中体现出的优势,Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,非常便于用pandas/NumPy/Matplotlib进行数据分析和可视化。当然,如果您习惯了用Excel或者关系型...
  • Python爬取知网论文信息,包含数据爬取、数据分析、数据可视化代码,直接输入关键词即可获取相关数据信息
  • 通过A股API接口爬取19年股票交易信息,包括开盘收盘最高最低等指标,并利用python对其进行数据可视化,进行股票技术分析。可视化内容包括了k线图、均线图、MACD、RSI、和相关系数。用到的库有numpy、matplotlib、...
  • Python爬取天气数据及可视化分析

    万次阅读 多人点赞 2020-07-29 10:48:23
    Python爬取天气数据及可视化分析 文章目录Python爬取天气数据及可视化分析说在前面1.数据获取请求网站链接提取有用信息保存csv文件2.可视化分析当天温度变化曲线图当天相对湿度变化曲线图温湿度相关性分析图空气质量...
  • 主要介绍了Python爬取股票信息,并可视化数据的示例,帮助大家更好的理解和使用python爬虫,感兴趣的朋友可以了解下
  • 前言 本文的文字及图片来源于网络,仅供学习、交流使用,不...找到数据了,直接请求网页,解析数据,保存数据 请求网页 import requests url = 'https://xueqiu.com/service/v5/stock/screener/quote/list' response = re
  • python爬取微博评论数据,爬虫之路,永无止境。。(附源码) 今天目标爬取微博任意博文的评论信息 工具使用 开发环境:win10、python3.6 开发工具:pycharm 工具包 :requests,re, time, random,tkinter 项目...
  • Python爬取网页数据

    万次阅读 多人点赞 2018-08-29 17:20:35
    都说python爬网页数据方便,我们今天就来试试,python爬取数据到底有多方便 简介 爬取数据,基本都是通过网页的URL得到这个网页的源代码,根据源代码筛选出需要的信息 准备 IDE:pyCharm 库:requests、...
  • 前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。...找到数据了,直接请求网页,解析数据,保存数据 请求网页 import requests url = 'https://x
  • Python爬取B站视频评论并进行数据分析

    万次阅读 多人点赞 2021-01-02 16:14:29
    Python爬取 冰冰 第一条B站视频的千条评论,绘制词云图,看看大家说了什么吧 文章目录数据分析数据预处理数据描述删除空值删除空值可视化点赞TOP20等级分布性别分布绘制词云图数据收集 数据分析 import pandas as ...
  • 生活中我们经常会用python进行数据爬取,...于是,我就想到用一种更简单的方式进行数据分析,那就是python爬取+BI分析,python强大的数据获取能力,配合轻量级BI简单快捷的可视化操作,分析效果奇佳。原理也很简单,...
  • 最近我出了一本书,《基于股票数据分析Python入门实战 视频教学版》,京东链接:https://item.jd.com/69241653952.html,在其中用股票范例讲述Python爬虫、数据分析和机器学习的技术,大家看了我的书,不仅能...
  • 自己写的一个爬虫的小demo,可以成功爬取数据存储到本地,使用的话,改一下路径就可以了,爬取数据后,数据清洗,然后进行了简单的数据分析
  • Python爬取股票信息

    千次阅读 2019-07-09 12:14:21
    一. 思路 最近想要自己做个爬取股票信息然后分析的工具。...数据分析以后再说。 二. 代码实现 1. 代码结构如下: 2. clsDir.py(创建目录) def mkdir(path): # 引入模块 import os # 去除首位空...
  • Python金融大数据分析Python金融大数据分析Python金融大数据分析Python金融大数据分析Python金融大数据分析Python金融大数据分析
  • Python爬取岗位数据分析

    千次阅读 多人点赞 2019-03-15 20:40:48
    Python也将近大半年了,最终也是为了能够找到一个待遇好点的,薪资高一点的工作,使得自己...本来是想去抓上万条数据的,可是点击Python关键字搜索后的25页左右,发现招聘岗位并无python关键词,只是在点击进去的...
  • python网络爬虫爬取了2018年截至到目前为止,北上广深这四个城市的空气质量的数据,并对此做出了分析,用python画图库,实现数据的可视化
  • Python爬取双色球数据进行分析

    千次阅读 2017-11-09 15:26:05
    突发奇想,是否可以从双色球...现在我们开始获取数据,应该从中彩网的爬取数据比较靠谱,下面是脚本。# -*- coding:utf-8 -*- import requests, bs4 import os, time import operator from itertools import combinati
  • 主要介绍了Python爬取智联招聘数据分析师岗位相关信息的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 今天带大家爬取雪球平台的股票数据, 并且实现数据可视化 先看下效果图 基本环境配置 python 3.6 pycharm requests csv time 目标地址 import requests url = 'https://xueqiu.com/service/v5/stoc.
  • 2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642....不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
  • 主要介绍了用Python 爬取猫眼电影数据分析《无名之辈》,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,782
精华内容 17,912
关键字:

python爬取股票数据分析

python 订阅