【发布时间】:2021-04-20 06:19:57
【问题描述】:
一段时间以来,我一直在测量我公寓的空气质量,因为我注意到楼下公寓有二手烟 (...)。我正在使用安装在连接到 Raspberry 的 enviro+ 上的 PMS5003 传感器。直到最近,我只测量了小颗粒,但我最近设法添加了气体测量。我很想看看不同值之间是否存在相关性。我的假设是空气中的 CO 和 nh3 浓度会很高(因此传感器读取的值很低,参见@987654321 @),当有烟雾进入公寓时,这将与燃烧产生的高 PM 2.5 值相结合。
数据以 csv 文件的形式出现,如下所示:
pm2_5_combustion;2021-01-09 20:14:00;166.24242424242425
然后解析为:
air_quality = pd.read_csv("processed/pms5003_gas.csv", sep=";")
air_quality.info()
air_quality["unit"].unique()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 92208 entries, 0 to 92207 Data columns (total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 unit 92208 non-null object
1 time 92208 non-null object
2 reading 86445 non-null float64
dtypes: float64(1), object(2)
memory usage: 2.1+ MB
array(['adc', 'gt_0_3um', 'gt_0_5um', 'gt_10um', 'gt_1um', 'gt_2_5um',
'gt_5um', 'nh3', 'oxidising', 'pm10_atmos', 'pm10_dust',
'pm1_atmos', 'pm1_ultrafine', 'pm2_5_atmos', 'pm2_5_combustion',
'reducing'], dtype=object)
以下是我一直试图用来实现目标的一些代码。
import datetime as dt
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
air_quality = pd.read_csv("processed/pms5003_gas.csv", sep=";")
air_quality.info()
air_quality["unit"].unique()
air_quality["time"] = pd.to_datetime(air_quality["time"]) #did not work
air_quality = air_quality.rename(columns={"time": "datetime"}) #renaming the column did not change much
# C. picking the values I would like to see the correlation between the following values
datetime = air_quality[air_quality["datetime"] == "datetime"]
pm2_5 = air_quality[air_quality["unit"] == "pm2_5_combustion"]
pm10 = air_quality[air_quality["unit"] == "pm10_dust"]
ox = air_quality[air_quality["unit"] == "oxidising"]
red = air_quality[air_quality["unit"] == "reducing"]
nh3 = air_quality[air_quality["unit"] == "nh3"]
# D. Trying with the below, did not work:
air_quality["weekday"] = air_quality["time"].dt.weekday
air_quality["date"] = air_quality["time"].dt.date
air_quality["hm"] = air_quality["time"].dt.hour
air_quality["hour"] = air_quality["time"].dt.hour
air_quality["datetime"] = pd.to_datetime(air_quality["datetime"])
air_quality["date"] = air_quality["datetime"].dt.date
air_quality["hour"] = air_quality["datetime"].dt.hour
air_quality["min"] = air_quality["datetime"].dt.minute
# A. Making a pivot and then picking the columns I would like to see the correlation
df = air_quality.pivot(index="datetime", columns="unit", values="reading")
df2 = df[["pm2_5_combustion", "pm10_dust", "reducing", "nh3", "oxidising"]]
# B. I also tried to concatenate the columns like that (did not work either):
frames = [datetime, pm2_5, pm10, ox, red, nh3]
result = pd.concat(frames)
# I can calculate the correlation without problem
df2.corr(method='pearson')
# I can also create some correlation graphs with sns.pairplot
sns.pairplot(
df2,
#hue="hour",
#plot_kws=dict(marker="+", linewidth=1),
#diag_kws=dict(fill=False)
)
我正在努力解决的问题是让“hue”参数起作用。有了上面的 C 和 D,我得到了这张表:
没关系,但是在我使用 .pivot 函数 (?) 之后,我无法获得日期、小时和最小值,我认为这是阻止我做到这一点的原因: seaborn pairplot explanation 我整个昨天都在尝试并阅读 pandas 文档,但我不知道接下来应该尝试什么,因此我在这里提出问题,而不是把我的笔记本电脑扔到我吸烟的邻居的脸上。
【问题讨论】:
-
谢谢。我以前这样做并得到了相关结果。一位数学家朋友建议我将不同的变量绘制在一起,看看相关性是否显着。我为此使用了
pairplot。但是,我假设它们是在传感器周围流动的不同气体,并且由于夜间暴露于香烟烟雾的情况更多,我正在考虑找到一种方法来显示不同测量的时间属性。因此,使用hue=hour,我希望按小时区分不同的点,但我无法在df2Dataframe (?) 中获取日期、小时、分钟列。
标签: python pandas datetime pivot seaborn