черчение и сводная таблица задача - PullRequest
0 голосов
/ 28 сентября 2019

ЗАДАЧА: Используя главные мужские и женские имена (всего два имени), проверьте их тренды с течением времени, то есть нанесите на график общее число рождений с этими именами в период с 1990 по 2010 год (рисунок 2).Чтобы сделать это, вам сначала нужно создать сводную таблицу.

Итак, у меня есть главные имена каждого мужчины и женщины, использующие:

g = data.groupby(['name','sex'])['births'].sum().reset_index(name = 'birth_sum')
top_names = g.loc[g.sex == 'F'].head(3).append(g.loc[g.sex == 'M'].head(3))
bottom_names = g.loc[g.sex == 'F'].tail(3).append(g.loc[g.sex == 'M'].tail(3))

print(top_names)
print(bottom_names)

tb_list = pd.concat([top_names, bottom_names], ignore_index = True, sort = False)
print(tb_list)

Данные .csv выглядяткак ...

             name sex  births  year
0         Jessica   F   46459  1990
1          Ashley   F   45544  1990
2        Brittany   F   36532  1990
3          Amanda   F   34391  1990
4        Samantha   F   25864  1990
5           Sarah   F   25803  1990
6       Stephanie   F   24853  1990
7        Jennifer   F   22218  1990
8       Elizabeth   F   20739  1990
9          Lauren   F   20498  1990
10          Megan   F   20249  1990
11          Emily   F   19349  1990
12         Nicole   F   17948  1990
13          Kayla   F   17534  1990
14          Amber   F   15862  1990
15         Rachel   F   15692  1990
16       Courtney   F   15374  1990
17       Danielle   F   14330  1990
18        Heather   F   14216  1990
19        Melissa   F   13996  1990
20        Rebecca   F   13669  1990
21       Michelle   F   13408  1990
22        Tiffany   F   13160  1990
23        Chelsea   F   12782  1990
24      Christina   F   11924  1990
25      Katherine   F   11613  1990
26         Alyssa   F   11259  1990
27        Jasmine   F   11034  1990
28          Laura   F   10903  1990
29         Hannah   F   10276  1990
          ...  ..     ...   ...
587772  Zecharyah   M       5  2009
587773        Zee   M       5  2009
587774   Zekariah   M       5  2009
587775      Zekhi   M       5  2009
587776       Zell   M       5  2009
587777    Zepplin   M       5  2009
587778     Zequan   M       5  2009
587779     Zereon   M       5  2009
587780     Zevion   M       5  2009
587781       Zhen   M       5  2009
587782     Zhyair   M       5  2009
587783       Zien   M       5  2009
587784       Zier   M       5  2009
587785   Zildjian   M       5  2009
587786        Zim   M       5  2009
587787      Zimir   M       5  2009
587788       Ziya   M       5  2009
587789      Ziyun   M       5  2009
587790     Zlatan   M       5  2009
587791       Zoen   M       5  2009
587792     Zubayr   M       5  2009
587793     Zuhaib   M       5  2009
587794      Zykee   M       5  2009
587795     Zykell   M       5  2009
587796      Zylar   M       5  2009
587797  Zyquarius   M       5  2009
587798      Zyran   M       5  2009
587799    Zyreion   M       5  2009
587800     Zyrian   M       5  2009
587801     Zyvion   M       5  2009

Я устал использовать ...

top2 = g.loc[g.sex == 'F'].head(1).append(g.loc[g.sex == 'M'].head(1))
print(top2)

pivot2 = top2.pivot_table(['birth_sum'], index = ['name','sex'])
print(pivot2)

male = data.loc[data.name == 'Aaban']
female = data.loc[data.name == 'Aabriella']
print(male)
print(female)

names = pd.concat([male, female], ignore_index = True, sort = False)
print(names)

pivot3 = names.pivot_table(['births'], index = ['name','sex', 'year'])
print(pivot3)

fig1 = plt.figure()

ax1 = fig1.add_subplot(1, 1, 1)
ax1.plot(pivot3['M'], linestyle="--", color="k", label="M")
ax1.plot(pivot3['F'], linestyle="--", color="b", label="F")

ax1.tick_params(rotation=90)
ax1.legend(loc="best")

1 Ответ

0 голосов
/ 28 сентября 2019

Вот решение для получения трех лучших имен для каждого пола и составления графика рождения против года.

Данные, загруженные отсюда и считываемые непосредственно из zip-файла: Данные об именах детей

Тогда вот код для чтения файла, поиска главных имен по полу и вывода данных:

from zipfile import ZipFile
import pandas as pd
import altair as alt

df_list = []
cols = ['state', 'sex', 'year', 'name', 'births'] 

# read the data from each state in the zip file and concat into a dataframe
zip_file = ZipFile('namesbystate.zip')
for text_file in zip_file.infolist():
    if text_file.filename.endswith('.TXT'):
        df_list.append(pd.read_csv(zip_file.open(text_file.filename), names=cols))
df = pd.concat(df_list)
display(df.head())

# sum up the births by sex and name
g = df.groupby(['sex', 'name']).agg({'births': 'sum'})

# get the overall top 3 all time names for each sex
m = g.loc[('M', slice(None)), ].nlargest(3, 'births')
f = g.loc[('F', slice(None)), ].nlargest(3, 'births')
top_names = pd.concat([m, f]).reset_index()
display(top_names)

# make a dataframe of just the top name sex combinations by inner joining
df_top = pd.merge(df, top_names.drop('births', axis=1), how='inner')

# Plot the data using Altair
alt.renderers.enable('notebook')

# sum up the data across all states.
source = df_top.groupby(['sex', 'year', 'name']).agg({'births': 'sum'}).reset_index()

alt.Chart(source).mark_line().encode(
    x='year:O',
    y='births',
    color='sex'
).properties(
    width=400,
    height=220
).facet('name').properties(columns=2).resolve_scale(x='independent')

Конечный результат выглядит следующим образом:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...