Преобразование SAS pro c sql в Python (pandas) - PullRequest
1 голос
/ 18 июня 2020

Я переписываю код с SAS на Python, используя Pandas библиотеку.

У меня есть такой код, и я не знаю, что мне с ним делать?

Можете ли вы мне помочь, потому что это слишком сложно для меня, чтобы сделать это правильно. Я изменил название столбцов (для шифрования конфиденциальных данных)

Это код SAS:

proc sql;
   create table &work_lib..opk_do_inf_4 as 
   select distinct         
            *,
            min(kat_opk) as opk_do_inf,
            count(nr_ks) as ilsc_opk_do_kosztu_infr
from &work_lib..opk_do_inf_3
group by kod_ow, kod_sw, nr_ks, nr_ks_pr, nazwa_zabiegu_icd_9, nazwa_zabiegu
having kat_opk = opk_do_inf
;
quit;

Это моя попытка Pandas:

df = self.opk_do_inf_3() -> create DF using other function
df['opk_do_inf'] = df.groupby(by=['kod_ow', 'kod_sw', 'nr_ks', 'nr_ks_pr', 'nazwa_zabiegu_icd_9', 'nazwa_zabiegu'])['kat_opk'].min()
df['ilsc_opk_do_kosztu_infr'] = df.groupby(by=['kod_ow', 'kod_sw', 'nr_ks', 'nr_ks_pr', 'nazwa_zabiegu_icd_9', 'nazwa_zabiegu'])['nr_ks'].count()
df_groupby = df.groupby(by=['kod_ow', 'kod_sw', 'nr_ks', 'nr_ks_pr', 'nazwa_zabiegu_icd_9', 'nazwa_zabiegu']).filter(lambda x: x['kat_opk']==x['opk_do_inf'])
df = df_groupby.reset_index()
df = df.drop_duplcates()
return df

Ответы [ 2 ]

1 голос
/ 06 июля 2020

Во-первых, вызов SELECT * в агрегированном запросе GROUP BY недействителен SQL. SAS может разрешить это, но может дать неизвестные результаты. Обычно столбцы SELECT должны быть ограничены столбцами в предложении GROUP BY.

С учетом сказанного, совокупные запросы SQL обычно можно преобразовать в Pandas с помощью groupby.agg() операций с условиями WHERE (фильтровать перед агрегацией) или HAVING (фильтровать после агрегации), обрабатываемых с использованием либо .loc, либо query.

SQL

SELECT col1, col2, col3, 
       MIN(col1) AS min_col1,
       AVG(col2) AS mean_col2, 
       MAX(col3) AS max_col3, 
       COUNT(*)  AS count_obs

FROM mydata
GROUP BY col1, col2, col3
HAVING col1 = min(col1)

Pandas

Общий

agg_data = (mydata.groupby(["col1", "col2", "col3"], as_index=False)
                  .agg(min_col1 = ("col1", "min"),
                       mean_col2 = ("col2", "mean"),
                       max_col3 = ("col3", "max"),
                       count_obs = ("col1", "count"))
                  .query("col1 == min_col1")
           )

Специфический c

opk_do_inf_4 = (mydata.groupby(["kat_opk", "kod_ow", "kod_sw", "nr_ks", "nr_ks_pr", 
                                "nazwa_zabiegu_icd_9", "nazwa_zabiegu"], 
                                as_index=False)
                      .agg(opk_do_inf = ("kat_opk", "min"),
                           ilsc_opk_do_kosztu_infr = ("nr_ks", "count"))
                      .query("kat_opk == opk_do_inf")
               )
0 голосов
/ 06 июля 2020

Вы можете использовать функцию sqldf из пакета panda sql для выполнения запроса sql к фрейму данных. пример ниже

'' 'from panda sql import sqldf query = "select top 10 * from df" newdf = sqldf (query, locals ())' ''

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