目录
《大数据技术原理与应用》实训报告
2020/2021 学年第一学期
目录
第一部分 实训题目与要求……………………………………………………………………….. 4
1 问题提出………………………………………………………………………………….. 4
2 功能要求………………………………………………………………………………….. 4
第二部分 设计实训题目功能…………………………………………………………………… 4
1 总体设计………………………………………………………………………………….. 4
2主要函数设计……………………………………………………………………………… 5
3 问题与改进………………………………………………………………………………... 6
第三部分 实训效果………………………………………………………………………………. 7
一、实训任务1……………………………………………………………………………… 7
二、实训任务2……………………………………………………………………………… 7
第四部分 实训总结………………………………………………………………………………. 7
1 结束语……………………………………………………………………………………... 7
附录A 程序清单…………………………………………………………………………………. 8
参考文献…………………………………………………………………………………………. 28
第一部分 实训题目与要求
1 问题提出
1.1实训任务1
对2017南京某几个月的天气分析,并能够使用合适的图例展示相关的数据
1.2实训任务2
利用爬虫技术爬取天气预报网并对爬取出来的数据进行可视化分析
2功能要求
2.1实训任务1
- 五月份南京最高温最大值、最低温最小值和最大温差及对应的日期。
- 五月份不同天气对应的天数和雨天的百分比。
- 五月份不同风向对应的天数和出现最多的风向。
- 五月份风力超过3级的天数。
- 绘制五月份南京高温、低温(柱状)及温差(折线)示意图,并标注温差最大的点。
- 绘制五月份南京天气情况分布饼图。
- 作柱状图比较5月、6月、7月三个月的最高温度和最低温度。
2.2实训任务2
从天气后报网(http://www.tianqihoubao.com/)爬取自己家乡所属城市过去一个月每天的最高温度和最低温度,并绘制一个月内最高温度和最低温度的走势比较图。
第二部分 设计实训题目功能
1 总体设计
1.1实训任务1
在对天气数据的分析过程中,需要有些python基础,需要用到的库有csv库,numpy库以及matplotlib库。
首先是先对给出的天气数据进行分析,根据任务需求进行程序代码的编写分析完天气数据,根据分析后的数据进行绘图。
1.2实训任务2
爬虫需有html,js以及css基础以及会一些爬虫相关库和绘图库的使用。首先获取url网站源码,将获取到的网页进行分析将抓取到的数据以csv文件保存在本地上,之后根据所需要的数据需求进行编写程序代码最后对文件数据进行分析绘图。
2主要函数设计
2.1实训任务1
对2017南京某几个月的天气分析,并能够使用合适的图例展示相关的数据
- 五月份南京最高温最大值、最低温最小值和最大温差及对应的日期。
- 五月份不同天气对应的天数和雨天的百分比。
- 五月份不同风向对应的天数和出现最多的风向。
- 五月份风力超过3级的天数。
- 绘制五月份南京高温、低温(柱状)及温差(折线)示意图,并标注温差最大的点。
- 绘制五月份南京天气情况分布饼图。
- 作柱状图比较5月、6月、7月三个月的最高温度和最低温度。
设计思路:
数据分析-绘制图形
已知给出2017年五月,六月,七月三个月的天气情况的csv文件,首先要先用到csv库,进行对csv文件读取,然后开始对数据进行分析处理。分析小任务1到6都是分析五月份的数据,所以说前面6个小任务首先就是要把五月这其中的一个月单 独取出来放在一个集合中,从csv文件中的数据分析中,可以知道每列分别代表着日期,最高温,最低温,天气,风向,风力,所对应的下标就分别为[0],[1] ,[2],[3],[4],[5],之后进行程序代码的编写,分别计算出相应结果。数据分析之后就进行绘图,利用matplotlib库进行绘 制对应的图形,最后以plt.show()将图形展示出来结束程序。
南京天气csv文件如下:
正在上传…重新上传取消
绘制出的图形如下
正在上传…重新上传取消
2.2实训任务2
从天气后报网(http://www.tianqihoubao.com/)爬取自己家乡所属城市过去一个月每天的最高温度和最低温度,并 绘制一个月内最高温度和最低温度的走势比较图。
设计思路:
爬虫(获取数据-解析数据-保存数据) 绘图(分析数据-进行绘图)
先分析任务要求,这次任务是为了爬取天气后报网中所在家乡城市的过去一个月天气情况。我的家乡在江西上饶,首先要先进入网站,地址url为: “http://www.tianqihoubao.com/" ,进入http://www.tianqihoubao.com/这个网站,然后选择要爬取的城市,选择江西[1]上饶,然后再选择2020年12月的天气历史情况
具体步骤如下操作
进入天气后报官网
正在上传…重新上传取消
进入我所在的地区--江西上饶的12月历史天气网址
正在上传…重新上传取消
获取并分析网站源码
正在上传…重新上传取消
通过对html代码分析发现,过去一个月的天气情况都是在“tr”元素之中
正在上传…重新上传取消
注:完整程序请参见附录A。
3 问题与改进
3.1实训任务1
问题:python基础没有学扎实牢固,写的代码过于繁琐冗余,没有进行好的算法处理导致一个简单的任务需要用到许多步骤 以及代码才能完成,代码书写规范也有欠缺,变量命名不规范,不会命名的都以中文拼音进行命名有损代码美观性以及 可读性。
改进: 实训结束后加强对python基础的学习,将基础学好,也养成一个规范书写代码的好习惯
3.2实训任务2
问题:前端知识尚欠缺,要用到的HTML,JavaScript以及CSS都没有进行较为深入的学习,还有需要用的到爬虫库也没有 学习,导致在完成任务2过程中出现了许许多多大大小小的改进: 简要学习前端(HTML,JavaScript,CSS)的一些知识内容,了解常用的一些爬虫框架以及相关库的使用。
第三部分 实训效果
一、实训任务1
二、实训任务2
第四部分 实训总结
1 结束语
附录A 程序清单
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define N 100
void mycreat();
void mynewcreat();
void mydisplay();
void myretake();
void myselect();
void mynumsort();
void mysort();
void myprint1();
void myprint2();
void myprint3();
void myfenduan();
struct student
{
char name[10];
int grade[5];
double ave;
char num[10];
};
void myprint1()
{
char choose='\0',yes_no='\0';
do
{
system("cls");
printf (" |---------------------------|\n");
printf (" | 请输入选项编号(0-4) |\n");
printf (" |---------------------------|\n");
printf (" | 1----------录入成绩 |\n");
printf (" | 2----------统计成绩 |\n");
printf (" | 3----------处理学籍 |\n");
printf (" | 4----------显示数据 |\n");
printf (" | 0----------退出系统 |\n");
printf (" |---------------------------|\n");
printf(" ");
choose=getche();
switch(choose)
{ case '1':mycreat(); break;
case '2':myprint2(); break;
case '3':myprint3(); break;
case '4':mydisplay(); break;
case '0':break;
default :printf("\n %c为非法选项!\n",choose);
}
if(choose=='0')
{
printf("\n");
printf("感谢您的使用!\n");
break;
}
printf("\n 要继续选择吗(Y/N)?\n");
do
{ yes_no=getch( );
} while(yes_no!='Y' && yes_no!='y'&& yes_no!='N' && yes_no!='n');
} while(yes_no=='Y' || yes_no=='y');
}
void myprint2()
{
char choose='\0',yes_no='\0';
do
{
system("cls");
printf (" |-----------------------------------|\n");
printf (" | 请输入选项编号(0-4) |\n");
printf (" |-----------------------------------|\n");
printf (" | 1----------按学号排序 |\n");
printf (" | 2----------计算平均分并排序 |\n");
printf (" | 3----------统计分数段 |\n");
printf (" | 4----------返回 |\n");
printf (" | 0----------退出系统 |\n");
printf (" |-----------------------------------|\n");
printf(" ");
choose=getche();
switch(choose)
{ case '1':mynumsort(); break;
case '2':mysort(); break;
case '3':myfenduan(); break;
case '4':myprint1(); break;
case '0':break;
default :printf("\n %c为非法选项!\n",choose);
}
if(choose=='0')
{
printf("\n");
printf("感谢您的使用!\n");
break;
}
printf("\n 要继续选择吗(Y/N)?\n");
do
{ yes_no=getch( );
} while(yes_no!='Y' && yes_no!='y'&& yes_no!='N' && yes_no!='n');
} while(yes_no=='Y' || yes_no=='y');
}
void myprint3()
{
char choose='\0',yes_no='\0';
do
{
system("cls");
printf (" |---------------------------------------|\n");
printf (" | 请输入选项编号(0-4) |\n");
printf (" |---------------------------------------|\n");
printf (" | 1----------生成并打印补考通知单 |\n");
printf (" | 2----------生成并打印退学通知单 |\n");
printf (" | 3----------生成并打印新名册 |\n");
printf (" | 4----------返回 |\n");
printf (" | 0----------退出系统 |\n");
printf (" |---------------------------------------|\n");
printf(" ");
choose=getche();
switch(choose)
{ case '1':myretake(); break;
case '2':myselect(); break;
case '3':mynewcreat(); break;
case '4':myprint1(); break;
case '0':break;
default :printf("\n %c为非法选项!\n",choose);
}
if(choose=='0')
{
printf("\n");
printf("感谢您的使用!\n");
break;
}
printf("\n 要继续选择吗(Y/N)?\n");
do
{ yes_no=getch( );
} while(yes_no!='Y' && yes_no!='y'&& yes_no!='N' && yes_no!='n');
} while(yes_no=='Y' || yes_no=='y');
}
void mycreat()
{
int i=1,j=0;
struct student temp={0};
FILE*fp=NULL;
fp=fopen("d:\\yuan.dat","w");
if(fp==NULL)
{
printf("打开文件失败!\n");
return;
}
system("cls");
printf("注意:输入学号时请将所有位数保持一致不足位用0补齐。例如最大学号为1000则均保持4位有效数字。");
printf("\n 请输入第1个记录:\n");
printf(" 学号(用#结束输入):");
do
{
gets(temp.num);
}while(strcmp(temp.num,"")==0);
printf(" 姓名(用#结束输入):");
gets(temp.name);
printf(" 请输入 高数 英语 物理 编程 马哲 5组成绩(用#结束输入): ");
for(j=0;j<=4;j++)
{
scanf("%d",&temp.grade[j]);
}
while(temp.num[0]!='#'&&temp.name[0]!='#'&&temp.grade[0]!='#')
{
fprintf(fp,"%23s%15s",temp.num,temp.name);
for(j=0;j<=4;j++)
{
fprintf(fp,"%5d",temp.grade[j]);
}
fprintf(fp,"\n");
i++;
printf("\n 请输入第%d个记录:\n",i);
printf(" 学号(用#结束输入):");
do
{
gets(temp.num);
}while(strcmp(temp.num,"")==0);
printf(" 姓名(用#结束输入):");
gets(temp.name);
printf(" 请输入 高数 英语 物理 编程 马哲 5组成绩 (用#结束输入): ");
for(j=0;j<=4;j++)
{
scanf("%8d",&temp.grade[j]);
}
}
fclose(fp);
}
void mynumsort()
{
int i=0,j=0,k=0,n=0,grade=0,num=0,m=0,ww;
struct student temp[N]={0};
struct student a;
FILE *fp=NULL;
FILE *fq=NULL;
fp=fopen("d:\\yuan.dat","r");
if(fp==NULL)
{
printf("\n 打开文件失败!\n");
return;
}
system("cls");
while(feof(fp)==0)
{
ww=fscanf(fp,"%23s%15s",temp[n].num,temp[n].name);
if(ww==-1) break;
for(j=0;j<5;j++)
{
fscanf(fp,"%d",&temp[n].grade[j]);
}
n++;
}
printf("n=%d",n);
fclose(fp);
printf("\n");
for(i=0; i<n; i++)
{ k=i;
for(j=k+1; j<n; j++)
if(strcmp(temp[k].num,temp[j].num)>0)
k=j;
a=temp[i];
temp[i]=temp[k];
temp[k]=a;
}
for(k=0;k<n;k++)
{
printf("%10s号 %10s同学",temp[k].num,temp[k].name);
for(m=0;m<5;m++)
{
printf("%5d分",temp[k].grade[m]);
}
printf("\n");
}
if(n==0)printf("\n 文件中无记录!\n");
else printf("\n 文件中有%d个记录",n);
fq=fopen("d:\\std.dat","w");
if(fq==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
for(i=0;i<n;i++)
{
fprintf(fq,"%23s%15s",temp[i].num,temp[i].name);
for(j=0;j<5;j++)
{
fprintf(fq,"%2d",temp[i].grade[j]);
}
fprintf(fq,"\n");
}
fclose(fq);
printf("计算已完成 保存在d:\std.dat文件当中,请查验");
}
void mysort()
{
struct student temp[N]={0},a[N]={0};
int i=0,j=0,n=0,ww=0;
FILE*fp=NULL;
FILE*fq=NULL;
fp=fopen("d:\\yuan.dat","r");
if(fp==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
system("cls");
while(feof(fp)==0)
{
ww=fscanf(fp,"%23s%15s",temp[n].num,temp[n].name);
if(ww==-1) break;
for(j=0;j<5;j++)
{
fscanf(fp,"%d",&temp[n].grade[j]);
}
n++;
}
for(i=0;i<n;i++)
{
for(j=0;j<5;j++)
{
temp[i].ave=temp[i].ave+temp[i].grade[j];
}
temp[i].ave=temp[i].ave/5;
}
for(i=0;i<n;i++)
{
if(temp[i].ave<temp[i+1].ave)
{
a[i]=temp[i];
temp[i]=temp[i+1];
temp[i+1]=a[i];
}
}
fq=fopen("d:\\sort.dat","w");
if(fq==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
for(i=0;i<n;i++)
{
fprintf(fq,"%23s%15s%10.2f",temp[i].num,temp[i].name,temp[i].ave );
for(j=0;j<5;j++)
{
fprintf(fq,"%2d",temp[i].grade[j]);
}
fprintf(fq,"\n");
}
fclose(fq);
printf("计算已完成 保存在d:\sort.dat文件当中,请查验");
}
void myfenduan()
{
int i=0,j=0,n=0,ww;
int b[N]={0},c[N]={0},d[N]={0},e[N]={0},f[N]={0};
struct student temp[N]={0};
FILE*fp=NULL;
fp=fopen("d:\\yuan.dat","r");
if(fp==NULL)
{
printf("打开文件失败!\n");
return;
}
system("cls");
while(feof(fp)==0)
{
ww=fscanf(fp,"%23s%15s",temp[n].num,temp[n].name);
if(ww==-1) break;
for(j=0;j<5;j++)
{
fscanf(fp,"%d",&temp[n].grade[j]);
}
n++;
}
for(i=0;i<n;i++)
{
for(j=0;j<5;j++)
{
if(temp[i].grade[j]>=90)
b[j]=b[j]+1;
else if(temp[i].grade[j]>=80)
c[j]=c[j]+1;
else if(temp[i].grade[j]>=70)
d[j]=d[j]+1;
else if(temp[i].grade[j]>=60)
e[j]=e[j]+1;
else f[j]=f[j]+1;
}
}
printf("各门课、各分数段学生的人数\n");
printf("________________________________________________________\n");
printf(" |90分以上 | 80~89分 | 70~79分 | 60~69分 | 60分以下 \n");
printf("--------------------------------------------------------\n");
printf("高数_____%d________%d_________%d________%d_________%d___\n",b[0],c[0],d[0],e[0],f[0]);
printf("__________________________________________________\n");
printf("英语_____%d________%d_________%d________%d_________%d___\n",b[1],c[1],d[1],e[1],f[1]);
printf("__________________________________________________\n");
printf("物理_____%d________%d_________%d________%d_________%d___\n",b[2],c[2],d[2],e[2],f[2]);
printf("__________________________________________________\n");
printf("编程_____%d________%d_________%d________%d_________%d___\n",b[3],c[3],d[3],e[3],f[3]);
printf("__________________________________________________\n");
printf("马哲_____%d________%d_________%d________%d_________%d___\n",b[4],c[4],d[4],e[4],f[4]);
printf("__________________________________________________\n");
fclose(fp);
}
void mydisplay()
{ int n=0,j=0,k=0,m=0,ww;
struct student temp[N]={0};
FILE*fp=NULL;
fp=fopen("d:\\yuan.dat","r");
if(fp==NULL)
{
printf("打开文件失败!\n");
return;
}
system("cls");
while(feof(fp)==0)
{
ww=fscanf(fp,"%23s%15s",temp[n].num,temp[n].name);
if(ww==-1) break;
for(j=0;j<5;j++)
{
fscanf(fp,"%d",&temp[n].grade[j]);
}
n++;
}
for(k=0;k<n;k++)
{
printf("%23s %15s ",temp[k].num,temp[k].name);
for(m=0;m<5;m++)
{
printf("%d ",temp[k].grade[m]);
}
printf("\n");
}
if(n==0)printf("\n 文件中无记录!\n");
else printf("\n 文件中共有%d个记录!",n);
fclose(fp);
}
void myretake()
{
int i=0,e=0,j=0,n=0,s[5]={0},ww;
struct student temp[N]={0};
FILE*fp=NULL;
fp=fopen("d:\\yuan.dat","r");
if(fp==NULL)
{
printf("打开文件失败!\n");
return;
}
while(feof(fp)==0)
{
ww=fscanf(fp,"%23s%15s",temp[n].num,temp[n].name);
if(ww==-1) break;
for(j=0;j<5;j++)
{
fscanf(fp,"%d",&temp[n].grade[j]);
}
n++;
}
for (i=0;i<n;i++)
{
for(j=0;j<5;j++)
{
if(temp[i].grade[j]<60)
s[i]++;
}
if(s[i]>=1 && s[i]<=3)
{ printf("\n");
printf("学号%10s 姓名%10s \n",temp[i].num,temp[i].name);
if(temp[i].grade[0]<60)
printf("%10s您的高数成绩为%6d,需要补考,请于2011年2月26日上午9点在教学楼5023教室进行补考考试\n",temp[i].name,temp[i].grade[0]);
if(temp[i].grade[1]<60)
printf("%10s您的英语成绩为%6d,需要补考,请于2011年2月27日上午9点在教学楼5023教室进行补考考试\n",temp[i].name,temp[i].grade[1]);
if(temp[i].grade[2]<60)
printf("%10s您的物理成绩为%6d,需要补考,请于2011年2月28日上午9点在教学楼5023教室进行补考考试\n",temp[i].name,temp[i].grade[2]);
if(temp[i].grade[3]<60)
printf("%10s您的编程成绩为%6d,需要补考,请于2011年2月26日下午3点在教学楼5023教室进行补考考试\n",temp[i].name,temp[i].grade[3]);
if(temp[i].grade[4]<60)
printf("%10s您的马哲成绩为%6d,需要补考,请于2011年2月28日下午3点在教学楼5023教室进行补考考试\n",temp[i].name,temp[i].grade[4]);
}
}
for(e=0;e<n;e++)
{
if(s[e]!=0)
{
printf("\n");
printf("以上学生需要补考!");
}
else
{
printf("\n");
printf("没有学生需要补考!");
}
break;
}
}
void myselect()
{
int i=0,k=0,s[5]={0},n=0,j=0,ww;
struct student temp[N]={0};
FILE*fp=NULL;
fp=fopen("d:\\yuan.dat","r");
if(fp==NULL)
{
printf("打开文件失败!\n");
return;
}
while(feof(fp)==0)
{
ww=fscanf(fp,"%23s%15s",temp[n].num,temp[n].name);
for(j=0;j<5;j++)
{
ww=fscanf(fp,"%d",&temp[n].grade[j]);
if(ww==-1) break;
}
n++;
}
for(i=0;i<n-1;i++)
{
for(k=0;k<5;k++)
{
if (temp[i].grade[k]<60)
s[i]=s[i]+1;
}
if(s[i]>3)
{
printf("\n");
printf("学号%10s 姓名%10s 由于您不及格的科目为%d门(多于3门),因此退学。\n",temp[i].num,temp[i].name,s[i]);
if (temp[i].grade[0]<60)
printf("%15s您的高数成绩为%6d,为不及格。\n",temp[i].name,temp[i].grade[0]);
if (temp[i].grade[1]<60)
printf("%15s您的英语成绩为%6d,为不及格。\n",temp[i].name,temp[i].grade[1]);
if (temp[i].grade[2]<60)
printf("%15s您的物理成绩为%6d,为不及格。\n",temp[i].name,temp[i].grade[2]);
if (temp[i].grade[3]<60)
printf("%15s您的编程成绩为%6d,为不及格。\n",temp[i].name,temp[i].grade[3]);
if (temp[i].grade[4]<60)
printf("%15s您的马哲成绩为%6d,为不及格。\n",temp[i].name,temp[i].grade[4]);
}
}
}
void mynewcreat()
{
int i=0,k=0,s[5]={0},z[5]={0},v=0,n=0,m=0,j=0,p=0,c=0,ww;
struct student temp[N]={0};
FILE*fp=NULL;
FILE*fq=NULL;
fp=fopen("d:\\yuan.dat","r");
if(fp==NULL)
{
printf("打开文件失败!\n");
return;
}
while(feof(fp)==0)
{
ww=fscanf(fp,"%23s%15s",temp[n].num,temp[n].name);
if(ww==-1) break;
for(j=0;j<5;j++)
{
fscanf(fp,"%d",&temp[n].grade[j]);
}
n++;
}
while(i<=n)
{
for(k=0;k<5;k++)
{
if (temp[i].grade[k]<60)
s[i]=s[i]+1;
}
for(v=0;v<5;v++)
{
if(temp[i].grade[v]==0)
z[i]++;
}
if(z[i]==5)
{
break;
}
if(s[i]<=3)
{
i++;
}
if(s[i]>3)
{
for(c=i;c<=n;c++)
{
temp[c]=temp[c+1];
}
s[i]=0;
}
}
printf("\n");
printf("删除已退学的学生后,学生名册为:");
printf("\n");
for(p=0;p<n-1;p++)
{
printf("\n");
printf("%10s号 %10s分 ",temp[p].num,temp[p].name);
for(m=0;m<5;m++)
{
printf("%d ",temp[p].grade[m]);
}
printf("\n");
}
fq=fopen("d:\\next.dat","w");
if(fq==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
for(i=0;i<n;i++)
{
fprintf(fq,"%23s%15s",temp[i].num,temp[i].name);
for(j=0;j<5;j++)
{
fprintf(fq,"%2d",temp[i].grade[j]);
}
fprintf(fq,"\n");
}
fclose(fq);
printf("计算已完成 保存在d:\next.dat文件当中,请查验");
}
main()
{
myprint1();
}