【问题标题】:Show more time details in a correlation pairplot graph based on time series data在基于时间序列数据的相关对图中显示更多时间细节
【发布时间】: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,我希望按小时区分不同的点,但我无法在df2 Dataframe (?) 中获取日期、小时、分钟列。

标签: python pandas datetime pivot seaborn


【解决方案1】:

这可能不是最简洁直接的答案,但它确实有效。我想,有一种更好的方法可以以某种方式重置索引,而无需执行我所做的以下步骤。如果是这样,我仍然有兴趣了解它。我将它导出到一个csv(to_csv('')并再次打开它read_csv(''),然后用to_datetime()修改了日期信息的类型。

df2.to_csv('clean.csv')
no_5 = pd.read_csv("clean.csv")
no_5["datetime"] = pd.to_datetime(no_5["datetime"])
no_5["date"] = no_5["datetime"].dt.date #probably not necessary
no_5["hour"] = no_5["datetime"].dt.hour
no_5["min"] = no_5["datetime"].dt.minute

可能没有必要,但我在使用.groupby(),然后使用.unstack() 之后,将其导出为csv 中的每分钟值

no_5
del no_5["date"]
del no_5["min"]

然后是pairplot的魔力:

sns.pairplot(no_5, hue='hour', corner="True", plot_kws=dict(marker="+", linewidth=1))

铌。它看起来有点乱,在这个阶段也不是很能说明问题,但它显示出高浓度的小颗粒,对“还原”和“nh3”的抵抗力较低,这意味着在后期这些气体的浓度更高一天,人们通常在家。

当然,正如Trenton McKinney 所指出的,.corr 方法会给你不同的相关值。

no_5.corr(method='pearson') #or other available methods

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多