matplotlib和pandas实现数据可视化
数据可视化可以让我们很直观的发现数据中隐藏的规律,察觉到变量之间的互动关系,可以帮助我们更好的给他人解释现象,做到一图胜千文的说明效果。
常见的数据可视化库有:
matplotlib 是最常见的2维库,可以算作可视化的必备技能库,由于matplotlib是比较底层的库,api很多,代码学起来不太容易。
seaborn 是建构于matplotlib基础上,能满足绝大多数可视化需求。更特殊的需求还是需要学习matplotlib。
pyecharts 上面的两个库都是静态的可视化库,而pyecharts有很好的web兼容性,可以做到可视化的动态效果。
但是在数据科学中,几乎都离不开pandas数据分析库,而pandas可以做:
数据采集:如何批量采集网页表格数据?
数据读取:pd.read_csv/pd.read_excel
数据清洗(预处理):理解pandas中的apply和map的作用和异同
可视化,兼容matplotlib语法(今天重点)
londonweather.csv 链接: https://pan.baidu.com/s/1yZrsWG_-RytDAwIJMs ...
1021 个位数统计 (15分) PAT
1021 个位数统计 (15分)给定一个 k 位整数$N = d_{k-1}10^{k-1} + … + d_110^1 + d_0(0<=d_i<=9, i=0,…,k-1, d_{k-1}>0)$,请编写程序统计每种不同的个位数字出现的次数。例如:给定 N=100311,则有 2 个 0,3 个 1,和 1 个 3。
输入格式:每个输入包含 1 个测试用例,即一个不超过 1000 位的正整数 N。
输出格式:对 N 中每一种不同的个位数字,以 D:M 的格式在一行中输出该位数字 D 及其在 N 中出现的次数 M。要求按 D 的升序输出。
输入样例:
100311
输出样例:
0:21:33:1
解题思路:题意好懂,求一个数字中各个数字出现的次数,按照格式输出。
不超过1000位的正整数,本来考虑的是用Long类型处理,将各位通过除法取余等运算求出,后发现不太好写代码。
巧妙利用二维数组来存储每个数字出现的次数,我想也可以用List,HashMap等数据结构。将读入的字符串转为数组逐位处理即可。
代码实现:具体逻辑看注释
import java.util.Sca ...
1028 人口普查 (20分) PAT Java代码实现 -运行超时(牛客AC)
1028 人口普查 (20分)某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入格式:输入在第一行给出正整数 N,取值在(0,10^5 ];随后 N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按 yyyy/mm/dd(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。
输出格式:在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
输入样例:
5John 2001/05/12Tom 1814/09/06Ann 2121/01/30James 1814/09/05Steve 1967/11/20
输出样例:
3 Tom John
解题思路:此题题意也很容易理解,只需找出在时间段[1814/09/06-2014/09/06]之间的最晚和最早时间。如何判断时间段是否符合,以及求 ...
1012 数字分类 (20分) PAT
1012 数字分类 (20分)给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:
A1 = 能被 5 整除的数字中所有偶数的和;A2 = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1 −n2 +n3 −n4 ⋯;A3 = 被 5 除后余 2 的数字的个数;A4 = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;A5 = 被 5 除后余 4 的数字中最大数字。
输入格式:每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。
输出格式:对给定的 N 个正整数,按题目要求计算 A1 ~A5 并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若其中某一类数字不存在,则在相应位置输出 N。
输入样例 1:
13 1 2 3 4 5 6 7 8 9 10 20 16 18
输出样例 1:
30 11 2 9.7 9
输入样例 2:
8 1 2 4 5 6 7 9 16
输出样例 ...
1011 A+B 和 C (15分)
1011 A+B 和 C (15分)给定区间 [−2^31, 2^31 ] 内的 3 个整数 A、B 和 C,请判断 A+B 是否大于 C。
输入格式:输入第 1 行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。
输出格式:对每组测试用例,在一行中输出 Case #X: true 如果 A+B>C,否则输出 Case #X: false,其中 X 是测试用例的编号(从 1 开始)。
输入样例:
41 2 32 3 42147483647 0 21474836460 -2147483648 -2147483647
输出样例:
Case #1: falseCase #2: trueCase #3: trueCase #4: false
解题思路:此题题意很容易理解,用数学式子判断并输入特定格式结果。我第一眼看到的是这三个整数的取值范围,所以要注意数据类型的选择,此处选取long类型。需要注意的是选择何种读入数据方式,合理选择数据类型,以及精简代码。
看下侧代码更好地理解为何选取long
...
7-20 简单计算器(20 分) PAT
7-20 简单计算器(20 分)模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式:输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式:在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
输入样例:
1+2*10-10/2=
输出样例:
10
#include <stdio.h>int main(void){ int a,b,c; char n; scanf("%d",&a); while((n=getchar())!='='){ scanf("%d",&b); if(n=='/' && b==0 ||(n!='+' && n!='-' && n!='*' & ...
查验身份证 (15分) PAT
1031 查验身份证 (15分)一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:
Z:0 1 2 3 4 5 6 7 8 9 10M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
输入格式:输入第一行给出正整数N(≤100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
输出格式:按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出All passed。
输入样例1:
432012419880824005612010X19890101123411010819671130186637070419881216001X
输出样例1:
12010X19890101123 ...
1017 A除以B(20分)
1017 A除以B (20分)本题要求计算 A/B,其中 A 是不超过 1000 位的正整数,B 是 1 位正整数。你需要输出商数 Q 和余数 R,使得 A=B×Q+R 成立。
输入格式 输入在一行中依次给出 A 和 B,中间以 1 空格分隔。
输出格式在一行中依次输出 Q 和 R,中间以 1 空格分隔。
输入样例
123456789050987654321 7
输出样例
17636684150141093474 3
代码实现import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class Main{ public static void main(String[] args) throws IOException { //读取输入 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); ...
1022 D进制的A+B (20分) PAT
1022 D进制的A+B (20分)输入两个非负 10 进制整数 A 和 B (≤2^30−1),输出 A+B 的 D (1<D≤10)进制数。
输入格式:输入在一行中依次给出 3 个整数 A、B 和 D。
输出格式:输出 A+B 的 D 进制数。
输入样例:
123 456 8
输出样例:
1103
解题思路:此题题意简单易懂,也没有那么些坑,说一下我看的解题思路。首先这道题是求进制转换,进制要求(1-10],不用过多考虑用英文字母代替10以上数字问题。然后A和B的范围为int,A+B可就不一定了,故A+B的和考虑用long。进制转换就是类似除法竖式求余,不懂的可以点这个看一下。进制转换解题想法和 1017 A除以B 类似。第一次代码提交有一个测试点未过,仔细想了想是忘记了A+B结果为0情况处理,加上后顺利AC。解题大约耗时5分钟。
代码实现:具体逻辑细节看代码注释
import java.util.Scanner;public class Main { public static void main(String[] args) { ...
反射模拟实现spring的getBean方法
IoC(Inversion of Control) 控制反转,是spring框架的核心。DI(dependency injection)依赖注入是IoC 的核心。
IoC控制反转到底反转了什么?依赖对象的创建和依赖关系的形成,解耦。
spring不用自己创建对象,只需要在配置文件中配置属性就可以对其实现赋值。依赖注入底层是如何实现的呢,今天就用反射来手动实现getBean()方法。
项目中需要用到dom4j的jar包来解析spring的xml配置文件。下载链接如下:https://dom4j.github.io/
工程的总体目录如下,代码简单,注释详细。
总目录
实体类Student的代码如下:四个不同属性 ,分别设置setter和getter方法,重写toString方法
package com.entity;public class Student { private String name; private int age; private char gender; private double salary; public String getName() ...