Publicado el 27 de Julio del 2017
820 visualizaciones desde el 27 de Julio del 2017
446,4 KB
19 paginas
Creado hace 11a (05/01/2014)
Pandas bowling: convierte tus datos en
información
Introducción a la manipulación de datos utilizando pandas contra un set de datos públicos. Data munging:
filtering, merging, grouping, estadísticas comunes e introducción al plotting.
Pandas bowling
In [1]: import pandas as pd
import csv
import re
import unicodedata
In [2]: # Delimiter ;
# Awkward encoding
dialect = csv.excel()
dialect.delimiter = ';'
# Source: http://www.datosabiertos.jcyl.es/web/jcyl/risp/es/directorio/ba
res/1284211832884.csv
bars = pd.read_csv('bares.csv', dialect=dialect, encoding='cp1252')
to_ascii = lambda text: unicodedata.normalize('NFKD', text).encode('ASCII
', 'ignore').upper()
In [3]: bars
Out[3]: <class 'pandas.core.frame.DataFrame'>
Int64Index: 13984 entries, 0 to 13983
Data columns (total 15 columns):
Nombre 13984 non-null values
Dirección 13915 non-null values
C.Postal 13958 non-null values
Provincia 13984 non-null values
Municipio 13984 non-null values
Localidad 13984 non-null values
Nucleo 9786 non-null values
Teléfono 1 11849 non-null values
Teléfono 2 658 non-null values
Teléfono 3 21 non-null values
Fax 45 non-null values
Email 255 non-null values
web 39 non-null values
Q Calidad 0 non-null values
Unnamed: 14 0 non-null values
dtypes: float64(2), object(13)
In [4]: bars.tail(1)
Out[4]:
Nombre Dirección C.Postal Provincia Municipio Localidad
Nucleo
13983
ARCO
DE
TRIUNFO
VILLAR Y
MACIAS,
7
37003
Salamanca Salamanca SALAMANCA SALAMANCA
In [5]: bars.Localidad.apply(lambda x: x.find('LA ') != -1)
Out[5]: 0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 False
11 False
12 False
13 False
14 False
...
13969 False
13970 False
13971 False
13972 False
13973 True
13974 False
13975 False
13976 False
13977 False
13978 False
13979 False
13980 False
13981 False
13982 False
13983 False
Name: Localidad, Length: 13984, dtype: bool
In [6]: bars[bars.Localidad.apply(lambda x: x.find('LA ') != -1)]
Out[6]: <class 'pandas.core.frame.DataFrame'>
Int64Index: 805 entries, 46 to 13973
Data columns (total 15 columns):
Nombre 805 non-null values
Dirección 795 non-null values
C.Postal 803 non-null values
Provincia 805 non-null values
Municipio 805 non-null values
Localidad 805 non-null values
Nucleo 574 non-null values
Teléfono 1 685 non-null values
Teléfono 2 51 non-null values
Teléfono 3 0 non-null values
Fax 3 non-null values
Email 17 non-null values
web 1 non-null values
Q Calidad 0 non-null values
Unnamed: 14 0 non-null values
dtypes: float64(2), object(13)
In [7]: # Selección de filas
bars.iloc[0]
bars.loc[0]
bars.ix[0]
bars.T[0]
Out[7]: Nombre CASA PEDRO
Dirección NUÑEZ DE ARCE 4
C.Postal 47002
Provincia Valladolid
Municipio Valladolid
Localidad VALLADOLID
Nucleo VALLADOLID
Teléfono 1 983000000
Teléfono 2 NaN
Teléfono 3 NaN
Fax NaN
Email NaN
web NaN
Q Calidad NaN
Unnamed: 14 NaN
Name: 0, dtype: object
In [8]: bars[0]
-------------------------------------------------------------------------
--
KeyError Traceback (most recent call las
t)
<ipython-input-8-4cadcae3962b> in <module>()
----> 1 bars[0]
//anaconda/lib/python2.7/site-packages/pandas/core/frame.pyc in __getitem
__(self, key)
2001 # get column
2002 if self.columns.is_unique:
-> 2003 return self._get_item_cache(key)
2004
2005 # duplicate columns
//anaconda/lib/python2.7/site-packages/pandas/core/generic.pyc in _get_it
em_cache(self, item)
665 return cache[item]
666 except Exception:
--> 667 values = self._data.get(item)
668 res = self._box_item_values(item, values)
669 cache[item] = res
//anaconda/lib/python2.7/site-packages/pandas/core/internals.pyc in get(s
elf, item)
1653 def get(self, item):
1654 if self.items.is_unique:
-> 1655 _, block = self._find_block(item)
1656 return block.get(item)
1657 else:
//anaconda/lib/python2.7/site-packages/pandas/core/internals.pyc in _find
_block(self, item)
1933
1934 def _find_block(self, item):
-> 1935 self._check_have(item)
1936 for i, block in enumerate(self.blocks):
1937 if item in block:
//anaconda/lib/python2.7/site-packages/pandas/core/internals.pyc in _chec
k_have(self, item)
1940 def _check_have(self, item):
1941 if item not in self.items:
-> 1942 raise KeyError('no item named %s' % com.pprint_thing(
item))
1943
1944 def reindex_axis(self, new_axis, method=None, axis=0, copy=Tr
ue):
KeyError: u'no item named 0'
In []: bars.tail(1)
In []: web_only = bars.dropna(subset=['web'])
len(web_only)
web_only[web_only.Localidad == 'BURGOS']
In []: bars["C.Postal"]
In []: bars.Provincia
In [9]: by_provincia_gb = bars.groupby('Provincia')
by_provincia_gb
Out[9]: <pandas.core.groupby.DataFrameGroupBy object at 0x108cf5f50>
In [10]: by_provincia_gb.web.get_group(u'León').dropna()
Out[10]: 11406 seaki.com
Name: web, dtype: object
In [11]: by_provincia = pd.DataFrame({'Bares': by_provincia_gb.size()})
by_provincia
Out[11]:
Bares
Bares
Provincia
Burgos
1796
León
2224
Palencia
1057
Salamanca 1341
Segovia
804
Soria
353
Valladolid 3724
Zamora
1282
Ávila
1403
In [12]: by_provincia.index
Out[12]: Index([u'Burgos', u'León', u'Palencia', u'Salamanca', u'Segovia', u'Soria
', u'Valladolid', u'Zamora', u'Ávila'], dtype=object)
In [13]: by_provincia.sort('Bares', ascending=False)
Out[13]:
Bares
Provincia
Valladolid 3724
León
2224
Burgos
1796
Ávila
1403
Salamanca 1341
Zamora
1282
Palencia
1057
Segovia
804
Soria
353
In [14]: by_provincia.plot(rot=20)
Out[14]: <matplotlib.axes.AxesSubplot at 0x108d913d0>
In [15]: population = pd.read_excel('poblacion_por_provincias.xls', 'poblacion')
population['Provincia'] = population.Provincia.apply(to_ascii)
population.columns = 'Provincia', 'Población'
population = population.set_index('Provincia')
population
Out[15]:
Población
Provincia
AVILA
169505
BURGOS
367906
LEON
488991
PALENCIA
168721
SALAMANCA 347377
SEGOVIA
161640
SORIA
93389
VALLADOLID 530590
ZAMORA
189037
In [16]: joined = population.join(by_provincia)
joined
Out[16]:
Provincia
AVILA
BURGOS
Población Bares
169505
367906
NaN
NaN
BURGOS
367906
LEON
488991
PALENCIA
168721
SALAMANCA 347377
SEGOVIA
161640
SORIA
93389
VALLADOLID 530590
ZAMORA
189037
NaN
NaN
NaN
NaN
NaN
NaN
NaN
NaN
In [17]: by_provincia = by_provincia.set_index(by_provincia.index.map(lambda prov:
to_ascii(prov)))
In [18]: joined = population.join(by_provincia)
joined
Out[18]:
Población Bares
Provincia
AVILA
169505
BURGOS
367906
LEON
488991
PALENCIA
168721
SALAMANCA 347377
SEGOVIA
161640
SORIA
93389
VALLADOLID 530590
ZAMORA
189037
1403
1796
2224
1057
1341
804
353
3724
1282
In [19]: joined['Población'].sum()
Out[19]: 2517156.0
In [20]: joined.Bares.std()
Out[20]: 975.3478581739156
In [21]: joined[['Población', 'Bares']].corr()
Out[21]:
Población Bares
Población 1.000000
Bares
0.890913
0.890913
1.000000
In [22]: joined['Habitantes por bar'] = joined['Población'].astype(float) / joined
.Bares
joined['Habitantes por bar'] = joined['Habitantes por bar'].apply(round)
joined['% Bares'] = joined.Bares.apply(lambda number: round(100 * number
/ joined.Bares.sum().astype(float), 1))
joined['% Población'] = joined['Población'].apply(lambda people: round(10
0 * people / joined['Población'].sum().astype(float), 1))
joined
Out[22]:
Población Bares Habitantes por bar % Bares % Población
Provincia
AVILA
169505
BURGOS
367906
LEON
488991
PALENCIA
168721
SALAMANCA 347377
SEGOVIA
161640
SORIA
93389
VALLADOLID 530590
ZAMORA
189037
1403
1796
2224
1057
1341
804
353
3724
1282
121
205
220
160
259
201
265
142
147
10.0
12.8
15.9
7.6
9.6
5.7
2.5
26.6
9.2
6.7
14.6
19.4
6.7
13.8
6.4
3.7
21.1
7.5
In [23]: joined[['% Población', '% Bares']].plot()
Out[23]: <matplotlib.axes.AxesSubplot at 0x108d43650>
In [24]: pob_bar = joined[['Población', 'Bares']]
pob_bar.Bares.plot()
pob_bar['Población'].plot(secondary_y=True, style='g')
Out[24]: <matplotlib.axes.AxesSubplot at 0x108df1690>
In [25]: pd.tools.plotting.scatter_plot(joined, 'Población', 'Bares')
Out[25]:
In [26]: pd.tools.plotting.scatter_plot(joined, 'Población', 'Bares')
for label, x, y in zip(joined.index, joined['Población'], joined['Bares']
):
plt.annotate(
label,
xy = (x, y), xytext = (-10, 10),
textcoords = 'offset points', ha = 'center', va = 'bottom')
#bbox = dict(boxstyle = 'round,pad=0.5', fc = 'yellow', alpha = 0
.2))
In [27]: def scatter_and_fit(joined, figsize=(8, 6)):
from pylab import polyfit, poly1d
fit = polyfit(joined['Población'], joined['Bares'], 1)
fit_fn = poly1d(fit)
plt.figure(figsize=figsize, dpi=160)
plt.plot(
joined['Población'],
joined['Bares'],
'bo',
joined['Población'],
fit_fn(joined['Población']),
'--k');
for label, x, y in zip(joined.index, joined['Población'], joined['Bar
es']):
plt.annotate(
label,
xy = (x, y), xytext = (-10, 10),
textcoords = 'offset points', ha = 'center', va = 'bottom',)
scatter_and_fit(joined)
In [46]: initial_length = len(bars)
capitals = [to_ascii(provincia) for provincia in bars.Provincia.unique()]
bars_caps = bars[bars.Localidad.apply(lambda x: x in capitals)]
print initia
Comentarios de: Pandas bowling: convierte tus datos en información (0)
No hay comentarios