Медленный цикл Python для поиска данных в другом фрейме данных в Python - PullRequest
0 голосов
/ 22 мая 2018

У меня есть два фрейма данных: один со всеми моими данными (называемый «данными») и один с широтой и долготой разных станций, где каждое наблюдение начинается и заканчивается (называемый «инфо»), я пытаюсь получить фрейм данныхгде я буду иметь широту и долготу рядом с каждой станцией в каждом наблюдении, мой код на python:

for i in range(0,15557580):
    for j in range(0,542):
         if data.year[i] == '2018' and data.station[i]==info.station[j]:
             data.latitude[i] = info.latitude[j]
             data.longitude[i] = info.longitude[j]
             break

, но так как у меня есть около 15 миллионов наблюдений, выполнение этого занимает много времени,Есть ли более быстрый способ сделать это?

Большое спасибо (я все еще новичок в этом)

edit:

моя информация о файле выглядит так (около 500 наблюденийпо одному на каждую станцию)

enter image description here

данные моего файла примерно такие (вот другие переменные, которые здесь не показаны) (около 15 миллионов наблюдений, по одному на каждое путешествие)

enter image description here

и что я хочу получить, так это то, что при совпадении номеров станций результирующие данные будут выглядеть следующим образом:

enter image description here

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Это очень повторяющаяся и важная проблема, когда кто-то начинает работать с большими наборами данных.Большие данные - это отдельная тема, вот краткое введение в основные понятия.

1.Подготовьте ваш набор данных

В больших данных от 80% до 90% времени тратится на сбор, фильтрацию и подготовку ваших наборов данных.Создавайте подмножества данных, оптимизируя их для дальнейшей обработки.

2.Оптимизируйте ваш скрипт

Короткий код не всегда означает оптимизированный код с точки зрения производительности.В вашем случае, не зная о вашем наборе данных, трудно сказать точно, как вы должны его обработать, вам придется самостоятельно выяснить, как избежать максимально возможного вычисления, получая точно такой же результат.Старайтесь избегать ненужных вычислений.

Вы также можете разделить работу на несколько потоков, если это необходимо.

Как правило, вы не должны использовать петли for и break их внутри.Когда вы точно не знаете, сколько циклов вам придется пройти, вы всегда должны использовать циклы while или do...while.

3.Подумайте об использовании распределенного хранилища и вычислений

Этот вопрос сам по себе слишком велик, чтобы его можно было здесь объяснить.

Хранение, доступ и обработка данных в сериализованном виде быстрее для небольшого объема данных, но очень не подходит для больших наборов данных.Вместо этого мы используем распределенные системы хранения и вычисления.

Он стремится делать все параллельно.Он опирается на концепцию с именем MapReduce .

Первая структура распределенного хранения данных была Hadoop (например, Распределенная файловая система Hadoop или HDFS ).Эта структура имеет свои преимущества и недостатки, в зависимости от вашего приложения.

В любом случае, если вы хотите использовать эту платформу, для вас, вероятно, будет более целесообразным не использовать MR непосредственно поверх HDFS , но с использованиемверхний уровень, предпочтительно в памяти, такой как Spark или Apache Ignite поверх HDFS .Также, в зависимости от ваших потребностей, попробуйте взглянуть на такие фреймворки, как, например, Hive , Pig или Sqoop .

Опять же, этот предмет - совершенно другой мир, но вполне может быть адаптирован к вашей ситуации.Не стесняйтесь документировать себя обо всех этих концепциях и структурах и оставлять свои вопросы, если необходимо, в комментариях.

0 голосов
/ 22 мая 2018

Это одно решение.Вы также можете использовать pandas.merge, чтобы добавить 2 новых столбца в data и выполнить эквивалентное сопоставление.

# create series mappings from info
s_lat = info.set_index('station')['latitude']
s_lon = info.set_index('station')['latitude']

# calculate Boolean mask on year
mask = data['year'] == '2018'

# apply mappings, if no map found use fillna to retrieve original data
data.loc[mask, 'latitude'] = data.loc[mask, 'station'].map(s_lat)\
                                 .fillna(data.loc[mask, 'latitude'])

data.loc[mask, 'longitude'] = data.loc[mask, 'station'].map(s_lon)\
                                  .fillna(data.loc[mask, 'longitude'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...