Pandas图-以年为y轴、月为x轴绘制劳工统计局

xhv8bpkk  于 2023-02-28  发布在  其他
关注(0)|答案(2)|浏览(123)

我正在研究劳工统计局的通货膨胀统计数据,它们是这样呈现的:

我想做一个非常简单的折线图(可能会使用altair,但这与问题不完全相关)。
在Pandas中,重新构造DataFrame以准备时间序列可视化的最有效/最惯用的方法是什么?
注:这基本上是这个问题的逆问题:https://stackoverflow.com/questions/48211424/how-to-make-a-years-on-y-axis-and-months-on-x-axis-plot-with-pandas

blmhpbnm

blmhpbnm1#

对于这样的表,我称之为bls_df

Year      Jan      Feb      Mar  ...      Nov      Dec    HALF1    HALF2
0   2013  230.280  232.166  232.773  ...  233.069  233.049  232.366  233.548
1   2014  233.916  234.781  236.293  ...  236.151  234.812  236.384  237.088
2   2015  233.707  234.722  236.119  ...  237.336  236.525  236.265  237.769
3   2016  236.916  237.111  238.132  ...  241.353  241.432  238.778  241.237
4   2017  242.839  243.603  243.801  ...  246.669  246.524  244.076  246.163
5   2018  247.867  248.991  249.554  ...  252.038  251.233  250.089  252.125
6   2019  251.712  252.776  254.202  ...  257.208  256.974  254.412  256.903
7   2020  257.971  258.678  258.115  ...  260.229  260.474  257.557  260.065
8   2021  261.582  263.014  264.877  ...  277.948  278.802  266.236  275.703
9   2022  281.148  283.716  287.504  ...  297.711  296.797  288.347  296.963
10  2023  299.170      NaN      NaN  ...      NaN      NaN      NaN      NaN

[11 rows x 15 columns]

通过设置索引然后取消堆叠来重新成形。

nbls = bls_df.set_index('Year').unstack().reset_index().rename(columns={'level_0': 'month'})
nbls = nbls[nbls['month'].isin(list(calendar.month_abbr))]  # subset to real months

通过以可解析格式连接月份和年份列来生成日期:

>>> nbls['date'] = pd.to_datetime(nbls['month'] + '-' + nbls['Year'].astype(str))
>>> nbls.sort_values('date')  # nb does not act in-place
    month  Year        0       date
0     Jan  2013  230.280 2013-01-01
11    Feb  2013  232.166 2013-02-01
22    Mar  2013  232.773 2013-03-01
33    Apr  2013  232.531 2013-04-01
44    May  2013  232.945 2013-05-01
..    ...   ...      ...        ...
87    Aug  2023      NaN 2023-08-01
98    Sep  2023      NaN 2023-09-01
109   Oct  2023      NaN 2023-10-01
120   Nov  2023      NaN 2023-11-01
131   Dec  2023      NaN 2023-12-01

[132 rows x 4 columns]

我也希望您知道BLS已经以长格式存储了数据,您可以直接使用pd.read_csv(THE_URL, sep='\s+')读取它,其中THE_URL是以下链接:https://download.bls.gov/pub/time.series/cu/cu.data.0.Current。您仍然需要做一些工作来生成datetime列,并根据BLS分配的系列代码进行过滤,但这并不太困难。

jogvjijk

jogvjijk2#

可能有一种更优雅的方法来实现这一点,但是您可以循环遍历所有month列,并将其与year列中的所有值组合以获得year-month,然后将这些值和year-months一起存储在pd.Series中。
例如,我们可以创建一个与您的 Dataframe 类似的 Dataframe :

from datetime import datetime
import numpy as np
import pandas as pd

## recreate a dataframe with a similar structure
np.random.seed(42)
data = np.random.randint(low=1, high=10, size=(4, 13))

month_cols = [datetime.strptime(str(i), "%m").strftime("%b") for i in range(1,13)]
years = [1960.0,1961.0,1962.0,1963.0]
df = pd.DataFrame(
    data,
    columns= ['Date'] + month_cols
)
df['Date'] = years
>>> df
     Date  Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
0  1960.0    4    8    5    7    3    7    8    5    4    8    8    3
1  1961.0    5    2    8    6    2    5    1    6    9    1    3    7
2  1962.0    9    3    5    3    7    5    9    7    2    4    9    2
3  1963.0    5    2    4    7    8    3    1    4    2    8    4    2

把它变成一个时间序列:
一个二个一个一个

相关问题