В Часть 1 Мы сделали простые, 2 слоя данных преступности Атланты в 2021 году. Это было сделано путем импортирования CSV, который обновляет полицейский отдел Атланты еженедельно, в форме Atlanta Roads и создания экземпляра участка оси. Хотя мы смогли создать впечатляющую графику примерно в 25 строках кода, данные ничего не раскрывают. Проверьте мой ноутбук здесь Отказ
Это больше преступлений в этом году, чем последний? Как мы можем интуитивно использовать код, чтобы найти ответы? Давайте начнем, импортируя данные преступности 2020. Сразу же, что мы можем подумать о том, как наши 2021 данные неполны. В настоящее время 9 сентября 2021 года, поэтому мы всего более 2/3 прохождения прохождения прохождения.
Способ легко отфильтровать данные вашей таблицы – установить новый индекс. Естественно, ваш индекс с целым числом, которое увеличивается на один. Здесь мы собираемся использовать age_date в качестве каждого индекса строк. Что нам также нужно сделать, это преобразовать строку в тип DateTime. Это позволяет легко отфильтровать или данные по дате.
df2020 = pd.read_csv("https://github.com/nicholasoxford/pythonViz/blob/main/2020-old.csv?raw=true") df2020.index = pd.to_datetime(df2020["occur_date"]) df2020 = df2020[(df2020.index < "2020-09-10")] df2020
Если вы используете Google Collab, который вы должны, вы увидите распечаток кадра данных. Если вы прокомментируете линию фильтра, df2020 [(df2020.index <"2020-09-10")]
, вы увидите весь объем файла. Вы также заметите, что это только до 30 сентября. Остальные данные – это еще один CSV, названный преступностью-2020. В строке read_csv выключите имя файла в конце для остальных лет данных.
Как и в части 1, нам нужно преобразовать этот кадр данных в геодатaframe с использованием геопандов. Теперь, когда мы двигаемся в нашей карьере Python, давайте создадим многоразовую функцию. Мы могли бы просто скопировать и вставить, но я чувствую, что это не в последний раз, когда нам нужно будет трансформировать датафарам.
def dfGeoTransfer(df): return gpd.GeoDataFrame(df2021, crs="EPSG:4326", geometry=[Point(xy) for xy in zip(df2021['long'], df2021['lat'])]) geo_df20 = dfGeoTransfer(df2020) geo_df20
Вы можете видеть, что мы объединили две строки в более длительный оператор возврата. Вы могли бы сохранить его два, я думаю, что это зависит от вас действительно. Не стреляй меня. Наконец, мы устанавливаем возвращаемое значение функции, Geodataframe, к новой переменной, называемой GEO_DF20.
Далее нам нужно отфильтровать наши данные для долготы и широты нашего уличного участка. Мы не можем сделать то же самое сюжет. Хитрость, у нас в прошлый раз. Хотя мы создаем этот метод фильтрации, я думаю, что мы должны создать всеобъемлющий метод. Наша цель этой функции состоит в том, что она принимает ссылку на CSV и возвращает GeodataTaframe с надлежащей фильтрацией и преобразованием.
def prepareGeoDataFrame(url): df = pd.read_csv(url) df.index = pd.to_datetime(df["occur_date"]) df = df[(df.index < "2020-09-10")] filter = df["long"] > -84.425 filter2 = df["long"] < -84.35 filter3 = df["lat"] > 33.745 filter4 = df["lat"] < 33.813 df = df[(filter) &(filter2) & (filter3) & (filter4)] return gpd.GeoDataFrame(df, crs="EPSG:4326", geometry=[Point(xy) for xy in zip(df['long'], df['lat'])])
Чтобы сделать быструю контрольную проверку данных, давайте поставьте графики бок о бок. Существует аккуратный трюк с использованием экземпляров осей участков, в которых вы определяете, сколько рядов/столбцов и возвращает массив экземпляров осей. Я думаю, что код просто вроде имеет смысл.
Давайте также передам наши 2021 данные через нашу Prefaregeodatafarame
функция. Убедитесь, что наши данные структурированы то же самое, что поможет идти вперед. Плюс, теперь все, что нам нужно сделать, это пройти в URL, а тяжелая работа сделана для нас.
Очень-глаза среди вас заметит одну проблему с нашим кодом выше. Если мы пройдем в 2021 данные, мы в основном ничего не верну. Я сделал быстрое и легкое, если заявление, чтобы справиться с этой ситуацией.
df.index = pd.to_datetime(df["occur_date"]) if(df.index.max().year == 2020): df = df[(df.index < "2020-09-10")] if(df.index.max().year == 2021): df = df[(df.index < "2021-09-10")] filter = df["long"] > -84.425
Я сказал, прежде чем мы не сможем использовать XLIM-и юридические методы, это потому, что мы будем построить наши графики бок о бок. Для этого мы начнем то же самое, за исключением мы добавим два свойства на нашими подломам. Ряды и колонны. Теперь подломы вернут массив экземпляров осей. Быть ясным, мы будем использовать одну и ту же карту улицы для обоих, просто разных CSV.
С нашей новой функцией подготовить Geodataframe, все, что нам нужно:
street_map = gpd.read_file('/content/drive/MyDrive/GC_Roads/GC_RD_GA/Roads_Atlanta_GA.shp') geo_df20 = prepareGeoDataFrame("https://github.com/nicholasoxford/pythonViz/blob/main/2020-old.csv?raw=true") geo_df21 = prepareGeoDataFrame("https://github.com/nicholasoxford/pythonViz/blob/main/COBRA-2021%203.csv?raw=true") fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2,figsize=(9,9)) #plot both streetmap and and long/lat points # fig, ax = plt.subplots(figsize=(15,15)) geo_df21.plot(column="UC2_Literal", ax=ax1,alpha=0.5, legend=True,markersize=30) street_map.to_crs(4326).plot(ax=ax1, alpha=0.4,color='grey') geo_df20.plot(column="UC2_Literal", ax=ax2,alpha=0.5, legend=True,markersize=30) street_map.to_crs(4326).plot(ax=ax2, alpha=0.4,color='grey') fig.tight_layout()
а также мы получаем
Очевидно, что это не идеально, цвета не выпускаются, например. Тем не менее, мы упростим наш код, и у нас есть экземпляр графика нескольких столбцов. Вы, как кодер, также должны иметь гораздо лучшее понимание определения функции и если заявления. Пандас и геопандас делает его таким легким. Я чувствую, что это будет почти невозможно иначе.
Проверьте часть 3, где мы делаем статистический анализ и сломайте его преступлением.
Николас Оксфорд
Оригинал: “https://dev.to/nicholasoxford/python-data-visualization-atlanta-crime-data-part-2-h1c”