Vous êtes sur la page 1sur 40

ECOLE DES SCIENCES DE L'INFORMATION

Rapport du Projet

Datawarehouse

CONCEPTION ET RÉALISATION

RÉALISÉ PAR :
Reda El Marhouch
N77 GDV
Introduction

Au cours des années 1940, le ministère américain du travail, et plus précisément


le Bureau des statistiques du travail (BLS), a commencé à recueillir des
informations sur l'emploi par le biais d'enquêtes mensuelles sur les ménages.
D'autres séries de données remontent à 1912. Le taux de chômage a varié de 1 %
pendant la Première Guerre mondiale à 25 % pendant la Grande Dépression (dans
la plupart des pays, il a commencé en 1929 et a duré jusqu'en 1941. Ce fut la
dépression la plus longue, la plus profonde et la plus répandue du XXe siècle) .
Plus récemment, elle a atteint des pics de 10,8 % en novembre 1982 et de 10,0 %
en octobre 2009. Le chômage a tendance à augmenter pendant les récessions et à
diminuer pendant les expansions. De 1948 à 2015, le chômage s'est élevé en
moyenne à environ 5,8 %. Les États-Unis ont connu 11 récessions depuis la fin de
l'après-guerre en 1948.
Quelques définitions de base
Le Bureau américain des statistiques du travail a défini les concepts de base de
l'emploi comme suit :
• Les personnes qui ont un emploi ont un emploi.
• Les personnes qui sont sans emploi, à la recherche d'un emploi et
disponibles pour travailler sont au chômage.
• Les personnes qui n'ont ni emploi ni chômage ne font pas partie de la
population active.
Notre objectif est de mieux Comprendre l’évolution du taux de chômage les
comtés à travers tous les États-Unis et avoir des insights sur les indicateurs qui
évolue en parallèle dans le même contexte et les éventuelles relations entre ces
indicateurs.
Sources de données :
Nous comptons utiliser un dataset « chômage dans les Etats Unis » de la
plateforme publique Kaggle, puis alimenter ce dataset par des données
historiques par Web Scraping à partir de bureau américain des statistiques du
travail. Et puis ajouter des indicateurs globaux par exemple : la population, le
revenu médiane, l’indice de diversité et la criminalité.
les données (après scraping), seront basées sur les comtés à travers tous les
États, et sur plusieurs années entre 2010 et 2019.
Les sources de notre ensemble de données sont les suivantes :
- Indice de diversité de Kaggle :
https://www.kaggle.com/mikejohnsonjr/us-counties-diversity-index
- Le chômage selon Kaggle :
https://www.kaggle.com/aniruddhasshirahatti/us-unemployment-dataset-2010-
2020
- Le bureau américain des statistiques du travail :
https://data.bls.gov/lausmap/showMap.jsp;jsessionid=B485A0AB0EA8E46073B2C
5BE2137BAA8._t3_07v
- Revenu médian par comté de Data World : https://data.world/tylerudite/2015-
median-income-by-countsy
-criminalité :
https://www.kaggle.com/marshallproject/crime-rates
-population :
https://www.ers.usda.gov/data-products/county-level-data-sets/download-data/

Liste des Outils


• Python
• Microsoft SQL Server Management Studio
• Microsoft SQL Server Integration Services
• Tableau
Conception
Descriptif détaillé des indicateurs choisis et Matrice dimensionnelle

Population
Revenu
County
Month

Crime
State

Race
Year
Indicateurs choisis Explication
• Quelle année a connu le taux de Identifier l’année avec le taux de chômage le plus x
chômage le plus élevé/le plus bas bas en calculant la moyenne des « taux par
comtés »
Quels états/comtés ont les taux de Calculer le taux de criminalité par comtés pour un x x x
criminalité les plus élevés/les plus bas mois ou une année donnée
cette année
• Les États avec le taux de chômage le plus Identifier les top 10 Etats ayant le taux de x x x
élevé cette année/ce mois chômage le plus élevé/bas pour un mois et une
année donnée
• Les types de crimes les plus répandus Les types de crimes répandus dans les Etats ayant x x x
dans les Etats ayant un taux de chômage le taux de chômage le plus élevé/bas pour une
élevé/bas cette année année donnée
• les ethnies majoritaires par comté La distribution des ethnies les plus présents pour x x
un comté donné
• Les types de crimes les plus répandu Les types de crimes répandus dans les Etats le x x x
dans les Etats ayant un revenu médian revenu médian le plus élevé/bas
élevé/bas
• les ethnies majoritaires dans les états Les ethnies les plus présents dans les états ayant x x x
ayant un revenu médian élevé/bas un revenu médian élevé /bas
• les comtés ayant min/max revenu La distribution des comtés selon le revenu x x x
médian par état médian pour un état donné
• Relation entre taux de chômage taux de Décrire la relation entre taux de chômage taux de x x x
criminalité et revenu médian criminalité et revenu médian
Conception du datawarehouse
Création du Datawarehouse
Dans cette partie du projet, nous mettrons en œuvre l'entrepôt de données sur SSMS sous le nom
empDW, nous utiliserons le modèle en flocon,

Les attributs de chaque tableau sont représentés sur le diagramme ci-dessous.

Pour la dimension crime :


INDEX : Nombre total de crimes répertoriés dans le fichier UCR (Uniform Crime Report), à
l'exclusion des incendies criminels. La somme des variables MURDER à MVTHEFT.
MODINDX : INDICE MODIFIÉ. Nombre total de crimes répertoriés dans le fichier DUC
(Déclaration uniforme de la criminalité), y compris les incendies criminels (somme des
variables, MURDER à ARSON)
MURDER : Nombre de Meurtriers
RAPE : Nombre de viols
ROBBERY : Nombre de vols
AGASSLT : Nombre d'assauts aggravés
BURGLRY : Nombre de cambriolages
LARCENY : Nombre de vols simples
MVTHEFT : Nombre de vols de véhicules à moteur
ARSON : Nombre d'incendies criminels
Crime_rate : Taux de criminalité
Collecte et préparation des données
Pour l'étape de la collecte des données, j'ai opté pour un script python pour le
scraping des données du site officiel du bureau de statistiques du travail aux
États-Unis, et puis j'ai saisi l'occasion d'avoir les données en pandas data frame
pour les mettre à niveau en les traitant par des opérations de nettoyage et d'ajout
de colonne pour pouvoir faire la jointure facilement on Microsoft SQL server .
Script exécuté en premier lieu sur Jupiter notebook sera « par la suite » introduit
sous composante script python dans le processus ETL du datawarehouse (pour
l’automatisation complète du DW)
Voir le notebook associé en annexe

