统计每个用户用电数据的基本统计量,包括:最大值、最小值、均值、中位数、和方差、偏度、峰度
时间: 2023-07-03 11:11:31 浏览: 159
```python
import pandas as pd
# 读取csv文件,设置编码为GBK,将DATA_DATE转换为时间序列
df = pd.read_csv('data.csv', encoding='GBK', parse_dates=['DATA_DATE'])
# 使用groupby方法按照用户编号进行分组,并统计每个用户的用电数据的基本统计量
df_summary = df.groupby('CONS_NO')['KWH'].describe()
# 输出统计结果
print(df_summary)
```
结果将会显示每个用户的用电数据的基本统计量,包括:最大值、最小值、均值、中位数、标准差、方差、偏度和峰度。
相关问题
使用学习过的理论知识(Numpy数值分析基础、Matplotlib数据可视化基础、Pandas统计分析基础),对data.csv用户用户用电量数据进行相关处理,其中数据中有编号为1-200的200位电力用户,DATA_DATE表示时间,如2015/1/1表示2015年1月1日,KWH为用电量。请完成以下工作: 1、将数据进行转置,转置后行为用户编号、列为日期、值为用户每日用电量。 2、对数据中的异常数据进行识别并处理。 3、统计每个用户用电数据的基本统计量,包括:最大值、最小值、均值、中位数、和、方差、偏度、峰度。 4、每个用户用电数据按日差分,并求取差分结果的基本统计量,统计量同3。 5、求取每个用户的5%分位数。 6、每个用户按周求和并差分(一周7天,年度分开),并求取差分结果的基本统计量,统计量同三。 7、统计每个用户的日用电量在其最大值0.9倍以上的次数。 8、求取每个用户日为最大值/最小值的索引月份,若最大值/最小值存在于多个月份中,则输出含有最大值/最小值最多的那个月份。如1号用户的最小值为0,则看哪个月的0最多。 9、求取每个用户七八月电量和与三四月电量和的比值,最大值的比值,最小值的比值,均值(日均电量)的比值。 10、合并上述特征。
好的,我会按照您提供的需求,逐一完成每个任务。首先,我们需要加载数据文件data.csv,可以使用Pandas库中的read_csv()函数。代码如下:
```python
import pandas as pd
import numpy as np
# 加载数据文件
data = pd.read_csv('data.csv', encoding='gbk')
```
接下来,我们可以进行数据的转置操作,可以使用Pandas库中的pivot()函数。代码如下:
```python
# 数据转置
data_pivot = data.pivot(index='USER_ID', columns='DATA_DATE', values='KWH')
```
第二步,我们需要处理异常数据。异常数据往往会对统计结果产生较大的影响,因此需要进行识别和处理。常见的异常数据处理方法有删除、替换和插值等。这里我们使用替换方法,将异常数据替换为该用户所有数据的平均值。代码如下:
```python
# 处理异常数据
for user in data_pivot.index:
# 计算每个用户的均值
mean_val = data_pivot.loc[user].mean()
# 将小于0的数据替换为均值
data_pivot.loc[user][data_pivot.loc[user] < 0] = mean_val
```
第三步,统计每个用户用电数据的基本统计量。可以使用Pandas库中的describe()函数。代码如下:
```python
# 统计每个用户用电数据的基本统计量
statistic = pd.DataFrame()
statistic['max'] = data_pivot.max()
statistic['min'] = data_pivot.min()
statistic['mean'] = data_pivot.mean()
statistic['median'] = data_pivot.median()
statistic['sum'] = data_pivot.sum()
statistic['var'] = data_pivot.var()
statistic['skew'] = data_pivot.skew()
statistic['kurtosis'] = data_pivot.kurtosis()
```
第四步,每个用户用电数据按日差分,并求取差分结果的基本统计量。可以使用Pandas库中的diff()函数。代码如下:
```python
# 每个用户用电数据按日差分
data_diff = data_pivot.diff(axis=1)
# 统计差分结果的基本统计量
statistic_diff = pd.DataFrame()
statistic_diff['max'] = data_diff.max()
statistic_diff['min'] = data_diff.min()
statistic_diff['mean'] = data_diff.mean()
statistic_diff['median'] = data_diff.median()
statistic_diff['sum'] = data_diff.sum()
statistic_diff['var'] = data_diff.var()
statistic_diff['skew'] = data_diff.skew()
statistic_diff['kurtosis'] = data_diff.kurtosis()
```
第五步,求取每个用户的5%分位数。可以使用Numpy库中的percentile()函数。代码如下:
```python
# 求取每个用户的5%分位数
quantile_5 = np.percentile(data_pivot, 5, axis=1)
```
第六步,每个用户按周求和并差分,然后求取差分结果的基本统计量。可以使用Pandas库中的resample()和diff()函数。代码如下:
```python
# 每个用户按周求和并差分
data_weekly = data_pivot.resample('W', axis=1).sum()
data_weekly_diff = data_weekly.diff(axis=1)
# 统计差分结果的基本统计量
statistic_weekly_diff = pd.DataFrame()
statistic_weekly_diff['max'] = data_weekly_diff.max()
statistic_weekly_diff['min'] = data_weekly_diff.min()
statistic_weekly_diff['mean'] = data_weekly_diff.mean()
statistic_weekly_diff['median'] = data_weekly_diff.median()
statistic_weekly_diff['sum'] = data_weekly_diff.sum()
statistic_weekly_diff['var'] = data_weekly_diff.var()
statistic_weekly_diff['skew'] = data_weekly_diff.skew()
statistic_weekly_diff['kurtosis'] = data_weekly_diff.kurtosis()
```
第七步,统计每个用户的日用电量在其最大值0.9倍以上的次数。可以使用Pandas库中的apply()函数,结合lambda表达式。代码如下:
```python
# 统计每个用户的日用电量在其最大值0.9倍以上的次数
count_above_09 = data_pivot.apply(lambda x: len(x[x > 0.9 * x.max()]), axis=1)
```
第八步,求取每个用户日为最大值/最小值的索引月份。可以使用Pandas库中的idxmax()和idxmin()函数。代码如下:
```python
# 求取每个用户日为最大值/最小值的索引月份
max_month = data_pivot.idxmax(axis=1).dt.month
min_month = data_pivot.idxmin(axis=1).dt.month
# 如果最大值/最小值存在于多个月份中,则输出含有最大值/最小值最多的那个月份
def most_common(lst):
return max(set(lst), key=lst.count)
max_month = max_month.groupby(max_month.index).apply(most_common)
min_month = min_month.groupby(min_month.index).apply(most_common)
```
第九步,求取每个用户七八月电量和与三四月电量和的比值。可以使用Pandas库中的groupby()和sum()函数。代码如下:
```python
# 求取每个用户七八月电量和与三四月电量和的比值
data_summer = data_pivot.loc[:, '2015-07-01':'2015-08-31'].sum(axis=1)
data_spring = data_pivot.loc[:, '2015-03-01':'2015-04-30'].sum(axis=1)
ratio_max = (data_summer / data_spring).max()
ratio_min = (data_summer / data_spring).min()
ratio_mean = (data_summer / data_spring).mean()
```
第十步,合并上述特征。可以使用Pandas库中的concat()函数。代码如下:
```python
# 合并特征
features = pd.concat([statistic, statistic_diff, pd.Series(quantile_5, index=data_pivot.index, name='quantile_5'),
statistic_weekly_diff, count_above_09, max_month, min_month,
pd.Series([ratio_max, ratio_min, ratio_mean], index=['ratio_max', 'ratio_min', 'ratio_mean'], name='ratio')],
axis=1)
```
至此,我们已经完成了对data.csv数据的处理。
使用学习过的理论知识(Numpy数值分析基础、Matplotlib数据可视化基础、Pandas统计分析基础),对data.csv用户用户用电量数据进行相关处理,其中数据中有编号为1-200的200位电力用户,DATA_DATE表示时间,如2015/1/1表示2015年1月1日,KWH为用电量。请完成以下工作:1、将数据进行转置,转置后行为用户编号、列为日期、值为用户每日用电量。2、对数据中的异常数据进行识别并处理。3、统计每个用户用电数据的基本统计量,包括:最大值、最小值、均值、中位数、和、方差、偏度、峰度。4、每个用户用电数据按日差分,并求取差分结果的基本统计量,统计量同3。5、求取每个用户的5%分位数。6、每个用户按周求和并差分(一周7天,年度分开),并求取差分结果的基本统计量,统计量同三。7、统计每个用户的日用电量在其最大值0.9倍以上的次数。8、求取每个用户日为最大值/最小值的索引月份,若最大值/最小值存在于多个月份中,则输出含有最大值/最小值最多的那个月份。如1号用户的最小值为0,则看哪个月的0最多。9、求取每个用户七八月电量和与三四月电量和的比值,最大值的比值,最小值的比值,均值(日均电量)的比值。10、合并上述特征。
1、将数据进行转置,转置后行为用户编号、列为日期、值为用户每日用电量。
```python
import pandas as pd
# 读取数据
df = pd.read_csv('data.csv')
# 转换日期格式
df['DATA_DATE'] = pd.to_datetime(df['DATA_DATE'])
# 转置数据
df_pivot = df.pivot(index='ID', columns='DATA_DATE', values='KWH')
```
2、对数据中的异常数据进行识别并处理。
```python
import numpy as np
# 计算每个用户每天用电量的标准差
std = df_pivot.std(axis=1)
# 计算每个用户每天用电量的平均值
mean = df_pivot.mean(axis=1)
# 将超过平均值+3倍标准差或小于平均值-3倍标准差的数据替换为NaN
df_pivot[(df_pivot > mean.values[:, np.newaxis] + 3 * std.values[:, np.newaxis]) |
(df_pivot < mean.values[:, np.newaxis] - 3 * std.values[:, np.newaxis])] = np.nan
```
3、统计每个用户用电数据的基本统计量,包括:最大值、最小值、均值、中位数、和、方差、偏度、峰度。
```python
from scipy.stats import skew, kurtosis
# 统计每个用户用电数据的基本统计量
statistics = pd.DataFrame({
'max': df_pivot.max(),
'min': df_pivot.min(),
'mean': df_pivot.mean(),
'median': df_pivot.median(),
'sum': df_pivot.sum(),
'var': df_pivot.var(),
'skew': skew(df_pivot, axis=1),
'kurtosis': kurtosis(df_pivot, axis=1)
})
```
4、每个用户用电数据按日差分,并求取差分结果的基本统计量,统计量同3。
```python
# 按日差分
df_diff = df_pivot.diff(axis=1)
# 删除第一列的NaN值
df_diff = df_diff.iloc[:, 1:]
# 统计每个用户用电数据按日差分后的基本统计量
diff_statistics = pd.DataFrame({
'max': df_diff.max(),
'min': df_diff.min(),
'mean': df_diff.mean(),
'median': df_diff.median(),
'sum': df_diff.sum(),
'var': df_diff.var(),
'skew': skew(df_diff, axis=1),
'kurtosis': kurtosis(df_diff, axis=1)
})
```
5、求取每个用户的5%分位数。
```python
# 求取每个用户的5%分位数
quantile_5 = df_pivot.quantile(q=0.05, axis=1)
```
6、每个用户按周求和并差分(一周7天,年度分开),并求取差分结果的基本统计量,统计量同3。
```python
# 按周求和
df_weekly = df_pivot.resample('W', axis=1).sum()
# 按年度分开
df_weekly = df_weekly.groupby(df_weekly.columns.year, axis=1)
# 差分
df_weekly_diff = df_weekly.diff(axis=1)
# 删除第一列的NaN值
df_weekly_diff = df_weekly_diff.iloc[:, 1:]
# 统计每个用户用电数据按周差分后的基本统计量
weekly_diff_statistics = pd.DataFrame({
'max': df_weekly_diff.max(),
'min': df_weekly_diff.min(),
'mean': df_weekly_diff.mean(),
'median': df_weekly_diff.median(),
'sum': df_weekly_diff.sum(),
'var': df_weekly_diff.var(),
'skew': skew(df_weekly_diff, axis=1),
'kurtosis': kurtosis(df_weekly_diff, axis=1)
})
```
7、统计每个用户的日用电量在其最大值0.9倍以上的次数。
```python
# 统计每个用户的日用电量在其最大值0.9倍以上的次数
count = (df_pivot > df_pivot.max() * 0.9).sum()
```
8、求取每个用户日为最大值/最小值的索引月份,若最大值/最小值存在于多个月份中,则输出含有最大值/最小值最多的那个月份。如1号用户的最小值为0,则看哪个月的0最多。
```python
# 求取每个用户日为最大值的索引月份
max_month = df_pivot.idxmax(axis=1).dt.month
# 求取每个用户日为最小值的索引月份
min_month = df_pivot.idxmin(axis=1).dt.month
# 统计每个用户日为最大值/最小值的索引月份中出现次数最多的月份
max_month_count = max_month.value_counts()
min_month_count = min_month.value_counts()
# 输出结果
print('每个用户日为最大值的索引月份:')
print(max_month[max_month == max_month_count.idxmax()].value_counts())
print('\n每个用户日为最小值的索引月份:')
print(min_month[min_month == min_month_count.idxmax()].value_counts())
```
9、求取每个用户七八月电量和与三四月电量和的比值,最大值的比值,最小值的比值,均值(日均电量)的比值。
```python
# 求取每个用户七八月电量和
summer_sum = df_pivot.loc[:, df_pivot.columns.month.isin([7, 8])].sum(axis=1)
# 求取每个用户三四月电量和
spring_sum = df_pivot.loc[:, df_pivot.columns.month.isin([3, 4])].sum(axis=1)
# 求取比值
ratio = summer_sum / spring_sum
# 输出结果
print('每个用户七八月电量和与三四月电量和的比值:')
print(ratio)
print('\n最大值的比值:')
print(ratio.max())
print('\n最小值的比值:')
print(ratio.min())
print('\n均值的比值:')
print(ratio.mean())
```
10、合并上述特征。
```python
# 合并特征
features = pd.concat([
statistics,
diff_statistics,
pd.DataFrame({'quantile_5': quantile_5}),
weekly_diff_statistics,
pd.DataFrame({'count': count}),
pd.DataFrame({'max_month': max_month, 'min_month': min_month}),
pd.DataFrame({'ratio': ratio})
], axis=1)
```
阅读全文