I have created a Google chat space. I have a script which does some calculation and the final data is in pandas Dataframe. I want to send the data in this Dataframe as Daily alerts in tabular form in the chat space. What have I tried
# sample pandas Dataframe to be sent as alert
df =
SYMBOL LAST TIMESTAMP
0 20MICRONS 102.15 19-AUG-2022
1 21STCENMGM 27.50 19-AUG-2022
2 3IINFOLTD 45.90 19-AUG-2022
3 3MINDIA 22859.80 19-AUG-2022
4 3PLAND 17.45 19-AUG-2022
5 5PAISA 281.25 19-AUG-2022
6 63MOONS 188.50 19-AUG-2022
7 A2ZINFRA 12.80 19-AUG-2022
8 AAKASH 12.80 19-AUG-2022
9 AAREYDRUGS 35.20 19-AUG-2022
Using tabulate python package (which is used to print tabular data in nicely formatted tables) to create a table string
records = df.to_dict(orient="list")
tabular_string = tabulate(records, headers="keys", tablefmt="github")
print(tabular_string)
#Output
| SYMBOL | LAST | TIMESTAMP |
|------------|----------|-------------|
| 20MICRONS | 102.15 | 19-AUG-2022 |
| 21STCENMGM | 27.5 | 19-AUG-2022 |
| 3IINFOLTD | 45.9 | 19-AUG-2022 |
| 3MINDIA | 22859.8 | 19-AUG-2022 |
| 3PLAND | 17.45 | 19-AUG-2022 |
| 5PAISA | 281.25 | 19-AUG-2022 |
| 63MOONS | 188.5 | 19-AUG-2022 |
| A2ZINFRA | 12.8 | 19-AUG-2022 |
| AAKASH | 12.8 | 19-AUG-2022 |
| AAREYDRUGS | 35.2 | 19-AUG-2022 |
Creating message and posting it on webhook url
webhook_url = "https://chat.googleapis.com/..."
message = {"text": tabular_string}
headers = {'Content-Type': "application/json"}
response = requests.post(webhook_url, data=json.dumps(message), headers=headers)
In Chat Space the message is completely misaligned
Whereas the same message if sent to Microsoft Teams channel the table is perfectly aligned.
The issue is that Google Chat uses a proportional font by default, and for this type of line drawing you need a monospaced font.
You can't control the entire chat's font or whatever the user has selected in their browser, but Google Chat supports some markdown formatting so you can wrap your table between three backquotes (```) like we do here in StackOverflow to create a code block. This is mentioned in their documentation.
Edit: I built a sample based on Google's webhooks guide with the pandas Dataframe and the tabulate library as described in the OP. Transforming the list into a Dataframe and then back into a list is a little redundant since the data
variable can be just plugged in directly to tabulate
, but I wanted to reproduce it as close as possible. The most important part is that the table generated by tabulate
has the right format anyway.
from json import dumps
import pandas
from tabulate import tabulate
from httplib2 import Http
def main():
data = {
"SYMBOL":["20MICRONS","21STCENMGM","3IINFOLTD","3MINDIA","3PLAND","5PAISA","63MOONS","A2ZINFRA","AAKASH","AAREYDRUGS"],
"LAST":[102.15,27.5,45.9,22859.8,17.45,281.25,188.5,12.8,12.8,35.2],
"TIMESTAMP":["19-AUG-2022","19-AUG-2022","19-AUG-2022","19-AUG-2022","19-AUG-2022","19-AUG-2022","19-AUG-2022","19-AUG-2022","19-AUG-2022","19-AUG-2022",]
}
df = pandas.DataFrame(data)
records = df.to_dict(orient="list")
tabular_string = tabulate(records, headers="keys", tablefmt="github")
url = "https://chat.googleapis.com/v1/..."
bot_message = {
'text': f"```{tabular_string}```"}
message_headers = {'Content-Type': 'application/json; charset=UTF-8'}
http_obj = Http()
response = http_obj.request(
uri=url,
method='POST',
headers=message_headers,
body=dumps(bot_message),
)
if __name__ == '__main__':
main()
This posted the message successfully to the space: