根据房地产 ID 从数据框中提取唯一价格值

Extracting unique price values from dataframe depending on real estate id

我有一个数据框,其中包含从这样的数据库中获取的数据:

conn = sqlite3.connect('REDB.db')
dataAvg1 = pd.read_sql_query(
     "SELECT UNIQUE_RE_NUMBER, TYP_ID, LOCATION, RE_PRICE, PRICE.RE_ID, PRICE.UPDATE_DATE, HOUSEINFO.RE_POLOHA, HOUSEINFO.RE_DRUH, HOUSEINFO.RE_TYP, HOUSEINFO.RE_UPLOCHA FROM PRICE INNER JOIN REAL_ESTATE, ADDRESS, HOUSEINFO ON REAL_ESTATE.ID=PRICE.RE_ID AND REAL_ESTATE.ID=ADDRESS.RE_ID AND REAL_ESTATE.ID=HOUSEINFO.INF_ID",conn
)
dataAvg2 = pd.read_sql_query(
     "SELECT UNIQUE_RE_NUMBER, TYP_ID, LOCATION, RE_PRICE, PRICE.RE_ID, PRICE.UPDATE_DATE, FLATINFO.RE_DISPOZICE, FLATINFO.RE_DRUH, FLATINFO.RE_PPLOCHA FROM PRICE INNER JOIN REAL_ESTATE, ADDRESS, FLATINFO ON REAL_ESTATE.ID=PRICE.RE_ID AND REAL_ESTATE.ID=ADDRESS.RE_ID AND REAL_ESTATE.ID=FLATINFO.INF_ID",conn
)
dataAvg3 = pd.read_sql_query(
     "SELECT UNIQUE_RE_NUMBER, TYP_ID, LOCATION, RE_PRICE, PRICE.RE_ID, PRICE.UPDATE_DATE, LANDINFO.RE_PLOCHA, LANDINFO.RE_DRUH, LANDINFO.RE_SITE, LANDINFO.RE_KOMUNIKACE FROM PRICE INNER JOIN REAL_ESTATE, ADDRESS, LANDINFO ON REAL_ESTATE.ID=PRICE.RE_ID AND REAL_ESTATE.ID=ADDRESS.RE_ID AND REAL_ESTATE.ID=LANDINFO.INF_ID",conn
)
conn.close()

df2 = [dataAvg1, dataAvg2, dataAvg3]
dfAvg = pd.concat(df2)
dfAvg = dfAvg.reset_index(drop=True)

主要栏目是UNIQUE_RE_NUMBER、RE_PRICE和UPDATE_DATE。我想计算每天价格变化的频率。理想情况下,创建一个名为 'Frequency' 的新列,并为每一天添加一个数字。例如:

UPDATE_DAY       UNIQUE_RE_NUMBER      RE_PRICE    FREQUENCY
1.1.2021                 1                500          2
1.1.2021                 2                400          2
2.1.2021                 1                500          1
2.1.2021                 2                450          1

我希望这个例子是可以理解的。

现在我有这样的东西:

dfAvg['FREQUENCY'] = dfAvg.groupby('UPDATE_DATE')['UPDATE_DATE'].transform('count')
dfAvg.drop_duplicates(subset=['UPDATE_DATE'], inplace=True)

这段代码统计了当天加的每一个价格,所以2021年1月1日的房产价格是500,第二天也是500,算作价格的“变化”,但实际上是价格保持不变,我不想算那个。我想 select 每个房地产的价格只有不同的值。可能吗?

不确定这是否是最有效的方法,但也许它有帮助:

def ident_deltas(sdf):
    return sdf.assign(
        DELTA=(sdf.RE_PRICE.shift(1) != sdf.RE_PRICE).astype(int)
    )

def sum_deltas(sdf):
    return sdf.assign(FREQUENCY=sdf.DELTA.sum())

df = (
    df.groupby("UNIQUE_RE_NUMBER").apply(ident_deltas)
      .groupby("UPDATE_DAY").apply(sum_deltas)
      .drop(columns="DELTA")
)

结果

df = 
  UPDATE_DAY  UNIQUE_RE_NUMBER  RE_PRICE
0 2021-01-01                 1       500
1 2021-01-01                 2       400
2 2021-02-01                 1       500
3 2021-02-01                 2       450

  UPDATE_DAY  UNIQUE_RE_NUMBER  RE_PRICE  FREQUENCY
0 2021-01-01                 1       500          2
1 2021-01-01                 2       400          2
2 2021-02-01                 1       500          1
3 2021-02-01                 2       450          1