Python 使用pandas可以快速获得时间序列数据的正确聚合输出吗?

Python 使用pandas可以快速获得时间序列数据的正确聚合输出吗?,python,pandas,time-series,Python,Pandas,Time Series,我使用了Redfin房地产数据,其中记录了芝加哥地区每个地区历年的每月房屋销售价格。我想先计算城市的年平均房屋销售价格,同时,我还想得到每个地区的年房屋销售价格变化,然后我想将每个地区的年销售价格变化与城市中各自的平均年房屋销售价格进行比较,我想引入具有二进制值1的新列,一年中的每个地区为0。如果每个地区的房屋销售价格变化大于该变化的平均年房屋销售价格变化,则添加1,否则为0 expected_output = pd.DataFrame({'Year': ['2012', '2013', '20

我使用了Redfin房地产数据,其中记录了芝加哥地区每个地区历年的每月房屋销售价格。我想先计算城市的年平均房屋销售价格,同时,我还想得到每个地区的年房屋销售价格变化,然后我想将每个地区的年销售价格变化与城市中各自的平均年房屋销售价格进行比较,我想引入具有二进制值1的新列,一年中的每个地区为0。如果每个地区的房屋销售价格变化大于该变化的平均年房屋销售价格变化,则添加1,否则为0

expected_output = pd.DataFrame({'Year': ['2012', '2013', '2014', '2015', '2012', '2013', '2014', '2015', '2012', '2013', '2014', '2015'], 
                     'Area': ['Chicago, IL metro area', 'Chicago, IL metro area', 'Chicago, IL metro area', 'Chicago, IL metro area', 'Chicago, IL', 'Chicago, IL', 'Chicago, IL', 'Chicago, IL', 'Chicago, IL - Albany Park', 'Chicago, IL - Albany Park', 'Chicago, IL - Albany Park', 'Chicago, IL - Albany Park'],'yearly_price_change': ['5%', '10%', '7%','21%', '15%', '12%', '2%','21%', '10%', '11%', '12%','6%'],
                     'price_label':[0, 1, 0,1,1,1,0,1,1,1,1,0]})
例如,在2012年2月至2013年2月期间,奥斯汀地区的年房屋销售价格变化为5%,芝加哥地区的平均年房屋销售价格为7%,因此我可以在价格标签栏中添加值0

如何使时间序列数据的这种聚合变得容易?有什么办法完成这件事吗

我发布了好几次我的问题,同时我尝试了自己的,但没有得到正确的输出。有人能告诉我如何得到正确的解决方案吗?谢谢

示例数据:

以下是字典中时间序列数据的示例数据片段:

我的尝试:

但上述尝试未返回正确的预期聚合结果。我该怎么办?有什么办法可以做到这一点吗?我试了很多方法,但还是没有得到我想要的。有人能告诉我怎么做吗

更新

或者,我想将历年的月度变化与每个地区的年平均变化进行比较。有没有可能实现这种聚合的想法?谢谢

期望输出

我想得到一个数据框,其中每个地区的年房价百分比将作为新列添加,如果单个城市的房价变化大于该城市的平均年房价变化,那么我将添加二进制值,如1,0,否则

expected_output = pd.DataFrame({'Year': ['2012', '2013', '2014', '2015', '2012', '2013', '2014', '2015', '2012', '2013', '2014', '2015'], 
                     'Area': ['Chicago, IL metro area', 'Chicago, IL metro area', 'Chicago, IL metro area', 'Chicago, IL metro area', 'Chicago, IL', 'Chicago, IL', 'Chicago, IL', 'Chicago, IL', 'Chicago, IL - Albany Park', 'Chicago, IL - Albany Park', 'Chicago, IL - Albany Park', 'Chicago, IL - Albany Park'],'yearly_price_change': ['5%', '10%', '7%','21%', '15%', '12%', '2%','21%', '10%', '11%', '12%','6%'],
                     'price_label':[0, 1, 0,1,1,1,0,1,1,1,1,0]})
有什么办法完成这件事吗?如何获得与预期数据帧类似的正确聚合?我怎样才能做到这一点?有什么想法吗?谢谢

以下是我的看法:

# prepare the data frame
df = pd.DataFrame(dicts).set_index('Region')
df.columns = pd.to_datetime(df.columns)

df = df.stack().reset_index()
df.columns = ['Region', 'date', 'price']
df.head()

#    Region                  date                   price
#--  ----------------------  -------------------  -------
# 0  Chicago, IL metro area  2012-02-01 00:00:00     88.4
# 1  Chicago, IL metro area  2012-03-01 00:00:00     93.3
# 2  Chicago, IL metro area  2012-04-01 00:00:00     97.6
# 3  Chicago, IL metro area  2012-05-01 00:00:00    102
# 4  Chicago, IL metro area  2012-06-01 00:00:00    110.7

# get the price change over month, as I understand from the question
df['price_change'] = df.groupby('Region').price.apply(lambda x: x.diff().abs()/x)

# compute mean over the years and regions
new_df = df.groupby(['Region', df.date.dt.year])[['price_change']].mean()

# compute the price_label
new_df['price_label'] = new_df.groupby(level=0).apply(lambda x: (x>x.mean()).astype(int))
new_df

#                                     price_change
#date  Region                     
#2012  Chicago, IL                    0.082864
#      Chicago, IL - Albany Park      0.074394
#      Chicago, IL - Andersonville    0.066074
#      Chicago, IL metro area         0.035153
#2013  Chicago, IL                    0.074208
#      Chicago, IL - Albany Park      0.055192
#      Chicago, IL - Andersonville    0.032249
#      Chicago, IL metro area         0.040750
#2014  Chicago, IL                    0.063483
#      Chicago, IL - Albany Park      0.056466
#      Chicago, IL - Andersonville    0.030612
#      Chicago, IL metro area         0.032648
#2015  Chicago, IL                    0.049580
#      Chicago, IL - Albany Park      0.041228
#      Chicago, IL - Andersonville    0.061222
#      Chicago, IL metro area         0.038374
#Name: price_change, dtype: float64

# here we compute the average across the years for each region
# groupby(level=1) will gather all the records of same region (level 1)
# if you want average across the regions for each year,
# change to groupby(level=0), i.e. gather all records of same year.
new_df['price_label'] = new_df.groupby(level=1).apply(lambda x: (x>x.mean()).astype(int))

new_df
输出:

+------------------------------+-------+---------------+-------------+
|                              |       | price_change  | price_label |
+------------------------------+-------+---------------+-------------+
| Region                       | date  |               |             |
+------------------------------+-------+---------------+-------------+
| Chicago, IL                  | 2012  | 0.082864      |           1 |
|                              | 2013  | 0.074208      |           1 |
|                              | 2014  | 0.063483      |           0 |
|                              | 2015  | 0.049580      |           0 |
| Chicago, IL - Albany Park    | 2012  | 0.074394      |           1 |
|                              | 2013  | 0.055192      |           0 |
|                              | 2014  | 0.056466      |           0 |
|                              | 2015  | 0.041228      |           0 |
| Chicago, IL - Andersonville  | 2012  | 0.066074      |           1 |
|                              | 2013  | 0.032249      |           0 |
|                              | 2014  | 0.030612      |           0 |
|                              | 2015  | 0.061222      |           1 |
| Chicago, IL metro area       | 2012  | 0.035153      |           0 |
|                              | 2013  | 0.040750      |           1 |
|                              | 2014  | 0.032648      |           0 |
|                              | 2015  | 0.038374      |           1 |
+------------------------------+-------+---------------+-------------+

我可能误解了一些东西,但这就是要点:-.

你从哪里可以找到奥斯汀:[“芝加哥,伊利诺伊州大都会区”,“芝加哥,伊利诺伊州”,“芝加哥,伊利诺伊州-奥尔巴尼公园”,“芝加哥,伊利诺伊州-安德森维尔”]?@anky_91我更新了我的帖子。为了创建我期望的输出数据帧,这只是一个伪名称。我通过观察创建了这个虚拟数据帧。你能告诉我怎么解决这个问题吗?谢谢你是说你在比较不同年份的月度变化和年度平均变化吗?@sramalingam24你是对的,这更有意义。有什么想法吗?thanks@anky_91有什么想法吗?如何在这个问题上获得有效的聚合?你能帮我一个忙吗?我想从你的解决方案中澄清一点:我想将每个地区历年的月房价变化与所有地区的平均年房价变化进行比较。你能给我解释一下吗?我有点困惑。感谢you@Dan你想把伊利诺伊州芝加哥2012年的价格变化与2012年所有地区的平均价格进行比较吗?是的,我想看看这个加总。基于当前的解决方案,我如何进行聚合?感谢你在这里的出色工作。在任何汇总之前,从一开始就将它们过滤掉:df=df[df['date'].dt.year.betweenyear1,year2]在最后一行中使用x>=x.mean,而不是x>x.mean。
+------------------------------+-------+---------------+-------------+
|                              |       | price_change  | price_label |
+------------------------------+-------+---------------+-------------+
| Region                       | date  |               |             |
+------------------------------+-------+---------------+-------------+
| Chicago, IL                  | 2012  | 0.082864      |           1 |
|                              | 2013  | 0.074208      |           1 |
|                              | 2014  | 0.063483      |           0 |
|                              | 2015  | 0.049580      |           0 |
| Chicago, IL - Albany Park    | 2012  | 0.074394      |           1 |
|                              | 2013  | 0.055192      |           0 |
|                              | 2014  | 0.056466      |           0 |
|                              | 2015  | 0.041228      |           0 |
| Chicago, IL - Andersonville  | 2012  | 0.066074      |           1 |
|                              | 2013  | 0.032249      |           0 |
|                              | 2014  | 0.030612      |           0 |
|                              | 2015  | 0.061222      |           1 |
| Chicago, IL metro area       | 2012  | 0.035153      |           0 |
|                              | 2013  | 0.040750      |           1 |
|                              | 2014  | 0.032648      |           0 |
|                              | 2015  | 0.038374      |           1 |
+------------------------------+-------+---------------+-------------+