{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Cartographie des abattoirs de volaille en Pologne" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cette cartographie des abattoirs de volaille en Pologne est basée sur la liste des établissements agréés par l'Inspection vétérinaire centrale (GIS) à la date du 6 juin 2020 et selon les dispositions contenues dans le [règlement européen 853/2004](https://eur-lex.europa.eu/legal-content/FR/TXT/?qid=1503411625502&uri=CELEX:02004R0853-20190726) du 29 avril 2004 fixant des règles spécifiques d'hygiène applicables aux denrées alimentaires d'origine animale.\n", "\n", "Au sein de la [section II](https://zywnosc.wetgiw.gov.pl/spi/zatw/index.php?sekcja=3&lng=0) correspondant aux viandes de volaille et de lagomorphes (lapins, lièvres et rongeurs), on ne retiendra que les abattoirs de volaille en raison du très faible nombre d'abattoirs de lagomorphes." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "df = pd.read_csv('section2.csv', sep=';')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
WNIwojewództwopowiatgminanazwaadresKat.ALdziałalnosc powiązanauwagidec. ke 2014/709
002013901dolnośląskiebolesławieckiwarta bolesławieckaUbojnia Brojlex Spółka Jawna w Iwinach Francis...59-720 Raciborowice Górne, Iwiny 36BSHDNaNNaNNaNN
1NaNNaNNaNNaNNaNNaNCPDNaNNaNNaNNaN
202020302dolnośląskiedzierżoniowskibielawaZakład Przetwórstwa Mięsnego Jerzy Gawrycki58-260 Bielawa ul. Wincentego Witosa 3CPDNaNCP(I)MM(V)MP(V)PP(VI)mpN
302053902dolnośląskiejaworskimściwojówUbojnia Drobiu FRANEK Spółka z ograniczoną odp...59-407 Mściwojów, Targoszyn 79 HSHDZNaNNaNNaNN
4NaNNaNNaNNaNNaNNaNCPDZNaNNaNNaNNaN
502060202dolnośląskiejeleniogórskikarpaczPEKROL K.Zemankiewicz, M. Cichocki Sp.J.58-508 Jelenia Góra, Siedlęcin ul. 58-508 Jel...CPDNaNCP(I)MM(V)SH(I)mpN
602093902dolnośląskielegnickiprochowiceUbojnia Drobiu Michał Chomiak59-230 Prochowice, Lisowice 75SHDNaNNaNNaNN
7NaNNaNNaNNaNNaNNaNCPDNaNNaNNaNNaN
802093903dolnośląskielegnickiprochowiceUbojnia Drobiu GALLUS Sumicki Spółka Jawna59-230 Prochowice, Kawice 85SHDNaNNaNNaNN
9NaNNaNNaNNaNNaNNaNCPDNaNNaNNaNNaN
\n", "
" ], "text/plain": [ " WNI województwo powiat gmina \\\n", "0 02013901 dolnośląskie bolesławiecki warta bolesławiecka \n", "1 NaN NaN NaN NaN \n", "2 02020302 dolnośląskie dzierżoniowski bielawa \n", "3 02053902 dolnośląskie jaworski mściwojów \n", "4 NaN NaN NaN NaN \n", "5 02060202 dolnośląskie jeleniogórski karpacz \n", "6 02093902 dolnośląskie legnicki prochowice \n", "7 NaN NaN NaN NaN \n", "8 02093903 dolnośląskie legnicki prochowice \n", "9 NaN NaN NaN NaN \n", "\n", " nazwa \\\n", "0 Ubojnia Brojlex Spółka Jawna w Iwinach Francis... \n", "1 NaN \n", "2 Zakład Przetwórstwa Mięsnego Jerzy Gawrycki \n", "3 Ubojnia Drobiu FRANEK Spółka z ograniczoną odp... \n", "4 NaN \n", "5 PEKROL K.Zemankiewicz, M. Cichocki Sp.J. \n", "6 Ubojnia Drobiu Michał Chomiak \n", "7 NaN \n", "8 Ubojnia Drobiu GALLUS Sumicki Spółka Jawna \n", "9 NaN \n", "\n", " adres Kat. A L \\\n", "0 59-720 Raciborowice Górne, Iwiny 36B SH D NaN \n", "1 NaN CP D NaN \n", "2 58-260 Bielawa ul. Wincentego Witosa 3 CP D NaN \n", "3 59-407 Mściwojów, Targoszyn 79 H SH DZ NaN \n", "4 NaN CP DZ NaN \n", "5 58-508 Jelenia Góra, Siedlęcin ul. 58-508 Jel... CP D NaN \n", "6 59-230 Prochowice, Lisowice 75 SH D NaN \n", "7 NaN CP D NaN \n", "8 59-230 Prochowice, Kawice 85 SH D NaN \n", "9 NaN CP D NaN \n", "\n", " działalnosc powiązana uwagi dec. ke 2014/709 \n", "0 NaN NaN N \n", "1 NaN NaN NaN \n", "2 CP(I)MM(V)MP(V)PP(VI) mp N \n", "3 NaN NaN N \n", "4 NaN NaN NaN \n", "5 CP(I)MM(V)SH(I) mp N \n", "6 NaN NaN N \n", "7 NaN NaN NaN \n", "8 NaN NaN N \n", "9 NaN NaN NaN " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Dimensions du dataframe : (758, 12)\n" ] } ], "source": [ "display(df.head(10))\n", "print('Dimensions du dataframe :', df.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Champs :\n", "- WNI - estampille\n", "- województwo/powiat/gmina - région/district/commune\n", "- nazwa - nom\n", "- adres - adresse\n", "- Kat. - catégorie SH (abattoir) ou CP (atelier de découpe)\n", "- A - volaille\n", "- L - lagomorphes\n", "- D - en activité\n", "- DZ - activité suspendue\n", "- ZW - agrément conditionnel\n", "- działalnosc powiązana - autres activités (abattage, découpe, hachage, transformation...)\n", "- uwagi - remarques (viande fraîche et/ou produits à base de viande)\n", "- dec. ke 2014/709 - concerné par les mesures de lutte contre la peste porcine africaine" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Nettoyage de données\n", "\n", "Pour les besoins de notre cartographie, nous ne garderons que les colonnes WNI, województwo, powiat, nazwa, adres et Kat.. Nous ne conserverons également que les établissements en activité ou bien bénéficiant d'un agrément conditionnel." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Suppression des colonnes inutiles\n", "df.drop(columns=['gmina', 'L', 'działalnosc powiązana', 'uwagi', 'dec. ke 2014/709'], inplace=True)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
WNIwojewództwopowiatnazwaadresKat.A
1NaNNaNNaNNaNNaNCPD
4NaNNaNNaNNaNNaNCPDZ
7NaNNaNNaNNaNNaNCPD
9NaNNaNNaNNaNNaNCPD
11NaNNaNNaNNaNNaNCPD
........................
734NaNNaNNaNNaNNaNCPD
745NaNNaNNaNNaNNaNCPD
750NaNNaNNaNNaNNaNCPD
754NaNNaNNaNNaNNaNCPD
757NaNNaNNaNNaNNaNCPD
\n", "

164 rows × 7 columns

\n", "
" ], "text/plain": [ " WNI województwo powiat nazwa adres Kat. A\n", "1 NaN NaN NaN NaN NaN CP D\n", "4 NaN NaN NaN NaN NaN CP DZ\n", "7 NaN NaN NaN NaN NaN CP D\n", "9 NaN NaN NaN NaN NaN CP D\n", "11 NaN NaN NaN NaN NaN CP D\n", ".. ... ... ... ... ... ... ..\n", "734 NaN NaN NaN NaN NaN CP D\n", "745 NaN NaN NaN NaN NaN CP D\n", "750 NaN NaN NaN NaN NaN CP D\n", "754 NaN NaN NaN NaN NaN CP D\n", "757 NaN NaN NaN NaN NaN CP D\n", "\n", "[164 rows x 7 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Les établissements qui ont à la fois des activités d'abattage et de découpe apparaissent deux fois\n", "# Identification des doublons\n", "df[df['WNI'].isna()]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "# Suppression des doublons dont l'activité est suspendue\n", "df.drop(index=df[(df['WNI'].isna()) & (df['A'] == 'DZ')].index, inplace=True)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "# Création de deux colonnes 'abattage' et 'decoupe' aux valeurs booléennes (True or False)\n", "# à la place de la colonne 'Kat.'\n", "df['abattage'] = False\n", "df['decoupe'] = False\n", "df.loc[df['Kat.'] == 'SH', 'abattage'] = True\n", "df.loc[df['Kat.'] == 'CP', 'decoupe'] = True\n", "df.drop(columns=['Kat.'], inplace=True)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
WNIwojewództwopowiatnazwaadresabattagedecoupe
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [WNI, województwo, powiat, nazwa, adres, abattage, decoupe]\n", "Index: []" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Remplissage des lignes doublons à partir de la ligne précédente\n", "df.loc[((df['WNI'].isna()) & (df['A'] == 'D') & (df['A'].shift(1) == 'DZ')), ['WNI', 'województwo', 'powiat', 'nazwa', 'adres', 'abattage']] = df[['WNI', 'województwo', 'powiat', 'nazwa', 'adres', 'abattage']].shift(1)\n", "# Suppression des établissements dont l'activité est suspendue\n", "df.drop(index=df[df['A'] == 'DZ'].index, inplace=True)\n", "# Suppression de la colonne indiquant l'état de l'activité\n", "df.drop(columns=['A'], inplace=True)\n", "# Remplissage des lignes doublons restantes à partir de la ligne précédente\n", "df.loc[df['WNI'].isna(), ['WNI', 'województwo', 'powiat', 'nazwa', 'adres', 'abattage']] = df[['WNI', 'województwo', 'powiat', 'nazwa', 'adres', 'abattage']].shift(1)\n", "# Suppression des doublons\n", "df.drop_duplicates(subset=['WNI', 'województwo', 'powiat', 'nazwa', 'adres'], keep='last', ignore_index=True, inplace=True)\n", "# Recherche des éventuelles valeurs manquantes\n", "df[df.isnull().any(axis=1)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les données sont désormais propres, nous allons encore renommer les colonnes avant de passer à l'étape de conversion des adresses en coordonnées géographiques." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dimensions du dataframe nettoyé : (534, 7)\n" ] } ], "source": [ "noms_colonnes = ['estampille', 'region', 'district', 'nom', 'adresse', 'abattage', 'decoupe']\n", "df.columns = noms_colonnes\n", "df.head(10)\n", "print('Dimensions du dataframe nettoyé :', df.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conversion des adresses en coordonnées géographiques" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "from geopy.geocoders import GoogleV3\n", "# Ne pas oublier d'insérer la clé API\n", "key = 'secret'\n", "geocoder = GoogleV3(api_key=key, domain='maps.googleapis.com')" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "from functools import partial\n", "# Géocodage à l'aide de l'API Google\n", "df['point'] = df['adresse'].apply(partial(geocoder.geocode, components={\"country\": \"PL\"}))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "# Extraction des coordonnées\n", "df['coord'] = df['point'].str[1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Création de la carte" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "import folium\n", "from folium.plugins import MarkerCluster" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
" ], "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "coord_pologne = (51.9189, 19.1344)\n", "m = folium.Map(location=coord_pologne, zoom_start=6)\n", "mc = MarkerCluster().add_to(m)\n", "df.apply(lambda row:folium.Marker(location=row['coord'], popup=row['nom'], icon=folium.Icon(color='orange')).add_to(mc), axis=1)\n", "m" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }