第一步:
使用csv模块以列表形式读取数据集。
导入csv模块。
使用open()函数打开文件。
使用csv.reader()函数加载打开的文件。
在结果上调用list()以获取文件中所有数据的列表。
将结果分配给变量data。
显示第一5行data以验证一切。
import csv
with open("guns.csv", "r") as file:
data = list(csv.reader(file))
data[:5]
[['',
'year',
'month',
'intent',
'police',
'sex',
'age',
'race',
'hispanic',
'place',
'education'],
['1',
'2012',
'01',
'Suicide',
'0',
'M',
'34',
'Asian/Pacific Islander',
'100',
'Home',
'4'],
['2', '2012', '01', 'Suicide', '0', 'F', '21', 'White', '100', 'Street', '3'],
['3',
'2012',
'01',
'Suicide',
'0',
'M',
'60',
'White',
'100',
'Other specified',
'4'],
['4', '2012', '02', 'Suicide', '0', 'M', '64', 'White', '100', 'Home', '4']]
第二步:
提取第一行data,并将其分配给变量headers。
删除第一行data。
显示headers。
显示第一5行data以验证是否正确删除了标题行。
headers = data[0]
data = data[1:]
print(headers)
print(data[:5])
['', 'year', 'month', 'intent', 'police', 'sex', 'age', 'race', 'hispanic', 'place', 'education']
[['1', '2012', '01', 'Suicide', '0', 'M', '34', 'Asian/Pacific Islander', '100', 'Home', '4'], ['2', '2012', '01', 'Suicide', '0', 'F', '21', 'White', '100', 'Street', '3'], ['3', '2012', '01', 'Suicide', '0', 'M', '60', 'White', '100', 'Other specified', '4'], ['4', '2012', '02', 'Suicide', '0', 'M', '64', 'White', '100', 'Home', '4'], ['5', '2012', '02', 'Suicide', '0', 'M', '31', 'White', '100', 'Other specified', '2']]
第三步:
使用列表推导从中提取year列data。
因为year列是数据中的第二列,您需要1在每行的索引中获取元素。
将结果分配给变量years。
创建一个空的字典year_counts。
循环遍历每个元素years。
如果元素不是键year_counts,创建它,并将值设置为1。 如果元素是键year_counts,则将值增加1。
显示year_counts每年发生多少枪死亡事件。
years = [row[1] for row in data] year_counts = {} for year in years: if year in year_counts: year_counts[year] += 1 else: year_counts[year] = 1 year_counts
{'2012': 33563, '2013': 33636, '2014': 33599}
第四步:
使用list comprehension datetime.datetime为每行创建一个对象。将结果分配给dates。
year在每个行中的第二元件列。 该month柱是在每行中的第三个元素。 确保使用int()转换year和month整数。 通过year,month并day=1进入datetime.datetime()功能。
显示第一5行dates以验证一切正常。
计数每个唯一日期发生的次数dates。将结果分配给date_counts。
这跟我们在最后一个屏幕中做了类似的过程year_counts。
显示date_counts。
import datetime dates = [datetime.datetime(year=int(row[1]), month=int(row[2]), day=1) for row in data] date_counts = {} dates[:5] for date in dates: if date in date_counts: date_counts[date] +=1 else: date_counts[date] = 1 date_counts
{datetime.datetime(2012, 1, 1, 0, 0): 2758, datetime.datetime(2012, 2, 1, 0, 0): 2357, datetime.datetime(2012, 3, 1, 0, 0): 2743, datetime.datetime(2012, 4, 1, 0, 0): 2795, datetime.datetime(2012, 5, 1, 0, 0): 2999, datetime.datetime(2012, 6, 1, 0, 0): 2826, datetime.datetime(2012, 7, 1, 0, 0): 3026, datetime.datetime(2012, 8, 1, 0, 0): 2954, datetime.datetime(2012, 9, 1, 0, 0): 2852, datetime.datetime(2012, 10, 1, 0, 0): 2733, datetime.datetime(2012, 11, 1, 0, 0): 2729, datetime.datetime(2012, 12, 1, 0, 0): 2791, datetime.datetime(2013, 1, 1, 0, 0): 2864, datetime.datetime(2013, 2, 1, 0, 0): 2375, datetime.datetime(2013, 3, 1, 0, 0): 2862, datetime.datetime(2013, 4, 1, 0, 0): 2798, datetime.datetime(2013, 5, 1, 0, 0): 2806, datetime.datetime(2013, 6, 1, 0, 0): 2920, datetime.datetime(2013, 7, 1, 0, 0): 3079, datetime.datetime(2013, 8, 1, 0, 0): 2859, datetime.datetime(2013, 9, 1, 0, 0): 2742, datetime.datetime(2013, 10, 1, 0, 0): 2808, datetime.datetime(2013, 11, 1, 0, 0): 2758, datetime.datetime(2013, 12, 1, 0, 0): 2765, datetime.datetime(2014, 1, 1, 0, 0): 2651, datetime.datetime(2014, 2, 1, 0, 0): 2361, datetime.datetime(2014, 3, 1, 0, 0): 2684, datetime.datetime(2014, 4, 1, 0, 0): 2862, datetime.datetime(2014, 5, 1, 0, 0): 2864, datetime.datetime(2014, 6, 1, 0, 0): 2931, datetime.datetime(2014, 7, 1, 0, 0): 2884, datetime.datetime(2014, 8, 1, 0, 0): 2970, datetime.datetime(2014, 9, 1, 0, 0): 2914, datetime.datetime(2014, 10, 1, 0, 0): 2865, datetime.datetime(2014, 11, 1, 0, 0): 2756, datetime.datetime(2014, 12, 1, 0, 0): 2857}
第五步:
计数sex列中每个项目的次数。
将结果分配给sex_counts。
计数race列中每个项目的次数。
将结果分配给race_counts。
显示race_counts和sex_counts验证您的工作,并查看是否可以发现任何模式。
写一个降价细胞,详细说明你迄今为止学到的内容,你认为可能需要进一步检查。
sex_counts = {} race_counts = {} sexs = [row[5] for row in data[1:]] races = [row[7] for row in data[1:]] def count(items): item_counts = {} for item in items: if item in item_counts: item_counts[item] += 1 else: item_counts[item] = 1 return item_counts sex_counts = count(sexs) race_counts = count(races) sex_counts race_counts
{'Asian/Pacific Islander': 1326, 'Black': 23296, 'Hispanic': 9022, 'Native American/Native Alaskan': 917, 'White': 66237}
用到的知识点:
-
利用CSV模块导入CSV文件,将数据转化成数据列表
-
利用列表切片,删除表头
-
利用datetime模块,列表推导式,统计年份数量
-
统计性别和种族数量
第六步:
读入census.csv并转换为列表列表。将结果分配给census变量。 显示census以验证您的工作。
with open("census.csv") as file: census = list(csv.reader(file))
['Id', 'Year', 'Id', 'Sex', 'Id', 'Hispanic Origin', 'Id', 'Id2', 'Geography', 'Total', 'Race Alone - White', 'Race Alone - Hispanic', 'Race Alone - Black or African American', 'Race Alone - American Indian and Alaska Native', 'Race Alone - Asian', 'Race Alone - Native Hawaiian and Other Pacific Islander', 'Two or More Races'] ['cen42010', 'April 1, 2010 Census', 'totsex', 'Both Sexes', 'tothisp', 'Total', '0100000US', '', 'United States', '308745538', '197318956', '44618105', '40250635', '3739506', '15159516', '674625', '6984195']
第七步:
手动创建一个字典,mapping将每个键映射race_counts到比赛的人口数census。
在字典中的键应该是Asian/Pacific Islander,Black,Native American/Native Alaskan,Hispanic,和White。 在这种情况下Asian/Pacific Islander,您需要添加来自censusfor Race Alone - Asian和... 的计数Race Alone - Native Hawaiian and Other Pacific Islander。
创建一个空字典,race_per_hundredk。
循环通过每个键race_counts。
将与键相关联的值除以与键race_counts相关联的值mapping。 通过乘法100000。 将结果分配给相同的键race_per_hundredk。
当你完成后,race_per_hundredk应该包含每个100000人种族种族枪支死亡率。
打印race_per_hundredk以验证您的工作。
mapping = { "Asian/Pacific Islander": 15159516 + 674625, "Native American/Native Alaskan": 3739506, "Black": 40250635, "Hispanic": 44618105, "White": 197318956 } race_per_hundredk = {} for item in race_counts: race_per_hundredk[item] = race_counts[item]/mapping[item]*100000 race_per_hundredk
{'Asian/Pacific Islander': 8.374309664161762, 'Black': 57.8773477735196, 'Hispanic': 20.220491210910907, 'Native American/Native Alaskan': 24.521955573811088, 'White': 33.56849303419181}
第八步:
intent使用列表解析提取列。该intent柱是在第四列中data。
将结果分配给intents。
race使用列表解析提取列。该race柱是在第八列data。
将结果分配给races。
创建一个空的字典 homicide_race_counts
使用该enumerate()功能循环遍历每个项目races。应将该位置分配给循环变量i,并将值分配给循环变量race。
检查在位置值i在intents。 如果在位置值i的intents是Homicide: 如果密钥race不存在homicide_race_counts,创建它。 添加1到相关联的价值race在homicide_race_counts。
完成后,homicide_race_counts应该为每个种族分类中的一个键data。相关的价值应该是该次种族的凶杀枪死亡人数。
执行我们在最后一个屏幕使用也做了同样的程序mapping上homicide_race_counts得到从原始数据到每个率100000。
显示homicide_race_counts以验证您的工作。
将你的发现写在一个降价单元格中。
使用降价单元格中的数据编写您要追求的任何后续步骤。
intents = [row[3] for row in data[1:]] races = [row[7] for row in data[1:]] homicide_race_counts = {} for i, race in enumerate(races): if intents[i] == "Homicide": if race in homicide_race_counts: homicide_race_counts[race] += 1 else: homicide_race_counts[race] = 1 homicide_race_counts
{'Asian/Pacific Islander': 559, 'Black': 19510, 'Hispanic': 5634, 'Native American/Native Alaskan': 326, 'White': 9147}
hm_race_per_hundredk = {} for item in homicide_race_counts: hm_race_per_hundredk[item] = homicide_race_counts[item]/mapping[item]*100000 hm_race_per_hundredk
{'Asian/Pacific Islander': 3.530346230970155, 'Black': 48.471284987180944, 'Hispanic': 12.627161104219914, 'Native American/Native Alaskan': 8.717729026240365, 'White': 4.6356417981453335}
1