Python Pandas-每个客户在TimeSeriesIndexedData上的计算统计信息

时间:2019-02-08 15:36:31

标签: python pandas dataframe aggregation

    UsageDate               CustID1  CustID2   .... CustIDn
0   2018-01-01 00:00:00     1.095
1   2018-01-01 01:00:00     1.129
2   2018-01-01 02:00:00     1.165
3   2018-01-01 04:00:00     1.697
. 
.
m   2018-31-01 23:00:00     1.835                     (m,n)

数据帧(df)具有m行和n列。 m是每小时的时间序列索引,从月的第一小时到月的最后一小时开始。 这些专栏的客户将近100,000。 数据帧的每个单元格中的值是能耗值。

对于每个客户,我需要计算: 1)每小时平均使用率-因此基本上是每月一个月的第一小时,一个月的第二天的平均时间等。

2)总结每个客户的使用情况

3)前3个使用小时-对于客户x,它可以是“ 2018-01-01 01:00:00”, “ 2018-11-01 05:00:00”“ 2018-21-01 17:00:00”

4)下3个使用小时-与上述类似

5)当月每个客户的使用方式

我的主要问题是如何为每个客户以及一天中的某个小时或一天中的某一天汇总数据。

为了总结每个客户的使用情况,我尝试: df_temp = pd.DataFrame(columns=["TotalUsage"])

for col in df.columns:

`df_temp[col,"TotalUsage"] = df[col].apply.sum()`

但是,我尝试过的这个版本和很多版本都无法帮助我解决问题。

请帮助我提供一种方法以及如何考虑此类问题。

此外,由于数据帧很大,因此如果我们可以讨论计算复杂性以及如何减少计算时间,将很有帮助。

2 个答案:

答案 0 :(得分:0)

这看起来像是pandas.groupby的工作。

(我没有测试代码,因为我没有一个很好的示例数据集可用于工作。如果有错误,请告诉我。)

对于某些要求,您需要添加带有小时的列:

 df['hour']=df['UsageDate'].dt.hour

1)以小时为单位。

 mean_by_hour=df.groupby('hour').mean()

2)用户汇总。

 sum_by_uers=df.sum()

3)客户的最高使用率。下3个使用小时-与上面类似的解释-我不太了解您想要的输出,您可能在这个问题中问了太多不同的问题。如果您想要小时而不是值,我想您可能必须遍历各列。添加示例可能会有所帮助。

4)相同的评论。

5)由客户表示。

mean_by_cust = df.mean()

答案 1 :(得分:0)

我不确定这是否是您要查找的所有信息,但是它将为您指明正确的方向:

import pandas as pd
import numpy as np

# sample data for 3 days
np.random.seed(1)
data = pd.DataFrame(pd.date_range('2018-01-01', periods= 72, freq='H'), columns=['UsageDate'])
data2  = pd.DataFrame(np.random.rand(72,5), columns=[f'ID_{i}' for i in range(5)])
df = data.join([data2])
# print('Sample Data:')
# print(df.head())
# print()

# mean of every month and hour per year
# groupby year month hour then find the mean of every hour in a given year and month
mean_data = df.groupby([df['UsageDate'].dt.year, df['UsageDate'].dt.month, df['UsageDate'].dt.hour]).mean()
mean_data.index.names = ['UsageDate_year', 'UsageDate_month', 'UsageDate_hour']
# print('Mean Data:')
# print(mean_data.head())
# print()

# use set_index with max and head
top_3_Usage_hours = df.set_index('UsageDate').max(1).sort_values(ascending=False).head(3)
# print('Top 3:')
# print(top_3_Usage_hours)
# print()

# use set_index with min and tail
bottom_3_Usage_hours = df.set_index('UsageDate').min(1).sort_values(ascending=False).tail(3)
# print('Bottom 3:')
# print(bottom_3_Usage_hours)

退出:

Sample Data:
            UsageDate      ID_0      ID_1      ID_2      ID_3      ID_4
0 2018-01-01 00:00:00  0.417022  0.720324  0.000114  0.302333  0.146756
1 2018-01-01 01:00:00  0.092339  0.186260  0.345561  0.396767  0.538817
2 2018-01-01 02:00:00  0.419195  0.685220  0.204452  0.878117  0.027388
3 2018-01-01 03:00:00  0.670468  0.417305  0.558690  0.140387  0.198101
4 2018-01-01 04:00:00  0.800745  0.968262  0.313424  0.692323  0.876389

Mean Data:
                                                   ID_0      ID_1      ID_2  \
UsageDate_year UsageDate_month UsageDate_hour                                 
2018           1               0               0.250716  0.546475  0.202093   
                               1               0.414400  0.264330  0.535928   
                               2               0.335119  0.877191  0.380688   
                               3               0.577429  0.599707  0.524876   
                               4               0.702336  0.654344  0.376141   

                                                   ID_3      ID_4  
UsageDate_year UsageDate_month UsageDate_hour                      
2018           1               0               0.244185  0.598238  
                               1               0.400003  0.578867  
                               2               0.623516  0.477579  
                               3               0.429835  0.510685  
                               4               0.503908  0.595140  

Top 3:
UsageDate
2018-01-01 21:00:00    0.997323
2018-01-03 23:00:00    0.990472
2018-01-01 08:00:00    0.988861
dtype: float64

Bottom 3:
UsageDate
2018-01-01 19:00:00    0.002870
2018-01-03 02:00:00    0.000402
2018-01-01 00:00:00    0.000114
dtype: float64

对于前3名和后3名,如果要查找各行之间的最小和,则:

df.set_index('UsageDate').sum(1).sort_values(ascending=False).tail(3)