Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python/Pandas匹配样本对数据_Python_Pandas_Match_Time Series_Multi Index - Fatal编程技术网

使用Python/Pandas匹配样本对数据

使用Python/Pandas匹配样本对数据,python,pandas,match,time-series,multi-index,Python,Pandas,Match,Time Series,Multi Index,虽然这听起来像是一个统计问题,但请耐心听我说 我从不同采样点采集的水样中得到了几种钙浓度。在一些监测站每月、每年或每隔一年对水进行重新取样 我想使用Wilcoxon-Pratt符号秩检验来测量各组站点钙浓度的年度和十年变化,正如Lindsey和Rupert()所做的那样。为了进行测试,我想创建以一年(365天的时间增量)或尽可能接近该时间范围的数据对。成对的测量应该有相同的月份,只是不同的年份。我每个站每月只需要一双。我不希望对共享同一站点、月份和年份的样本的平均样本浓度进行分析 以下是我的数据

虽然这听起来像是一个统计问题,但请耐心听我说

我从不同采样点采集的水样中得到了几种钙浓度。在一些监测站每月、每年或每隔一年对水进行重新取样

我想使用Wilcoxon-Pratt符号秩检验来测量各组站点钙浓度的年度和十年变化,正如Lindsey和Rupert()所做的那样。为了进行测试,我想创建以一年(365天的时间增量)或尽可能接近该时间范围的数据对。成对的测量应该有相同的月份,只是不同的年份。我每个站每月只需要一双。我不希望对共享同一站点、月份和年份的样本的平均样本浓度进行分析

以下是我的数据示例:

我想生成一个熊猫数据帧,它看起来像这样:

SampleLocation   SampleDate1     CaConc1    SampleDate2     CaConc2
USGS-09382000    10/1/1947 0:00     66.0    10/1/1948 0:00    106.0
USGS-09382000    10/15/1947 0:00   132.0    10/15/1948 0:00   102.0
USGS-09382000    5/15/1948 0:00     53.0    5/15/1949 0:00     59.0
...              ...                 ...    ...                 ...
USGS-09288500    9/20/1947 0:00     59.0    9/29/1948 0:00     51.0
我相信可以使用Pandas中的多索引功能来实现这一点。到目前为止,我已经研究了以下stackoverflow问题,以帮助匹配日期并使用索引进行操作:

我认为第二个链接使用非堆叠多索引非常接近,如果我愿意聚合,我可能能够执行此操作,但我正试图避免这种情况


这项技术将适用于其他希望分析季节性趋势数据的人,例如比较同一天或接近同一天的流量、累积降水量或温度。

此方法有点混乱,但我正试图使其更稳健地解释丢失的数据

首先,我们将删除数据中的重复项,然后将日期转换为时间戳:

df = df.drop_duplicates()
df.SampleDate = [pd.Timestamp(ts) for ts in df.SampleDate]
然后,让我们安排您的数据帧,以便在一组唯一的日期上对其进行索引(列将是位置ID):

我已经填充了这些值,以使结果更加可靠。您可能希望限制可能提前填充的天数(例如,ffill(limit=30))

现在,我们可以将此数据帧移动365个日期:

df2_lagged = df2.shift(365)
堆叠df2和df2_滞后的样本位置:

df2 = pd.DataFrame(df2.stack('SampleLocation', dropna=False))
df2_lagged = df2_lagged.stack('SampleLocation', dropna=False)
现在将滞后数据合并到df2。数据帧具有完全相同的结构,因此您可以只复制值:

df2['lagged_val'] = df2_lagged
最后,交换位置和日期并重命名列:

result = df2.swaplevel(0, 1)
result.columns = ['CalciumConc_mgL', 'CalciumConc_mgL_lagged_12m']
对样本数据使用60天延迟:

>>> result
result.tail(10)
                                 CalciumConc_mgL  CalciumConc_mgL_lagged_12m
SampleLocation       SampleDate                                             
USGS-421548113205301 1950-01-01               59                          59
USGS-422818113225801 1950-01-01               59                         NaN
USGS-423200113472601 1950-01-01               33                          33
USGS-424006113355301 1950-01-01               62                          54
USGS-424142113340901 1950-01-01               54                          54
USGS-424348113242701 1950-01-01               40                         NaN
USGS-424431113412301 1950-01-01               46                         NaN
USGS-424511113291401 1950-01-01               38                          38
USGS-424518113282002 1950-01-01               39                          39
USGS-424659113433701 1950-01-01               39                          39
要仅索引位置ID,请执行以下操作:

result = result.reset_index().set_index('SampleLocation')

>>> result.loc['USGS-09402500', :]
        CalciumConc_mgL  CalciumConc_mgL_lagged_12m
