преобразовать SQL-код в операцию с данными в фрейме Python Pandas - PullRequest
0 голосов
/ 04 июня 2018

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

TABLE1
ID; AGE; SEX;
1; 1; F
2; 1; F
3; 1; M
4; 2; F
4; 2; m

и другой таблицы с данными:

TABLE2
TYPE, SEX, AGE_RANGE
1, F, 1-5
1, F, 6-10
1, F, 11-15
2, F, 1-5
1, M, 1-5
2, M, 1-5

Я создаю объединение:

SELECT tbl1.id, tbl1.age, tbl2.sex, table2.type
FROM table1 tbl1, table2 tbl2
WHERE 
tbl1.age >= tbl2.min_age AND tbl1.age <= tbl2.max_age AND
tbl1.sex = tbl2.sex

Результатом является действительно большая таблица (SELECT должен возвращать около 40 миллионов строк. Затем я использую метод groupby и filter для дальнейшей фильтрации моих записей. У меня естьпроблема, потому что я получаю MemmoryError при запуске моего кода. Я думал об изменении csv, чтобы лучше разместить pandas dataframe (чтобы избежать использования sql) Мой пример кода ниже:

df_table1 = pd.read_csv(table1)
df_table2 = pd.read_csv(table2)
conn = sqlite3.connect(':memory:')

df_table1.to_sql('table1', conn, index=False)
df_table2.to_sql('table2', conn, index=False)

sql = '''SELECT tbl1.id, tbl1.age, tbl2.sex, table2.type
FROM table1 tbl1, table2 tbl2
WHERE 
tbl1.age >= tbl2.min_age AND tbl1.age <= tbl2.max_age AND
tbl1.sex = tbl2.sex'''

df_filtered = pd.read_sql_query(sql, conn)

filter = ['sex', 'age_range', 'type']
grouped_data = df_filtered.groupby(iskanje).apply(select_random_row)
#select_random_row is my custom_made function which returns just select few rows that groupby returns
grouped_data .to_csv("result.csv", sep=';', encoding='utf-8') 

Самая большая проблема - мой sql, потому что яОшибка выхода из памяти, но даже без ошибки загрузка занимает слишком много времени. Я думал об изменении моего csv и использовании точного AGE, а не AGE_RANGE .... что позволило бы мне использовать запросы панд вместо sql

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Мне удалось закончить мою проблему с довольно хорошей производительностью.

Я использовал цикл для ЦИКЛА через каждый другой ТИП в df2 (это фиксированный размер, с 20 различными типами).Каждую итерацию я использовал df.merge для объединения обеих таблиц в AGE_GROUP и SEX (я добавил столбец AGE_GROUP в table1. Затем я использовал groupby в SEX и AGE_GROUP и пользовательский фильтр для этих групп. Весь процесс занимает около 15 минут, но по крайней мере я не надеваюне заканчивается баран.

0 голосов
/ 04 июня 2018

Я думаю, вы могли бы сделать что-то вроде:

table1['AGE_RANGE'] = pd.cut(table1['AGE'], np.linspace(0, 80, 17))

table2['AGE_RANGE_fmt'] = pd.cut(table2['AGE_RANGE'].str.split('-').str[0].astype('int'), np.linspace(0, 80, 17))

df_filtered = table1.merge(table2, how='left', left_on=['SEX', 'AGE_RANGE'], right_on=['SEX', 'AGE_RANGE_fmt'])

Здесь я создаю новый столбец AGE RANGE в обеих таблицах и использую его как ключ для слияния.

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