Pipeline ETL
1-Chargement des données vers des tables staging
les fichiers CSVs générés après l’exécution de ce script sont introduits comme
fichiers plats et chargés dans des tables « Staging » temporaires pour être
transformé et chargé vers les dimensions dans l'entrepôt de données que nous
avons créé sur le SQL Server Management Studio (SSMS)
2-Population des dimensions
Ensuite on transforme les données issues des tables staging, et on les charge dans les tables de
dimensions. Dans le schéma en flocon on commence le chargement par les dimensions les plus éloignés
de la table de faits.

Dim_State

Select DISTINCT [State Code], [State]

FROM [empDW].[dbo].[RevStagingTable] ORDER BY [State] ASC

Dim_County

SELECT DISTINCT RevStagingTable.fips, RevStagingTable.County, dim_state.state_ID

FROM RevStagingTable INNER JOIN

dim_state ON RevStagingTable.[State] = dim_state.[state_name]

ORDER BY RevStagingTable.fips

Pour la dimension County on a introduit une tâche de conversion de données pour changer le type de
FIPS d’une chaîne de caractères vers un entier
Dim_year

Select DISTINCT [year]

FROM [empDW].[dbo].[EmployStaging] ORDER


BY [year] ASC
Dim_Month

SELECT DISTINCT EmployStaging.[month] as month,

DATENAME(month,concat('1970-',month,'-01')) as
monthname,

dim_year.Year_ID as year_id

FROM EmployStaging INNER JOIN

dim_year ON EmployStaging.[year] = dim_year.[year]


Dim_Population

SELECT dim_year.Year_ID as year_id,dim_county.county_ID as


county_id, PopStaging.[pop_Estimate] as pop_estimate

FROM PopStaging INNER JOIN

dim_year ON PopStaging.[year] = dim_year.[year]

INNER JOIN dim_county ON CAST(CAST


(PopStaging.[FIPStxt] AS NUMERIC(19,4)) AS INT) = dim_county.[county_ID]
Dim_Crime

SELECT dim_year.Year_ID as year_id,dim_county.county_ID as county_id, CrimeStaging.[INDEX],

CrimeStaging.[MODINDX],

CrimeStaging.[MURDER],

CrimeStaging.[RAPE]

,CrimeStaging.[ROBBERY]

,CrimeStaging.[AGASSLT]

,CrimeStaging.[BURGLRY]

,CrimeStaging.[LARCENY]

,CrimeStaging.[MVTHEFT]

,CrimeStaging.[ARSON]

,CrimeStaging.[crime_rate_per_100000]

FROM CrimeStaging INNER JOIN dim_year ON CrimeStaging.[year] = dim_year.[year]

INNER JOIN dim_county ON CAST(CAST (CrimeStaging.[FIPS] AS NUMERIC(19,4)) AS INT) =


dim_county.[county_ID]

Dim_Revenu

SELECT dim_year.Year_ID as year_id,dim_county.county_ID as county_id,


CONVERT(float, RevStagingTable.[Median household income]) as revenu

FROM RevStagingTable INNER JOIN dim_year ON RevStagingTable.[year] =


dim_year.[year]

INNER JOIN dim_county ON CAST(CAST (RevStagingTable.[fips] AS


NUMERIC(19,4)) AS INT) = dim_county.[county_ID]
Dim_Race

SELECT dim_year.Year_ID as year_id,dim_county.county_ID as county_id, DivStaging.[Diversity]


,DivStaging.[Black or AA],DivStaging.[American Indian],DivStaging.[Asian], DivStaging.[Hawaiian]
,DivStaging.[Two or More],DivStaging.[Latino],DivStaging.[White]

FROM DivStaging INNER JOIN dim_year ON DivStaging.[year] = dim_year.[year]

INNER JOIN dim_county ON CAST(CAST (DivStaging.[fips] AS NUMERIC(19,4))


AS INT) = dim_county.[county_ID]

ORDER BY county_id
3-Population de la table de faits
Après avoir rempli les dimensions, on passe à la table de faits. On remplit les champs nécessaires de la
table en utilisant une requête SQL et des recherches de correspondance pour les IDs

Fact_Unemployement

SELECT dim_county.county_ID,month,year,
Employment, Labor_Force, Unemployment,
Unemployment_Rate

From EmployStaging

INNER JOIN dim_county ON CAST(CAST


(EmployStaging.[fips] AS NUMERIC(19,4)) AS INT) =
dim_county.[county_ID]

Order By year,month,county_ID

Puis à l’aide des taches d’exécution de requêtes SQL on effectue La mise à jour des tables par les clés
secondaires qui renvoient vers les dimensions.
Crime_ID

UPDATE fact_unemployement
SET fact_unemployement.crime_ID = dim_crime.crime_ID
FROM fact_unemployement
LEFT JOIN dim_crime ON
(fact_unemployement.year_ID = dim_crime.year_ID
AND
fact_unemployement.county_ID = dim_crime.county_ID)
revenue_ID
UPDATE fact_unemployement
SET fact_unemployement.revenu_ID = dim_revenu.revenu_ID
FROM fact_unemployement
LEFT JOIN dim_revenu ON
(fact_unemployement.year_ID = dim_revenu.year_ID
AND
fact_unemployement.county_ID = dim_revenu.county_ID)
race_ID
UPDATE fact_unemployement
SET fact_unemployement.race_ID = dim_race.race_ID
FROM fact_unemployement
LEFT JOIN dim_race ON
(fact_unemployement.year_ID = dim_race.year_ID
AND
fact_unemployement.county_ID = dim_race.county_ID)
population_ID
UPDATE fact_unemployement
SET fact_unemployement.population_ID = dim_population.population_ID
FROM fact_unemployement
LEFT JOIN dim_population ON
(fact_unemployement.year_ID = dim_population.year_ID
AND fact_unemployement.county_ID = dim_population.county_ID)
l’ETL complet

Analyse et Reporting
On a procédé par l’importation des données du datawarehouse dans l’onglet
data source.
1-Création des graphiques
En utilisant le worksheet on crée les graphiques à partir des mesures et des dimensions existantes dans
l'onglet data, puis Bon paramètres l'affichage et la mise en page du graphique pour pouvoir l'intégrer
dans un nouveau dashboard.

