PDF de programación - Pandas bowling: convierte tus datos en información

Imágen de pdf Pandas bowling: convierte tus datos en información

Pandas bowling: convierte tus datos en informacióngráfica de visualizaciones

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
  • Links de descarga
http://lwp-l.com/pdf5824

Comentarios de: Pandas bowling: convierte tus datos en información (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad