Jar*_*čík 2 python csv aggregate date pandas
我有一个csv,看起来像这样:
Date,Sentiment
2014-01-03,0.4
2014-01-04,-0.03
2014-01-09,0.0
2014-01-10,0.07
2014-01-12,0.0
2014-02-24,0.0
2014-02-25,0.0
2014-02-25,0.0
2014-02-26,0.0
2014-02-28,0.0
2014-03-01,0.1
2014-03-02,-0.5
2014-03-03,0.0
2014-03-08,-0.06
2014-03-11,-0.13
2014-03-22,0.0
2014-03-23,0.33
2014-03-23,0.3
2014-03-25,-0.14
2014-03-28,-0.25
etc
Run Code Online (Sandbox Code Playgroud)
我的目标是按月汇总日期并计算平均月份。日期可能不以1或1月开始。问题是我有很多数据,这意味着我还有很多年。为此,我想找到最快的日期(月份),然后从那里开始计算月份及其平均值。例如:
Month count, average
1, 0.4 (<= the earliest month)
2, -0.3
3, 0.0
...
12, 0.1
13, -0.4 (<= new year but counting of month is continuing)
14, 0.3
Run Code Online (Sandbox Code Playgroud)
我正在使用Pandas打开CSV
data = pd.read_csv("pks.csv", sep=",")
Run Code Online (Sandbox Code Playgroud)
所以在data['Date']我有约会,在data['Sentiment']我有价值观。知道怎么做吗?
可能最简单的方法是使用resample命令。首先,当您读入数据时,请确保您解析日期并将日期列设置为索引(忽略StringIO部件和header = True ...我正在从多行字符串中读取示例数据):
>>> df = pd.read_csv(StringIO(data),header=True,parse_dates=['Date'],
index_col='Date')
>>> df
Sentiment
Date
2014-01-03 0.40
2014-01-04 -0.03
2014-01-09 0.00
2014-01-10 0.07
2014-01-12 0.00
2014-02-24 0.00
2014-02-25 0.00
2014-02-25 0.00
2014-02-26 0.00
2014-02-28 0.00
2014-03-01 0.10
2014-03-02 -0.50
2014-03-03 0.00
2014-03-08 -0.06
2014-03-11 -0.13
2014-03-22 0.00
2014-03-23 0.33
2014-03-23 0.30
2014-03-25 -0.14
2014-03-28 -0.25
>>> df.resample('M').mean()
Sentiment
2014-01-31 0.088
2014-02-28 0.000
2014-03-31 -0.035
Run Code Online (Sandbox Code Playgroud)
如果您想要一个月计数器,可以在以下位置添加它resample:
>>> agg = df.resample('M',how='mean')
>>> agg['cnt'] = range(len(agg))
>>> agg
Sentiment cnt
2014-01-31 0.088 0
2014-02-28 0.000 1
2014-03-31 -0.035 2
Run Code Online (Sandbox Code Playgroud)
您也可以使用groupby方法和TimeGrouper函数(按月分组,然后调用可用的mean average方法groupby)来执行此操作。
>>> df.groupby(pd.TimeGrouper(freq='M')).mean()
Sentiment
2014-01-31 0.088
2014-02-28 0.000
2014-03-31 -0.035
Run Code Online (Sandbox Code Playgroud)
要在 DataFrame 具有每日数据行“情绪”时获取 Data Frame 的月平均值,我会:
df['dates']为 DataFrame 的索引df:df.set_index('date',inplace=True)dates转换为月份索引:df.index.monthdf.groupby(df.index.month).Sentiment.mean()我慢慢地把每一步都扔到这里:
您首先需要导入 Pandas 和 Numpy,以及模块 datetime
from datetime import datetime
Run Code Online (Sandbox Code Playgroud)'date'在 2019 年 1 月 1 日和 2019 年 3 月 5 日之间以“W”周为间隔生成一列。还有一个'Sentiment'随机值在 1-100 之间的列:
date_rng = pd.date_range(start='1/1/2018', end='3/05/2018', freq='W')
df = pd.DataFrame(date_rng, columns=['date'])
df['Sentiment']=np.random.randint(0,100,size=(len(date_rng)))
Run Code Online (Sandbox Code Playgroud)将df有两列'date'和'Sentiment':
date Sentiment
0 2018-01-07 34
1 2018-01-14 32
2 2018-01-21 15
3 2018-01-28 0
4 2018-02-04 95
5 2018-02-11 53
6 2018-02-18 7
7 2018-02-25 35
8 2018-03-04 17
Run Code Online (Sandbox Code Playgroud)
'date'column设置为 DataFrame 的索引:df.set_index('date',inplace=True)
Run Code Online (Sandbox Code Playgroud)df有一列'Sentiment',索引是 'date':
Sentiment
date
2018-01-07 34
2018-01-14 32
2018-01-21 15
2018-01-28 0
2018-02-04 95
2018-02-11 53
2018-02-18 7
2018-02-25 35
2018-03-04 17
Run Code Online (Sandbox Code Playgroud) months=df.index.month
Run Code Online (Sandbox Code Playgroud)
monthly_avg=df.groupby(months).Sentiment.mean()
Run Code Online (Sandbox Code Playgroud)
'monthly_avg'为: date
1 20.25
2 47.50
3 17.00
Run Code Online (Sandbox Code Playgroud)