2-Création du Dashboard
En créant un nouvel onglet dashboard, on peut importer les graphiques crées ultérieurement et les
insérer, On peut aussi créer des filtres pour paramétrer l'affichage d'une manière interactive dans notre
dashboard.

Page Principale du tableu de bord


On a ajouté les Sliders pour rendre notre tableau interactif, ainsi que des boutons pour changer le
paramétrage de quelques graphiques, On a aussi paramétré des données additionnelles à afficher
lorsqu'on met la souris sur un élément « hover ». Par exemple dans la carte : si on clique sur « voir par
comté » on va passer à une visualisation avec un niveau de granularité plus profond.

Carte Détaillée

Page 2 du Tableau de bord


3- Analyse des KPI

• Quelle année a connu le taux de chômage le plus élevé/le plus bas


 Analyse :

On remarque d'après ce
graphique que le taux de
chômage n’a cessé de
diminuer cette dernière
décennie avec une
baisse considérable de
9,3% en 2010 à 3,96% en
2019

• Quels États/comtés ont les taux de criminalité les plus élevés/les plus en 2016
 Analyse :

Au niveau des états on remarque


que Nebraska a le taux de criminalité
le plus bas aux États-Unis avec une
moyenne de 61,6 actes criminels
dans une population de 100000
personnes. Cependant, South
Carolina a le taux de criminalité le
plus haut avec une moyenne de
581,1 actes criminels dans une
population de 100000.
 Analyse :

Au niveau des comtés on remarque que Zeibach County (Comté dans le Dakota du Sud) a le
taux de criminalité le plus bas aux États-Unis avec une moyenne de 35 actes criminels dans une
population de 100000 personnes. Abbeville County (Comté en Caroline du Sud) a le taux de
criminalité le plus haut avec une moyenne de 581,1 actes criminels dans une population de
100000.
• Les États avec le taux de chômage le plus élevé cette année/ce mois
On a ajouté une liste déroulante pour pouvoir
sélectionner l'année et le moi l’ordre des Top 10
états changes en fonction de la valeur chronologique
l’option Play nous permet de dérouler le classement
chronologiquement sous forme de graphique
dynamique
«Bar Chart Race»

 Analyse :

Les Etats ayant le taux de chômage le plus élevé en janvier 2011 sont La Californie Avec un taux
de chômage aux environs de 15% suivi par Alaska 14% puis la Caroline du Sud 13%. En décembre
2019, Alaska possède le taux de chômage le plus élevé suivi par Mississippi et Arizona.
On remarque que dans cette décennie plusieurs états ont pu diminuer leur taux de chômage, à
titre d'exemple la Caroline du Sud qui a pu descendre de la 3eme place au début de 2011 à la
10eme place à la fin de 2019, En réduisant son taux de chômage de 13% à 3%.
• Les types de crimes les plus répandus dans les Etats ayant un taux de chômage élevé/bas

 Analyse :

Le tableau suivant est


classé selon la moyenne
des vols simples, et colorié
selon la moyenne de taux
de chômage.
on remarque que les
états avec un taux de
chômage relativement
élevé souffrent des actes
criminels de type vols
simples et cambriolage.

• les ethnies majoritaires par comté

 Analyse :

Même si on a utilisé une échelle logarithmique, On peut clairement distinguer l'ethnie


majoritaire dans Alpena County, ce sont Les Blancs américains, une catégorie du Bureau du
recensement des États-Unis qui définit les personnes ayant des caractéristiques physiques les
rattachant aux Blancs. Cependant, dans Aleutians West Conty on remarque une variété
d’ethnies, avec les deux majoritaires ; Les Blancs américains, et Les Asio-Américains, ou
Américains asiatiques.
• Les types de crimes les plus répandu dans les Etats ayant un revenu médian élevé/bas

 Analyse :

New Jersey a le meilleur revenu


médian aux états unis. Cependant,
les types de des actes criminels le
plus répandu dans cet état est le vol
simple, les cambriolages et les
agressions.

• les ethnies majoritaires dans les états ayant un revenu médian élevé/bas

 Analyse :

L’Etat de New Jersey a le meilleur revenu médian aux états unis. Les ethnies majoritaires sont Les Blancs,
suivi par les Latinos, puis les Africains Américains.
• les comtés ayant min/max revenu moyenne par état

 Analyse :

Les 50% centrale des comtés de la Californie ont un revenu médian entre $45K et $65K , Santa Clara
County représente une valeur aberrante dans cet l’Etat avec un revenu médian de $96,310.

• Relation entre taux de Chômage – Crime - Revenu

 Analyse :

Dans ce graphique on représente le taux de criminalité dans l'axe des x et le taux de chômage dans l'axe
des y, la taille de la bulle indique le revenu médian dans cet Etat. Il apparaît qu'il existe une liaison entre
le taux de chômage et le taux de criminalité, pour la prouver il faut effectuer une étude de corrélation,
en tout cas l’étude du phénomène de criminalité dans les états unis ne peut être effectuée d’une
manière uniforme sur l’ensemble des états sans prendre en compte plusieurs facteurs et les differentes
juridictions de chaque Etat par rapport le port d’arme etc…
Table des matières
Introduction .................................................................................................................................................. 2
Sources de données : .................................................................................................................................... 3
Liste des Outils .............................................................................................................................................. 3
Conception .................................................................................................................................................... 4
Descriptif détaillé des indicateurs choisis et Matrice dimensionnelle ................................................... 4
Conception du datawarehouse ................................................................................................................ 4
Création du Datawarehouse ......................................................................................................................... 5
Collecte et préparation des données ............................................................................................................ 6
Pipeline ETL ................................................................................................................................................... 6
1-Chargement des données vers des tables staging ............................................................................... 6
2-Population des dimensions................................................................................................................... 7
3-Population de la table de faits ............................................................................................................ 13
Analyse et Reporting ................................................................................................................................... 15
1-Création des graphiques ..................................................................................................................... 16
2-Création du Dashboard ....................................................................................................................... 16
3- Analyse des KPI .................................................................................................................................. 18
• Quelle année a connu le taux de chômage le plus élevé/le plus bas ......................................... 18
• Quels États/comtés ont les taux de criminalité les plus élevés/les plus en 2016 ...................... 18
• Les États avec le taux de chômage le plus élevé cette année/ce mois....................................... 19
• Les types de crimes les plus répandus dans les Etats ayant un taux de chômage élevé/bas ..... 20
• les ethnies majoritaires par comté ............................................................................................. 20
• Les types de crimes les plus répandu dans les Etats ayant un revenu médian élevé/bas.......... 21
• les ethnies majoritaires dans les états ayant un revenu médian élevé/bas ............................... 21
• les comtés ayant min/max revenu moyenne par état ................................................................ 22
• Relation entre taux de Chômage – Crime - Revenu .................................................................... 22
Annexe ........................................................................................................................................................ 24
ANNEXE
Scrapping_Cleaning_For_DW

