在Pandas中绘制时间序列数据,以及不同邮政编码的中位房价

时间:2017-01-04 07:48:37

标签: python pandas matplotlib

我从本地地铁列表中下载了数据,我想分析该地区的不同市场趋势。我有工具来分析metro-list网站上的趋势,但我想更熟悉使用Pandas和matplotlib进行绘图。

目前,这就是我所拥有的。

train_20901 = pd.read_csv('C:/Users/Damanjit/Documents/marketTrends/data/area20901.csv')
train_20901.head()
#small snippet of the full data, to see full data see images. 
     Address - Zip Code     Listing Date      Listing Price
0    95242                  10/15/2012        15000 
1    95240                  2/14/2011         67900 
2    95240                  12/18/2008        31900 
3    95240                  8/24/2011         22000 
4    95240                  7/15/2012         25000

#Need to create Days on Market for training data
train_20901['Listing Date'] = pd.to_datetime(train_20901['Listing Date'])
train_20901['Pending Date'] = pd.to_datetime(train_20901['Pending Date'])
train_20901['Selling Date'] = pd.to_datetime(train_20901['Selling Date'])

train_20901['Days on Market'] = train_20901['Pending Date'] - train_20901['Listing Date']
train_20901['Days on Market'] = (train_20901['Days on Market'] / np.timedelta64(1, 'D')).astype(int)

train_20901.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6185 entries, 0 to 6184
Data columns (total 9 columns):
Address               6185 non-null object
Address - Zip Code    6185 non-null int64
Listing Date          6185 non-null datetime64[ns]
Listing Price         6185 non-null int64
Pending Date          6185 non-null datetime64[ns]
Price Per Sq Ft       6185 non-null float64
Selling Date          6185 non-null datetime64[ns]
Selling Price         6185 non-null int64
Days on Market        6185 non-null int32
dtypes: datetime64[ns](3), float64(1), int32(1), int64(3), object(1)
memory usage: 410.8+ KB

train_20901.groupby(train_20901['Address - Zip Code']).median()

Address - Zip Code  Listing Price   Price Per Sq Ft Selling Price   Days on Market              
95240               169900          122.820          168000         35.0
95242               267750          150.945          265000         35.5
95258               265000          148.620          258050         41.0

打开数据并准备

enter image description here

按邮政编码分组数据

enter image description here

我希望能够做的是使用上市日期来描绘上市价格的中位数随时间的变化情况。日期从2008年10月22日开始到2016年12月29日结束。我想收集日期,以便只显示日期和年份。例如,我想绘制12/09中三个不同邮政编码95242,95240和95258的上市价格中位数。因此,在12/09的时间段内,应该有三个不同的点。我希望在10月8日到12月16日期间的所有不同时段都这样做。图表总共应该有99个箱子。我感到困惑的是如何在DataFrame中构建我的数据以完成此任务并绘制它。我已经尝试过pandas.resample和pandas.pivot,但没有让它发挥作用。正确方向的任何小提示都将非常受欢迎。

我猜我的桌子应该在最后看起来像是:

Listing Date    Zip Code     Median Home Prices
10/08           95240        168000
10/08           95242        216500
10/08           95258        210000
11/08           95240        171400
11/08           95242        219000
11/08           95258        212100

...依此类推,每个邮政编码在特定时间段内都有自己的中位数价格。我可以使用字典为每个月和每年硬编码,并找到某种邮政编码的中位房价,但我觉得大熊猫应该有更简单的方法来处理大数据集。

修改

------------------------------------------------------------------------------

因此,当我使用resample时,我会为时间序列数据创建二进制文件,但我想单独获取不同的邮政编码。我重拍时有这个

train_20901.resample('M', on = 'Selling Date').median()




Selling Date    Zip Code    Days on Market  Listing Price   Price Per Sq Ft Selling Price               
2008-10-31        95240         21.0           160500         122.575        150000
2008-11-30        95240         36.0           179400         136.710        180000
2008-12-31        95240         32.0           165400         126.665        165025
2009-01-31        95240         37.5           165200         122.075        165000
2009-02-28        95240         52.0           174700         116.925        172500
2009-03-31        95240         48.5           129900         99.300         124950
2009-04-30        95240         35.5           164950         114.900        163250
2009-05-31        95240         21.0           159000         122.860        165000
2009-06-30        95240         36.0           134900         110.470        126000
2009-07-31        95240         14.0           174900         121.800        177500

我是否使用groupby函数,但如果是这样,我如何将索引保留为时间序列,但获取不同的邮政编码,而不是中位数?

解决

通过这样做我弄清楚了。

resampled = train_20901.set_index('Selling Date').groupby('Address - Zip Code').resample('M').median()

这正是我想要的,现在我只需绘制。

1 个答案:

答案 0 :(得分:0)

如上所示,这是通过以下方式解决的:

resampled = train_20901.set_index('Selling Date').groupby('Address - Zip Code').resample('M').median()