【问题标题】:Modifying Code to work for Month and Week instead of Year修改代码以适用于月和周而不是年
【发布时间】:2015-07-14 16:40:15
【问题描述】:

我正在制作一年时间跨度的堆积条形图,其中 x 轴是公司名称,y 轴是调用次数,堆栈是月份。

我希望能够让这个情节运行一个月的时间跨度,其中堆栈是几天,以及一周的时间跨度,堆栈是几天。我在执行此操作时遇到了麻烦,因为我的代码已经在一年左右的时间跨度内构建。

我的输入原始输入是一个 csv 文件。我像这样拉两行:

CompanyName     recvd_dttm
Company1        6/5/2015 18:28:50 PM
Company2        6/5/2015 14:25:43 PM
Company3        9/10/2015 21:45:12 PM
Company4        6/5/2015 14:30:43 PM
Company5        6/5/2015 14:32:33 PM

然后我制作一个看起来像这样的数据表

pivot_table.head(3)
Out[12]: 
Month       1   2   3   4   5   6   7   8   9   10  11   12 
CompanyName                                                                     
Customer1   17  30  29  39  15  26  24  12  36  21  18   15  
Customer2   4   11  13  22  35  29  15  18  29  31  17   14
Customer3   11   8  25  24   7  15  20   0  21  12  12   17

到目前为止,我的代码是这样的。

首先我获取了一年的数据(对于这个问题,我会将其更改为一个月或一周)

# filter by countries with at least one medal and sort
df['recvd_dttm'] = pd.to_datetime(df['recvd_dttm'])

#Only retrieve data before now (ignore typos that are future dates)
mask = df['recvd_dttm'] <= datetime.datetime.now()
df = df.loc[mask]
# get first and last datetime for final week of data

range_max = df['recvd_dttm'].max()
range_min = range_max - pd.DateOffset(years=1)

# take slice with final week of data
df = df[(df['recvd_dttm'] >= range_min) & 
               (df['recvd_dttm'] <= range_max)]

然后我创建上面显示的数据透视表。

###########################################################
#Create Dataframe
###########################################################

df = df.set_index('recvd_dttm')
df.index = pd.to_datetime(df.index, format='%m/%d/%Y %H:%M')

result = df.groupby([lambda idx: idx.month, 'CompanyName']).agg(len).reset_index()
result.columns = ['Month', 'CompanyName', 'NumberCalls']
pivot_table = result.pivot(index='Month', columns='CompanyName', values='NumberCalls').fillna(0)
s = pivot_table.sum().sort(ascending=False,inplace=False)
pivot_table = pivot_table.ix[:,s.index[:30]]
pivot_table = pivot_table.transpose()
pivot_table = pivot_table.reset_index()
pivot_table['CompanyName'] = [str(x) for x in pivot_table['CompanyName']]
Companies = list(pivot_table['CompanyName'])
pivot_table = pivot_table.set_index('CompanyName')
pivot_table.to_csv('pivot_table.csv')

然后我使用数据透视表创建一个 OrderedDict 用于绘图

###########################################################
#Create OrderedDict for plotting
###########################################################


months = [pivot_table[(m)].astype(float).values for m in range(1, 13)]
names = ["Jan", "Feb", "Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov", "Dec"]
months_dict = OrderedDict(list(zip(names, months)))

###########################################################
#Plot!
###########################################################


palette = brewer["RdYlGn"][8]

hover = HoverTool(
    tooltips = [
        ("Month", "@months"),
        ("Number of Calls", "@NumberCalls"),
        ]
)
output_file("stacked_bar.html")
bar = Bar(months_dict, Companies, title="Number of Calls Each Month", palette = palette, legend = "top_right", width = 1200, height=900, stacked=True)
bar.add_tools(hover)


show(bar)

是否有人对如何修改此代码以使其可以在更短的时间内工作有任何想法?我认为它将在 OrderedDict 部分进行修改。可能让 len(recvd_dttm) 迭代?

【问题讨论】:

    标签: python datetime for-loop pandas date-range


    【解决方案1】:

    一个月中的几天(比如“2015-07”)你可以改变

    result = df.groupby([lambda idx: idx.month, 'CompanyName']).agg(len).reset_index()
    

    类似

    month = '2015-07'
    result = df.loc[month].groupby([lambda idx: idx.day, 'CompanyName']).agg(len).reset_index()
    

    并将'Month' 替换为下面的'Day'。在这种情况下,您不必担心 OrderedDict 等,因为它们只是整数。一个星期你可以做

    start, end = '2015-07-06', '2015-07-12'
    result = df.loc[start: end].groupby(
                [lambda idx: idx.dayofweek, 'CompanyName']).agg(len).reset_index()
    

    【讨论】:

    • 如果我不关心 OrderedDict,我在 bar 中放入的变量是什么?它是否知道特定月份要投入多少天或一天要投入多少小时?
    • 我不确定,因为我不知道 Bar 类的 API 是什么。我假设您使用了有序的字典,以便月份的名称按时间顺序而不是按字典顺序排序。你是从哪个模块导入的?这对我来说是新的,但看起来很有用。我的猜测是你会使用pivot_table 的索引,这将是一个月或一周中的几天,在某种程度上但不确定。我也从未见过HoverTool。
    • 它来自散景。这是我从画廊中提取的东西的代码。 bokeh.pydata.org/en/latest/docs/gallery/stacked_bar_chart.html
    猜你喜欢
    • 1970-01-01
    • 2014-12-31
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多