使用学习过的理论知识(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、合并上述特征。
时间: 2023-12-03 11:43:40 浏览: 197
1、将数据进行转置,转置后行为用户编号、列为日期、值为用户每日用电量。
```python
import pandas as pd
data = pd.read_csv('data.csv')
data_transposed = data.pivot(index='ID', columns='DATA_DATE', values='KWH')
```
2、对数据中的异常数据进行识别并处理。
我们可以通过绘制箱线图来识别异常数据,然后将异常数据替换成该列的中位数或均值。
```python
import numpy as np
import matplotlib.pyplot as plt
def handle_outliers(data):
"""
处理异常值
"""
for column in data.columns:
q1 = data[column].quantile(0.25)
q3 = data[column].quantile(0.75)
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
outliers = (data[column] < lower_bound) | (data[column] > upper_bound)
if outliers.any():
# 用中位数代替异常值
median = data[column].median()
data[column][outliers] = median
return data
# 绘制箱线图
plt.boxplot(data_transposed.values.T)
plt.show()
# 处理异常数据
data_transposed = handle_outliers(data_transposed)
```
3、统计每个用户用电数据的基本统计量,包括:最大值、最小值、均值、中位数、和、方差、偏度、峰度。
```python
statistics = pd.DataFrame(index=data_transposed.index, columns=['max', 'min', 'mean', 'median', 'sum', 'var', 'skew', 'kurtosis'])
for id in data_transposed.index:
user_data = data_transposed.loc[id]
statistics.loc[id] = [user_data.max(), user_data.min(), user_data.mean(), user_data.median(), user_data.sum(), user_data.var(), user_data.skew(), user_data.kurtosis()]
print(statistics)
```
4、每个用户用电数据按日差分,并求取差分结果的基本统计量,统计量同3。
```python
diff_data = data_transposed.diff(axis=1)
diff_statistics = pd.DataFrame(index=diff_data.index, columns=['max', 'min', 'mean', 'median', 'sum', 'var', 'skew', 'kurtosis'])
for id in diff_data.index:
user_data = diff_data.loc[id]
diff_statistics.loc[id] = [user_data.max(), user_data.min(), user_data.mean(), user_data.median(), user_data.sum(), user_data.var(), user_data.skew(), user_data.kurtosis()]
print(diff_statistics)
```
5、求取每个用户的5%分位数。
```python
quantile_05 = data_transposed.quantile(0.05)
print(quantile_05)
```
6、每个用户按周求和并差分(一周7天,年度分开),并求取差分结果的基本统计量,统计量同三。
```python
# 将日期转换为周次
data_transposed.index = pd.to_datetime(data_transposed.index)
week_data = data_transposed.resample('W').sum()
# 将每年的数据分开处理
week_data_by_year = {}
for year in week_data.index.year.unique():
year_mask = (week_data.index >= pd.Timestamp(year=year, month=1, day=1)) & (week_data.index < pd.Timestamp(year=year+1, month=1, day=1))
year_data = week_data.loc[year_mask]
year_diff_data = year_data.diff()
year_diff_statistics = pd.DataFrame(index=year_diff_data.index, columns=['max', 'min', 'mean', 'median', 'sum', 'var', 'skew', 'kurtosis'])
for date in year_diff_data.index:
user_data = year_diff_data.loc[date]
year_diff_statistics.loc[date] = [user_data.max(), user_data.min(), user_data.mean(), user_data.median(), user_data.sum(), user_data.var(), user_data.skew(), user_data.kurtosis()]
week_data_by_year[year] = year_diff_statistics
print(week_data_by_year)
```
7、统计每个用户的日用电量在其最大值0.9倍以上的次数。
```python
count_over_09 = pd.Series(index=data_transposed.index)
for id in data_transposed.index:
user_data = data_transposed.loc[id]
count_over_09[id] = (user_data > user_data.max() * 0.9).sum()
print(count_over_09)
```
8、求取每个用户日为最大值/最小值的索引月份,若最大值/最小值存在于多个月份中,则输出含有最大值/最小值最多的那个月份。如1号用户的最小值为0,则看哪个月的0最多。
```python
max_month = pd.Series(index=data_transposed.index)
min_month = pd.Series(index=data_transposed.index)
for id in data_transposed.index:
user_data = data_transposed.loc[id]
# 最大值
max_value = user_data.max()
max_months = user_data[user_data == max_value].index.month
max_month_count = max_months.value_counts()
max_month[id] = max_month_count.index[0]
# 最小值
min_value = user_data.min()
min_months = user_data[user_data == min_value].index.month
min_month_count = min_months.value_counts()
min_month[id] = min_month_count.index[0]
print(max_month)
print(min_month)
```
9、求取每个用户七八月电量和与三四月电量和的比值,最大值的比值,最小值的比值,均值(日均电量)的比值。
```python
summer_data = data_transposed.loc[:, (data_transposed.columns.month >= 7) & (data_transposed.columns.month <= 8)].sum(axis=1)
spring_data = data_transposed.loc[:, (data_transposed.columns.month >= 3) & (data_transposed.columns.month <= 4)].sum(axis=1)
summer_ratio = summer_data / spring_data
max_summer_ratio = summer_ratio.max()
min_summer_ratio = summer_ratio.min()
mean_summer_ratio = summer_ratio.mean()
print(summer_ratio)
print(max_summer_ratio)
print(min_summer_ratio)
print(mean_summer_ratio)
```
10、合并上述特征。
```python
feature = pd.concat([statistics, diff_statistics, count_over_09, max_month, min_month, summer_ratio], axis=1)
feature.columns = ['max', 'min', 'mean', 'median', 'sum', 'var', 'skew', 'kurtosis', 'diff_max', 'diff_min', 'diff_mean', 'diff_median', 'diff_sum', 'diff_var', 'diff_skew', 'diff_kurtosis', 'count_over_09', 'max_month', 'min_month', 'summer_ratio']
print(feature)
```
最终得到的 feature 数据框包含了每个用户的所有特征。
阅读全文