2017-03-16 3 views
1

Ich arbeite an der Alienvault Reputation.data Datei. Es ist eine Liste der 40k bösartigen IP-Adresse und ihrer Standorte. Ich habe die Datei eingelesen, wie soPython plotten Komma getrennte Koordinaten (lat, lang) in Matplotlib Grundkarte

addresses_columns = ["IP", "Reliability", "Risk", "Type", "Country", "Locale", "Coords", "x"] 
ip_addresses = pd.read_csv('reputation.data', sep='#', names=addresses_columns) 

Ich möchte die Coords Spalte nehmen und verwenden Sie die lat langen Zahlen sie als Streudiagramm auf einer Weltkarte zu zeichnen. Die Koordinaten sind Breiten- und Längengrad, Komma getrennt in den Spalten, sie sind Floats wie 21.0333003998,105.849998474. Die Weltkarte ist von Grundkarte codiert also

#import the world map from basemap 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 

# Define the projection, scale, the corners of the map, and the resolution. 
m = Basemap(projection='merc',llcrnrlat=-80,urcrnrlat=80,\ 
     llcrnrlon=-180,urcrnrlon=180,lat_ts=20,resolution='c') 
# Draw the coastlines 
m.drawcoastlines() 
# Color the continents 
m.fillcontinents(color='#ffcc99',lake_color='#ccffff') 
# draw parallels and meridians. 
m.drawparallels(np.arange(-90.,91.,30.)) 
m.drawmeridians(np.arange(-180.,181.,60.)) 
# fill in the oceans 
m.drawmapboundary(fill_color='#ccffff') 
plt.title("Map of IP Addresses") 
plt.show 

So jetzt möchte ich die lat langen Zahlen auf der Karte plotten. Das habe ich.

coordinates = ip_addresses[['Coords']] 
for index in range(len(coordinates)): 
    lat, lon = coordinates[index].split(",") 
    print "lat=%s, lon=%s" % (lat, lon) 
    x,y = map(lon, lat) 
    map.plot(x, y, 'bo', markersize=2) 

Hier ist die Ausgabe

Traceback (most recent call last): File "./assignment.py", line 85, in <module> 
    lat, lon = coordinates[index].split(",") File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 2059, in __getitem__ 
    return self._getitem_column(key) File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 2066, in _getitem_column 
    return self._get_item_cache(key) File "/usr/local/lib/python2.7/dist-packages/pandas/core/generic.py", line 1386, in _get_item_cache 
    values = self._data.get(item) File "/usr/local/lib/python2.7/dist-packages/pandas/core/internals.py", line 3543, in get 
    loc = self.items.get_loc(item) File "/usr/local/lib/python2.7/dist-packages/pandas/indexes/base.py", line 2136, in get_loc 
    return self._engine.get_loc(self._maybe_cast_indexer(key)) 
    File "pandas/index.pyx", line 132, in pandas.index.IndexEngine.get_loc (pandas/index.c:4145) 
    File "pandas/index.pyx", line 154, in pandas.index.IndexEngine.get_loc (pandas/index.c:4009) 
    File "pandas/src/hashtable_class_helper.pxi", line 732, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13166) 
    File "pandas/src/hashtable_class_helper.pxi", line 740, in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:13120) 
    KeyError: 0 

Warum gibt es kein Streudiagramm? Jede Hilfe wird geschätzt.

+0

Willkommen bei Stackoverflow. "Keine Freude" ist keine ausreichende Problembeschreibung. Was ist das Problem? Was passiert, wenn Sie Ihren Code ausführen? Wenn ein Fehler auftritt, schließen Sie das Traceback ein. [Bearbeiten] Ihre Frage entsprechend. – ImportanceOfBeingErnest

Antwort

0

Der Fehler kann mit dem folgenden Beispiel reproduziert werden.

import pandas as pd 
import numpy as np 

x = np.random.rand(10, 2) 
d = ["{},{}".format(x[i,0], x[i,1]) for i in range(x.shape[0])] 
df = pd.DataFrame({"Coords": d}) 

coordinates = df[['Coords']] 
for index in range(len(coordinates)): 
    lat, lon = coordinates[index].split(",") 
    print "lat=%s, lon=%s" % (lat, lon) 

Das Problem ist die Linie, wo eine Spalten coordinates = df[['Coords']] Indexierungs versucht wird, ein einzelnes Element Liste. Das ist nicht möglich.
Verwenden Sie stattdessen

coordinates = df['Coords']