January 4, 2021

1 County Level Unemployement Data Scraper 2010-2019


[67]: #--------------------------------------
# Area Unemployment statistics: https://download.bls.gov/pub/time.series/la/
#--------------------------------------

import pandas as pd
import requests

#------------------------------------------------------
# Download and save .TXT files from BLS website

BLS_url = 'https://download.bls.gov/pub/time.series/la/'

filenames = ['la.area','la.data.0.CurrentU10-14','la.data.0.CurrentU15-19']

for xx in filenames:
dls = BLS_url+xx
resp = requests.get(dls)

output = open(xx+'.txt', 'wb')


output.write(resp.content)
output.close()
#MApping Area Code with County Name
df_areas = pd.read_table('la.area.txt')
df_areas = df_areas[['area_code', 'area_text']]

df_areas = df_areas.loc[df_areas['area_code'].str.contains('CN')]
df_areas.reset_index(drop=True, inplace=True)

df_areas.columns = ['area_code', 'countyname']

tmp = df_areas['countyname'].str.split(', ', expand=True)


df_areas['countyname'] = tmp[0]
df_areas['state'] = tmp[1]

1
df_areas['area_code'] = df_areas['area_code'].map(lambda x: x.strip())
df_areas['countyname'] = df_areas['countyname'].map(lambda x: x.strip())

#------------------------------------------------------
[68]: def get_BLS_county_data(BLS_data_path, df_areas):

# Import area information


col_types = {'series_id': str, 'year': int, 'period': str, 'value': str,␣
,→'footnote_codes': str}

df_bls_county = pd.read_table(BLS_data_path, dtype=col_types)

# Remove white space from code..