SampleDate                                             
1941-05-18              NaN                         NaN
1941-05-19              NaN                         NaN
1941-06-16              NaN                         NaN
1941-10-01              102                         NaN
1941-10-12              132                         NaN
1941-10-21              119                         NaN
1943-09-18              110                         NaN
1943-10-01              138                         NaN
1943-10-11              140                         NaN
1943-10-12              140                         NaN
1943-10-14              140                         NaN
1943-10-21              156                         NaN
1944-01-01              116                         NaN
1944-01-11              126                         NaN
1944-01-13              126                         NaN
1944-01-21              133                         NaN
1944-05-01               84                         NaN
1944-05-11               84                         NaN
1944-05-13               66                         NaN
1944-05-15               66                         NaN
1944-05-16               66                         NaN
1944-05-21               57                         NaN
1944-05-22               57                         NaN
1944-06-01               58                         NaN
1944-06-11               57                         NaN
1944-06-21               57                         NaN
1944-09-01              134                         NaN
1944-09-11              122                         NaN
1944-09-15              122                         NaN
1944-09-18              122                         NaN
...                     ...                         ...
1949-05-03               63                          62
1949-05-11               63                          62
1949-05-15               63                          62
1949-05-21               57                          62
1949-06-01               58                         133
1949-06-09               58                         128
1949-06-10               58                         128
1949-06-11               74                         128
1949-06-12               74                         128
1949-06-13               74                         124
1949-06-15               74                         112
1949-06-21               67                         123
1949-06-23               67                         123
1949-06-30               67                         123
1949-09-01              142                         123
1949-09-09              142                         123
1949-09-10              142                         131
1949-09-11              140                         106
1949-09-15              140                         108
1949-09-21              146                         108
1949-09-28              146                         102
1949-10-01              156                         102
1949-10-11              153                         102
1949-10-13              153                          68
1949-10-14              153                          68
1949-10-15              153                          63
1949-10-21              152                          63
1949-10-27              152                          63
1949-10-28              152                          63
1950-01-01              128                          60

您可以使用时间增量(例如365天),或者在日期后看“一年”,在这种情况下,您必须考虑闰年、丢失的数据点等。您更喜欢哪一个?@Alexander时间增量听起来更容易实现,所以我更喜欢这样。我编辑了这篇文章以反映我的偏好。一些可能会让你接近正确答案并且速度相当快的事情是
重新采样
,然后
移位
。如果这是一个愚蠢的问题,我很抱歉,但是在你的脚本中,你是如何以及在哪里实现“样本数据的60天延迟”的df2_滞后=df2.shift(365)。将365替换为60。样本数据不足以满足365天的延迟,所以我用60天来说明这一点。
>>> result
result.tail(10)
                                 CalciumConc_mgL  CalciumConc_mgL_lagged_12m
SampleLocation       SampleDate                                             
USGS-421548113205301 1950-01-01               59                          59
USGS-422818113225801 1950-01-01               59                         NaN
USGS-423200113472601 1950-01-01               33                          33
USGS-424006113355301 1950-01-01               62                          54
USGS-424142113340901 1950-01-01               54                          54
USGS-424348113242701 1950-01-01               40                         NaN
USGS-424431113412301 1950-01-01               46                         NaN
USGS-424511113291401 1950-01-01               38                          38
USGS-424518113282002 1950-01-01               39                          39
USGS-424659113433701 1950-01-01               39                          39
result = result.reset_index().set_index('SampleLocation')

>>> result.loc['USGS-09402500', :]
        CalciumConc_mgL  CalciumConc_mgL_lagged_12m
SampleDate                                             
1941-05-18              NaN                         NaN
1941-05-19              NaN                         NaN
1941-06-16              NaN                         NaN
1941-10-01              102                         NaN
1941-10-12              132                         NaN
1941-10-21              119                         NaN
1943-09-18              110                         NaN
1943-10-01              138                         NaN
1943-10-11              140                         NaN
1943-10-12              140                         NaN
1943-10-14              140                         NaN
1943-10-21              156                         NaN
1944-01-01              116                         NaN
1944-01-11              126                         NaN
1944-01-13              126                         NaN
1944-01-21              133                         NaN
1944-05-01               84                         NaN
1944-05-11               84                         NaN
1944-05-13               66                         NaN
1944-05-15               66                         NaN
1944-05-16               66                         NaN
1944-05-21               57                         NaN
1944-05-22               57                         NaN
1944-06-01               58                         NaN
1944-06-11               57                         NaN
1944-06-21               57                         NaN
1944-09-01              134                         NaN
1944-09-11              122                         NaN
1944-09-15              122                         NaN
1944-09-18              122                         NaN
...                     ...                         ...
1949-05-03               63                          62
1949-05-11               63                          62
1949-05-15               63                          62
1949-05-21               57                          62
1949-06-01               58                         133
1949-06-09               58                         128
1949-06-10               58                         128
1949-06-11               74                         128
1949-06-12               74                         128
1949-06-13               74                         124
1949-06-15               74                         112
1949-06-21               67                         123
1949-06-23               67                         123
1949-06-30               67                         123
1949-09-01              142                         123
1949-09-09              142                         123
1949-09-10              142                         131
1949-09-11              140                         106
1949-09-15              140                         108
1949-09-21              146                         108
1949-09-28              146                         102
1949-10-01              156                         102
1949-10-11              153                         102
1949-10-13              153                          68
1949-10-14              153                          68
1949-10-15              153                          63
1949-10-21              152                          63
1949-10-27              152                          63
1949-10-28              152                          63
1950-01-01              128                          60