我有一个包含27.000行的CSV文件。我正在尝试创建一个抖动图,就像这个[https://static1.squarespace.com/static/56fd706140261df95349d4bd/t/59297c72579fb3d813d591c1/1495891103667/Jitter+Example+The+Truthful+Art.png?format=1000w]一样。
' y' axis将是名为" VALOR_REEMBOLSADO"的列。 (代表"退款价值")。 ' x' axis将是名为" MES"的列。 (代表"月")。
它代表了2017年巴西参议员的支出.CSV文件非常有条理,但最初有" VALOR_REEMBOLSADO"作为字符串而不是浮点数。我取代了","对于"。",但我仍然无法绘制图表。
有人可以帮我处理代码吗?什么代码可以创建这样的图表?
在这里您可以找到2017年的CSV文件:https://www12.senado.leg.br/transparencia/dados-abertos-transparencia/dados-abertos-ceaps
答案 0 :(得分:2)
起初我不得不承认我无法理解你问题的某些方面(第一个链接不起作用,更重要的是:你想要一个显示月份的x轴,但是在图中,数据,数据显示在州之上。
但我发现你的问题在读取数据的最初阶段已经开始了,所以我会尝试给你提供所需的提示:
为了阅读这样的csv数据,我建议pandas
,通常用
import pandas as pd
它包含一个csv阅读器,功能非常强大。一般来说,你应该避免手动调整你拥有的数据源(比如改变小数点等),因为这是read_csv
等导入函数已经解决的问题(你不想这样做)将来会有新的数据文件,但同样的情节产生一次又一次):
filepath = 'wherever/file/may/roam/2017.csv'
data = pd.read_csv(filepath, skiprows=1, sep=';', usecols=[1, 9], decimal=',')
使用filepath
告诉导入者您存储csv文件的位置,skiprows=1
表示您对文件的第一行不感兴趣,sep
定义了通过usecols
列之间的分隔符,您只能选择感兴趣的列,“MES'和' VALOR_REEMBOLSADO'在你的例子中。
decimal
指定数据中浮点数的小数点。
现在data
包含数据的pandas数据框:
In: data[:10]
Out:
MES VALOR_REEMBOLSADO
0 1 97.00
1 1 6000.00
2 1 418.04
3 1 1958.95
4 1 1178.67
5 1 1252.65
6 2 62.30
7 2 240.81
8 2 6000.00
9 2 2062.25
所以这应该是你可以玩的东西。
如果您愿意,现在可以使用matplotlib
或seaborn
来绘制此数据。
pandas
本身也包含了一些绘图方法。
但是,正如我所指出的那样,你的问题与你添加的示例情节有所不同,所以从这一点来看,它有点难以准确地帮助你。
例如,您可以汇总所有相等的月份,以创建数月的情节。对于这些情况,Dataframes有groupby
方法:
data.groupby('MES')
这只返回一个所谓的grouby-object,但你可以告诉它,你想对分组数据做些什么,例如:
In: data.groupby('MES').sum()
Out:
VALOR_REEMBOLSADO
MES
1 1558581.11
2 1951731.07
3 2225328.21
4 2248882.83
5 2256224.68
6 2216981.94
7 2053173.90
8 2372847.10
9 2161915.35
10 2355417.34
11 2294658.51
12 2938033.00
如果您对每个月内的金额感兴趣。 data.groupby('MES').mean()
的平均值相同。对于第一个图,您可以添加类似
data.groupby('MES').sum().plot()
产生
如果您想查看问题中图片中的分布和平均值(但仍然会在数月内绘制,而不是在州内绘制,因为我不会在您的文件中看到此信息)您可以拥有看看散点图:
import matplotlib.pyplot as plt
plt.figure()
plt.scatter(data['MES'],data['VALOR_REEMBOLSADO'])
plt.plot(data.groupby('MES').mean()['VALOR_REEMBOLSADO'], 'k_', ms=10)
产生
但是当你在标签列表中提到seaborn时:这个库提供了一个抖动图,就像你引用via stripplot
一样。所以这最终是你问题的绘图部分的答案,导致这段代码:
import pandas as pd
import seaborn as sns
filepath = 'https://raw.githubusercontent.com/gabrielacaesar/studyingPython/master/ceap-sf-new-12-04-2018.csv'
data = pd.read_csv(filepath, usecols=[1,9], decimal=',')
x = data['MES'].values
y = data['VALOR_REEMBOLSADO'].values
sns.stripplot(x, y, jitter=True)
产生