df_bls_county['series_id'] = df_bls_county['series_id ␣
,→'].map(lambda x: x.strip())

df_bls_county['value'] = df_bls_county[' value'].apply(pd.to_numeric,␣


,→errors='coerce')

# Get variable code


df_bls_county['var_code'] = df_bls_county['series_id'].str[-2:]
# Get area code
df_bls_county['series_id'] = df_bls_county['series_id'].astype(str).str[3:].
,→str[:-2]

# Get FIPS code (as string to preserve initial zeros)


df_bls_county['FIPS'] = df_bls_county['series_id'].str[2:7]
# Only keep rows corresponding to counties
df_bls_county = df_bls_county.loc[df_bls_county['series_id'].str.
,→contains('CN')]

# Drop columns, reset index


df_bls_county =␣
,→df_bls_county[['series_id','year','period','value','var_code','FIPS']]

df_bls_county.reset_index(drop=True, inplace=True)

# Rename codes with variable names, rename columns


df_bls_county['var_code'] = df_bls_county['var_code'].map({'03':␣
,→'Unemployment_Rate', '04': 'Unemployment',

'05':␣
,→'Employment', '06': 'Labor_Force'})

df_bls_county.columns = ['area_code', 'year', 'month',␣


,→'value','variable_name', 'FIPS']

# Drop month 13 (year average)


df_bls_county = df_bls_county.loc[df_bls_county['month']!='M13']
df_bls_county['month'] = pd.to_numeric(df_bls_county['month'].str[1:])

2
df_bls_county = pd.merge(df_bls_county, df_areas, how='inner',␣
,→ on='area_code')

df_bls_county = df_bls_county.pivot_table(values='value',␣
,→index=['area_code', 'FIPS', 'state', 'countyname','year', 'month'],␣
,→columns='variable_name')

df_bls_county.reset_index(inplace=True)
df_bls_county.columns.name = None
print('Done!')

return df_bls_county
[69]: df_unemp_10_14 = get_BLS_county_data('la.data.0.CurrentU10-14.txt', df_areas)

Done!

[70]: df_unemp_10_14.tail(30)
[70]: area_code FIPS ... Unemployment Unemployment_Rate
193050 CN7215300000000 72153 ... 2497.0 21.0
193051 CN7215300000000 72153 ... 2342.0 20.5
193052 CN7215300000000 72153 ... 2307.0 20.0
193053 CN7215300000000 72153 ... 2349.0 20.5
193054 CN7215300000000 72153 ... 2242.0 19.8
193055 CN7215300000000 72153 ... 2314.0 20.3
193056 CN7215300000000 72153 ... 2704.0 22.7
193057 CN7215300000000 72153 ... 2399.0 21.2
193058 CN7215300000000 72153 ... 2285.0 20.4
193059 CN7215300000000 72153 ... 2142.0 19.5
193060 CN7215300000000 72153 ... 2214.0 20.0
193061 CN7215300000000 72153 ... 2259.0 20.3
193062 CN7215300000000 72153 ... 2399.0 20.8
193063 CN7215300000000 72153 ... 2409.0 21.0
193064 CN7215300000000 72153 ... 2427.0 21.1
193065 CN7215300000000 72153 ... 2398.0 21.1
193066 CN7215300000000 72153 ... 2354.0 21.0
193067 CN7215300000000 72153 ... 2706.0 23.7
193068 CN7215300000000 72153 ... 2679.0 23.5
193069 CN7215300000000 72153 ... 2652.0 23.6
193070 CN7215300000000 72153 ... 2578.0 23.0
193071 CN7215300000000 72153 ... 2394.0 21.8
193072 CN7215300000000 72153 ... 2397.0 21.9
193073 CN7215300000000 72153 ... 2229.0 20.6
193074 CN7215300000000 72153 ... 2294.0 21.1
193075 CN7215300000000 72153 ... 2504.0 22.4
193076 CN7215300000000 72153 ... 2374.0 21.7
193077 CN7215300000000 72153 ... 2143.0 19.5
193078 CN7215300000000 72153 ... 2124.0 19.5

3
193079 CN7215300000000 72153 ... 2025.0 18.7

[30 rows x 10 columns]


[71]: df_unemp_10_14.columns
[71]: Index(['area_code', 'FIPS', 'state', 'countyname', 'year', 'month',
'Employment', 'Labor_Force', 'Unemployment', 'Unemployment_Rate'],
dtype='object')
Save Scrapped Data To Csv file
[72]: df_unemp_10_14 = get_BLS_county_data('la.data.0.CurrentU10-14.txt', df_areas)
df_unemp_15_19 = get_BLS_county_data('la.data.0.CurrentU15-19.txt', df_areas)

df_unemp_county = df_unemp_10_14
df_unemp_county = df_unemp_county.append(df_unemp_15_19)

df_unemp_county = df_unemp_county.sort_values(by=['area_code', 'year',␣


,→'month'], axis=0)

df_unemp_county[['FIPS', 'state', 'countyname', 'year', 'month','Employment',␣


,→'Labor_Force', 'Unemployment', 'Unemployment_Rate']].

,→to_csv('BLS_county_employment.csv', index=False)

Done!
Done!

[73]: !ls -l -sh

total 273M
22M -rw-r--r-- 1 root root 22M Jan 3 23:01 BLS_county_employment.csv
252K -rw-r--r-- 1 root root 250K Jan 3 20:19 div.csv
272K -rw-r--r-- 1 root root 272K Jan 3 20:19 div_with_fips.csv
4.0K drwxr-xr-x 4 root root 4.0K Jan 3 20:19 DWBI_ETL
240K -rw-r--r-- 1 root root 237K Jan 3 20:19 Income_fips.csv
428K -rw-r--r-- 1 root root 428K Jan 3 23:00 la.area.txt
114M -rw-r--r-- 1 root root 114M Jan 3 23:00 la.data.0.CurrentU10-14.txt
114M -rw-r--r-- 1 root root 114M Jan 3 23:00 la.data.0.CurrentU15-19.txt
216K -rw-r--r-- 1 root root 216K Jan 3 20:19 revenu.csv
4.0K drwxr-xr-x 1 root root 4.0K Dec 21 17:29 sample_data
384K -rw-r--r-- 1 root root 384K Jan 3 20:19 Table_crime.csv
280K -rw-r--r-- 1 root root 279K Jan 3 20:19 Table_div.csv
22M -rw-r--r-- 1 root root 22M Jan 3 20:19 Table_employment.csv
1.3M -rw-r--r-- 1 root root 1.3M Jan 3 20:19 Table_population.csv
248K -rw-r--r-- 1 root root 246K Jan 3 20:19 Table_revenu.csv

Import Other Dataset from Repo


[74]: !rm -R DWBI_ETL
!git clone https://github.com/RedaElmar/DWBI_ETL

4
Cloning into 'DWBI_ETL'...
remote: Enumerating objects: 29, done.
remote: Counting objects: 100% (29/29), done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 29 (delta 4), reused 11 (delta 0), pack-reused 0
Unpacking objects: 100% (29/29), done.

[75]: import pandas as pd


import requests
data=pd.read_csv("BLS_county_employment.csv")
[76]: data
[76]: FIPS state ... Unemployment Unemployment_Rate
0 1001 AL ... 2655.0 10.6
1 1001 AL ... 2529.0 10.1
2 1001 AL ... 2380.0 9.5
3 1001 AL ... 2197.0 8.5
4 1001 AL ... 2099.0 8.1
... ... ... ... ... ...
386155 72153 PR ... 1168.0 12.2
386156 72153 PR ... 1360.0 14.1
386157 72153 PR ... 1401.0 14.4
386158 72153 PR ... 1385.0 14.4
386159 72153 PR ... 1567.0 16.1

[386160 rows x 9 columns]


[77]: len(data.FIPS.unique())
[77]: 3218
[78]: df_diversity = pd.read_csv('DWBI_ETL/data/diversityindex.csv')
fix some enteries and normalise data
[79]: df_diversity["Location"] = df_diversity["Location"].replace(["Do?a Ana County,␣
,→NM"],"Dona Ana County, NM")

df_diversity.columns = ["Location","Diversity","Black or AA","American␣


,→Indian","Asian","Hawaiian","Two or More","Latino","White"]

df_diversity.head()
[79]: Location Diversity ... Latino White
0 Aleutians West Census Area, AK 0.769346 ... 14.6 29.2
1 Queens County, NY 0.742224 ... 28.0 26.7
2 Maui County, HI 0.740757 ... 10.7 31.5
3 Alameda County, CA 0.740399 ... 22.7 33.2
4 Aleutians East Borough, AK 0.738867 ... 13.5 12.9

[5 rows x 9 columns]
[80]: df_diversity.tail

5
[80]: <bound method NDFrame.tail of Location Diversity
... Latino White
0 Aleutians West Census Area, AK 0.769346 ... 14.6 29.2
1 Queens County, NY 0.742224 ... 28.0 26.7
2 Maui County, HI 0.740757 ... 10.7 31.5
3 Alameda County, CA 0.740399 ... 22.7 33.2
4 Aleutians East Borough, AK 0.738867 ... 13.5 12.9
... ... ... ... ... ...
3190 Osage County, MO 0.037540 ... 0.6 98.1
3191 Lincoln County, WV 0.035585 ... 0.6 98.2
3192 Leslie County, KY 0.035581 ... 0.5 98.2
3193 Blaine County, NE 0.023784 ... 0.2 98.8
3194 Keya Paha County, NE 0.021816 ... 0.5 98.9

[3195 rows x 9 columns]>


[81]: df_crime = pd.read_csv('DWBI_ETL/data/crime_data_w_population_and_crime_rate.
,→csv')

Creation a FIPS variable to Identify County and to use as ID for Joining


[82]: def addzeros(lenght,txt):
txt =str(txt)
while len(txt)<lenght:
txt= "0"+txt
return txt
df_crime.FIPS_CTY = df_crime.FIPS_CTY.apply(lambda x : addzeros(3,x) )
[83]: df_crime["FIPS"] = df_crime.FIPS_ST.astype(str) + df_crime.FIPS_CTY
[84]: df_crime.FIPS = df_crime.FIPS.astype(str)
[85]: df_crime
[85]: county_name crime_rate_per_100000 ... FIPS_CTY FIPS
0 St. Louis city, MO 1791.995377 ... 510 29510
1 Crittenden County, AR 1754.914968 ... 035 5035
2 Alexander County, IL 1664.700485 ... 003 17003
3 Kenedy County, TX 1456.310680 ... 261 48261
4 De Soto Parish, LA 1447.402430 ... 031 22031
... ... ... ... ... ...
3131 Ohio County, IN 0.000000 ... 115 18115
3132 Newton County, MS 0.000000 ... 101 28101
3133 Jerauld County, SD 0.000000 ... 073 46073
3134 Cimarron County, OK 0.000000 ... 025 40025
3135 Lawrence County, MS 0.000000 ... 077 28077

[3136 rows x 25 columns]


Using External Library to provide FIPS from County_name,State
[86]: !pip install addfips

6
Requirement already satisfied: addfips in /usr/local/lib/python3.6/dist-packages
(0.3.1)
Requirement already satisfied: importlib-resources>=2.0.1 in
/usr/local/lib/python3.6/dist-packages (from addfips) (3.3.0)
Requirement already satisfied: zipp>=0.4; python_version < "3.8" in
/usr/local/lib/python3.6/dist-packages (from importlib-
resources>=2.0.1->addfips) (3.4.0)

[87]: import addfips


af = addfips.AddFIPS()
df_diversity['TEMcounty']=df_diversity['Location']
df_diversity['TEMstate']=df_diversity['Location']
[88]: df_diversity
[88]: Location ... TEMstate
0 Aleutians West Census Area, AK ... Aleutians West Census Area, AK
1 Queens County, NY ... Queens County, NY
2 Maui County, HI ... Maui County, HI
3 Alameda County, CA ... Alameda County, CA
4 Aleutians East Borough, AK ... Aleutians East Borough, AK
... ... ... ...
3190 Osage County, MO ... Osage County, MO
3191 Lincoln County, WV ... Lincoln County, WV
3192 Leslie County, KY ... Leslie County, KY
3193 Blaine County, NE ... Blaine County, NE
3194 Keya Paha County, NE ... Keya Paha County, NE

[3195 rows x 11 columns]


[89]: def takeElt(text,i):
if "," in text:
return text.split(", ")[i]

df_diversity['TEMcounty']=df_diversity['TEMcounty'].apply(lambda x:␣
,→takeElt(x,0))

df_diversity['TEMstate']=df_diversity['TEMstate'].apply(lambda x: takeElt(x,1))
[90]: df_diversity.Location[df_diversity["Location"]=="Dona Ana County, NM" ]
[90]: 825 Dona Ana County, NM
Name: Location, dtype: object
[91]: import addfips
af = addfips.AddFIPS()
af.get_county_fips('Dona Ana County', state='NM')
[91]: '35013'
[92]: df_diversity.to_csv('div.csv', index=False)

7
!addfips div.csv --state-field TEMstate --county-field TEMcounty >␣
,→div_with_fips.csv

[93]: import numpy as np


df_divFips= pd.read_csv('div_with_fips.csv')
[94]: import math
df_divFips['fips'] =df_divFips['fips'].apply(lambda x : 0 if math.isnan(x) else␣
,→int(x))

[95]: df_divFips
[95]: fips ... TEMstate
0 2016 ... AK
1 36081 ... NY
2 15009 ... HI
3 6001 ... CA
4 2013 ... AK
... ... ... ...
3190 29151 ... MO
3191 54043 ... WV
3192 21131 ... KY
3193 31009 ... NE
3194 31103 ... NE

[3195 rows x 12 columns]


[96]: pop_data=pd.read_csv("DWBI_ETL/data/PopulationEstimates.csv", encoding =␣
,→"ISO-8859-1")

pop_data
[96]: FIPStxt State ... R_NET_MIG_2018 R_NET_MIG_2019
0 0 US ... NaN NaN
1 1000 AL ... 1.8 2.5
2 1001 AL ... 0.5 4.6
3 1003 AL ... 24.7 24.4
4 1005 AL ... -8.8 -5.2
... ... ... ... ... ...
3268 72145 PR ... NaN NaN
3269 72147 PR ... NaN NaN
3270 72149 PR ... NaN NaN
3271 72151 PR ... NaN NaN
3272 72153 PR ... NaN NaN

[3273 rows x 165 columns]


Keeping only Relevent Data Columns
[97]: pop_data=pop_data[["FIPStxt","State","Area_Name","POP_ESTIMATE_2010","POP_ESTIMATE_2011","POP_

,→"POP_ESTIMATE_2014", "POP_ESTIMATE_2015","POP_ESTIMATE_2016","POP_ESTIMATE_2017","POP

8
[98]: pop_data=pop_data.
,→melt(id_vars=["FIPStxt","State","Area_Name"],var_name="year",value_name="pop_Estimate")

[99]: pop_data.year=pop_data.year.apply(lambda x : int(x[-4:]))


[100]: pop_data
[100]: FIPStxt State Area_Name year pop_Estimate
0 0 US United States 2010 309,321,666
1 1000 AL Alabama 2010 4,785,437
2 1001 AL Autauga County 2010 54,773
3 1003 AL Baldwin County 2010 183,112
4 1005 AL Barbour County 2010 27,327
... ... ... ... ... ...
32725 72145 PR Vega Baja Municipio, Puerto Rico 2019 50,023
32726 72147 PR Vieques Municipio, Puerto Rico 2019 8,386
32727 72149 PR Villalba Municipio, Puerto Rico 2019 21,372
32728 72151 PR Yabucoa Municipio, Puerto Rico 2019 32,282
32729 72153 PR Yauco Municipio, Puerto Rico 2019 33,575

[32730 rows x 5 columns]


Normalise FIPS among all tables with County Level Data
[101]: def normalise_fips(x):
while len(x)<6:
x='0'+x
return x
df_divFips['fips'] =df_divFips['fips'].apply(lambda x : "NaN" if math.isnan(x)␣
,→else normalise_fips(str(x)))

[102]: pop_data['FIPStxt']=pop_data['FIPStxt'].apply(lambda x : "NaN" if math.isnan(x)␣


,→else normalise_fips(str(x)))

[103]: df_divFips['year']=2016
[104]: df_divFips
[104]: fips Location ... TEMstate year
0 002016 Aleutians West Census Area, AK ... AK 2016
1 036081 Queens County, NY ... NY 2016
2 015009 Maui County, HI ... HI 2016
3 006001 Alameda County, CA ... CA 2016
4 002013 Aleutians East Borough, AK ... AK 2016
... ... ... ... ... ...
3190 029151 Osage County, MO ... MO 2016
3191 054043 Lincoln County, WV ... WV 2016
3192 021131 Leslie County, KY ... KY 2016
3193 031009 Blaine County, NE ... NE 2016
3194 031103 Keya Paha County, NE ... NE 2016

[3195 rows x 13 columns]

9
[105]: pop_data
[105]: FIPStxt State Area_Name year pop_Estimate
0 000000 US United States 2010 309,321,666
1 001000 AL Alabama 2010 4,785,437
2 001001 AL Autauga County 2010 54,773
3 001003 AL Baldwin County 2010 183,112
4 001005 AL Barbour County 2010 27,327
... ... ... ... ... ...
32725 072145 PR Vega Baja Municipio, Puerto Rico 2019 50,023
32726 072147 PR Vieques Municipio, Puerto Rico 2019 8,386
32727 072149 PR Villalba Municipio, Puerto Rico 2019 21,372
32728 072151 PR Yabucoa Municipio, Puerto Rico 2019 32,282
32729 072153 PR Yauco Municipio, Puerto Rico 2019 33,575

[32730 rows x 5 columns]


[106]: df_crime['FIPS']=df_crime['FIPS'].apply(lambda x : "NaN" if math.isnan(int(x))␣
,→else normalise_fips(str(x)))

df_crime['year']=2016
[107]: df_crime
[107]: county_name crime_rate_per_100000 ... FIPS year
0 St. Louis city, MO 1791.995377 ... 029510 2016
1 Crittenden County, AR 1754.914968 ... 005035 2016
2 Alexander County, IL 1664.700485 ... 017003 2016
3 Kenedy County, TX 1456.310680 ... 048261 2016
4 De Soto Parish, LA 1447.402430 ... 022031 2016
... ... ... ... ... ...
3131 Ohio County, IN 0.000000 ... 018115 2016
3132 Newton County, MS 0.000000 ... 028101 2016
3133 Jerauld County, SD 0.000000 ... 046073 2016
3134 Cimarron County, OK 0.000000 ... 040025 2016
3135 Lawrence County, MS 0.000000 ... 028077 2016

[3136 rows x 26 columns]


[108]: data['FIPS']=data['FIPS'].apply(lambda x : "NaN" if math.isnan(int(x)) else␣
,→normalise_fips(str(x)))

[109]: data
[109]: FIPS state ... Unemployment Unemployment_Rate
0 001001 AL ... 2655.0 10.6
1 001001 AL ... 2529.0 10.1
2 001001 AL ... 2380.0 9.5
3 001001 AL ... 2197.0 8.5
4 001001 AL ... 2099.0 8.1
... ... ... ... ... ...

10
386155 072153 PR ... 1168.0 12.2
386156 072153 PR ... 1360.0 14.1
386157 072153 PR ... 1401.0 14.4
386158 072153 PR ... 1385.0 14.4
386159 072153 PR ... 1567.0 16.1

[386160 rows x 9 columns]


[110]: data.to_csv('Table_employment.csv', index=False)
df_crime.to_csv('Table_crime.csv', index=False)
[111]: duplicateDFRow = df_divFips[df_divFips.duplicated(['fips'])]
these FIPS refer only to state average we remove these entries
[112]: duplicateDFRow
[112]: fips Location Diversity ... TEMcounty TEMstate year
32 000000 CALIFORNIA 0.674524 ... NaN NaN 2016
57 000000 TEXAS 0.641294 ... NaN NaN 2016
62 000000 NEVADA 0.635404 ... NaN NaN 2016
84 000000 DISTRICT OF COLUMBIA 0.614376 ... NaN NaN 2016
91 000000 MARYLAND 0.612776 ... NaN NaN 2016
97 000000 NEW MEXICO 0.608758 ... NaN NaN 2016
109 000000 NEW JERSEY 0.601993 ... NaN NaN 2016
116 000000 NEW YORK 0.600981 ... NaN NaN 2016
125 000000 FLORIDA 0.597203 ... NaN NaN 2016
138 000000 GEORGIA 0.590880 ... NaN NaN 2016
177 000000 ARIZONA 0.580068 ... NaN NaN 2016
202 000000 ALASKA 0.573340 ... NaN NaN 2016
266 000000 UNITED STATES 0.557926 ... NaN NaN 2016
278 000000 ILLINOIS 0.555075 ... NaN NaN 2016
339 000000 VIRGINIA 0.544823 ... NaN NaN 2016
387 000000 LOUISIANA 0.537020 ... NaN NaN 2016
441 000000 DELAWARE 0.530787 ... NaN NaN 2016
455 000000 MISSISSIPPI 0.528400 ... NaN NaN 2016
465 000000 NORTH CAROLINA 0.527610 ... NaN NaN 2016
554 000000 OKLAHOMA 0.517362 ... NaN NaN 2016
603 000000 SOUTH CAROLINA 0.510489 ... NaN NaN 2016
741 000000 ALABAMA 0.486223 ... NaN NaN 2016
775 000000 CONNECTICUT 0.478890 ... NaN NaN 2016
810 000000 WASHINGTON 0.471552 ... NaN NaN 2016
824 000000 COLORADO 0.470384 ... NaN NaN 2016
1003 000000 ARKANSAS 0.427039 ... NaN NaN 2016
1057 000000 MASSACHUSETTS 0.414346 ... NaN NaN 2016
1085 000000 TENNESSEE 0.407136 ... NaN NaN 2016
1086 000000 RHODE ISLAND 0.407071 ... NaN NaN 2016
1121 000000 MICHIGAN 0.396959 ... NaN NaN 2016
1151 000000 KANSAS 0.387568 ... NaN NaN 2016
1181 000000 OREGON 0.380600 ... NaN NaN 2016

11
1232 000000 PENNSYLVANIA 0.366855 ... NaN NaN 2016
1315 000000 UTAH 0.345283 ... NaN NaN 2016
1347 000000 MISSOURI 0.337624 ... NaN NaN 2016
1353 000000 INDIANA 0.334928 ... NaN NaN 2016
1355 000000 OHIO 0.334424 ... NaN NaN 2016
1374 000000 NEBRASKA 0.330784 ... NaN NaN 2016
1406 000000 MINNESOTA 0.320766 ... NaN NaN 2016
1443 000000 WISCONSIN 0.310146 ... NaN NaN 2016
1488 000000 SOUTH DAKOTA 0.296087 ... NaN NaN 2016
1492 000000 IDAHO 0.294478 ... NaN NaN 2016
1544 000000 WYOMING 0.281902 ... NaN NaN 2016
1658 000000 KENTUCKY 0.258983 ... NaN NaN 2016
1767 000000 MONTANA 0.237060 ... NaN NaN 2016
1785 000000 NORTH DAKOTA 0.233284 ... NaN NaN 2016
1814 000000 IOWA 0.227828 ... NaN NaN 2016
2166 000000 NEW HAMPSHIRE 0.158854 ... NaN NaN 2016
2316 000000 WEST VIRGINIA 0.138886 ... NaN NaN 2016
2464 000000 VERMONT 0.119187 ... NaN NaN 2016
2500 000000 MAINE 0.115582 ... NaN NaN 2016

[51 rows x 13 columns]


[113]: df_divFips.drop(df_divFips[df_divFips['fips']=="000000"].index, inplace=True)
[114]: df_divFips
[114]: fips Location ... TEMstate year
0 002016 Aleutians West Census Area, AK ... AK 2016
1 036081 Queens County, NY ... NY 2016
2 015009 Maui County, HI ... HI 2016
3 006001 Alameda County, CA ... CA 2016
4 002013 Aleutians East Borough, AK ... AK 2016
... ... ... ... ... ...
3190 029151 Osage County, MO ... MO 2016
3191 054043 Lincoln County, WV ... WV 2016
3192 021131 Leslie County, KY ... KY 2016
3193 031009 Blaine County, NE ... NE 2016
3194 031103 Keya Paha County, NE ... NE 2016

[3143 rows x 13 columns]


[115]: duplicateDFRow = df_divFips[df_divFips.duplicated(['fips'])]
duplicateDFRow
[115]: Empty DataFrame
Columns: [fips, Location, Diversity, Black or AA, American Indian, Asian,
Hawaiian, Two or More, Latino, White, TEMcounty, TEMstate, year]
Index: []
[116]:

12
same for revenu
[117]: df_revenu = pd.read_csv('DWBI_ETL/data/2015 Median Income by County.csv')

df_revenu["County"] = df_revenu["County"].replace(["Doa Ana␣


,→County "],"Dona Ana County")
df_revenu.to_csv('revenu.csv', index=False)
[118]: !addfips 'revenu.csv' --state-field State --county-field County > Income_fips.
,→csv

[119]: df_revenu_fips = pd.read_csv('Income_fips.csv')


df_revenu_fips
[119]: fips County-State ... State Code State
0 1001.0 Autauga County, Alabama ... AL Alabama
1 1003.0 Baldwin County, Alabama ... AL Alabama
2 1005.0 Barbour County, Alabama ... AL Alabama
3 1007.0 Bibb County, Alabama ... AL Alabama
4 1009.0 Blount County, Alabama ... AL Alabama
... ... ... ... ... ...
3215 NaN Vega Baja Municipio, Puerto Rico ... WY Wyoming
3216 NaN Vieques Municipio, Puerto Rico ... WY Wyoming
3217 NaN Villalba Municipio, Puerto Rico ... WY Wyoming
3218 NaN Yabucoa Municipio, Puerto Rico ... WY Wyoming
3219 NaN Yauco Municipio, Puerto Rico ... WY Wyoming

[3220 rows x 7 columns]


[120]: df_revenu_fips.dropna(subset = ["fips"], inplace=True)
[121]: df_revenu_fips['fips']=df_revenu_fips['fips'].astype(float).astype(int).
,→apply(lambda x : normalise_fips(str(x)))

[122]: df_revenu_fips['year']=2016
[123]: df_revenu_fips
[123]: fips County-State ... State year
0 001001 Autauga County, Alabama ... Alabama 2016
1 001003 Baldwin County, Alabama ... Alabama 2016
2 001005 Barbour County, Alabama ... Alabama 2016
3 001007 Bibb County, Alabama ... Alabama 2016
4 001009 Blount County, Alabama ... Alabama 2016
... ... ... ... ... ...
3137 056037 Sweetwater County, Wyoming ... Wyoming 2016
3138 056039 Teton County, Wyoming ... Wyoming 2016
3139 056041 Uinta County, Wyoming ... Wyoming 2016
3140 056043 Washakie County, Wyoming ... Wyoming 2016
3141 056045 Weston County, Wyoming ... Wyoming 2016

[3140 rows x 8 columns]

13
[124]: df_revenu_fips.to_csv('Table_revenu.csv', index=False)
All fips with ’000’ in the end represents state average Data
[125]: L=[normalise_fips(str(x)+"000") for x in range(0,52)]
L
[125]: ['000000',
'001000',
'002000',
'003000',
'004000',
'005000',
'006000',
'007000',
'008000',
'009000',
'010000',
'011000',
'012000',
'013000',
'014000',
'015000',
'016000',
'017000',
'018000',
'019000',
'020000',
'021000',
'022000',
'023000',
'024000',
'025000',
'026000',
'027000',
'028000',
'029000',
'030000',
'031000',
'032000',
'033000',
'034000',
'035000',
'036000',
'037000',
'038000',
'039000',
'040000',
'041000',

14
'042000',
'043000',
'044000',
'045000',
'046000',
'047000',
'048000',
'049000',
'050000',
'051000']
[126]: for n in L:
pop_data.drop(pop_data[pop_data['FIPStxt']==n].index, inplace=True)
pop_data
[126]: FIPStxt State Area_Name year pop_Estimate
2 001001 AL Autauga County 2010 54,773
3 001003 AL Baldwin County 2010 183,112
4 001005 AL Barbour County 2010 27,327
5 001007 AL Bibb County 2010 22,870
6 001009 AL Blount County 2010 57,376
... ... ... ... ... ...
32725 072145 PR Vega Baja Municipio, Puerto Rico 2019 50,023
32726 072147 PR Vieques Municipio, Puerto Rico 2019 8,386
32727 072149 PR Villalba Municipio, Puerto Rico 2019 21,372
32728 072151 PR Yabucoa Municipio, Puerto Rico 2019 32,282
32729 072153 PR Yauco Municipio, Puerto Rico 2019 33,575

[32250 rows x 5 columns]


[127]: pop_data.to_csv('Table_population.csv', index=False, sep=';')
[128]: len(data["FIPS"].unique())
[128]: 3218
[134]: len(df_revenu_fips["fips"].unique())
[134]: 3140
[130]: len(df_crime["FIPS"].unique())
[130]: 3136
[131]: len(df_divFips["fips"].unique())
[131]: 3143
[132]: len(pop_data["FIPStxt"].unique())
[132]: 3225
re save with different separator
( comma separated causing errors on import to SQL Server ’some entries contains comma’)

15
[135]: pop_data.to_csv('Table_population.csv', index=False, sep=';')
df_revenu_fips.to_csv('Table_revenu.csv', index=False, sep=';')
df_divFips.to_csv('Table_div.csv', index=False, sep=';')
data.to_csv('Table_employment.csv', index=False, sep=';')
df_crime.to_csv('Table_crime.csv', index=False, sep=';')

16

Vous aimerez peut-être aussi