随机生成身份证号码并进行分析

  数据分析练习1,要求:给你1000个身份证号码,告诉我里面有多少男女,各省市人口的分布,这些人的年龄和星座。分析:我要先生成1000个可以满足上面分析的身份证,然后进行分析,我想最后能够得到可视化的数据。

import random
import datetime
def ident_generator():
#身份证号的前两位,省份代号
    province = ('11','12','13','14','15','21','22','23','31','32','33','34','35',
    '36','37','41','42','43','44','45','46','50','51','52','53','54','61','62','63','64','65','71','81','82')
#第3-第6位为市和区的代码。这里傻瓜式的设置为随机4位数(我知道这里没有0000-0999)
    district = random.randint(1000,9999)
#第7-第14位出生的年月日的代码,这里设置的是,大于等于18岁左右,小于68岁左右
    birthdate = (datetime.date.today() - datetime.timedelta(days = random.randint(6500, 25000)))
#第15-第16位为户籍所在地派出所。这里傻瓜式的设置为随机2位数
    police_station = random.randint(10,99)
#第17位性别
    gender = random.randrange(0,9,1)
    
#拼接出身份证号的前17位
    ident = province[random.randint(0, 33)] + str(district) + birthdate.strftime("%Y%m%d") + str(police_station) + str(gender)
    
#将前面的身份证号码17位数分别乘以不同的系数,系数见coe,然后将这17位数字和系数相乘的结果相加。用加出来和除以11,看余数是多少?
    coe = {1: 7, 2: 9, 3: 10, 4: 5, 5: 8, 6: 4, 7: 2, 8: 1, 9: 6, 10: 3, 11:7, 12: 9, 13: 10, 14: 5, 15: 8, 16: 4, 17: 2}
    summation = 0
    
#ident[i:i+1]使用的是python的切片获得每位数字
    for i in range(17):
        summation = summation + int(ident[i:i + 1]) * coe[i+1]
        
#用余数对照key得到校验码,比如余数为2,则校验码(第18位)为X        
    key = {0: '1', 1: '0', 2: 'X', 3: '9', 4: '8', 5: '7', 6: '6', 7: '5', 8: '4', 9: '3', 10: '2'}
    check_code = key[summation % 11]

    return ident + check_code
def get_constellation(month, date):
    dates = (21, 20, 21, 21, 22, 22, 23, 24, 24, 24, 23, 22)
    constellations = ("摩羯", "水瓶", "双鱼", "白羊", "金牛", "双子", "巨蟹", "狮子", "处女", "天秤", "天蝎", "射手", "摩羯")
    if date < dates[month-1]:
        return constellations[month-1]
    else:
        return constellations[month]

这里参考的:https://www.cnblogs.com/jiaolong/archive/2011/03/13/1982945.html
他也是参考的人家的,不过对12/31的问题做了优化

ident_generator()
'462467196305067669'   

现在,我们有了身份证生成器,我希望,能够生成1000个这样的身份证,然后分析,然后将身份证以及分析得到的数据存为CSV文件

import numpy as np

arr = np.empty(shape=(1000,6))
arr.dtype
arr = arr.astype(np.str)
for i in range(1000):
    id = ident_generator()
    # print (id)
    # print (id[0:2])
    province_id = {'11':'北京市','12':'天津市','13':'河北省','14':'山西省','15':'内蒙古','21':'辽宁省','22':'吉林省',
               '23':'黑龙江','31':'上海市','32':'江苏省','33':'浙江省','34':'安徽省','35':'福建省','36':'江西省',
               '37':'山东省','41':'河南省','42':'湖北省','43':'湖南省','44':'广州省','45':'广西省','46':'海南省',
               '50':'重庆市','51':'四川省','52':'贵州省','53':'云南省','54':'西藏省','61':'陕西省','62':'甘肃省',
               '63':'青海省','64':'宁夏省','65':'新疆省','71':'台湾省','81':'香港省','82':'澳门省'}
    province_out = province_id[id[0:2]]
    #print (province_out)
    #print (id[6:14])

    time = datetime.datetime.strptime(id[6:14], '%Y%m%d').date()
    #print (time)

    age = 2019 - int(id[6:10]) + 1
    #print (age)

    gender_id = {'1':'男','2':'女','3':'男','4':'女','5':'男','6':'女','7':'男','8':'女','9':'男','0':'女'}
    gender_out = gender_id[id[16]]
    #print (gender_out)

    month = int(id[10:12])
    day = int(id[12:14])
    #print (constellation)
    
    # print (get_constellation(month, day)) 
    constellation_out = get_constellation(month, day)
    
    arr[i]=[id,province_out,time,age,gender_out,constellation_out]
import pandas as pd
data_out = pd.DataFrame(arr,columns=('ident','procince','brithday','age','gender','constellation'))
data_out.head()
#data_out.to_csv('../datasets/Id_information.csv')
图片1
array([['376222196009229908', '山东省', '1960-09-22', '60', '女', '处女'],
       ['418222197511259677', '河南省', '1975-11-25', '45', '男', '射手'],
       ['518454195504104083', '四川省', '1955-04-10', '65', '女', '白羊'],
       ...,
       ['618246199207136071', '陕西省', '1992-07-13', '28', '男', '巨蟹'],
       ['211247199809185853', '辽宁省', '1998-09-18', '22', '男', '处女'],
       ['541181196208276872', '西藏省', '1962-08-27', '58', '男', '处女']],
      dtype='<U32')

这里我把这个存储为CSV的操作注释掉了,防止每次运行将文件替换掉,那文件里存在的版本为上面这个。
下面就开始分析。

dataset_url = '../../datasets/Id_information.csv'
data = pd.read_csv(dataset_url)
data.head()

但是我从CSV读取后,是这样的:

图片2

不知道为啥,多了一列索引

data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 7 columns):
Unnamed: 0       1000 non-null int64
ident            1000 non-null object
procince         1000 non-null object
brithday         1000 non-null object
age              1000 non-null int64
gender           1000 non-null object
constellation    1000 non-null object
dtypes: int64(2), object(5)
memory usage: 54.8+ KB
data.describe()
图片3
data["gender"].value_counts()

女 559
男 441
Name: gender, dtype: int64

import matplotlib.pyplot as plt
%matplotlib inline   
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

plt.figure(figsize=(6,6)) #调节图形大小
labels = [u'女', u'男']
sizes = [559, 441]
colors = 'red', 'orange'
explode = (0.2, 0)  # 各类别的偏移半径
patches,text1,text2 = plt.pie(sizes,
                      explode=explode,
                      labels=labels,
                      colors=colors,
                      autopct = '%3.2f%%', #数值保留固定小数位
                      shadow = False, #无阴影设置
                      startangle =90, #逆时针起始角度设置
                      pctdistance = 0.6) #数值距圆心半径倍数距离
#patches饼图的返回值,texts1饼图外label的文本,texts2饼图内部的文本
plt.axis('equal')
plt.title("男女性别分布情况图")
plt.legend()
plt.show()
图片4
data["age"].hist(bins=50, figsize=(8,5))

plt.title("年龄分布情况图")
plt.xlabel('年龄')
plt.ylabel('人数')

plt.show()
图片5

我的博客: 随机生成身份证号码并进行分析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,641评论 6 525
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,754评论 3 408
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 173,075评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,369评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,386评论 6 402
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,800评论 1 317
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,122评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,130评论 0 281
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,689评论 1 327
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,693评论 3 348
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,804评论 1 356
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,399评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,128评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,528评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,705评论 1 278
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,409评论 3 383
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,878评论 2 368