python爬虫天气后报数据可视化,为什么我输入的是三个月的天气数据最后得到的图像只是每个月的第一天的数据可视化?求帮忙解决下感谢!!
import data as data
import fig as fig
import requests
from bs4 import BeautifulSoup
import pandas as pd
from urllib3.util import url
def get_data(url):
resp = requests.get(url)
# print(resp.text)
html = resp.content.decode('gbk')
soup = BeautifulSoup(html, 'html.parser')
# print(soup)
tr_list = soup.find_all('tr')
# print(tr_list)
dates, conditions, temp = [], [], []
for data in tr_list[1:]:
sub_data = data.text.split()
# print(sub_data)
dates.append(sub_data[0]) #
conditions.append(''.join(sub_data[1:3])) #
# print(conditions) #
temp.append(''.join(sub_data[3:6])) #
# print(temp)
_data = pd.DataFrame()
_data['日期'] = dates
_data['天气状况'] = conditions
_data['气温'] = temp
return _data
data_1_month = get_data('http://www.tianqihoubao.com/lishi/handan/month/202301.html')
data_2_month = get_data('http://www.tianqihoubao.com/lishi/handan/month/202302.html')
data_3_month = get_data('http://www.tianqihoubao.com/lishi/handan/month/202303.html')
data = pd.concat([data_1_month, data_2_month, data_3_month]).reset_index(drop=True)
# print(data)
data.to_csv('handan.csv', index=False, encoding='utf-8')
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data = pd.read_csv('handan.csv')
# print((data.isnull()).sum())
# print(data.head())
data['最高气温'] = data['气温'].str.split('/', expand=True)[0]
data['最低气温'] = data['气温'].str.split('/', expand=True)[1]
data['最高气温'] = data['最高气温'].map(lambda x: int(x.replace('℃', '')))
data['最低气温'] = data['最低气温'].map(lambda x: int(x.replace('℃', '')))
dates = data['日期']
highs = data['最高气温']
lows = data['最低气温']
plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red', alpha=0.5)
plt.plot(dates, lows, c='red', alpha=0.5)
plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.2)
plt.title('2023年1-3月邯郸天气', fontsize=24)
plt.xlabel('', fontsize=6)
fig.autofmt_xdate()
plt.ylabel('气温', fontsize=12)
plt.tick_params(axis='both', which='major', labelsize=10)
plt.xticks(dates)[::20]
plt.show()
这里按照四个condition
进行考虑,主要是处理E、F中的数据
con1 → 暂时下架(F)
con2 → 重新上架(E中部分数据,数据中同一个id可能有不同title,“换个马甲重新上架”)
con3 → 预售(E中部分数据,预售商品的title中包含“预售”二字),字符串查找特定字符 df.str.contains(‘预售’)
con4 → 彻底下架(E中部分数据),可忽略
1)找到未参与双十一当天活动的商品id并筛选出原始数据
id_not11 = id_data[id_data['sale']==False] # 筛选出双十一当天没参加活动的产品id
print('双十一当天没参加活动的商品总数为{}个,占比为{:.2f}%\n-------'.format(len(id_not11),len(id_not11)/m*100))
print('双十一当天没参加活动的商品销售节奏类别为:\n',id_not11['type'].value_counts().index.tolist())
–> 输出结果为:(其中G
类商品只是满足双十一之后销售,但是双十一之前并没有销售,所以G
类商品不在这次的处理之内,也就是上面说的主要处理E
、F
类数据)
双十一当天没参加活动的商品总数为1167个,占比为33.32%
-------
双十一当天没参加活动的商品销售节奏类别为:
['E', 'F', 'G']
筛选出未参与双十一当天活动商品id
对应的原始数据
df_not11 = id_not11[['id','type']]
data_not11 = pd.merge(df_not11,df,on = 'id', how = 'left')
print(data_not11.head(15))
–> 输出结果为:
2) 筛选出con1
的商品数据
就是筛选处F
类商品的数据即可
id_con1 = id_data['id'][id_data['type'] == 'F'].values
3) 筛选出con2
的商品数据
data_con2 = data_not11[['id','title','date']].groupby(by = ['id','title']).count()
title_count = data_con2.reset_index()['id'].value_counts()
id_con2 = title_count[title_count>1].index
–> 输出结果为:(按照id
和title
字段进行数据的汇总,这样就会保留一个id
对应多个title
的商品数据了,然后在对id
字段进行统计长度就知道con2
条件下的商品数量了)
4) 筛选出con3
的商品数据
data_con3 = data_not11[data_not11['title'].str.contains('预售')]
id_con3 = data_con3['id'].value_counts().index
5) 输出三种condition
下的商品情况
print("未参与双十一当天活动的商品中:\n暂时下架商品的数量为{}个,重新上架商品的数据量为{}个,预售商品的数据量为{}个"
.format(len(id_con1), len(id_con2), len(id_con3)))
–> 输出结果为:
未参与双十一当天活动的商品中:
暂时下架商品的数量为242个,重新上架商品的数据量为110个,预售商品的数据量为453个